diff --git a/packages/editor/src/icons/FolderMinusIcon.vue b/packages/editor/src/icons/FolderMinusIcon.vue new file mode 100644 index 00000000..1c694e17 --- /dev/null +++ b/packages/editor/src/icons/FolderMinusIcon.vue @@ -0,0 +1,22 @@ + + + diff --git a/packages/editor/src/layouts/sidebar/LayerMenu.vue b/packages/editor/src/layouts/sidebar/LayerMenu.vue index 0b8ba8bf..ca5b55fd 100644 --- a/packages/editor/src/layouts/sidebar/LayerMenu.vue +++ b/packages/editor/src/layouts/sidebar/LayerMenu.vue @@ -6,7 +6,10 @@ import { computed, inject, markRaw, ref } from 'vue'; import { Files, Plus } from '@element-plus/icons-vue'; +import { isPage } from '@tmagic/utils'; + import ContentMenu from '@editor/components/ContentMenu.vue'; +import FolderMinusIcon from '@editor/icons/FolderMinusIcon.vue'; import type { ComponentGroup, MenuButton, MenuComponent, Services } from '@editor/type'; import { useCopyMenu, useDeleteMenu, useMoveToMenu, usePasteMenu } from '@editor/utils/content-menu'; @@ -18,6 +21,10 @@ const props = defineProps<{ layerContentMenu: (MenuButton | MenuComponent)[]; }>(); +const emit = defineEmits<{ + 'collapse-all': []; +}>(); + const services = inject('services'); const menu = ref>(); const node = computed(() => services?.editorService.get('node')); @@ -76,6 +83,15 @@ const getSubMenuData = computed(() => { }); const menuData = computed<(MenuButton | MenuComponent)[]>(() => [ + { + type: 'button', + text: '全部折叠', + icon: FolderMinusIcon, + display: () => isPage(node.value), + handler: () => { + emit('collapse-all'); + }, + }, { type: 'button', text: '新增', diff --git a/packages/editor/src/layouts/sidebar/LayerPanel.vue b/packages/editor/src/layouts/sidebar/LayerPanel.vue index 23497986..2567ce78 100644 --- a/packages/editor/src/layouts/sidebar/LayerPanel.vue +++ b/packages/editor/src/layouts/sidebar/LayerPanel.vue @@ -42,7 +42,7 @@ - + @@ -356,4 +356,14 @@ const contextmenu = async (event: MouseEvent, data: MNode): Promise => { menu.value?.show(event); }; + +const collapseAllHandler = () => { + const page = editorService?.get('page'); + if (!tree.value || !page) return; + const rootNode = tree.value.getNode(page.id); + rootNode.childNodes.forEach((node: any) => { + node.collapse(); + handleCollapse(node.data); + }); +};