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