Browse Source

fix: 修复执行: check:cspell 命令路径参数传入没有转义导致检测路径失效。添加菜单右键功能。优化:多余监听 activePath 变化,自动滚动到激活项 watch

pull/7608/head
lmx 3 weeks ago
parent
commit
173e6b08c9
  1. 4
      package.json
  2. 6
      packages/@core/base/typings/src/menu-record.ts
  3. 2
      packages/@core/ui-kit/layout-ui/src/components/layout-sidebar.vue
  4. 4
      packages/@core/ui-kit/menu-ui/package.json
  5. 13
      packages/@core/ui-kit/menu-ui/src/components/menu-item.vue
  6. 8
      packages/@core/ui-kit/menu-ui/src/components/menu.vue
  7. 1
      packages/@core/ui-kit/menu-ui/src/sub-menu.vue
  8. 11
      packages/@core/ui-kit/menu-ui/src/types.ts
  9. 2
      packages/utils/src/helpers/generate-menus.ts

4
package.json

@ -37,7 +37,7 @@
"changeset": "pnpm exec changeset",
"check": "pnpm run check:circular && pnpm run check:dep && pnpm run check:type && pnpm check:cspell",
"check:circular": "vsh check-circular",
"check:cspell": "cspell lint **/*.ts **/README.md .changeset/*.md --no-progress",
"check:cspell": "cspell lint \"**/*.ts\" \"**/README.md\" \".changeset/*.md\" --no-progress",
"check:dep": "vsh check-dep",
"check:type": "turbo run typecheck",
"clean": "node ./scripts/clean.mjs",
@ -59,7 +59,7 @@
"reinstall": "pnpm clean --del-lock && pnpm install",
"test:unit": "vitest run --dom",
"test:e2e": "turbo run test:e2e",
"update:deps": "npx taze -r -w",
"up te:deps": "npx taze -r -w",
"version": "pnpm exec changeset version && pnpm install --no-frozen-lockfile",
"catalog": "pnpx codemod pnpm/catalog"
},

6
packages/@core/base/typings/src/menu-record.ts

@ -1,6 +1,8 @@
import type { Component } from 'vue';
import type { RouteRecordRaw } from 'vue-router';
import type { Recordable } from './helper';
/**
*
*/
@ -66,6 +68,10 @@ interface MenuRecordRaw extends MenuRecordBadgeRaw {
* key
*/
path: string;
/**
*
*/
query?: Recordable<any>;
/**
*
* @default true

2
packages/@core/ui-kit/layout-ui/src/components/layout-sidebar.vue

@ -306,13 +306,13 @@ const handleDragSidebar = (e: MouseEvent) => {
ref="asideRef"
:style="style"
class="fixed left-0 top-0 h-full transition-all duration-150"
:class="theme"
@mouseenter="handleMouseenter"
@mouseleave="handleMouseleave"
>
<div
class="h-full"
:class="[
theme,
{
'bg-sidebar-deep': isSidebarMixed,
'border-r border-border bg-sidebar': !isSidebarMixed,

4
packages/@core/ui-kit/menu-ui/package.json

@ -43,6 +43,10 @@
"@vben-core/shared": "workspace:*",
"@vben-core/typings": "workspace:*",
"@vueuse/core": "catalog:",
"qs": "catalog:",
"vue": "catalog:"
},
"devDependencies": {
"@types/qs": "catalog:"
}
}

13
packages/@core/ui-kit/menu-ui/src/components/menu-item.vue

@ -6,6 +6,8 @@ import { computed, onBeforeUnmount, onMounted, reactive, useSlots } from 'vue';
import { useNamespace } from '@vben-core/composables';
import { VbenIcon, VbenTooltip } from '@vben-core/shadcn-ui';
import qs from 'qs';
import { MenuBadge } from '../components';
import { useMenu, useMenuContext, useSubMenuContext } from '../hooks';
@ -54,6 +56,7 @@ const item: MenuItemRegistered = reactive({
active,
parentPaths: parentPaths.value,
path: props.path || '',
query: props.query,
});
/**
@ -81,6 +84,13 @@ onBeforeUnmount(() => {
});
</script>
<template>
<a
:href="
(item.parentPaths.at(-1) ?? '') +
(item?.query ? `?${qs.stringify(item?.query)}` : '')
"
@click.prevent.stop="handleClick"
>
<li
:class="[
rootMenu.theme,
@ -90,8 +100,8 @@ onBeforeUnmount(() => {
is('collapse-show-title', collapseShowTitle),
]"
role="menuitem"
@click.stop="handleClick"
>
<!-- -->
<VbenTooltip
v-if="showTooltip"
:content-class="[rootMenu.theme]"
@ -119,4 +129,5 @@ onBeforeUnmount(() => {
<slot name="title"></slot>
</div>
</li>
</a>
</template>

8
packages/@core/ui-kit/menu-ui/src/components/menu.vue

@ -212,15 +212,15 @@ const enableScroll = computed(
() => props.scrollToActive && props.mode === 'vertical' && !props.collapse,
);
const { scrollToActiveItem } = useMenuScroll(activePath, {
useMenuScroll(activePath, {
enable: enableScroll,
delay: 320,
});
// activePath
watch(activePath, () => {
scrollToActiveItem();
});
// watch(activePath, () => {
// scrollToActiveItem();
// });
//
function initMenu() {

1
packages/@core/ui-kit/menu-ui/src/sub-menu.vue

@ -41,6 +41,7 @@ const hasChildren = computed(() => {
:badge-variants="menu.badgeVariants"
:icon="menu.icon"
:path="menu.path"
:query="menu.query"
>
<template #title>
<span>{{ menu.name }}</span>

11
packages/@core/ui-kit/menu-ui/src/types.ts

@ -1,6 +1,10 @@
import type { Component, Ref } from 'vue';
import type { MenuRecordBadgeRaw, ThemeModeType } from '@vben-core/typings';
import type {
MenuRecordBadgeRaw,
Recordable,
ThemeModeType,
} from '@vben-core/typings';
interface MenuProps {
/**
@ -91,12 +95,17 @@ interface MenuItemProps extends MenuRecordBadgeRaw {
* @zh_CN menuitem
*/
path: string;
/**
* @zh_CN
*/
query?: Recordable<any>;
}
interface MenuItemRegistered {
active: boolean;
parentPaths: string[];
path: string;
query?: Recordable<any>;
}
interface MenuItemClicked {

2
packages/utils/src/helpers/generate-menus.ts

@ -43,6 +43,7 @@ function generateMenus(
link,
order,
title = '',
query,
} = meta;
// 确保菜单名称不为空
@ -71,6 +72,7 @@ function generateMenus(
badgeVariants,
icon,
name,
query,
order,
parent: route.parent,
parents: route.parents,

Loading…
Cancel
Save