Skip to content

Commit 1e5d059

Browse files
authored
feat: allow sorting trace file roots (#23)
1 parent bdf57eb commit 1e5d059

File tree

5 files changed

+57
-16
lines changed

5 files changed

+57
-16
lines changed

devUiDriver/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ function handleMessage(e: any) {
3131
return
3232

3333
for (const message of commands) {
34-
if (deepEq(message.trigger, e.data))
34+
if (message.trigger && deepEq(message.trigger, e.data))
3535
iframe.contentWindow?.postMessage(message.response, '*')
3636
}
3737
}
@@ -50,6 +50,7 @@ const commandResponses: Record<string, any[]> = {}
5050
for (const command of commands) {
5151
if (
5252
'trigger' in command
53+
&& command.trigger
5354
&& 'command' in command.trigger
5455
&& command.trigger.command
5556
) {

shared/src/messages.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ const zodTree: z.ZodType<Tree> = z.lazy(() =>
104104
const showTree = z.object({
105105
message: z.literal('showTree'),
106106
nodes: z.array(zodTree),
107-
replace: z.boolean().optional(),
107+
step: z.literal('start').or(z.literal('add').or(z.literal('done'))),
108108
})
109109
export type ShowTree = z.infer<typeof showTree>
110110

shared/src/traceTree.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,16 +99,18 @@ export function showTree(startsWith: string, sourceFileName: string, position: n
9999
if (updateUi)
100100
postMessage({ message: 'filterTree', startsWith, sourceFileName, position })
101101

102-
postMessage({ message: 'showTree', nodes: [], replace: true })
102+
postMessage({ message: 'showTree', nodes: [], step: 'start' })
103103

104104
let i = 0
105105

106106
// this can be large enough to freeze the UI if sent at once
107107
const interval = setInterval(() => {
108-
postMessage({ message: 'showTree', nodes: skinnyNodes.slice(i, i + 10) })
108+
postMessage({ message: 'showTree', nodes: skinnyNodes.slice(i, i + 10), step: 'add' })
109109
i += 10
110-
if (i >= skinnyNodes.length)
110+
if (i >= skinnyNodes.length) {
111111
clearInterval(interval)
112+
postMessage({ message: 'showTree', nodes: [], step: 'done' })
113+
}
112114
}, 0)
113115

114116
nodes.forEach(node => treeIdNodes.set(node.id, node))

ui/app.vue

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ const colorMode = useColorMode()
44
55
const sendMesage = useNuxtApp().$sendMessage
66
7+
const sortOptions = ['Timestamp', 'Duration', 'Types', 'Total Types'] as const
8+
const sortBy = ref('Timestamp' as (typeof sortOptions)[number])
9+
710
const secondButtonLabel = ref('Another button')
811
912
const filters = useState('treeFilters', () => ({ startsWith: 'check', sourceFileName: '', position: 0 as number | '' }))
@@ -72,17 +75,22 @@ function toggleDarkMode() {
7275
</ULabled>
7376
</div>
7477
</ULabled>
75-
<div>
76-
<p class="p-4 pb-2">
77-
<UIcon
78-
v-model="colorMode.preference" :name="iconName"
79-
:dynamic="true" @click="toggleDarkMode"
80-
/>
81-
</p>
78+
<div class="flex flex-col gap-1">
79+
<ULabled label="Dark Mode">
80+
<p class="p-4 ">
81+
<UIcon
82+
v-model="colorMode.preference" :name="iconName"
83+
:dynamic="true" @click="toggleDarkMode"
84+
/>
85+
</p>
86+
</ULabled>
87+
<ULabled label="Sort By">
88+
<USelect v-model="sortBy" :options="sortOptions" />
89+
</ULabled>
8290
</div>
8391
</div>
8492
<div>
85-
<tree-root />
93+
<tree-root :sort-by="sortBy" />
8694
</div>
8795

8896
<dev-controls />

ui/components/TreeRoot.vue

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,52 @@
33
import type { Tree } from '../../shared/src/traceTree'
44
import TreeNode from './TreeNode.vue'
55
6+
const props = defineProps<{ sortBy: 'Timestamp' | 'Duration' | 'Types' | 'Total Types' }>()
7+
68
const Messages = useNuxtApp().$Messages
79
10+
const sortValue: Record<typeof props.sortBy, (t: Tree) => number> = {
11+
'Timestamp': t => t.line.ts,
12+
'Duration': t => -(t.line.dur ?? 0),
13+
'Types': t => -t.typeCnt,
14+
'Total Types': t => -(t.childTypeCnt + t.typeCnt),
15+
} as const
16+
817
const nodes = ref([] as Tree[])
918
19+
let lastSortBy = props.sortBy
20+
function doSort() {
21+
lastSortBy = props.sortBy
22+
const val = props.sortBy ?? 'Timestamp'
23+
const ord = sortValue[val]
24+
nodes.value = nodes.value.toSorted((a, b) => ord(a) - ord(b))
25+
}
26+
1027
function handleMessage(e: MessageEvent<unknown>) {
1128
const message = Messages.message.safeParse(e.data)
1229
if (!message.success)
1330
return
1431
1532
if (message.data.message === 'showTree') {
16-
if (message.data.replace)
17-
nodes.value = []
18-
nodes.value.push(...message.data.nodes)
33+
switch (message.data.step) {
34+
case 'start':
35+
nodes.value = []
36+
break
37+
case 'add':
38+
nodes.value.push(...message.data.nodes)
39+
break
40+
case 'done':
41+
doSort()
42+
break
43+
}
1944
}
2045
}
2146
47+
onUpdated(() => {
48+
if (lastSortBy !== props.sortBy)
49+
doSort()
50+
})
51+
2252
onMounted(() => {
2353
window.addEventListener('message', handleMessage)
2454
})

0 commit comments

Comments
 (0)