Browse Source

feat(vben5-platform): Add deleting the favorites menu

pull/1303/head
colin 6 months ago
parent
commit
5ea4eefdee
  1. 15
      apps/vben5/packages/@abp/platform/src/api/useMyFavoriteMenusApi.ts
  2. 106
      apps/vben5/packages/@abp/platform/src/components/workbench/components/WorkbenchQuickNav.vue
  3. 29
      apps/vben5/packages/@abp/platform/src/components/workbench/index.vue

15
apps/vben5/packages/@abp/platform/src/api/useMyFavoriteMenusApi.ts

@ -15,7 +15,9 @@ export function useMyFavoriteMenusApi() {
* @param input * @param input
* @returns * @returns
*/ */
function createApi(input: UserFavoriteMenuCreateDto) { function createApi(
input: UserFavoriteMenuCreateDto,
): Promise<UserFavoriteMenuDto> {
return request<UserFavoriteMenuDto>( return request<UserFavoriteMenuDto>(
`/api/platform/menus/favorites/my-favorite-menus`, `/api/platform/menus/favorites/my-favorite-menus`,
{ {
@ -25,6 +27,16 @@ export function useMyFavoriteMenusApi() {
); );
} }
/**
*
* @param id Id
*/
function deleteApi(id: string): Promise<void> {
return request(`/api/platform/menus/favorites/my-favorite-menus/${id}`, {
method: 'DELETE',
});
}
/** /**
* *
* @param framework ui框架 * @param framework ui框架
@ -44,6 +56,7 @@ export function useMyFavoriteMenusApi() {
return { return {
cancel, cancel,
createApi, createApi,
deleteApi,
getListApi, getListApi,
}; };
} }

106
apps/vben5/packages/@abp/platform/src/components/workbench/components/WorkbenchQuickNav.vue

@ -1,6 +1,10 @@
<script setup lang="ts"> <script setup lang="ts">
import type { FavoriteMenu } from '../types'; import type { FavoriteMenu } from '../types';
import { computed, h } from 'vue';
import { $t } from '@vben/locales';
import { import {
Card, Card,
CardContent, CardContent,
@ -9,6 +13,9 @@ import {
VbenIcon, VbenIcon,
} from '@vben-core/shadcn-ui'; } from '@vben-core/shadcn-ui';
import { DeleteOutlined } from '@ant-design/icons-vue';
import { Dropdown, Menu, Modal } from 'ant-design-vue';
interface Props { interface Props {
items?: FavoriteMenu[]; items?: FavoriteMenu[];
title: string; title: string;
@ -18,13 +25,53 @@ defineOptions({
name: 'WorkbenchQuickNav', name: 'WorkbenchQuickNav',
}); });
withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
items: () => [], items: () => [],
}); });
defineEmits<{ const emits = defineEmits<{
(event: 'click', menu: FavoriteMenu): void; (event: 'click', menu: FavoriteMenu): void;
(event: 'delete', menu: FavoriteMenu): void;
(event: 'add'): void;
}>(); }>();
const MenuItem = Menu.Item;
const getFavoriteMenus = computed(() => {
const addMenu: FavoriteMenu = {
id: 'addMenu',
displayName: $t('workbench.content.favoriteMenu.create'),
icon: 'ion:add-outline',
color: '#00bfff',
isDefault: true,
};
return [...props.items, addMenu];
});
function onClick(menu: FavoriteMenu) {
if (menu.id === 'addMenu') {
emits('add');
return;
}
emits('click', menu);
}
function onMenuClick(key: string, menu: FavoriteMenu) {
switch (key) {
case 'delete': {
Modal.confirm({
centered: true,
iconType: 'warning',
title: $t('AbpUi.AreYouSure'),
content: $t('AbpUi.ItemWillBeDeletedMessage'),
okCancel: true,
onOk: () => {
emits('delete', menu);
},
});
}
}
}
</script> </script>
<template> <template>
@ -33,25 +80,42 @@ defineEmits<{
<CardTitle class="text-lg">{{ title }}</CardTitle> <CardTitle class="text-lg">{{ title }}</CardTitle>
</CardHeader> </CardHeader>
<CardContent class="flex flex-wrap p-0"> <CardContent class="flex flex-wrap p-0">
<template v-for="(item, index) in items" :key="item.displayName"> <template
<div v-for="(item, index) in getFavoriteMenus"
:class="{ :key="item.displayName"
'border-r-0': index % 3 === 2, >
'border-b-0': index < 3, <Dropdown :trigger="['contextmenu']">
'pb-4': index > 2, <div
'rounded-bl-xl': index === items.length - 3, :class="{
'rounded-br-xl': index === items.length - 1, 'border-r-0': index % 3 === 2,
}" 'border-b-0': index < 3,
class="flex-col-center border-border group w-1/3 cursor-pointer border-r border-t py-8 hover:shadow-xl" 'pb-4': index > 2,
> 'rounded-bl-xl': index === items.length - 3,
<VbenIcon 'rounded-br-xl': index === items.length - 1,
:color="item.color" }"
:icon="item.icon" class="flex-col-center border-border group w-1/3 cursor-pointer border-r border-t py-8 hover:shadow-xl"
class="size-7 transition-all duration-300 group-hover:scale-125" @click="onClick(item)"
@click="$emit('click', item)" >
/> <VbenIcon
<span class="text-md mt-2 truncate">{{ item.displayName }}</span> :color="item.color"
</div> :icon="item.icon"
class="size-7 transition-all duration-300 group-hover:scale-125"
/>
<span class="text-md mt-2 truncate">{{ item.displayName }}</span>
</div>
<template #overlay>
<Menu
v-if="!item.isDefault"
@click="
({ key: menuKey }) => onMenuClick(menuKey.toString(), item)
"
>
<MenuItem key="delete" :icon="h(DeleteOutlined)">
{{ $t('workbench.content.favoriteMenu.delete') }}
</MenuItem>
</Menu>
</template>
</Dropdown>
</template> </template>
</CardContent> </CardContent>
</Card> </Card>

29
apps/vben5/packages/@abp/platform/src/components/workbench/index.vue

@ -3,8 +3,9 @@ import type { WorkbenchTodoItem, WorkbenchTrendItem } from '@vben/common-ui';
import type { FavoriteMenu } from './types'; import type { FavoriteMenu } from './types';
import { computed, onMounted, ref } from 'vue'; import { computed, defineAsyncComponent, onMounted, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { useAppConfig } from '@vben/hooks'; import { useAppConfig } from '@vben/hooks';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
import { preferences } from '@vben/preferences'; import { preferences } from '@vben/preferences';
@ -16,7 +17,7 @@ import {
useMyNotifilersApi, useMyNotifilersApi,
useNotificationSerializer, useNotificationSerializer,
} from '@abp/notifications'; } from '@abp/notifications';
import { Empty } from 'ant-design-vue'; import { Empty, message } from 'ant-design-vue';
import { useMyFavoriteMenusApi } from '../../api/useMyFavoriteMenusApi'; import { useMyFavoriteMenusApi } from '../../api/useMyFavoriteMenusApi';
import WorkbenchHeader from './components/WorkbenchHeader.vue'; import WorkbenchHeader from './components/WorkbenchHeader.vue';
@ -30,7 +31,8 @@ defineEmits<{
const userStore = useUserStore(); const userStore = useUserStore();
const { getMyNotifilersApi } = useMyNotifilersApi(); const { getMyNotifilersApi } = useMyNotifilersApi();
const { getListApi: getFavoriteMenusApi } = useMyFavoriteMenusApi(); const { getListApi: getFavoriteMenusApi, deleteApi: deleteFavoriteMenuApi } =
useMyFavoriteMenusApi();
const { deserialize } = useNotificationSerializer(); const { deserialize } = useNotificationSerializer();
const { uiFramework } = useAppConfig(import.meta.env, import.meta.env.PROD); const { uiFramework } = useAppConfig(import.meta.env, import.meta.env.PROD);
@ -107,6 +109,13 @@ const getWelcomeTitle = computed(() => {
} }
return ''; return '';
}); });
const [WorkbenchQuickNavModal, quickNavModalApi] = useVbenModal({
connectedComponent: defineAsyncComponent(
() => import('./components/WorkbenchQuickNavModal.vue'),
),
});
async function onInit() { async function onInit() {
await Promise.all([ await Promise.all([
onInitFavoriteMenus(), onInitFavoriteMenus(),
@ -119,6 +128,7 @@ async function onInitFavoriteMenus() {
favoriteMenus.value = items.map((item) => { favoriteMenus.value = items.map((item) => {
return { return {
...item, ...item,
id: item.menuId,
isDefault: false, isDefault: false,
}; };
}); });
@ -144,6 +154,16 @@ async function onInitTodoList() {
todoList.value = []; todoList.value = [];
} }
function onCreatingFavoriteMenu() {
quickNavModalApi.open();
}
async function onDeleteFavoriteMenu(menu: FavoriteMenu) {
await deleteFavoriteMenuApi(menu.id);
await onInitFavoriteMenus();
message.success($t('AbpUi.SuccessfullyDeleted'));
}
onMounted(onInit); onMounted(onInit);
</script> </script>
@ -166,6 +186,8 @@ onMounted(onInit);
:items="getFavoriteMenus" :items="getFavoriteMenus"
class="mt-5 lg:mt-0" class="mt-5 lg:mt-0"
:title="$t('workbench.content.favoriteMenu.title')" :title="$t('workbench.content.favoriteMenu.title')"
@add="onCreatingFavoriteMenu"
@delete="onDeleteFavoriteMenu"
@click="(menu: FavoriteMenu) => $emit('navTo', menu)" @click="(menu: FavoriteMenu) => $emit('navTo', menu)"
/> />
<WorkbenchTodo <WorkbenchTodo
@ -189,6 +211,7 @@ onMounted(onInit);
</WorkbenchTrends> </WorkbenchTrends>
</div> </div>
</div> </div>
<WorkbenchQuickNavModal @change="onInitFavoriteMenus" />
</div> </div>
</template> </template>

Loading…
Cancel
Save