fix: the issue that the menu is not updated after the menu item is deleted (halo-dev/console#725)

#### What type of PR is this?

/kind bug
/milestone 2.0.0-rc.2

#### What this PR does / why we need it:

修复当菜单项被删除时,没有更新菜单的问题。

#### Which issue(s) this PR fixes:

Fixes https://github.com/halo-dev/halo/issues/2561

#### Special notes for your reviewer:

测试方式:

1. 创建一个菜单,添加若干个菜单项。
2. 删除部分菜单项,检查菜单下的菜单项个数是否正确。

#### Does this PR introduce a user-facing change?

```release-note
修复 Console 端当菜单项被删除时,没有更新菜单的问题。
```
pull/3445/head
Ryan Wang 2022-11-28 19:26:17 +08:00 committed by GitHub
parent 23838d5236
commit 99b2966ac1
3 changed files with 54 additions and 26 deletions

View File

@ -70,6 +70,8 @@ const handleFetchMenuItems = async (options?: { mute?: boolean }) => {
handleFetchMenuItems({ mute: true }); handleFetchMenuItems({ mute: true });
}, 3000); }, 3000);
} }
await handleResetMenuItems();
} catch (e) { } catch (e) {
console.error("Failed to fetch menu items", e); console.error("Failed to fetch menu items", e);
} finally { } finally {
@ -86,8 +88,14 @@ onBeforeRouteLeave(() => {
}); });
const handleOpenEditingModal = (menuItem: MenuTreeItem) => { const handleOpenEditingModal = (menuItem: MenuTreeItem) => {
selectedMenuItem.value = convertMenuTreeItemToMenuItem(menuItem); apiClient.extension.menuItem
menuItemEditingModal.value = true; .getv1alpha1MenuItem({
name: menuItem.metadata.name,
})
.then((response) => {
selectedMenuItem.value = response.data;
menuItemEditingModal.value = true;
});
}; };
const handleOpenCreateByParentModal = (menuItem: MenuTreeItem) => { const handleOpenCreateByParentModal = (menuItem: MenuTreeItem) => {
@ -103,11 +111,17 @@ const onMenuItemEditingModalClose = () => {
const onMenuItemSaved = async (menuItem: MenuItem) => { const onMenuItemSaved = async (menuItem: MenuItem) => {
const menuToUpdate = cloneDeep(selectedMenu.value); const menuToUpdate = cloneDeep(selectedMenu.value);
if (menuToUpdate) { // update menu items
const menuItemsToUpdate = cloneDeep(menuToUpdate.spec.menuItems) || []; if (
menuItemsToUpdate.push(menuItem.metadata.name); menuToUpdate &&
!menuToUpdate.spec.menuItems?.includes(menuItem.metadata.name)
) {
if (menuToUpdate.spec.menuItems) {
menuToUpdate.spec.menuItems.push(menuItem.metadata.name);
} else {
menuToUpdate.spec.menuItems = [menuItem.metadata.name];
}
menuToUpdate.spec.menuItems = menuItemsToUpdate;
await apiClient.extension.menu.updatev1alpha1Menu({ await apiClient.extension.menu.updatev1alpha1Menu({
name: menuToUpdate.metadata.name, name: menuToUpdate.metadata.name,
menu: menuToUpdate, menu: menuToUpdate,
@ -135,12 +149,12 @@ const handleUpdateInBatch = useDebounceFn(async () => {
await menuListRef.value.handleFetchMenus(); await menuListRef.value.handleFetchMenus();
await handleFetchMenuItems({ mute: true }); await handleFetchMenuItems({ mute: true });
} }
}, 500); }, 300);
const handleDelete = async (menuItem: MenuTreeItem) => { const handleDelete = async (menuItem: MenuTreeItem) => {
Dialog.info({ Dialog.info({
title: "是否确定删除该菜单?", title: "确定删除该菜单项吗",
description: "删除后将无法恢复", description: "将同时删除所有子菜单项,删除后将无法恢复",
confirmType: "danger", confirmType: "danger",
onConfirm: async () => { onConfirm: async () => {
await apiClient.extension.menuItem.deletev1alpha1MenuItem({ await apiClient.extension.menuItem.deletev1alpha1MenuItem({
@ -150,28 +164,39 @@ const handleDelete = async (menuItem: MenuTreeItem) => {
const childrenNames = getChildrenNames(menuItem); const childrenNames = getChildrenNames(menuItem);
if (childrenNames.length) { if (childrenNames.length) {
setTimeout(() => { const deleteChildrenRequests = childrenNames.map((name) =>
Dialog.info({ apiClient.extension.menuItem.deletev1alpha1MenuItem({
title: "检查到当前菜单下包含子菜单,是否删除?", name,
description: "如果选择否,那么所有子菜单将转移到一级菜单", })
confirmType: "danger", );
onConfirm: async () => { await Promise.all(deleteChildrenRequests);
const promises = childrenNames.map((name) =>
apiClient.extension.menuItem.deletev1alpha1MenuItem({
name,
})
);
await Promise.all(promises);
},
});
}, 200);
} }
await menuListRef.value.handleFetchMenus();
await handleFetchMenuItems(); await handleFetchMenuItems();
}, },
}); });
}; };
const handleResetMenuItems = async () => {
if (!selectedMenu.value) {
return;
}
const menuToUpdate = cloneDeep(selectedMenu.value);
const menuItemNames = menuItems.value.map((menuItem) => {
return menuItem.metadata.name;
});
menuToUpdate.spec.menuItems = menuItemNames;
await apiClient.extension.menu.updatev1alpha1Menu({
name: menuToUpdate.metadata.name,
menu: menuToUpdate,
});
await menuListRef.value.handleFetchMenus({ mute: true });
};
</script> </script>
<template> <template>
<MenuItemEditingModal <MenuItemEditingModal

View File

@ -128,6 +128,7 @@ watch(
<VSpace> <VSpace>
<SubmitButton <SubmitButton
v-if="visible" v-if="visible"
:loading="saving"
type="secondary" type="secondary"
@submit="$formkit.submit('menu-form')" @submit="$formkit.submit('menu-form')"
> >

View File

@ -77,6 +77,7 @@ const handleSaveMenuItem = async () => {
name: formState.value.metadata.name, name: formState.value.metadata.name,
menuItem: formState.value, menuItem: formState.value,
}); });
onVisibleChange(false); onVisibleChange(false);
emit("saved", data); emit("saved", data);
} else { } else {
@ -242,7 +243,7 @@ const onMenuItemSourceChange = () => {
@submit="handleSaveMenuItem" @submit="handleSaveMenuItem"
> >
<FormKit <FormKit
v-if="!isUpdateMode && menu" v-if="!isUpdateMode && menu && visible"
v-model="selectedParentMenuItem" v-model="selectedParentMenuItem"
label="上级菜单项" label="上级菜单项"
placeholder="选择上级菜单项" placeholder="选择上级菜单项"
@ -317,6 +318,7 @@ const onMenuItemSourceChange = () => {
<VSpace> <VSpace>
<SubmitButton <SubmitButton
v-if="visible" v-if="visible"
:loading="saving"
type="secondary" type="secondary"
@submit="$formkit.submit('menuitem-form')" @submit="$formkit.submit('menuitem-form')"
> >