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);
+ });
+};