From bdf7340219878df7772e51b5b377a53230ad8422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=85=A7=E5=9D=A4?= Date: Wed, 1 Oct 2025 21:33:21 +0800 Subject: [PATCH] feat: enhance pinia panel with improved UX and deep state expansion - Add expand/collapse all buttons for both tree and state panels - Implement hover actions for tree nodes with expand/collapse shortcuts - Auto-expand tree nodes and state when searching (up to 6 levels) - Support deep nested state expansion for complex objects and arrays - Make depth and withTag props optional in TreeViewer component - Add comprehensive Pinia demo stores with deeply nested structures - Improve placeholder text for search inputs - Optimize initial tree expansion to 6 levels for better developer experience --- .../src/components/state/ChildStateViewer.vue | 2 +- .../applet/src/components/tree/TreeViewer.vue | 45 +- .../modules/pinia/components/store/Index.vue | 136 +++++- .../__test__/store-functionality.test.ts | 400 ++++++++++++++++++ packages/playground/basic/src/main.ts | 6 + .../playground/basic/src/pages/PiniaDemo.vue | 151 +++++++ packages/playground/basic/src/stores/index.ts | 119 ++++++ 7 files changed, 843 insertions(+), 16 deletions(-) create mode 100644 packages/applet/src/modules/pinia/components/store/__test__/store-functionality.test.ts create mode 100644 packages/playground/basic/src/pages/PiniaDemo.vue diff --git a/packages/applet/src/components/state/ChildStateViewer.vue b/packages/applet/src/components/state/ChildStateViewer.vue index 9e46718bd..20e136582 100644 --- a/packages/applet/src/components/state/ChildStateViewer.vue +++ b/packages/applet/src/components/state/ChildStateViewer.vue @@ -4,7 +4,7 @@ import StateFieldViewer from './StateFieldViewer.vue' withDefaults(defineProps<{ data: CustomInspectorState[] - depth: number + depth?: number index: string expandedStateId?: string }>(), { diff --git a/packages/applet/src/components/tree/TreeViewer.vue b/packages/applet/src/components/tree/TreeViewer.vue index 8da159b3f..ace0f47f5 100644 --- a/packages/applet/src/components/tree/TreeViewer.vue +++ b/packages/applet/src/components/tree/TreeViewer.vue @@ -2,6 +2,7 @@ import type { ComponentTreeNode, InspectorTree } from '@vue/devtools-kit' import { UNDEFINED } from '@vue/devtools-kit' import { vTooltip } from '@vue/devtools-ui' +import { ref } from 'vue' import NodeTag from '~/components/basic/NodeTag.vue' import ToggleExpanded from '~/components/basic/ToggleExpanded.vue' import ComponentTreeViewer from '~/components/tree/TreeViewer.vue' @@ -10,8 +11,8 @@ import { useToggleExpanded } from '~/composables/toggle-expanded' const props = withDefaults(defineProps<{ data: ComponentTreeNode[] | InspectorTree[] - depth: number - withTag: boolean + depth?: number + withTag?: boolean }>(), { depth: 0, withTag: false, @@ -20,6 +21,7 @@ const emit = defineEmits(['hover', 'leave']) const selectedNodeId = defineModel() const { expanded, toggleExpanded } = useToggleExpanded() const { select: _select } = useSelect() +const hoveredNodeId = ref(null) function normalizeLabel(item: ComponentTreeNode | InspectorTree) { return ('name' in item && item?.name) || ('label' in item && item.label) @@ -28,6 +30,20 @@ function normalizeLabel(item: ComponentTreeNode | InspectorTree) { function select(id: string) { selectedNodeId.value = id } +function onNodeHover(item: ComponentTreeNode | InspectorTree) { + hoveredNodeId.value = item.id + emit('hover', item.id) +} + +function onNodeLeave() { + hoveredNodeId.value = null + emit('leave') +} + +function onExpandToggleClick(event: Event, itemId: string) { + event.stopPropagation() + toggleExpanded(itemId) +}