@ditari/bsui 5.0.25 → 5.0.27
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/dist/cjs/components/layout/components/layout/HeaderLayout.vue2.cjs +1 -1
- package/dist/cjs/components/layout/components/layout/HeaderLayout.vue2.cjs.map +1 -1
- package/dist/cjs/components/layout/components/menu/Menu.cjs +15 -1
- package/dist/cjs/components/layout/components/menu/Menu.cjs.map +1 -1
- package/dist/cjs/components/tab/Search.cjs +3 -1
- package/dist/cjs/components/tab/Search.cjs.map +1 -1
- package/dist/esm/components/layout/components/layout/HeaderLayout.vue2.mjs +1 -1
- package/dist/esm/components/layout/components/layout/HeaderLayout.vue2.mjs.map +1 -1
- package/dist/esm/components/layout/components/menu/Menu.mjs +15 -1
- package/dist/esm/components/layout/components/menu/Menu.mjs.map +1 -1
- package/dist/esm/components/tab/Search.mjs +3 -1
- package/dist/esm/components/tab/Search.mjs.map +1 -1
- package/dist/types/components/layout/components/menu/Menu.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -76,7 +76,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
76
76
|
return vue.openBlock(), vue.createElementBlock(
|
|
77
77
|
"div",
|
|
78
78
|
{
|
|
79
|
-
class: vue.normalizeClass(vue.unref(headerStyle))
|
|
79
|
+
class: vue.normalizeClass([vue.unref(headerStyle), "app-header-layout"])
|
|
80
80
|
},
|
|
81
81
|
[
|
|
82
82
|
vue.createElementVNode(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderLayout.vue2.cjs","sources":["../../../../../../src/components/layout/components/layout/HeaderLayout.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, type ComputedRef } from \"vue\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport {\r\n MenuFoldOutlined,\r\n MenuUnfoldOutlined\r\n} from \"@ant-design/icons-vue\";\r\nimport { useAppStore } from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\n\r\nimport Tab from \"../../../tab/Tab.vue\";\r\n\r\nconst { layout, modeConfig, headerTokenStyle } =\r\n storeToRefs(useAppStore());\r\nconst {\r\n headerStyle,\r\n headerTabStyle,\r\n collapsedStyle,\r\n rightStyle\r\n} = useStyle();\r\n\r\nfunction useStyle(): {\r\n headerStyle: ComputedRef<string>;\r\n headerTabStyle: ComputedRef<string>;\r\n collapsedStyle: ComputedRef<string>;\r\n rightStyle: ComputedRef<string>;\r\n} {\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } =\r\n useToken();\r\n\r\n const left = computed(\r\n () =>\r\n `${layout.value.collapsed ? layout.value.collapsedWidth : layout.value.sideWidth}px`\r\n );\r\n\r\n const headerStyle = computed(\r\n () => css`\r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n z-index: 1;\r\n background-color: ${modeConfig.value.mode !== \"light\"\r\n ? token.value.colorBgContainer\r\n : headerTokenStyle.value.bgColor};\r\n left: ${left.value};\r\n height: ${layout.value.headerHeight}px;\r\n transition: left 0.4s cubic-bezier(0.22, 1.2, 0.36, 1);\r\n display: flex;\r\n align-items: flex-end;\r\n `\r\n );\r\n\r\n const headerTabStyle = computed(\r\n () => css`\r\n flex: 1;\r\n overflow: hidden;\r\n padding-right: 10px;\r\n `\r\n );\r\n\r\n const collapsedStyle = computed(\r\n () => css`\r\n padding: 0 10px;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: ${modeConfig.value.mode === \"light\"\r\n ? headerTokenStyle.value.txtColor\r\n : \"inherit\"};\r\n `\r\n );\r\n\r\n const rightStyle = computed(\r\n () => css`\r\n height: 100%;\r\n `\r\n );\r\n\r\n return {\r\n headerStyle,\r\n headerTabStyle,\r\n collapsedStyle,\r\n rightStyle\r\n };\r\n}\r\n</script>\r\n\r\n<template>\r\n <div :class=\"headerStyle\">\r\n <div\r\n :class=\"collapsedStyle\"\r\n @click=\"layout.collapsed = !layout.collapsed\"\r\n >\r\n <menu-unfold-outlined\r\n v-if=\"layout.collapsed\"\r\n class=\"trigger\"\r\n />\r\n <menu-fold-outlined v-else />\r\n </div>\r\n <div :class=\"headerTabStyle\">\r\n <Tab />\r\n </div>\r\n <div :class=\"rightStyle\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n"],"names":["storeToRefs","useAppStore","theme","computed","headerStyle","css","headerTabStyle","collapsedStyle","rightStyle"],"mappings":";;;;;;;;;;;;;;;;;AAeA,IAAA,MAAM,EAAE,MAAQ,EAAA,UAAA,EAAY,kBAC1B,GAAAA,iBAAA,CAAYC,mBAAa,CAAA;AAC3B,IAAM,MAAA;AAAA,MACJ,WAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,QACE,QAAS,EAAA;AAEb,IAAA,SAAS,QAKP,GAAA;AACA,MAAM,MAAA,EAAE,UAAa,GAAAC,kBAAA;AACrB,MAAM,MAAA,EAAE,KAAM,EAAA,GACZ,QAAS,EAAA;AAEX,MAAA,MAAM,IAAO,GAAAC,YAAA;AAAA,QACX,MACE,CAAG,EAAA,MAAA,CAAO,KAAM,CAAA,SAAA,GAAY,OAAO,KAAM,CAAA,cAAA,GAAiB,MAAO,CAAA,KAAA,CAAM,SAAS,CAAA,EAAA;AAAA,OACpF;AAEA,MAAA,MAAMC,YAAc,GAAAD,YAAA;AAAA,QAClB,MAAME,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKgB,EAAA,UAAA,CAAW,MAAM,IAAS,KAAA,OAAA,GAC1C,MAAM,KAAM,CAAA,gBAAA,GACZ,gBAAiB,CAAA,KAAA,CAAM,OAAO,CAAA;AAAA,YAAA,EAC1B,KAAK,KAAK,CAAA;AAAA,cACR,EAAA,MAAA,CAAO,MAAM,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,OAKvC;AAEA,MAAA,MAAMC,eAAiB,GAAAH,YAAA;AAAA,QACrB,MAAME,OAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,OAKR;AAEA,MAAA,MAAME,eAAiB,GAAAJ,YAAA;AAAA,QACrB,MAAME,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAOK,WAAW,KAAM,CAAA,IAAA,KAAS,UAC/B,gBAAiB,CAAA,KAAA,CAAM,WACvB,SAAS,CAAA;AAAA,IAAA;AAAA,OAEjB;AAEA,MAAA,MAAMG,WAAa,GAAAL,YAAA;AAAA,QACjB,MAAME,OAAA;AAAA;AAAA,IAAA;AAAA,OAGR;AAEA,MAAO,OAAA;AAAA,QACL,WAAAD,EAAAA,YAAAA;AAAA,QACA,cAAAE,EAAAA,eAAAA;AAAA,QACA,cAAAC,EAAAA,eAAAA;AAAA,QACA,UAAAC,EAAAA;AAAA,OACF;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"HeaderLayout.vue2.cjs","sources":["../../../../../../src/components/layout/components/layout/HeaderLayout.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, type ComputedRef } from \"vue\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport {\r\n MenuFoldOutlined,\r\n MenuUnfoldOutlined\r\n} from \"@ant-design/icons-vue\";\r\nimport { useAppStore } from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\n\r\nimport Tab from \"../../../tab/Tab.vue\";\r\n\r\nconst { layout, modeConfig, headerTokenStyle } =\r\n storeToRefs(useAppStore());\r\nconst {\r\n headerStyle,\r\n headerTabStyle,\r\n collapsedStyle,\r\n rightStyle\r\n} = useStyle();\r\n\r\nfunction useStyle(): {\r\n headerStyle: ComputedRef<string>;\r\n headerTabStyle: ComputedRef<string>;\r\n collapsedStyle: ComputedRef<string>;\r\n rightStyle: ComputedRef<string>;\r\n} {\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } =\r\n useToken();\r\n\r\n const left = computed(\r\n () =>\r\n `${layout.value.collapsed ? layout.value.collapsedWidth : layout.value.sideWidth}px`\r\n );\r\n\r\n const headerStyle = computed(\r\n () => css`\r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n z-index: 1;\r\n background-color: ${modeConfig.value.mode !== \"light\"\r\n ? token.value.colorBgContainer\r\n : headerTokenStyle.value.bgColor};\r\n left: ${left.value};\r\n height: ${layout.value.headerHeight}px;\r\n transition: left 0.4s cubic-bezier(0.22, 1.2, 0.36, 1);\r\n display: flex;\r\n align-items: flex-end;\r\n `\r\n );\r\n\r\n const headerTabStyle = computed(\r\n () => css`\r\n flex: 1;\r\n overflow: hidden;\r\n padding-right: 10px;\r\n `\r\n );\r\n\r\n const collapsedStyle = computed(\r\n () => css`\r\n padding: 0 10px;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: ${modeConfig.value.mode === \"light\"\r\n ? headerTokenStyle.value.txtColor\r\n : \"inherit\"};\r\n `\r\n );\r\n\r\n const rightStyle = computed(\r\n () => css`\r\n height: 100%;\r\n `\r\n );\r\n\r\n return {\r\n headerStyle,\r\n headerTabStyle,\r\n collapsedStyle,\r\n rightStyle\r\n };\r\n}\r\n</script>\r\n\r\n<template>\r\n <div :class=\"[headerStyle, 'app-header-layout']\">\r\n <div\r\n :class=\"collapsedStyle\"\r\n @click=\"layout.collapsed = !layout.collapsed\"\r\n >\r\n <menu-unfold-outlined\r\n v-if=\"layout.collapsed\"\r\n class=\"trigger\"\r\n />\r\n <menu-fold-outlined v-else />\r\n </div>\r\n <div :class=\"headerTabStyle\">\r\n <Tab />\r\n </div>\r\n <div :class=\"rightStyle\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n"],"names":["storeToRefs","useAppStore","theme","computed","headerStyle","css","headerTabStyle","collapsedStyle","rightStyle"],"mappings":";;;;;;;;;;;;;;;;;AAeA,IAAA,MAAM,EAAE,MAAQ,EAAA,UAAA,EAAY,kBAC1B,GAAAA,iBAAA,CAAYC,mBAAa,CAAA;AAC3B,IAAM,MAAA;AAAA,MACJ,WAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,QACE,QAAS,EAAA;AAEb,IAAA,SAAS,QAKP,GAAA;AACA,MAAM,MAAA,EAAE,UAAa,GAAAC,kBAAA;AACrB,MAAM,MAAA,EAAE,KAAM,EAAA,GACZ,QAAS,EAAA;AAEX,MAAA,MAAM,IAAO,GAAAC,YAAA;AAAA,QACX,MACE,CAAG,EAAA,MAAA,CAAO,KAAM,CAAA,SAAA,GAAY,OAAO,KAAM,CAAA,cAAA,GAAiB,MAAO,CAAA,KAAA,CAAM,SAAS,CAAA,EAAA;AAAA,OACpF;AAEA,MAAA,MAAMC,YAAc,GAAAD,YAAA;AAAA,QAClB,MAAME,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKgB,EAAA,UAAA,CAAW,MAAM,IAAS,KAAA,OAAA,GAC1C,MAAM,KAAM,CAAA,gBAAA,GACZ,gBAAiB,CAAA,KAAA,CAAM,OAAO,CAAA;AAAA,YAAA,EAC1B,KAAK,KAAK,CAAA;AAAA,cACR,EAAA,MAAA,CAAO,MAAM,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,OAKvC;AAEA,MAAA,MAAMC,eAAiB,GAAAH,YAAA;AAAA,QACrB,MAAME,OAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,OAKR;AAEA,MAAA,MAAME,eAAiB,GAAAJ,YAAA;AAAA,QACrB,MAAME,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAOK,WAAW,KAAM,CAAA,IAAA,KAAS,UAC/B,gBAAiB,CAAA,KAAA,CAAM,WACvB,SAAS,CAAA;AAAA,IAAA;AAAA,OAEjB;AAEA,MAAA,MAAMG,WAAa,GAAAL,YAAA;AAAA,QACjB,MAAME,OAAA;AAAA;AAAA,IAAA;AAAA,OAGR;AAEA,MAAO,OAAA;AAAA,QACL,WAAAD,EAAAA,YAAAA;AAAA,QACA,cAAAE,EAAAA,eAAAA;AAAA,QACA,cAAAC,EAAAA,eAAAA;AAAA,QACA,UAAAC,EAAAA;AAAA,OACF;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -85,12 +85,26 @@ var Menu = /* @__PURE__ */ vue.defineComponent({
|
|
|
85
85
|
} = pinia.storeToRefs(store.useMenuStore());
|
|
86
86
|
const route = vueRouter.useRoute();
|
|
87
87
|
const router = vueRouter.useRouter();
|
|
88
|
+
const findClosestParentMenu = (url, menus) => {
|
|
89
|
+
const cleanUrl = url.split("?")[0].split("#")[0];
|
|
90
|
+
const pathSegments = cleanUrl.split("/").filter(Boolean);
|
|
91
|
+
for (let i = pathSegments.length; i > 0; i--) {
|
|
92
|
+
const testPath = "/" + pathSegments.slice(0, i).join("/");
|
|
93
|
+
const foundItem = findMenuItemByUrl(testPath, menus);
|
|
94
|
+
if (foundItem) return foundItem;
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
};
|
|
88
98
|
vue.watch(() => route.fullPath, (path) => __async(this, null, function* () {
|
|
89
99
|
const flag = selectedKeys2.value.some((item) => item === path);
|
|
90
100
|
if (!flag) {
|
|
91
|
-
|
|
101
|
+
let menuItem = findMenuItemByUrl(path, data.value);
|
|
102
|
+
if (!menuItem) {
|
|
103
|
+
menuItem = findClosestParentMenu(path, data.value);
|
|
104
|
+
}
|
|
92
105
|
if (!menuItem) {
|
|
93
106
|
openKeys2.value = [];
|
|
107
|
+
selectedKeys2.value = [path];
|
|
94
108
|
} else {
|
|
95
109
|
const rs = getFullParentChain(menuItem.id, data.value);
|
|
96
110
|
if (!layout.value.collapsed) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.cjs","sources":["../../../../../../src/components/layout/components/menu/Menu.tsx"],"sourcesContent":["import { computed, defineComponent, watch } from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport {\r\n useAppStore,\r\n useMenuStore,\r\n useNoStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\n\r\nimport useMenuCore from \"../../../../utils/useMenuCore\";\r\n\r\nexport default defineComponent({\r\n name: \"DMenu\",\r\n emits: [\"onMenuClick\"],\r\n setup(_, { emit }) {\r\n const { layout, modeConfig } =\r\n storeToRefs(useAppStore());\r\n const { findMatchedMenuById, findMenuItemByUrl } =\r\n useMenuCore();\r\n const { menuList } = storeToRefs(useNoStore());\r\n const { menuWrapperStyle } = useStyle();\r\n const { openKeys, selectedKeys, onClick } = useMenu();\r\n\r\n function useStyle() {\r\n const menuWrapperStyle = computed(\r\n () => css`\r\n flex: 1;\r\n overflow: hidden;\r\n\r\n .ant-menu {\r\n height: 100%;\r\n overflow: scroll;\r\n -ms-overflow-style: none; /* 对 IE 和 Edge 生效 */\r\n scrollbar-width: none; /* 对 Firefox 生效 */\r\n\r\n ${modeConfig.value.mode === \"light\"\r\n ? \"background:transparent;\"\r\n : \"\"}\r\n /* Webkit 浏览器 */\r\n ::-webkit-scrollbar {\r\n display: none;\r\n }\r\n }\r\n `\r\n );\r\n return {\r\n menuWrapperStyle\r\n };\r\n }\r\n\r\n function useMenu() {\r\n const { openKeys, selectedKeys, data } =\r\n storeToRefs(useMenuStore());\r\n const route = useRoute();\r\n const router = useRouter();\r\n\r\n /**\r\n * 在标签切换的时候,路由会变化,需要动态关联左侧菜单的选中状态\r\n */\r\n watch(\r\n () => route.fullPath,\r\n async path => {\r\n const flag = selectedKeys.value.some(\r\n (item: string) => item === path\r\n );\r\n if (!flag) {\r\n const menuItem = findMenuItemByUrl(\r\n path,\r\n data.value\r\n );\r\n if (!menuItem) {\r\n openKeys.value = [];\r\n } else {\r\n const rs = getFullParentChain(\r\n menuItem.id,\r\n data.value as never\r\n );\r\n if (!layout.value.collapsed) {\r\n openKeys.value = rs!;\r\n }\r\n selectedKeys.value = [menuItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n watch(\r\n () => layout.value.collapsed,\r\n val => {\r\n const id = selectedKeys.value[0];\r\n const rs = findMatchedMenuById(\r\n id,\r\n data.value as never\r\n );\r\n\r\n if (val) {\r\n openKeys.value = [];\r\n } else {\r\n if (rs?.parentItem) {\r\n openKeys.value = [rs.parentItem.key];\r\n } else {\r\n openKeys.value = [rs!.matchItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n /**\r\n * 获取从根到目标菜单项的完整 key 链\r\n * @param targetId 目标菜单项 id\r\n * @param menus 菜单数据\r\n * @param parentChain 递归传递的父级链\r\n */\r\n const getFullParentChain = (\r\n targetId: string,\r\n menus: any[],\r\n parentChain: string[] = []\r\n ): string[] | null => {\r\n for (const menu of menus) {\r\n // 找到目标项,返回完整链(包含自身 key)\r\n if (menu.id === targetId) {\r\n return [...parentChain, menu.key];\r\n }\r\n\r\n // 递归查找子菜单\r\n if (menu.children?.length) {\r\n const result = getFullParentChain(\r\n targetId,\r\n menu.children,\r\n [...parentChain, menu.key] // 传递当前层级的 key\r\n );\r\n if (result) return result;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const onClick = ({\r\n key,\r\n keyPath,\r\n item\r\n }: {\r\n item: { originItemValue: any };\r\n key: string;\r\n keyPath: string[];\r\n }) => {\r\n const rs = findMatchedMenuById(key, data.value);\r\n if (\r\n item.originItemValue?.isFrame &&\r\n item.originItemValue?.isFrame === \"0\"\r\n ) {\r\n emit(\"onMenuClick\", item);\r\n } else {\r\n openKeys.value = keyPath;\r\n selectedKeys.value = [rs.matchItem?.key];\r\n if (rs.matchItem?.url !== route.path) {\r\n // 判断目标路由和当前路由是否相等;\r\n // 不相等的时候再跳转\r\n router.push(rs.matchItem?.url).then(r => {\r\n if (r) {\r\n console.warn(r);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n return {\r\n openKeys,\r\n selectedKeys,\r\n data,\r\n onClick\r\n };\r\n }\r\n\r\n return () => (\r\n <div class={menuWrapperStyle.value}>\r\n <a-menu\r\n v-model:open-keys={openKeys.value}\r\n v-model:selected-keys={selectedKeys.value}\r\n items={menuList.value}\r\n mode=\"inline\"\r\n triggerSubMenuAction={\"hover\"}\r\n onClick={onClick}\r\n ></a-menu>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["defineComponent","name","emits","setup","_","emit","layout","modeConfig","storeToRefs","useAppStore","findMatchedMenuById","findMenuItemByUrl","useMenuCore","menuList","useNoStore","menuWrapperStyle","useStyle","openKeys","selectedKeys","onClick","useMenu","computed","css","value","mode","data","useMenuStore","route","useRoute","router","useRouter","watch","fullPath","path","flag","some","item","menuItem","rs","getFullParentChain","id","collapsed","key","val","parentItem","matchItem","targetId","menus","parentChain","menu","children","length","result","keyPath","originItemValue","isFrame","url","push","then","r","console","warn","_createVNode","_resolveComponent","$event"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Menu.cjs","sources":["../../../../../../src/components/layout/components/menu/Menu.tsx"],"sourcesContent":["import { computed, defineComponent, watch } from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport {\r\n useAppStore,\r\n useMenuStore,\r\n useNoStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\n\r\nimport useMenuCore from \"../../../../utils/useMenuCore\";\r\n\r\nexport default defineComponent({\r\n name: \"DMenu\",\r\n emits: [\"onMenuClick\"],\r\n setup(_, { emit }) {\r\n const { layout, modeConfig } =\r\n storeToRefs(useAppStore());\r\n const { findMatchedMenuById, findMenuItemByUrl } =\r\n useMenuCore();\r\n const { menuList } = storeToRefs(useNoStore());\r\n const { menuWrapperStyle } = useStyle();\r\n const { openKeys, selectedKeys, onClick } = useMenu();\r\n\r\n function useStyle() {\r\n const menuWrapperStyle = computed(\r\n () => css`\r\n flex: 1;\r\n overflow: hidden;\r\n\r\n .ant-menu {\r\n height: 100%;\r\n overflow: scroll;\r\n -ms-overflow-style: none; /* 对 IE 和 Edge 生效 */\r\n scrollbar-width: none; /* 对 Firefox 生效 */\r\n\r\n ${modeConfig.value.mode === \"light\"\r\n ? \"background:transparent;\"\r\n : \"\"}\r\n /* Webkit 浏览器 */\r\n ::-webkit-scrollbar {\r\n display: none;\r\n }\r\n }\r\n `\r\n );\r\n return {\r\n menuWrapperStyle\r\n };\r\n }\r\n\r\n function useMenu() {\r\n const { openKeys, selectedKeys, data } =\r\n storeToRefs(useMenuStore());\r\n const route = useRoute();\r\n const router = useRouter();\r\n\r\n /**\r\n * 根据URL路径查找最接近的父级菜单\r\n */\r\n const findClosestParentMenu = (\r\n url: string,\r\n menus: any[]\r\n ): any => {\r\n // 移除查询参数和哈希\r\n const cleanUrl = url.split(\"?\")[0].split(\"#\")[0];\r\n const pathSegments = cleanUrl\r\n .split(\"/\")\r\n .filter(Boolean);\r\n\r\n // 从最长路径开始尝试匹配\r\n for (let i = pathSegments.length; i > 0; i--) {\r\n const testPath =\r\n \"/\" + pathSegments.slice(0, i).join(\"/\");\r\n const foundItem = findMenuItemByUrl(\r\n testPath,\r\n menus\r\n );\r\n if (foundItem) return foundItem;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n /**\r\n * 在标签切换的时候,路由会变化,需要动态关联左侧菜单的选中状态\r\n */\r\n watch(\r\n () => route.fullPath,\r\n async path => {\r\n const flag = selectedKeys.value.some(\r\n (item: string) => item === path\r\n );\r\n if (!flag) {\r\n let menuItem = findMenuItemByUrl(\r\n path,\r\n data.value\r\n );\r\n\r\n // 如果没有精确匹配,尝试匹配父级路径\r\n if (!menuItem) {\r\n menuItem = findClosestParentMenu(\r\n path,\r\n data.value\r\n );\r\n }\r\n\r\n if (!menuItem) {\r\n openKeys.value = [];\r\n selectedKeys.value = [path];\r\n } else {\r\n const rs = getFullParentChain(\r\n menuItem.id,\r\n data.value as never\r\n );\r\n if (!layout.value.collapsed) {\r\n openKeys.value = rs!;\r\n }\r\n selectedKeys.value = [menuItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n watch(\r\n () => layout.value.collapsed,\r\n val => {\r\n const id = selectedKeys.value[0];\r\n const rs = findMatchedMenuById(\r\n id,\r\n data.value as never\r\n );\r\n\r\n if (val) {\r\n openKeys.value = [];\r\n } else {\r\n if (rs?.parentItem) {\r\n openKeys.value = [rs.parentItem.key];\r\n } else {\r\n openKeys.value = [rs!.matchItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n /**\r\n * 获取从根到目标菜单项的完整 key 链\r\n * @param targetId 目标菜单项 id\r\n * @param menus 菜单数据\r\n * @param parentChain 递归传递的父级链\r\n */\r\n const getFullParentChain = (\r\n targetId: string,\r\n menus: any[],\r\n parentChain: string[] = []\r\n ): string[] | null => {\r\n for (const menu of menus) {\r\n // 找到目标项,返回完整链(包含自身 key)\r\n if (menu.id === targetId) {\r\n return [...parentChain, menu.key];\r\n }\r\n\r\n // 递归查找子菜单\r\n if (menu.children?.length) {\r\n const result = getFullParentChain(\r\n targetId,\r\n menu.children,\r\n [...parentChain, menu.key] // 传递当前层级的 key\r\n );\r\n if (result) return result;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const onClick = ({\r\n key,\r\n keyPath,\r\n item\r\n }: {\r\n item: { originItemValue: any };\r\n key: string;\r\n keyPath: string[];\r\n }) => {\r\n const rs = findMatchedMenuById(key, data.value);\r\n if (\r\n item.originItemValue?.isFrame &&\r\n item.originItemValue?.isFrame === \"0\"\r\n ) {\r\n emit(\"onMenuClick\", item);\r\n } else {\r\n openKeys.value = keyPath;\r\n selectedKeys.value = [rs.matchItem?.key];\r\n if (rs.matchItem?.url !== route.path) {\r\n // 判断目标路由和当前路由是否相等;\r\n // 不相等的时候再跳转\r\n router.push(rs.matchItem?.url).then(r => {\r\n if (r) {\r\n console.warn(r);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n return {\r\n openKeys,\r\n selectedKeys,\r\n data,\r\n onClick\r\n };\r\n }\r\n\r\n return () => (\r\n <div class={menuWrapperStyle.value}>\r\n <a-menu\r\n v-model:open-keys={openKeys.value}\r\n v-model:selected-keys={selectedKeys.value}\r\n items={menuList.value}\r\n mode=\"inline\"\r\n triggerSubMenuAction={\"hover\"}\r\n onClick={onClick}\r\n ></a-menu>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["defineComponent","name","emits","setup","_","emit","layout","modeConfig","storeToRefs","useAppStore","findMatchedMenuById","findMenuItemByUrl","useMenuCore","menuList","useNoStore","menuWrapperStyle","useStyle","openKeys","selectedKeys","onClick","useMenu","computed","css","value","mode","data","useMenuStore","route","useRoute","router","useRouter","findClosestParentMenu","url","menus","cleanUrl","split","pathSegments","filter","Boolean","i","length","testPath","slice","join","foundItem","watch","fullPath","path","flag","some","item","menuItem","rs","getFullParentChain","id","collapsed","key","val","parentItem","matchItem","targetId","parentChain","menu","children","result","keyPath","originItemValue","isFrame","push","then","r","console","warn","_createVNode","_resolveComponent","$event"],"mappings":"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"}
|
|
@@ -221,7 +221,9 @@ var Search = /* @__PURE__ */ vue.defineComponent({
|
|
|
221
221
|
return navTabList.value.length !== 1;
|
|
222
222
|
}
|
|
223
223
|
};
|
|
224
|
-
return () => vue.createVNode("div",
|
|
224
|
+
return () => vue.createVNode("div", {
|
|
225
|
+
"class": "app-search-tab"
|
|
226
|
+
}, [vue.createVNode(vue.resolveComponent("a-popover"), {
|
|
225
227
|
"open": open.value,
|
|
226
228
|
"onUpdate:open": ($event) => open.value = $event,
|
|
227
229
|
"placement": "bottomRight",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Search.cjs","sources":["../../../../src/components/tab/Search.tsx"],"sourcesContent":["import {\r\n computed,\r\n ComputedRef,\r\n defineComponent,\r\n h,\r\n ref,\r\n watch\r\n} from \"vue\";\r\nimport { useRouter } from \"vue-router\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport {\r\n useMagicKeys,\r\n useWindowScroll\r\n} from \"@vueuse/core\";\r\n\r\nimport {\r\n CloseOutlined,\r\n DownOutlined,\r\n SearchOutlined,\r\n UnorderedListOutlined\r\n} from \"@ant-design/icons-vue\";\r\nimport {\r\n type NavTabsState,\r\n useNavTabStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\nimport dayjs from \"dayjs\";\r\n\r\nexport default defineComponent({\r\n name: \"Search\",\r\n setup() {\r\n const router = useRouter();\r\n\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } =\r\n useToken();\r\n\r\n const { getList, deleteTabs } = useNavTabStore();\r\n // 用来监听 Ctrl + Shift + S\r\n const keys = useMagicKeys();\r\n const shiftCtrlA = keys[\"Shift+Ctrl+S\"];\r\n const open = ref(false);\r\n const { y } = useWindowScroll();\r\n\r\n const navTabList = computed(() => {\r\n return getList!.sort(\r\n (a, b) => (b.openTime || 0) - (a.openTime || 0)\r\n );\r\n });\r\n\r\n // 添加搜索相关状态\r\n const searchKewords = ref(\"\"); // 搜索输入框的值\r\n const filteredNavTabList = computed(() => {\r\n const list = getList!.sort(\r\n (a, b) => (b.openTime || 0) - (a.openTime || 0)\r\n );\r\n\r\n if (!searchKewords.value) {\r\n return list; // 如果没有搜索词,返回完整列表\r\n }\r\n\r\n const query = searchKewords.value.toLowerCase();\r\n return list.filter(item => {\r\n const fullPathMatch = item.fullPath\r\n ?.toLowerCase()\r\n .includes(query);\r\n\r\n const title: string =\r\n (item.meta?.title as string) || \"\";\r\n\r\n const titleMatch = title\r\n .toLowerCase()\r\n .includes(query);\r\n\r\n return fullPathMatch || titleMatch;\r\n });\r\n });\r\n\r\n watch(shiftCtrlA, v => {\r\n if (v) {\r\n open.value = !open.value;\r\n }\r\n });\r\n\r\n watch(\r\n () => open.value,\r\n () => {\r\n searchKewords.value = \"\";\r\n }\r\n );\r\n\r\n watch(\r\n () => y.value,\r\n val => {\r\n if (val > 0) {\r\n open.value = false;\r\n }\r\n }\r\n );\r\n\r\n const onCloseTab = (path: string) => {\r\n deleteTabs(path);\r\n };\r\n\r\n const searchStyle = computed(\r\n () => css`\r\n padding: 10px;\r\n border-bottom: 1px solid ${token.value.colorBorder};\r\n\r\n .tip-txt {\r\n color: ${token.value.colorPrimary};\r\n }\r\n `\r\n );\r\n\r\n const searchListStyle = computed(\r\n () => css`\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 400px;\r\n overflow-y: overlay;\r\n user-select: none;\r\n\r\n /* 整个滚动条 */\r\n\r\n ::-webkit-scrollbar {\r\n width: 4px; /* 垂直滚动条的宽度 */\r\n height: 4px; /* 水平滚动条的高度 */\r\n }\r\n\r\n /* 滚动条轨道 */\r\n\r\n ::-webkit-scrollbar-track {\r\n background: transparent; /* 轨道背景色 */\r\n border-radius: 0; /* 轨道圆角 */\r\n }\r\n\r\n /* 滚动条滑块 */\r\n\r\n ::-webkit-scrollbar-thumb {\r\n //background: #888; /* 滑块背景色 */\r\n // border-radius: 6px; /* 滑块圆角 */\r\n border: 3px solid\r\n ${token.value.colorPrimaryBorder}; /* 滑块边框 */\r\n }\r\n\r\n /* 滚动条滑块悬停效果 */\r\n\r\n ::-webkit-scrollbar-thumb:hover {\r\n background: red; /* 滑块悬停背景色 */\r\n }\r\n\r\n .search-title {\r\n position: sticky;\r\n top: 0;\r\n padding: 10px;\r\n background: ${token.value.colorPrimary};\r\n }\r\n\r\n ul {\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n min-width: 400px;\r\n\r\n li {\r\n display: flex;\r\n align-items: center;\r\n padding: 4px 10px;\r\n width: 400px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background-color: ${token.value\r\n .colorBgLayout};\r\n\r\n .close-wrapper {\r\n display: block;\r\n }\r\n }\r\n\r\n .icon {\r\n width: 42px;\r\n height: 42px;\r\n border-radius: 10px;\r\n background-color: ${token.value.colorPrimary};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n\r\n .content {\r\n padding-left: 10px;\r\n\r\n .time-ago {\r\n display: flex;\r\n align-items: center;\r\n font-size: 12px;\r\n\r\n .hostname {\r\n max-width: 180px;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n }\r\n\r\n .split {\r\n width: 4px;\r\n height: 4px;\r\n display: inline-block;\r\n background-color: ${token.value\r\n .colorPrimary};\r\n border-radius: 10px;\r\n margin: 0 6px;\r\n }\r\n }\r\n }\r\n\r\n .close-wrapper {\r\n display: none;\r\n flex: 1;\r\n text-align: right;\r\n\r\n .close-btn {\r\n display: inline-block;\r\n width: 22px;\r\n height: 22px;\r\n border-radius: 50%;\r\n text-align: center;\r\n\r\n &:hover {\r\n // background-color: ${token.value\r\n .colorBgLayout};\r\n }\r\n }\r\n }\r\n }\r\n }\r\n `\r\n );\r\n\r\n function timeAgo(providedTime: number) {\r\n const now = dayjs();\r\n const diffInSeconds = now.diff(\r\n providedTime,\r\n \"second\"\r\n ); // 计算时间差(秒)\r\n const diffInMinutes = now.diff(\r\n providedTime,\r\n \"minute\"\r\n ); // 计算时间差(分钟)\r\n const diffInHours = now.diff(providedTime, \"hour\"); // 计算时间差(小时)\r\n\r\n if (diffInMinutes < 1) {\r\n return `${diffInSeconds} 秒前`;\r\n } else if (diffInHours < 1) {\r\n return `${diffInMinutes} 分钟前`;\r\n } else {\r\n return `${diffInHours} 小时前`;\r\n }\r\n }\r\n\r\n const onJump = (item: NavTabsState) => {\r\n if (item.fullPath) {\r\n router.push(item.fullPath);\r\n }\r\n open.value = false;\r\n };\r\n\r\n const closeBtnStatus = (item: NavTabsState) => {\r\n // 如果meta有设置keepOpen则隐藏关闭按钮\r\n if (item.meta?.keepOpen) {\r\n return false;\r\n } else {\r\n // 如果只有一个标签,则隐藏关闭按钮\r\n return navTabList.value.length !== 1;\r\n }\r\n };\r\n\r\n return () => (\r\n <div>\r\n <a-popover\r\n v-model:open={open.value}\r\n placement={\"bottomRight\"}\r\n trigger={\"click\"}\r\n overlayClassName={\"search-popover-wrapper\"}\r\n >\r\n {{\r\n default: () => (\r\n <div style={{ marginRight: \"5px\" }}>\r\n <a-button\r\n style={{ borderRadius: \"10px\" }}\r\n icon={h(DownOutlined)}\r\n title={\"搜索标签页\"}\r\n />\r\n </div>\r\n ),\r\n content: () => (\r\n <>\r\n <div class={searchStyle.value}>\r\n <a-input\r\n v-model:value={searchKewords.value}\r\n placeholder={\"搜索标签页\"}\r\n bordered={false}\r\n >\r\n {{\r\n prefix: () => <SearchOutlined />,\r\n suffix: () => (\r\n <span class={\"tip-txt\"}>\r\n Ctrl+Shift+S\r\n </span>\r\n )\r\n }}\r\n </a-input>\r\n </div>\r\n <div class={searchListStyle.value}>\r\n <span class={\"search-title\"}>\r\n 打开的标签页\r\n </span>\r\n <ul>\r\n {filteredNavTabList.value.map(item => (\r\n <li onClick={() => onJump(item)}>\r\n <div class={\"icon\"}>\r\n <UnorderedListOutlined />\r\n </div>\r\n <div class={\"content\"}>\r\n <div class={\"title\"}>\r\n {item.meta?.title}\r\n </div>\r\n <div class={\"time-ago\"}>\r\n <span class={\"hostname\"}>\r\n {window.location.hostname +\r\n \"\" +\r\n item.path}\r\n </span>\r\n <span class={\"split\"}></span>\r\n <span class={\"time\"}>\r\n {timeAgo(item.openTime ?? 0)}\r\n </span>\r\n </div>\r\n </div>\r\n {closeBtnStatus(item) && (\r\n <div class={\"close-wrapper\"}>\r\n <span\r\n class={\"close-btn\"}\r\n onClick={() =>\r\n onCloseTab(\r\n item.fullPath || \"\"\r\n )\r\n }\r\n >\r\n <CloseOutlined />\r\n </span>\r\n </div>\r\n )}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n </>\r\n )\r\n }}\r\n </a-popover>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["defineComponent","name","setup","router","useRouter","useToken","theme","token","getList","deleteTabs","useNavTabStore","keys","useMagicKeys","shiftCtrlA","open","ref","y","useWindowScroll","navTabList","computed","sort","a","b","openTime","searchKewords","filteredNavTabList","list","value","query","toLowerCase","filter","item","fullPathMatch","fullPath","includes","title","meta","titleMatch","watch","v","val","onCloseTab","path","searchStyle","css","colorBorder","colorPrimary","searchListStyle","colorPrimaryBorder","colorBgLayout","timeAgo","providedTime","now","dayjs","diffInSeconds","diff","diffInMinutes","diffInHours","onJump","push","closeBtnStatus","keepOpen","length","_createVNode","_resolveComponent","$event","default","marginRight","borderRadius","h","DownOutlined","content","_Fragment","prefix","SearchOutlined","suffix","_createTextVNode","map","onClick","UnorderedListOutlined","window","location","hostname","CloseOutlined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Search.cjs","sources":["../../../../src/components/tab/Search.tsx"],"sourcesContent":["import {\r\n computed,\r\n ComputedRef,\r\n defineComponent,\r\n h,\r\n ref,\r\n watch\r\n} from \"vue\";\r\nimport { useRouter } from \"vue-router\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport {\r\n useMagicKeys,\r\n useWindowScroll\r\n} from \"@vueuse/core\";\r\n\r\nimport {\r\n CloseOutlined,\r\n DownOutlined,\r\n SearchOutlined,\r\n UnorderedListOutlined\r\n} from \"@ant-design/icons-vue\";\r\nimport {\r\n type NavTabsState,\r\n useNavTabStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\nimport dayjs from \"dayjs\";\r\n\r\nexport default defineComponent({\r\n name: \"Search\",\r\n setup() {\r\n const router = useRouter();\r\n\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } =\r\n useToken();\r\n\r\n const { getList, deleteTabs } = useNavTabStore();\r\n // 用来监听 Ctrl + Shift + S\r\n const keys = useMagicKeys();\r\n const shiftCtrlA = keys[\"Shift+Ctrl+S\"];\r\n const open = ref(false);\r\n const { y } = useWindowScroll();\r\n\r\n const navTabList = computed(() => {\r\n return getList!.sort(\r\n (a, b) => (b.openTime || 0) - (a.openTime || 0)\r\n );\r\n });\r\n\r\n // 添加搜索相关状态\r\n const searchKewords = ref(\"\"); // 搜索输入框的值\r\n const filteredNavTabList = computed(() => {\r\n const list = getList!.sort(\r\n (a, b) => (b.openTime || 0) - (a.openTime || 0)\r\n );\r\n\r\n if (!searchKewords.value) {\r\n return list; // 如果没有搜索词,返回完整列表\r\n }\r\n\r\n const query = searchKewords.value.toLowerCase();\r\n return list.filter(item => {\r\n const fullPathMatch = item.fullPath\r\n ?.toLowerCase()\r\n .includes(query);\r\n\r\n const title: string =\r\n (item.meta?.title as string) || \"\";\r\n\r\n const titleMatch = title\r\n .toLowerCase()\r\n .includes(query);\r\n\r\n return fullPathMatch || titleMatch;\r\n });\r\n });\r\n\r\n watch(shiftCtrlA, v => {\r\n if (v) {\r\n open.value = !open.value;\r\n }\r\n });\r\n\r\n watch(\r\n () => open.value,\r\n () => {\r\n searchKewords.value = \"\";\r\n }\r\n );\r\n\r\n watch(\r\n () => y.value,\r\n val => {\r\n if (val > 0) {\r\n open.value = false;\r\n }\r\n }\r\n );\r\n\r\n const onCloseTab = (path: string) => {\r\n deleteTabs(path);\r\n };\r\n\r\n const searchStyle = computed(\r\n () => css`\r\n padding: 10px;\r\n border-bottom: 1px solid ${token.value.colorBorder};\r\n\r\n .tip-txt {\r\n color: ${token.value.colorPrimary};\r\n }\r\n `\r\n );\r\n\r\n const searchListStyle = computed(\r\n () => css`\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 400px;\r\n overflow-y: overlay;\r\n user-select: none;\r\n\r\n /* 整个滚动条 */\r\n\r\n ::-webkit-scrollbar {\r\n width: 4px; /* 垂直滚动条的宽度 */\r\n height: 4px; /* 水平滚动条的高度 */\r\n }\r\n\r\n /* 滚动条轨道 */\r\n\r\n ::-webkit-scrollbar-track {\r\n background: transparent; /* 轨道背景色 */\r\n border-radius: 0; /* 轨道圆角 */\r\n }\r\n\r\n /* 滚动条滑块 */\r\n\r\n ::-webkit-scrollbar-thumb {\r\n //background: #888; /* 滑块背景色 */\r\n // border-radius: 6px; /* 滑块圆角 */\r\n border: 3px solid\r\n ${token.value.colorPrimaryBorder}; /* 滑块边框 */\r\n }\r\n\r\n /* 滚动条滑块悬停效果 */\r\n\r\n ::-webkit-scrollbar-thumb:hover {\r\n background: red; /* 滑块悬停背景色 */\r\n }\r\n\r\n .search-title {\r\n position: sticky;\r\n top: 0;\r\n padding: 10px;\r\n background: ${token.value.colorPrimary};\r\n }\r\n\r\n ul {\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n min-width: 400px;\r\n\r\n li {\r\n display: flex;\r\n align-items: center;\r\n padding: 4px 10px;\r\n width: 400px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background-color: ${token.value\r\n .colorBgLayout};\r\n\r\n .close-wrapper {\r\n display: block;\r\n }\r\n }\r\n\r\n .icon {\r\n width: 42px;\r\n height: 42px;\r\n border-radius: 10px;\r\n background-color: ${token.value.colorPrimary};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n\r\n .content {\r\n padding-left: 10px;\r\n\r\n .time-ago {\r\n display: flex;\r\n align-items: center;\r\n font-size: 12px;\r\n\r\n .hostname {\r\n max-width: 180px;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n }\r\n\r\n .split {\r\n width: 4px;\r\n height: 4px;\r\n display: inline-block;\r\n background-color: ${token.value\r\n .colorPrimary};\r\n border-radius: 10px;\r\n margin: 0 6px;\r\n }\r\n }\r\n }\r\n\r\n .close-wrapper {\r\n display: none;\r\n flex: 1;\r\n text-align: right;\r\n\r\n .close-btn {\r\n display: inline-block;\r\n width: 22px;\r\n height: 22px;\r\n border-radius: 50%;\r\n text-align: center;\r\n\r\n &:hover {\r\n // background-color: ${token.value\r\n .colorBgLayout};\r\n }\r\n }\r\n }\r\n }\r\n }\r\n `\r\n );\r\n\r\n function timeAgo(providedTime: number) {\r\n const now = dayjs();\r\n const diffInSeconds = now.diff(\r\n providedTime,\r\n \"second\"\r\n ); // 计算时间差(秒)\r\n const diffInMinutes = now.diff(\r\n providedTime,\r\n \"minute\"\r\n ); // 计算时间差(分钟)\r\n const diffInHours = now.diff(providedTime, \"hour\"); // 计算时间差(小时)\r\n\r\n if (diffInMinutes < 1) {\r\n return `${diffInSeconds} 秒前`;\r\n } else if (diffInHours < 1) {\r\n return `${diffInMinutes} 分钟前`;\r\n } else {\r\n return `${diffInHours} 小时前`;\r\n }\r\n }\r\n\r\n const onJump = (item: NavTabsState) => {\r\n if (item.fullPath) {\r\n router.push(item.fullPath);\r\n }\r\n open.value = false;\r\n };\r\n\r\n const closeBtnStatus = (item: NavTabsState) => {\r\n // 如果meta有设置keepOpen则隐藏关闭按钮\r\n if (item.meta?.keepOpen) {\r\n return false;\r\n } else {\r\n // 如果只有一个标签,则隐藏关闭按钮\r\n return navTabList.value.length !== 1;\r\n }\r\n };\r\n\r\n return () => (\r\n <div class={\"app-search-tab\"}>\r\n <a-popover\r\n v-model:open={open.value}\r\n placement={\"bottomRight\"}\r\n trigger={\"click\"}\r\n overlayClassName={\"search-popover-wrapper\"}\r\n >\r\n {{\r\n default: () => (\r\n <div style={{ marginRight: \"5px\" }}>\r\n <a-button\r\n style={{ borderRadius: \"10px\" }}\r\n icon={h(DownOutlined)}\r\n title={\"搜索标签页\"}\r\n />\r\n </div>\r\n ),\r\n content: () => (\r\n <>\r\n <div class={searchStyle.value}>\r\n <a-input\r\n v-model:value={searchKewords.value}\r\n placeholder={\"搜索标签页\"}\r\n bordered={false}\r\n >\r\n {{\r\n prefix: () => <SearchOutlined />,\r\n suffix: () => (\r\n <span class={\"tip-txt\"}>\r\n Ctrl+Shift+S\r\n </span>\r\n )\r\n }}\r\n </a-input>\r\n </div>\r\n <div class={searchListStyle.value}>\r\n <span class={\"search-title\"}>\r\n 打开的标签页\r\n </span>\r\n <ul>\r\n {filteredNavTabList.value.map(item => (\r\n <li onClick={() => onJump(item)}>\r\n <div class={\"icon\"}>\r\n <UnorderedListOutlined />\r\n </div>\r\n <div class={\"content\"}>\r\n <div class={\"title\"}>\r\n {item.meta?.title}\r\n </div>\r\n <div class={\"time-ago\"}>\r\n <span class={\"hostname\"}>\r\n {window.location.hostname +\r\n \"\" +\r\n item.path}\r\n </span>\r\n <span class={\"split\"}></span>\r\n <span class={\"time\"}>\r\n {timeAgo(item.openTime ?? 0)}\r\n </span>\r\n </div>\r\n </div>\r\n {closeBtnStatus(item) && (\r\n <div class={\"close-wrapper\"}>\r\n <span\r\n class={\"close-btn\"}\r\n onClick={() =>\r\n onCloseTab(\r\n item.fullPath || \"\"\r\n )\r\n }\r\n >\r\n <CloseOutlined />\r\n </span>\r\n </div>\r\n )}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n </>\r\n )\r\n }}\r\n </a-popover>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["defineComponent","name","setup","router","useRouter","useToken","theme","token","getList","deleteTabs","useNavTabStore","keys","useMagicKeys","shiftCtrlA","open","ref","y","useWindowScroll","navTabList","computed","sort","a","b","openTime","searchKewords","filteredNavTabList","list","value","query","toLowerCase","filter","item","fullPathMatch","fullPath","includes","title","meta","titleMatch","watch","v","val","onCloseTab","path","searchStyle","css","colorBorder","colorPrimary","searchListStyle","colorPrimaryBorder","colorBgLayout","timeAgo","providedTime","now","dayjs","diffInSeconds","diff","diffInMinutes","diffInHours","onJump","push","closeBtnStatus","keepOpen","length","_createVNode","_resolveComponent","$event","default","marginRight","borderRadius","h","DownOutlined","content","_Fragment","prefix","SearchOutlined","suffix","_createTextVNode","map","onClick","UnorderedListOutlined","window","location","hostname","CloseOutlined"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderLayout.vue2.mjs","sources":["../../../../../../src/components/layout/components/layout/HeaderLayout.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, type ComputedRef } from \"vue\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport {\r\n MenuFoldOutlined,\r\n MenuUnfoldOutlined\r\n} from \"@ant-design/icons-vue\";\r\nimport { useAppStore } from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\n\r\nimport Tab from \"../../../tab/Tab.vue\";\r\n\r\nconst { layout, modeConfig, headerTokenStyle } =\r\n storeToRefs(useAppStore());\r\nconst {\r\n headerStyle,\r\n headerTabStyle,\r\n collapsedStyle,\r\n rightStyle\r\n} = useStyle();\r\n\r\nfunction useStyle(): {\r\n headerStyle: ComputedRef<string>;\r\n headerTabStyle: ComputedRef<string>;\r\n collapsedStyle: ComputedRef<string>;\r\n rightStyle: ComputedRef<string>;\r\n} {\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } =\r\n useToken();\r\n\r\n const left = computed(\r\n () =>\r\n `${layout.value.collapsed ? layout.value.collapsedWidth : layout.value.sideWidth}px`\r\n );\r\n\r\n const headerStyle = computed(\r\n () => css`\r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n z-index: 1;\r\n background-color: ${modeConfig.value.mode !== \"light\"\r\n ? token.value.colorBgContainer\r\n : headerTokenStyle.value.bgColor};\r\n left: ${left.value};\r\n height: ${layout.value.headerHeight}px;\r\n transition: left 0.4s cubic-bezier(0.22, 1.2, 0.36, 1);\r\n display: flex;\r\n align-items: flex-end;\r\n `\r\n );\r\n\r\n const headerTabStyle = computed(\r\n () => css`\r\n flex: 1;\r\n overflow: hidden;\r\n padding-right: 10px;\r\n `\r\n );\r\n\r\n const collapsedStyle = computed(\r\n () => css`\r\n padding: 0 10px;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: ${modeConfig.value.mode === \"light\"\r\n ? headerTokenStyle.value.txtColor\r\n : \"inherit\"};\r\n `\r\n );\r\n\r\n const rightStyle = computed(\r\n () => css`\r\n height: 100%;\r\n `\r\n );\r\n\r\n return {\r\n headerStyle,\r\n headerTabStyle,\r\n collapsedStyle,\r\n rightStyle\r\n };\r\n}\r\n</script>\r\n\r\n<template>\r\n <div :class=\"headerStyle\">\r\n <div\r\n :class=\"collapsedStyle\"\r\n @click=\"layout.collapsed = !layout.collapsed\"\r\n >\r\n <menu-unfold-outlined\r\n v-if=\"layout.collapsed\"\r\n class=\"trigger\"\r\n />\r\n <menu-fold-outlined v-else />\r\n </div>\r\n <div :class=\"headerTabStyle\">\r\n <Tab />\r\n </div>\r\n <div :class=\"rightStyle\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n"],"names":["headerStyle","headerTabStyle","collapsedStyle","rightStyle"],"mappings":";;;;;;;;;;;;;AAeA,IAAA,MAAM,EAAE,MAAQ,EAAA,UAAA,EAAY,kBAC1B,GAAA,WAAA,CAAY,aAAa,CAAA;AAC3B,IAAM,MAAA;AAAA,MACJ,WAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,QACE,QAAS,EAAA;AAEb,IAAA,SAAS,QAKP,GAAA;AACA,MAAM,MAAA,EAAE,UAAa,GAAA,KAAA;AACrB,MAAM,MAAA,EAAE,KAAM,EAAA,GACZ,QAAS,EAAA;AAEX,MAAA,MAAM,IAAO,GAAA,QAAA;AAAA,QACX,MACE,CAAG,EAAA,MAAA,CAAO,KAAM,CAAA,SAAA,GAAY,OAAO,KAAM,CAAA,cAAA,GAAiB,MAAO,CAAA,KAAA,CAAM,SAAS,CAAA,EAAA;AAAA,OACpF;AAEA,MAAA,MAAMA,YAAc,GAAA,QAAA;AAAA,QAClB,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKgB,EAAA,UAAA,CAAW,MAAM,IAAS,KAAA,OAAA,GAC1C,MAAM,KAAM,CAAA,gBAAA,GACZ,gBAAiB,CAAA,KAAA,CAAM,OAAO,CAAA;AAAA,YAAA,EAC1B,KAAK,KAAK,CAAA;AAAA,cACR,EAAA,MAAA,CAAO,MAAM,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,OAKvC;AAEA,MAAA,MAAMC,eAAiB,GAAA,QAAA;AAAA,QACrB,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,OAKR;AAEA,MAAA,MAAMC,eAAiB,GAAA,QAAA;AAAA,QACrB,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAOK,WAAW,KAAM,CAAA,IAAA,KAAS,UAC/B,gBAAiB,CAAA,KAAA,CAAM,WACvB,SAAS,CAAA;AAAA,IAAA;AAAA,OAEjB;AAEA,MAAA,MAAMC,WAAa,GAAA,QAAA;AAAA,QACjB,MAAM,GAAA;AAAA;AAAA,IAAA;AAAA,OAGR;AAEA,MAAO,OAAA;AAAA,QACL,WAAAH,EAAAA,YAAAA;AAAA,QACA,cAAAC,EAAAA,eAAAA;AAAA,QACA,cAAAC,EAAAA,eAAAA;AAAA,QACA,UAAAC,EAAAA;AAAA,OACF;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"HeaderLayout.vue2.mjs","sources":["../../../../../../src/components/layout/components/layout/HeaderLayout.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, type ComputedRef } from \"vue\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport {\r\n MenuFoldOutlined,\r\n MenuUnfoldOutlined\r\n} from \"@ant-design/icons-vue\";\r\nimport { useAppStore } from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\n\r\nimport Tab from \"../../../tab/Tab.vue\";\r\n\r\nconst { layout, modeConfig, headerTokenStyle } =\r\n storeToRefs(useAppStore());\r\nconst {\r\n headerStyle,\r\n headerTabStyle,\r\n collapsedStyle,\r\n rightStyle\r\n} = useStyle();\r\n\r\nfunction useStyle(): {\r\n headerStyle: ComputedRef<string>;\r\n headerTabStyle: ComputedRef<string>;\r\n collapsedStyle: ComputedRef<string>;\r\n rightStyle: ComputedRef<string>;\r\n} {\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } =\r\n useToken();\r\n\r\n const left = computed(\r\n () =>\r\n `${layout.value.collapsed ? layout.value.collapsedWidth : layout.value.sideWidth}px`\r\n );\r\n\r\n const headerStyle = computed(\r\n () => css`\r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n z-index: 1;\r\n background-color: ${modeConfig.value.mode !== \"light\"\r\n ? token.value.colorBgContainer\r\n : headerTokenStyle.value.bgColor};\r\n left: ${left.value};\r\n height: ${layout.value.headerHeight}px;\r\n transition: left 0.4s cubic-bezier(0.22, 1.2, 0.36, 1);\r\n display: flex;\r\n align-items: flex-end;\r\n `\r\n );\r\n\r\n const headerTabStyle = computed(\r\n () => css`\r\n flex: 1;\r\n overflow: hidden;\r\n padding-right: 10px;\r\n `\r\n );\r\n\r\n const collapsedStyle = computed(\r\n () => css`\r\n padding: 0 10px;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: ${modeConfig.value.mode === \"light\"\r\n ? headerTokenStyle.value.txtColor\r\n : \"inherit\"};\r\n `\r\n );\r\n\r\n const rightStyle = computed(\r\n () => css`\r\n height: 100%;\r\n `\r\n );\r\n\r\n return {\r\n headerStyle,\r\n headerTabStyle,\r\n collapsedStyle,\r\n rightStyle\r\n };\r\n}\r\n</script>\r\n\r\n<template>\r\n <div :class=\"[headerStyle, 'app-header-layout']\">\r\n <div\r\n :class=\"collapsedStyle\"\r\n @click=\"layout.collapsed = !layout.collapsed\"\r\n >\r\n <menu-unfold-outlined\r\n v-if=\"layout.collapsed\"\r\n class=\"trigger\"\r\n />\r\n <menu-fold-outlined v-else />\r\n </div>\r\n <div :class=\"headerTabStyle\">\r\n <Tab />\r\n </div>\r\n <div :class=\"rightStyle\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n"],"names":["headerStyle","headerTabStyle","collapsedStyle","rightStyle"],"mappings":";;;;;;;;;;;;;AAeA,IAAA,MAAM,EAAE,MAAQ,EAAA,UAAA,EAAY,kBAC1B,GAAA,WAAA,CAAY,aAAa,CAAA;AAC3B,IAAM,MAAA;AAAA,MACJ,WAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,QACE,QAAS,EAAA;AAEb,IAAA,SAAS,QAKP,GAAA;AACA,MAAM,MAAA,EAAE,UAAa,GAAA,KAAA;AACrB,MAAM,MAAA,EAAE,KAAM,EAAA,GACZ,QAAS,EAAA;AAEX,MAAA,MAAM,IAAO,GAAA,QAAA;AAAA,QACX,MACE,CAAG,EAAA,MAAA,CAAO,KAAM,CAAA,SAAA,GAAY,OAAO,KAAM,CAAA,cAAA,GAAiB,MAAO,CAAA,KAAA,CAAM,SAAS,CAAA,EAAA;AAAA,OACpF;AAEA,MAAA,MAAMA,YAAc,GAAA,QAAA;AAAA,QAClB,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKgB,EAAA,UAAA,CAAW,MAAM,IAAS,KAAA,OAAA,GAC1C,MAAM,KAAM,CAAA,gBAAA,GACZ,gBAAiB,CAAA,KAAA,CAAM,OAAO,CAAA;AAAA,YAAA,EAC1B,KAAK,KAAK,CAAA;AAAA,cACR,EAAA,MAAA,CAAO,MAAM,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,OAKvC;AAEA,MAAA,MAAMC,eAAiB,GAAA,QAAA;AAAA,QACrB,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,OAKR;AAEA,MAAA,MAAMC,eAAiB,GAAA,QAAA;AAAA,QACrB,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAOK,WAAW,KAAM,CAAA,IAAA,KAAS,UAC/B,gBAAiB,CAAA,KAAA,CAAM,WACvB,SAAS,CAAA;AAAA,IAAA;AAAA,OAEjB;AAEA,MAAA,MAAMC,WAAa,GAAA,QAAA;AAAA,QACjB,MAAM,GAAA;AAAA;AAAA,IAAA;AAAA,OAGR;AAEA,MAAO,OAAA;AAAA,QACL,WAAAH,EAAAA,YAAAA;AAAA,QACA,cAAAC,EAAAA,eAAAA;AAAA,QACA,cAAAC,EAAAA,eAAAA;AAAA,QACA,UAAAC,EAAAA;AAAA,OACF;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -81,12 +81,26 @@ var Menu = /* @__PURE__ */ defineComponent({
|
|
|
81
81
|
} = storeToRefs(useMenuStore());
|
|
82
82
|
const route = useRoute();
|
|
83
83
|
const router = useRouter();
|
|
84
|
+
const findClosestParentMenu = (url, menus) => {
|
|
85
|
+
const cleanUrl = url.split("?")[0].split("#")[0];
|
|
86
|
+
const pathSegments = cleanUrl.split("/").filter(Boolean);
|
|
87
|
+
for (let i = pathSegments.length; i > 0; i--) {
|
|
88
|
+
const testPath = "/" + pathSegments.slice(0, i).join("/");
|
|
89
|
+
const foundItem = findMenuItemByUrl(testPath, menus);
|
|
90
|
+
if (foundItem) return foundItem;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
};
|
|
84
94
|
watch(() => route.fullPath, (path) => __async(this, null, function* () {
|
|
85
95
|
const flag = selectedKeys2.value.some((item) => item === path);
|
|
86
96
|
if (!flag) {
|
|
87
|
-
|
|
97
|
+
let menuItem = findMenuItemByUrl(path, data.value);
|
|
98
|
+
if (!menuItem) {
|
|
99
|
+
menuItem = findClosestParentMenu(path, data.value);
|
|
100
|
+
}
|
|
88
101
|
if (!menuItem) {
|
|
89
102
|
openKeys2.value = [];
|
|
103
|
+
selectedKeys2.value = [path];
|
|
90
104
|
} else {
|
|
91
105
|
const rs = getFullParentChain(menuItem.id, data.value);
|
|
92
106
|
if (!layout.value.collapsed) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.mjs","sources":["../../../../../../src/components/layout/components/menu/Menu.tsx"],"sourcesContent":["import { computed, defineComponent, watch } from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport {\r\n useAppStore,\r\n useMenuStore,\r\n useNoStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\n\r\nimport useMenuCore from \"../../../../utils/useMenuCore\";\r\n\r\nexport default defineComponent({\r\n name: \"DMenu\",\r\n emits: [\"onMenuClick\"],\r\n setup(_, { emit }) {\r\n const { layout, modeConfig } =\r\n storeToRefs(useAppStore());\r\n const { findMatchedMenuById, findMenuItemByUrl } =\r\n useMenuCore();\r\n const { menuList } = storeToRefs(useNoStore());\r\n const { menuWrapperStyle } = useStyle();\r\n const { openKeys, selectedKeys, onClick } = useMenu();\r\n\r\n function useStyle() {\r\n const menuWrapperStyle = computed(\r\n () => css`\r\n flex: 1;\r\n overflow: hidden;\r\n\r\n .ant-menu {\r\n height: 100%;\r\n overflow: scroll;\r\n -ms-overflow-style: none; /* 对 IE 和 Edge 生效 */\r\n scrollbar-width: none; /* 对 Firefox 生效 */\r\n\r\n ${modeConfig.value.mode === \"light\"\r\n ? \"background:transparent;\"\r\n : \"\"}\r\n /* Webkit 浏览器 */\r\n ::-webkit-scrollbar {\r\n display: none;\r\n }\r\n }\r\n `\r\n );\r\n return {\r\n menuWrapperStyle\r\n };\r\n }\r\n\r\n function useMenu() {\r\n const { openKeys, selectedKeys, data } =\r\n storeToRefs(useMenuStore());\r\n const route = useRoute();\r\n const router = useRouter();\r\n\r\n /**\r\n * 在标签切换的时候,路由会变化,需要动态关联左侧菜单的选中状态\r\n */\r\n watch(\r\n () => route.fullPath,\r\n async path => {\r\n const flag = selectedKeys.value.some(\r\n (item: string) => item === path\r\n );\r\n if (!flag) {\r\n const menuItem = findMenuItemByUrl(\r\n path,\r\n data.value\r\n );\r\n if (!menuItem) {\r\n openKeys.value = [];\r\n } else {\r\n const rs = getFullParentChain(\r\n menuItem.id,\r\n data.value as never\r\n );\r\n if (!layout.value.collapsed) {\r\n openKeys.value = rs!;\r\n }\r\n selectedKeys.value = [menuItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n watch(\r\n () => layout.value.collapsed,\r\n val => {\r\n const id = selectedKeys.value[0];\r\n const rs = findMatchedMenuById(\r\n id,\r\n data.value as never\r\n );\r\n\r\n if (val) {\r\n openKeys.value = [];\r\n } else {\r\n if (rs?.parentItem) {\r\n openKeys.value = [rs.parentItem.key];\r\n } else {\r\n openKeys.value = [rs!.matchItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n /**\r\n * 获取从根到目标菜单项的完整 key 链\r\n * @param targetId 目标菜单项 id\r\n * @param menus 菜单数据\r\n * @param parentChain 递归传递的父级链\r\n */\r\n const getFullParentChain = (\r\n targetId: string,\r\n menus: any[],\r\n parentChain: string[] = []\r\n ): string[] | null => {\r\n for (const menu of menus) {\r\n // 找到目标项,返回完整链(包含自身 key)\r\n if (menu.id === targetId) {\r\n return [...parentChain, menu.key];\r\n }\r\n\r\n // 递归查找子菜单\r\n if (menu.children?.length) {\r\n const result = getFullParentChain(\r\n targetId,\r\n menu.children,\r\n [...parentChain, menu.key] // 传递当前层级的 key\r\n );\r\n if (result) return result;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const onClick = ({\r\n key,\r\n keyPath,\r\n item\r\n }: {\r\n item: { originItemValue: any };\r\n key: string;\r\n keyPath: string[];\r\n }) => {\r\n const rs = findMatchedMenuById(key, data.value);\r\n if (\r\n item.originItemValue?.isFrame &&\r\n item.originItemValue?.isFrame === \"0\"\r\n ) {\r\n emit(\"onMenuClick\", item);\r\n } else {\r\n openKeys.value = keyPath;\r\n selectedKeys.value = [rs.matchItem?.key];\r\n if (rs.matchItem?.url !== route.path) {\r\n // 判断目标路由和当前路由是否相等;\r\n // 不相等的时候再跳转\r\n router.push(rs.matchItem?.url).then(r => {\r\n if (r) {\r\n console.warn(r);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n return {\r\n openKeys,\r\n selectedKeys,\r\n data,\r\n onClick\r\n };\r\n }\r\n\r\n return () => (\r\n <div class={menuWrapperStyle.value}>\r\n <a-menu\r\n v-model:open-keys={openKeys.value}\r\n v-model:selected-keys={selectedKeys.value}\r\n items={menuList.value}\r\n mode=\"inline\"\r\n triggerSubMenuAction={\"hover\"}\r\n onClick={onClick}\r\n ></a-menu>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["name","emits","setup","_","emit","layout","modeConfig","storeToRefs","useAppStore","findMatchedMenuById","findMenuItemByUrl","useMenuCore","menuList","useNoStore","menuWrapperStyle","useStyle","openKeys","selectedKeys","onClick","useMenu","computed","css","value","mode","data","useMenuStore","route","useRoute","router","useRouter","watch","fullPath","path","flag","some","item","menuItem","rs","getFullParentChain","id","collapsed","key","val","parentItem","matchItem","targetId","menus","parentChain","menu","children","length","result","keyPath","originItemValue","isFrame","url","push","then","r","console","warn","_createVNode","_resolveComponent","$event"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Menu.mjs","sources":["../../../../../../src/components/layout/components/menu/Menu.tsx"],"sourcesContent":["import { computed, defineComponent, watch } from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport {\r\n useAppStore,\r\n useMenuStore,\r\n useNoStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\n\r\nimport useMenuCore from \"../../../../utils/useMenuCore\";\r\n\r\nexport default defineComponent({\r\n name: \"DMenu\",\r\n emits: [\"onMenuClick\"],\r\n setup(_, { emit }) {\r\n const { layout, modeConfig } =\r\n storeToRefs(useAppStore());\r\n const { findMatchedMenuById, findMenuItemByUrl } =\r\n useMenuCore();\r\n const { menuList } = storeToRefs(useNoStore());\r\n const { menuWrapperStyle } = useStyle();\r\n const { openKeys, selectedKeys, onClick } = useMenu();\r\n\r\n function useStyle() {\r\n const menuWrapperStyle = computed(\r\n () => css`\r\n flex: 1;\r\n overflow: hidden;\r\n\r\n .ant-menu {\r\n height: 100%;\r\n overflow: scroll;\r\n -ms-overflow-style: none; /* 对 IE 和 Edge 生效 */\r\n scrollbar-width: none; /* 对 Firefox 生效 */\r\n\r\n ${modeConfig.value.mode === \"light\"\r\n ? \"background:transparent;\"\r\n : \"\"}\r\n /* Webkit 浏览器 */\r\n ::-webkit-scrollbar {\r\n display: none;\r\n }\r\n }\r\n `\r\n );\r\n return {\r\n menuWrapperStyle\r\n };\r\n }\r\n\r\n function useMenu() {\r\n const { openKeys, selectedKeys, data } =\r\n storeToRefs(useMenuStore());\r\n const route = useRoute();\r\n const router = useRouter();\r\n\r\n /**\r\n * 根据URL路径查找最接近的父级菜单\r\n */\r\n const findClosestParentMenu = (\r\n url: string,\r\n menus: any[]\r\n ): any => {\r\n // 移除查询参数和哈希\r\n const cleanUrl = url.split(\"?\")[0].split(\"#\")[0];\r\n const pathSegments = cleanUrl\r\n .split(\"/\")\r\n .filter(Boolean);\r\n\r\n // 从最长路径开始尝试匹配\r\n for (let i = pathSegments.length; i > 0; i--) {\r\n const testPath =\r\n \"/\" + pathSegments.slice(0, i).join(\"/\");\r\n const foundItem = findMenuItemByUrl(\r\n testPath,\r\n menus\r\n );\r\n if (foundItem) return foundItem;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n /**\r\n * 在标签切换的时候,路由会变化,需要动态关联左侧菜单的选中状态\r\n */\r\n watch(\r\n () => route.fullPath,\r\n async path => {\r\n const flag = selectedKeys.value.some(\r\n (item: string) => item === path\r\n );\r\n if (!flag) {\r\n let menuItem = findMenuItemByUrl(\r\n path,\r\n data.value\r\n );\r\n\r\n // 如果没有精确匹配,尝试匹配父级路径\r\n if (!menuItem) {\r\n menuItem = findClosestParentMenu(\r\n path,\r\n data.value\r\n );\r\n }\r\n\r\n if (!menuItem) {\r\n openKeys.value = [];\r\n selectedKeys.value = [path];\r\n } else {\r\n const rs = getFullParentChain(\r\n menuItem.id,\r\n data.value as never\r\n );\r\n if (!layout.value.collapsed) {\r\n openKeys.value = rs!;\r\n }\r\n selectedKeys.value = [menuItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n watch(\r\n () => layout.value.collapsed,\r\n val => {\r\n const id = selectedKeys.value[0];\r\n const rs = findMatchedMenuById(\r\n id,\r\n data.value as never\r\n );\r\n\r\n if (val) {\r\n openKeys.value = [];\r\n } else {\r\n if (rs?.parentItem) {\r\n openKeys.value = [rs.parentItem.key];\r\n } else {\r\n openKeys.value = [rs!.matchItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n /**\r\n * 获取从根到目标菜单项的完整 key 链\r\n * @param targetId 目标菜单项 id\r\n * @param menus 菜单数据\r\n * @param parentChain 递归传递的父级链\r\n */\r\n const getFullParentChain = (\r\n targetId: string,\r\n menus: any[],\r\n parentChain: string[] = []\r\n ): string[] | null => {\r\n for (const menu of menus) {\r\n // 找到目标项,返回完整链(包含自身 key)\r\n if (menu.id === targetId) {\r\n return [...parentChain, menu.key];\r\n }\r\n\r\n // 递归查找子菜单\r\n if (menu.children?.length) {\r\n const result = getFullParentChain(\r\n targetId,\r\n menu.children,\r\n [...parentChain, menu.key] // 传递当前层级的 key\r\n );\r\n if (result) return result;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const onClick = ({\r\n key,\r\n keyPath,\r\n item\r\n }: {\r\n item: { originItemValue: any };\r\n key: string;\r\n keyPath: string[];\r\n }) => {\r\n const rs = findMatchedMenuById(key, data.value);\r\n if (\r\n item.originItemValue?.isFrame &&\r\n item.originItemValue?.isFrame === \"0\"\r\n ) {\r\n emit(\"onMenuClick\", item);\r\n } else {\r\n openKeys.value = keyPath;\r\n selectedKeys.value = [rs.matchItem?.key];\r\n if (rs.matchItem?.url !== route.path) {\r\n // 判断目标路由和当前路由是否相等;\r\n // 不相等的时候再跳转\r\n router.push(rs.matchItem?.url).then(r => {\r\n if (r) {\r\n console.warn(r);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n return {\r\n openKeys,\r\n selectedKeys,\r\n data,\r\n onClick\r\n };\r\n }\r\n\r\n return () => (\r\n <div class={menuWrapperStyle.value}>\r\n <a-menu\r\n v-model:open-keys={openKeys.value}\r\n v-model:selected-keys={selectedKeys.value}\r\n items={menuList.value}\r\n mode=\"inline\"\r\n triggerSubMenuAction={\"hover\"}\r\n onClick={onClick}\r\n ></a-menu>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["name","emits","setup","_","emit","layout","modeConfig","storeToRefs","useAppStore","findMatchedMenuById","findMenuItemByUrl","useMenuCore","menuList","useNoStore","menuWrapperStyle","useStyle","openKeys","selectedKeys","onClick","useMenu","computed","css","value","mode","data","useMenuStore","route","useRoute","router","useRouter","findClosestParentMenu","url","menus","cleanUrl","split","pathSegments","filter","Boolean","i","length","testPath","slice","join","foundItem","watch","fullPath","path","flag","some","item","menuItem","rs","getFullParentChain","id","collapsed","key","val","parentItem","matchItem","targetId","parentChain","menu","children","result","keyPath","originItemValue","isFrame","push","then","r","console","warn","_createVNode","_resolveComponent","$event"],"mappings":"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"}
|
|
@@ -217,7 +217,9 @@ var Search = /* @__PURE__ */ defineComponent({
|
|
|
217
217
|
return navTabList.value.length !== 1;
|
|
218
218
|
}
|
|
219
219
|
};
|
|
220
|
-
return () => createVNode("div",
|
|
220
|
+
return () => createVNode("div", {
|
|
221
|
+
"class": "app-search-tab"
|
|
222
|
+
}, [createVNode(resolveComponent("a-popover"), {
|
|
221
223
|
"open": open.value,
|
|
222
224
|
"onUpdate:open": ($event) => open.value = $event,
|
|
223
225
|
"placement": "bottomRight",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Search.mjs","sources":["../../../../src/components/tab/Search.tsx"],"sourcesContent":["import {\r\n computed,\r\n ComputedRef,\r\n defineComponent,\r\n h,\r\n ref,\r\n watch\r\n} from \"vue\";\r\nimport { useRouter } from \"vue-router\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport {\r\n useMagicKeys,\r\n useWindowScroll\r\n} from \"@vueuse/core\";\r\n\r\nimport {\r\n CloseOutlined,\r\n DownOutlined,\r\n SearchOutlined,\r\n UnorderedListOutlined\r\n} from \"@ant-design/icons-vue\";\r\nimport {\r\n type NavTabsState,\r\n useNavTabStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\nimport dayjs from \"dayjs\";\r\n\r\nexport default defineComponent({\r\n name: \"Search\",\r\n setup() {\r\n const router = useRouter();\r\n\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } =\r\n useToken();\r\n\r\n const { getList, deleteTabs } = useNavTabStore();\r\n // 用来监听 Ctrl + Shift + S\r\n const keys = useMagicKeys();\r\n const shiftCtrlA = keys[\"Shift+Ctrl+S\"];\r\n const open = ref(false);\r\n const { y } = useWindowScroll();\r\n\r\n const navTabList = computed(() => {\r\n return getList!.sort(\r\n (a, b) => (b.openTime || 0) - (a.openTime || 0)\r\n );\r\n });\r\n\r\n // 添加搜索相关状态\r\n const searchKewords = ref(\"\"); // 搜索输入框的值\r\n const filteredNavTabList = computed(() => {\r\n const list = getList!.sort(\r\n (a, b) => (b.openTime || 0) - (a.openTime || 0)\r\n );\r\n\r\n if (!searchKewords.value) {\r\n return list; // 如果没有搜索词,返回完整列表\r\n }\r\n\r\n const query = searchKewords.value.toLowerCase();\r\n return list.filter(item => {\r\n const fullPathMatch = item.fullPath\r\n ?.toLowerCase()\r\n .includes(query);\r\n\r\n const title: string =\r\n (item.meta?.title as string) || \"\";\r\n\r\n const titleMatch = title\r\n .toLowerCase()\r\n .includes(query);\r\n\r\n return fullPathMatch || titleMatch;\r\n });\r\n });\r\n\r\n watch(shiftCtrlA, v => {\r\n if (v) {\r\n open.value = !open.value;\r\n }\r\n });\r\n\r\n watch(\r\n () => open.value,\r\n () => {\r\n searchKewords.value = \"\";\r\n }\r\n );\r\n\r\n watch(\r\n () => y.value,\r\n val => {\r\n if (val > 0) {\r\n open.value = false;\r\n }\r\n }\r\n );\r\n\r\n const onCloseTab = (path: string) => {\r\n deleteTabs(path);\r\n };\r\n\r\n const searchStyle = computed(\r\n () => css`\r\n padding: 10px;\r\n border-bottom: 1px solid ${token.value.colorBorder};\r\n\r\n .tip-txt {\r\n color: ${token.value.colorPrimary};\r\n }\r\n `\r\n );\r\n\r\n const searchListStyle = computed(\r\n () => css`\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 400px;\r\n overflow-y: overlay;\r\n user-select: none;\r\n\r\n /* 整个滚动条 */\r\n\r\n ::-webkit-scrollbar {\r\n width: 4px; /* 垂直滚动条的宽度 */\r\n height: 4px; /* 水平滚动条的高度 */\r\n }\r\n\r\n /* 滚动条轨道 */\r\n\r\n ::-webkit-scrollbar-track {\r\n background: transparent; /* 轨道背景色 */\r\n border-radius: 0; /* 轨道圆角 */\r\n }\r\n\r\n /* 滚动条滑块 */\r\n\r\n ::-webkit-scrollbar-thumb {\r\n //background: #888; /* 滑块背景色 */\r\n // border-radius: 6px; /* 滑块圆角 */\r\n border: 3px solid\r\n ${token.value.colorPrimaryBorder}; /* 滑块边框 */\r\n }\r\n\r\n /* 滚动条滑块悬停效果 */\r\n\r\n ::-webkit-scrollbar-thumb:hover {\r\n background: red; /* 滑块悬停背景色 */\r\n }\r\n\r\n .search-title {\r\n position: sticky;\r\n top: 0;\r\n padding: 10px;\r\n background: ${token.value.colorPrimary};\r\n }\r\n\r\n ul {\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n min-width: 400px;\r\n\r\n li {\r\n display: flex;\r\n align-items: center;\r\n padding: 4px 10px;\r\n width: 400px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background-color: ${token.value\r\n .colorBgLayout};\r\n\r\n .close-wrapper {\r\n display: block;\r\n }\r\n }\r\n\r\n .icon {\r\n width: 42px;\r\n height: 42px;\r\n border-radius: 10px;\r\n background-color: ${token.value.colorPrimary};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n\r\n .content {\r\n padding-left: 10px;\r\n\r\n .time-ago {\r\n display: flex;\r\n align-items: center;\r\n font-size: 12px;\r\n\r\n .hostname {\r\n max-width: 180px;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n }\r\n\r\n .split {\r\n width: 4px;\r\n height: 4px;\r\n display: inline-block;\r\n background-color: ${token.value\r\n .colorPrimary};\r\n border-radius: 10px;\r\n margin: 0 6px;\r\n }\r\n }\r\n }\r\n\r\n .close-wrapper {\r\n display: none;\r\n flex: 1;\r\n text-align: right;\r\n\r\n .close-btn {\r\n display: inline-block;\r\n width: 22px;\r\n height: 22px;\r\n border-radius: 50%;\r\n text-align: center;\r\n\r\n &:hover {\r\n // background-color: ${token.value\r\n .colorBgLayout};\r\n }\r\n }\r\n }\r\n }\r\n }\r\n `\r\n );\r\n\r\n function timeAgo(providedTime: number) {\r\n const now = dayjs();\r\n const diffInSeconds = now.diff(\r\n providedTime,\r\n \"second\"\r\n ); // 计算时间差(秒)\r\n const diffInMinutes = now.diff(\r\n providedTime,\r\n \"minute\"\r\n ); // 计算时间差(分钟)\r\n const diffInHours = now.diff(providedTime, \"hour\"); // 计算时间差(小时)\r\n\r\n if (diffInMinutes < 1) {\r\n return `${diffInSeconds} 秒前`;\r\n } else if (diffInHours < 1) {\r\n return `${diffInMinutes} 分钟前`;\r\n } else {\r\n return `${diffInHours} 小时前`;\r\n }\r\n }\r\n\r\n const onJump = (item: NavTabsState) => {\r\n if (item.fullPath) {\r\n router.push(item.fullPath);\r\n }\r\n open.value = false;\r\n };\r\n\r\n const closeBtnStatus = (item: NavTabsState) => {\r\n // 如果meta有设置keepOpen则隐藏关闭按钮\r\n if (item.meta?.keepOpen) {\r\n return false;\r\n } else {\r\n // 如果只有一个标签,则隐藏关闭按钮\r\n return navTabList.value.length !== 1;\r\n }\r\n };\r\n\r\n return () => (\r\n <div>\r\n <a-popover\r\n v-model:open={open.value}\r\n placement={\"bottomRight\"}\r\n trigger={\"click\"}\r\n overlayClassName={\"search-popover-wrapper\"}\r\n >\r\n {{\r\n default: () => (\r\n <div style={{ marginRight: \"5px\" }}>\r\n <a-button\r\n style={{ borderRadius: \"10px\" }}\r\n icon={h(DownOutlined)}\r\n title={\"搜索标签页\"}\r\n />\r\n </div>\r\n ),\r\n content: () => (\r\n <>\r\n <div class={searchStyle.value}>\r\n <a-input\r\n v-model:value={searchKewords.value}\r\n placeholder={\"搜索标签页\"}\r\n bordered={false}\r\n >\r\n {{\r\n prefix: () => <SearchOutlined />,\r\n suffix: () => (\r\n <span class={\"tip-txt\"}>\r\n Ctrl+Shift+S\r\n </span>\r\n )\r\n }}\r\n </a-input>\r\n </div>\r\n <div class={searchListStyle.value}>\r\n <span class={\"search-title\"}>\r\n 打开的标签页\r\n </span>\r\n <ul>\r\n {filteredNavTabList.value.map(item => (\r\n <li onClick={() => onJump(item)}>\r\n <div class={\"icon\"}>\r\n <UnorderedListOutlined />\r\n </div>\r\n <div class={\"content\"}>\r\n <div class={\"title\"}>\r\n {item.meta?.title}\r\n </div>\r\n <div class={\"time-ago\"}>\r\n <span class={\"hostname\"}>\r\n {window.location.hostname +\r\n \"\" +\r\n item.path}\r\n </span>\r\n <span class={\"split\"}></span>\r\n <span class={\"time\"}>\r\n {timeAgo(item.openTime ?? 0)}\r\n </span>\r\n </div>\r\n </div>\r\n {closeBtnStatus(item) && (\r\n <div class={\"close-wrapper\"}>\r\n <span\r\n class={\"close-btn\"}\r\n onClick={() =>\r\n onCloseTab(\r\n item.fullPath || \"\"\r\n )\r\n }\r\n >\r\n <CloseOutlined />\r\n </span>\r\n </div>\r\n )}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n </>\r\n )\r\n }}\r\n </a-popover>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["name","setup","router","useRouter","useToken","theme","token","getList","deleteTabs","useNavTabStore","keys","useMagicKeys","shiftCtrlA","open","ref","y","useWindowScroll","navTabList","computed","sort","a","b","openTime","searchKewords","filteredNavTabList","list","value","query","toLowerCase","filter","item","fullPathMatch","fullPath","includes","title","meta","titleMatch","watch","v","val","onCloseTab","path","searchStyle","css","colorBorder","colorPrimary","searchListStyle","colorPrimaryBorder","colorBgLayout","timeAgo","providedTime","now","dayjs","diffInSeconds","diff","diffInMinutes","diffInHours","onJump","push","closeBtnStatus","keepOpen","length","_createVNode","_resolveComponent","$event","default","marginRight","borderRadius","h","DownOutlined","content","_Fragment","prefix","SearchOutlined","suffix","_createTextVNode","map","onClick","UnorderedListOutlined","window","location","hostname","CloseOutlined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Search.mjs","sources":["../../../../src/components/tab/Search.tsx"],"sourcesContent":["import {\r\n computed,\r\n ComputedRef,\r\n defineComponent,\r\n h,\r\n ref,\r\n watch\r\n} from \"vue\";\r\nimport { useRouter } from \"vue-router\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport {\r\n useMagicKeys,\r\n useWindowScroll\r\n} from \"@vueuse/core\";\r\n\r\nimport {\r\n CloseOutlined,\r\n DownOutlined,\r\n SearchOutlined,\r\n UnorderedListOutlined\r\n} from \"@ant-design/icons-vue\";\r\nimport {\r\n type NavTabsState,\r\n useNavTabStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\nimport dayjs from \"dayjs\";\r\n\r\nexport default defineComponent({\r\n name: \"Search\",\r\n setup() {\r\n const router = useRouter();\r\n\r\n const { useToken } = theme;\r\n const { token }: { token: ComputedRef<GlobalToken> } =\r\n useToken();\r\n\r\n const { getList, deleteTabs } = useNavTabStore();\r\n // 用来监听 Ctrl + Shift + S\r\n const keys = useMagicKeys();\r\n const shiftCtrlA = keys[\"Shift+Ctrl+S\"];\r\n const open = ref(false);\r\n const { y } = useWindowScroll();\r\n\r\n const navTabList = computed(() => {\r\n return getList!.sort(\r\n (a, b) => (b.openTime || 0) - (a.openTime || 0)\r\n );\r\n });\r\n\r\n // 添加搜索相关状态\r\n const searchKewords = ref(\"\"); // 搜索输入框的值\r\n const filteredNavTabList = computed(() => {\r\n const list = getList!.sort(\r\n (a, b) => (b.openTime || 0) - (a.openTime || 0)\r\n );\r\n\r\n if (!searchKewords.value) {\r\n return list; // 如果没有搜索词,返回完整列表\r\n }\r\n\r\n const query = searchKewords.value.toLowerCase();\r\n return list.filter(item => {\r\n const fullPathMatch = item.fullPath\r\n ?.toLowerCase()\r\n .includes(query);\r\n\r\n const title: string =\r\n (item.meta?.title as string) || \"\";\r\n\r\n const titleMatch = title\r\n .toLowerCase()\r\n .includes(query);\r\n\r\n return fullPathMatch || titleMatch;\r\n });\r\n });\r\n\r\n watch(shiftCtrlA, v => {\r\n if (v) {\r\n open.value = !open.value;\r\n }\r\n });\r\n\r\n watch(\r\n () => open.value,\r\n () => {\r\n searchKewords.value = \"\";\r\n }\r\n );\r\n\r\n watch(\r\n () => y.value,\r\n val => {\r\n if (val > 0) {\r\n open.value = false;\r\n }\r\n }\r\n );\r\n\r\n const onCloseTab = (path: string) => {\r\n deleteTabs(path);\r\n };\r\n\r\n const searchStyle = computed(\r\n () => css`\r\n padding: 10px;\r\n border-bottom: 1px solid ${token.value.colorBorder};\r\n\r\n .tip-txt {\r\n color: ${token.value.colorPrimary};\r\n }\r\n `\r\n );\r\n\r\n const searchListStyle = computed(\r\n () => css`\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 400px;\r\n overflow-y: overlay;\r\n user-select: none;\r\n\r\n /* 整个滚动条 */\r\n\r\n ::-webkit-scrollbar {\r\n width: 4px; /* 垂直滚动条的宽度 */\r\n height: 4px; /* 水平滚动条的高度 */\r\n }\r\n\r\n /* 滚动条轨道 */\r\n\r\n ::-webkit-scrollbar-track {\r\n background: transparent; /* 轨道背景色 */\r\n border-radius: 0; /* 轨道圆角 */\r\n }\r\n\r\n /* 滚动条滑块 */\r\n\r\n ::-webkit-scrollbar-thumb {\r\n //background: #888; /* 滑块背景色 */\r\n // border-radius: 6px; /* 滑块圆角 */\r\n border: 3px solid\r\n ${token.value.colorPrimaryBorder}; /* 滑块边框 */\r\n }\r\n\r\n /* 滚动条滑块悬停效果 */\r\n\r\n ::-webkit-scrollbar-thumb:hover {\r\n background: red; /* 滑块悬停背景色 */\r\n }\r\n\r\n .search-title {\r\n position: sticky;\r\n top: 0;\r\n padding: 10px;\r\n background: ${token.value.colorPrimary};\r\n }\r\n\r\n ul {\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n min-width: 400px;\r\n\r\n li {\r\n display: flex;\r\n align-items: center;\r\n padding: 4px 10px;\r\n width: 400px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background-color: ${token.value\r\n .colorBgLayout};\r\n\r\n .close-wrapper {\r\n display: block;\r\n }\r\n }\r\n\r\n .icon {\r\n width: 42px;\r\n height: 42px;\r\n border-radius: 10px;\r\n background-color: ${token.value.colorPrimary};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n\r\n .content {\r\n padding-left: 10px;\r\n\r\n .time-ago {\r\n display: flex;\r\n align-items: center;\r\n font-size: 12px;\r\n\r\n .hostname {\r\n max-width: 180px;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n }\r\n\r\n .split {\r\n width: 4px;\r\n height: 4px;\r\n display: inline-block;\r\n background-color: ${token.value\r\n .colorPrimary};\r\n border-radius: 10px;\r\n margin: 0 6px;\r\n }\r\n }\r\n }\r\n\r\n .close-wrapper {\r\n display: none;\r\n flex: 1;\r\n text-align: right;\r\n\r\n .close-btn {\r\n display: inline-block;\r\n width: 22px;\r\n height: 22px;\r\n border-radius: 50%;\r\n text-align: center;\r\n\r\n &:hover {\r\n // background-color: ${token.value\r\n .colorBgLayout};\r\n }\r\n }\r\n }\r\n }\r\n }\r\n `\r\n );\r\n\r\n function timeAgo(providedTime: number) {\r\n const now = dayjs();\r\n const diffInSeconds = now.diff(\r\n providedTime,\r\n \"second\"\r\n ); // 计算时间差(秒)\r\n const diffInMinutes = now.diff(\r\n providedTime,\r\n \"minute\"\r\n ); // 计算时间差(分钟)\r\n const diffInHours = now.diff(providedTime, \"hour\"); // 计算时间差(小时)\r\n\r\n if (diffInMinutes < 1) {\r\n return `${diffInSeconds} 秒前`;\r\n } else if (diffInHours < 1) {\r\n return `${diffInMinutes} 分钟前`;\r\n } else {\r\n return `${diffInHours} 小时前`;\r\n }\r\n }\r\n\r\n const onJump = (item: NavTabsState) => {\r\n if (item.fullPath) {\r\n router.push(item.fullPath);\r\n }\r\n open.value = false;\r\n };\r\n\r\n const closeBtnStatus = (item: NavTabsState) => {\r\n // 如果meta有设置keepOpen则隐藏关闭按钮\r\n if (item.meta?.keepOpen) {\r\n return false;\r\n } else {\r\n // 如果只有一个标签,则隐藏关闭按钮\r\n return navTabList.value.length !== 1;\r\n }\r\n };\r\n\r\n return () => (\r\n <div class={\"app-search-tab\"}>\r\n <a-popover\r\n v-model:open={open.value}\r\n placement={\"bottomRight\"}\r\n trigger={\"click\"}\r\n overlayClassName={\"search-popover-wrapper\"}\r\n >\r\n {{\r\n default: () => (\r\n <div style={{ marginRight: \"5px\" }}>\r\n <a-button\r\n style={{ borderRadius: \"10px\" }}\r\n icon={h(DownOutlined)}\r\n title={\"搜索标签页\"}\r\n />\r\n </div>\r\n ),\r\n content: () => (\r\n <>\r\n <div class={searchStyle.value}>\r\n <a-input\r\n v-model:value={searchKewords.value}\r\n placeholder={\"搜索标签页\"}\r\n bordered={false}\r\n >\r\n {{\r\n prefix: () => <SearchOutlined />,\r\n suffix: () => (\r\n <span class={\"tip-txt\"}>\r\n Ctrl+Shift+S\r\n </span>\r\n )\r\n }}\r\n </a-input>\r\n </div>\r\n <div class={searchListStyle.value}>\r\n <span class={\"search-title\"}>\r\n 打开的标签页\r\n </span>\r\n <ul>\r\n {filteredNavTabList.value.map(item => (\r\n <li onClick={() => onJump(item)}>\r\n <div class={\"icon\"}>\r\n <UnorderedListOutlined />\r\n </div>\r\n <div class={\"content\"}>\r\n <div class={\"title\"}>\r\n {item.meta?.title}\r\n </div>\r\n <div class={\"time-ago\"}>\r\n <span class={\"hostname\"}>\r\n {window.location.hostname +\r\n \"\" +\r\n item.path}\r\n </span>\r\n <span class={\"split\"}></span>\r\n <span class={\"time\"}>\r\n {timeAgo(item.openTime ?? 0)}\r\n </span>\r\n </div>\r\n </div>\r\n {closeBtnStatus(item) && (\r\n <div class={\"close-wrapper\"}>\r\n <span\r\n class={\"close-btn\"}\r\n onClick={() =>\r\n onCloseTab(\r\n item.fullPath || \"\"\r\n )\r\n }\r\n >\r\n <CloseOutlined />\r\n </span>\r\n </div>\r\n )}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n </>\r\n )\r\n }}\r\n </a-popover>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["name","setup","router","useRouter","useToken","theme","token","getList","deleteTabs","useNavTabStore","keys","useMagicKeys","shiftCtrlA","open","ref","y","useWindowScroll","navTabList","computed","sort","a","b","openTime","searchKewords","filteredNavTabList","list","value","query","toLowerCase","filter","item","fullPathMatch","fullPath","includes","title","meta","titleMatch","watch","v","val","onCloseTab","path","searchStyle","css","colorBorder","colorPrimary","searchListStyle","colorPrimaryBorder","colorBgLayout","timeAgo","providedTime","now","dayjs","diffInSeconds","diff","diffInMinutes","diffInHours","onJump","push","closeBtnStatus","keepOpen","length","_createVNode","_resolveComponent","$event","default","marginRight","borderRadius","h","DownOutlined","content","_Fragment","prefix","SearchOutlined","suffix","_createTextVNode","map","onClick","UnorderedListOutlined","window","location","hostname","CloseOutlined"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../../../../src/components/layout/components/menu/Menu.tsx"],"names":[],"mappings":";;;AAaA,
|
|
1
|
+
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../../../../src/components/layout/components/menu/Menu.tsx"],"names":[],"mappings":";;;AAaA,wBAsNG"}
|