2
2
import type { CustomInspectorNode , CustomInspectorState } from ' @vue/devtools-kit'
3
3
import { DevToolsMessagingEvents , rpc } from ' @vue/devtools-core'
4
4
import { parse } from ' @vue/devtools-kit'
5
- import { until } from ' @vueuse/core'
5
+ import { VueInput } from ' @vue/devtools-ui'
6
+ import { until , useToggle , watchDebounced } from ' @vueuse/core'
6
7
import { Pane , Splitpanes } from ' splitpanes'
7
8
import { computed , onUnmounted , ref , watch } from ' vue'
8
9
import DevToolsHeader from ' ~/components/basic/DevToolsHeader.vue'
@@ -21,6 +22,8 @@ const customInspectState = useCustomInspectorState()
21
22
const inspectorId = computed (() => customInspectState .value .id ! )
22
23
23
24
const selected = ref (' ' )
25
+ const filterKey = ref (' ' )
26
+ const [filtered, toggleFiltered] = useToggle (true )
24
27
const tree = ref <CustomInspectorNode []>([])
25
28
const treeNodeLinkedList = computed (() => tree .value ?.length ? dfs (tree .value ?.[0 ]) : [])
26
29
const flattenedTreeNodes = computed (() => flattenTreeNodes (tree .value ))
@@ -92,8 +95,8 @@ watch(selected, () => {
92
95
getRoutesState (selected .value )
93
96
})
94
97
95
- const getRoutesInspectorTree = ( ) => {
96
- rpc .value .getInspectorTree ({ inspectorId: inspectorId .value , filter: ' ' }).then ((_data ) => {
98
+ const getRoutesInspectorTree = async ( filter = ' ' ) => {
99
+ await rpc .value .getInspectorTree ({ inspectorId: inspectorId .value , filter }).then ((_data ) => {
97
100
const data = parse (_data ! )
98
101
tree .value = data
99
102
if (! selected .value && data .length ) {
@@ -145,6 +148,18 @@ onUnmounted(() => {
145
148
rpc .functions .off (DevToolsMessagingEvents .INSPECTOR_TREE_UPDATED , onInspectorTreeUpdated )
146
149
rpc .functions .off (DevToolsMessagingEvents .INSPECTOR_STATE_UPDATED , onInspectorStateUpdated )
147
150
})
151
+
152
+ function search(v : string ) {
153
+ const value = v .trim ().toLowerCase ()
154
+ toggleFiltered ()
155
+ getRoutesInspectorTree (value ).then (() => {
156
+ toggleFiltered ()
157
+ })
158
+ }
159
+
160
+ watchDebounced (filterKey , (v ) => {
161
+ search (v )
162
+ }, { debounce: 300 })
148
163
</script >
149
164
150
165
<template >
@@ -155,12 +170,22 @@ onUnmounted(() => {
155
170
<Splitpanes class =" flex-1 overflow-auto" >
156
171
<Pane border =" r base" size =" 40" h-full >
157
172
<div h-full select-none overflow-scroll p2 class =" no-scrollbar" >
173
+ <div class =" pb2" >
174
+ <VueInput
175
+ v-model =" filterKey" placeholder =" Search routes"
176
+ :loading =" !filtered"
177
+ :loading-debounce-time =" 250" class =" text-3.5"
178
+ />
179
+ </div >
158
180
<ComponentTree v-model =" selected" :data =" tree" />
159
181
</div >
160
182
</Pane >
161
183
<Pane size =" 60" >
162
184
<div h-full overflow-scroll class =" no-scrollbar" >
163
- <RootStateViewer v-if =" selected" class =" p3" :data =" state" node-id =" " inspector-id =" router" expanded-state-id =" routes-state" />
185
+ <RootStateViewer
186
+ v-if =" selected" class =" p3" :data =" state" node-id =" " inspector-id =" router"
187
+ expanded-state-id =" routes-state"
188
+ />
164
189
<Empty v-else >
165
190
No Data
166
191
</Empty >
0 commit comments