🔱: [client] sync upgrade with 6 commits [trident-sync]

chore:
chore: help menu
chore: help menu
fix: 修复 antdv 弹出菜单边框过大的问题
fix: 修复 antdv懒加载后dropdown按钮无法点击的bug
pull/91/head
GitHub Actions Bot 2025-03-05 19:24:47 +00:00
parent 140606744b
commit 2b4b15f558
11 changed files with 142 additions and 55 deletions

View File

@ -62,5 +62,6 @@ export default defineComponent({
.fs-highlight { .fs-highlight {
margin: 0px; margin: 0px;
border-radius: 4px; border-radius: 4px;
font-size: 12px;
} }
</style> </style>

View File

@ -15,15 +15,15 @@ const userStore = useUserStore();
const accessStore = useAccessStore(); const accessStore = useAccessStore();
const menus = computed(() => [ const menus = computed(() => [
{ // {
handler: () => { // handler: () => {
openWindow(VBEN_DOC_URL, { // openWindow(VBEN_DOC_URL, {
target: "_blank" // target: "_blank"
}); // });
}, // },
icon: BookOpenText, // icon: BookOpenText,
text: $t("ui.widgets.document") // text: $t("ui.widgets.document")
} // }
]); ]);
const avatar = computed(() => { const avatar = computed(() => {
@ -38,7 +38,7 @@ async function handleLogout() {
<template> <template>
<BasicLayout @clear-preferences-and-logout="handleLogout"> <BasicLayout @clear-preferences-and-logout="handleLogout">
<template #user-dropdown> <template #user-dropdown>
<UserDropdown :avatar :menus :text="userStore.userInfo?.nickName" description="ann.vben@gmail.com" tag-text="Pro" @logout="handleLogout" /> <UserDropdown :avatar :menus :text="userStore.userInfo?.nickName" description="development@handsfree.work" tag-text="Pro" @logout="handleLogout" />
</template> </template>
<template #lock-screen> <template #lock-screen>
<LockScreen :avatar @to-login="handleLogout" /> <LockScreen :avatar @to-login="handleLogout" />

View File

@ -1,19 +1,15 @@
import { defineAsyncComponent } from "vue"; import { defineAsyncComponent } from "vue";
import Input from "ant-design-vue/es/input/Input";
import Button from "ant-design-vue/es/button/button";
export default { export default {
install(app: any) { install(app: any) {
app.component( app.component("AInput", Input);
"AInput", app.component("AButton", Button);
defineAsyncComponent(() => import("ant-design-vue/es/input/Input"))
);
app.component( app.component(
"AInputPassword", "AInputPassword",
defineAsyncComponent(() => import("ant-design-vue/es/input/Password")) defineAsyncComponent(() => import("ant-design-vue/es/input/Password"))
); );
app.component(
"AButton",
defineAsyncComponent(() => import("ant-design-vue/es/button/button"))
);
app.component( app.component(
"AButtonGroup", "AButtonGroup",
defineAsyncComponent(() => import("ant-design-vue/es/button/button-group")) defineAsyncComponent(() => import("ant-design-vue/es/button/button-group"))
@ -158,5 +154,18 @@ export default {
"AToar", "AToar",
defineAsyncComponent(() => import("ant-design-vue/es/tree-select")) defineAsyncComponent(() => import("ant-design-vue/es/tree-select"))
); );
app.component(
"AMenu",
defineAsyncComponent(() => import("ant-design-vue/es/menu/index"))
);
app.component(
"ASubMenu",
defineAsyncComponent(() => import("ant-design-vue/es/menu/src/SubMenu"))
);
app.component(
"AMenuItem",
defineAsyncComponent(() => import("ant-design-vue/es/menu/src/MenuItem"))
);
} }
}; };

View File

@ -35,7 +35,8 @@ export const frameworkResource = [
auth: true auth: true
} }
}, },
...dynamicRoutes // @ts-ignore
...dynamicRoutes.sort((a, b) => (a.meta?.order || 0) - (b.meta?.order || 0))
] ]
} }
]; ];

View File

@ -0,0 +1,85 @@
import { IFrameView } from "/@/vben/layouts";
export const aboutResource = [
{
title: "关于",
name: "about",
path: "/about",
redirect: "/about/doc",
meta: {
icon: "lucide:copyright",
order: 9999
},
children: [
{
title: "文档",
name: "document",
path: "/about/doc",
component: IFrameView,
meta: {
icon: "lucide:book-open-text",
link: "http://fast-crud.docmirror.cn/",
title: "文档"
}
},
{
name: "Github",
path: "/about/github",
component: IFrameView,
meta: {
icon: "mdi:github",
link: "https://github.com/fast-crud/fast-crud",
title: "Github"
}
},
{
name: "Gitee",
path: "/about/gitee",
component: IFrameView,
meta: {
icon: "ion:logo-octocat",
link: "https://gitee.com/fast-crud/fast-crud",
title: "Gite"
}
},
{
title: "其他Demo",
name: "demo",
path: "/about/demo",
meta: {
icon: "ion:git-branch-outline"
},
children: [
{
title: "Element版",
path: "/about/demo/element",
component: IFrameView,
meta: {
link: "http://fast-crud.docmirror.cn/element/",
title: "Element版"
}
},
{
title: "Naive版",
path: "/about/demo/naive",
component: IFrameView,
meta: {
link: "http://fast-crud.docmirror.cn/naive/",
title: "Naive版"
}
},
{
title: "VbenAdmin",
path: "/about/demo/vben",
meta: {
link: "http://fast-crud.docmirror.cn/vben/",
title: "VbenAdmin"
}
}
]
}
]
}
];
export default aboutResource;

View File

@ -31,4 +31,4 @@ export const uiResources = [
} }
]; ];
export default uiResources; // export default uiResources;

View File

@ -382,6 +382,9 @@ function removeMenuItem(item: MenuItemRegistered) {
.is-menu-align { .is-menu-align {
justify-content: var(--menu-align, start); justify-content: var(--menu-align, start);
} }
.vben-menu__popup-container {
padding: 0px !important;
}
.vben-menu__popup-container, .vben-menu__popup-container,
.vben-menu { .vben-menu {

View File

@ -1,24 +1,24 @@
<script setup lang="ts"> <script setup lang="ts">
import type { VbenButtonProps } from './button'; import type { VbenButtonProps } from "./button";
import { computed } from 'vue'; import { computed } from "vue";
import { LoaderCircle } from '/@/vben/icons'; import { LoaderCircle } from "/@/vben/icons";
import { cn } from '/@/vben/shared/utils'; import { cn } from "/@/vben/shared/utils";
import { Primitive } from 'radix-vue'; import { Primitive } from "radix-vue";
import { buttonVariants } from '../../ui'; import { buttonVariants } from "../../ui";
interface Props extends VbenButtonProps {} interface Props extends VbenButtonProps {}
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
as: 'button', as: "button",
class: '', class: "",
disabled: false, disabled: false,
loading: false, loading: false,
size: 'default', size: "default",
variant: 'default', variant: "default"
}); });
const isDisabled = computed(() => { const isDisabled = computed(() => {
@ -27,16 +27,8 @@ const isDisabled = computed(() => {
</script> </script>
<template> <template>
<Primitive <Primitive :as="as" :as-child="asChild" :class="cn(buttonVariants({ variant, size }), props.class)" :disabled="isDisabled">
:as="as" <LoaderCircle v-if="loading" class="text-md mr-2 size-4 flex-shrink-0 animate-spin" />
:as-child="asChild"
:class="cn(buttonVariants({ variant, size }), props.class)"
:disabled="isDisabled"
>
<LoaderCircle
v-if="loading"
class="text-md mr-2 size-4 flex-shrink-0 animate-spin"
/>
<slot></slot> <slot></slot>
</Primitive> </Primitive>
</template> </template>

View File

@ -1,23 +1,20 @@
<script setup lang="ts"> <script setup lang="ts">
import type { PopoverContentEmits, PopoverContentProps } from 'radix-vue'; import type { PopoverContentEmits, PopoverContentProps } from "radix-vue";
import { computed } from 'vue'; import { computed } from "vue";
import { cn } from '/@/vben/shared/utils'; import { cn } from "/@/vben/shared/utils";
import { PopoverContent, PopoverPortal, useForwardPropsEmits } from 'radix-vue'; import { PopoverContent, PopoverPortal, useForwardPropsEmits } from "radix-vue";
defineOptions({ defineOptions({
inheritAttrs: false, inheritAttrs: false
}); });
const props = withDefaults( const props = withDefaults(defineProps<PopoverContentProps & { class?: any }>(), {
defineProps<PopoverContentProps & { class?: any }>(), align: "center",
{ sideOffset: 4
align: 'center', });
sideOffset: 4,
},
);
const emits = defineEmits<PopoverContentEmits>(); const emits = defineEmits<PopoverContentEmits>();
const delegatedProps = computed(() => { const delegatedProps = computed(() => {
@ -36,7 +33,7 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
:class=" :class="
cn( cn(
'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border w-72 rounded-md border p-4 shadow-md outline-none', 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border w-72 rounded-md border p-4 shadow-md outline-none',
props.class, props.class
) )
" "
> >

View File

@ -22,7 +22,6 @@ export default defineComponent({
setup() { setup() {
const { crudBinding, crudRef, crudExpose, context, crudOptions, resetCrudOptions, appendBindingOptions } = useFs({ createCrudOptions, context: { text: 111 } }); const { crudBinding, crudRef, crudExpose, context, crudOptions, resetCrudOptions, appendBindingOptions } = useFs({ createCrudOptions, context: { text: 111 } });
debugger;
const { merge } = useMerge(); const { merge } = useMerge();
setTimeout(() => { setTimeout(() => {
//crudOptions //crudOptions

View File

@ -1,6 +1,6 @@
export default { export default {
crud: ` columns: { crud: ` columns: {
date:{ name:{
title: '姓名', //字段名称 title: '姓名', //字段名称
type: 'text', //字段类型,添加、修改、查询将自动生成相应表单组件 type: 'text', //字段类型,添加、修改、查询将自动生成相应表单组件
}, },