Skip to content

Commit f9211af

Browse files
committed
wip:
1 parent 2ea3b15 commit f9211af

File tree

15 files changed

+454
-94
lines changed

15 files changed

+454
-94
lines changed

packages/core/src/client/standalone/App.vue

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
<script setup lang="ts">
22
import type { DocksContext } from '@vitejs/devtools-kit/client'
33
import { getDevToolsRpcClient } from '@vitejs/devtools-kit/client'
4-
import { markRaw, ref, useTemplateRef, watch } from 'vue'
4+
import { computed, markRaw, ref, useTemplateRef, watch } from 'vue'
55
import DockEntriesWithCategories from '../webcomponents/components/DockEntriesWithCategories.vue'
66
import FloatingElements from '../webcomponents/components/FloatingElements.vue'
77
import VitePlus from '../webcomponents/components/icons/VitePlus.vue'
88
import ViewBuiltinClientAuthNotice from '../webcomponents/components/ViewBuiltinClientAuthNotice.vue'
99
import ViewEntry from '../webcomponents/components/ViewEntry.vue'
1010
import { createDocksContext } from '../webcomponents/state/context'
11+
import { groupDockEntries } from '../webcomponents/state/dock-settings'
12+
import { sharedStateToRef } from '../webcomponents/state/docks'
1113
import { PersistedDomViewsManager } from '../webcomponents/utils/PersistedDomViewsManager'
1214
1315
const rpc = await getDevToolsRpcClient()
@@ -28,6 +30,10 @@ context.rpc.events.on('rpc:is-trusted:updated', (isTrusted) => {
2830
isRpcTrusted.value = isTrusted
2931
})
3032
33+
// Load settings from context
34+
const settingsStore = await context.docks.getSettingsStore()
35+
const settings = sharedStateToRef(settingsStore)
36+
3137
watch(
3238
() => context.docks.entries,
3339
() => {
@@ -36,6 +42,10 @@ watch(
3642
{ immediate: true },
3743
)
3844
45+
const groupedEntries = computed(() => {
46+
return groupDockEntries(context.docks.entries, settings.value)
47+
})
48+
3949
function switchEntry(id: string) {
4050
if (id) {
4151
context.docks.switchEntry(id)
@@ -55,7 +65,7 @@ function switchEntry(id: string) {
5565
<div class="transition duration-200 p2">
5666
<DockEntriesWithCategories
5767
:context="context"
58-
:entries="context.docks.entries"
68+
:groups="groupedEntries"
5969
:is-vertical="false"
6070
:selected="context.docks.selected"
6171
@select="(e) => switchEntry(e?.id)"

packages/core/src/client/webcomponents/.generated/css.ts

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

packages/core/src/client/webcomponents/components/Dock.vue

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
<script setup lang="ts">
2+
import type { DevToolsDocksUserSettings } from '@vitejs/devtools-kit'
23
import type { DocksContext } from '@vitejs/devtools-kit/client'
34
import { useEventListener, useScreenSafeArea } from '@vueuse/core'
4-
import { computed, onMounted, reactive, ref, useTemplateRef, watchEffect } from 'vue'
5+
import { computed, onMounted, reactive, ref, shallowRef, useTemplateRef, watch, watchEffect } from 'vue'
56
import { BUILTIN_ENTRY_CLIENT_AUTH_NOTICE } from '../constants'
7+
import { groupDockEntries, splitGroupsWithCapacity } from '../state/dock-settings'
8+
import { sharedStateToRef } from '../state/docks'
69
import DockEntriesWithCategories from './DockEntriesWithCategories.vue'
710
import DockOverflowButton from './DockOverflowButton.vue'
811
import BracketLeft from './icons/BracketLeft.vue'
@@ -73,7 +76,24 @@ context.rpc.events.on('rpc:is-trusted:updated', (isTrusted) => {
7376
context.docks.switchEntry(null)
7477
})
7578
76-
onMounted(() => {
79+
const settings = shallowRef<DevToolsDocksUserSettings>({
80+
hiddenDocks: [],
81+
hiddenCategories: [],
82+
pinnedDocks: [],
83+
customOrder: {},
84+
})
85+
86+
const groupedEntries = computed(() => {
87+
const groups = groupDockEntries(context.docks.entries, settings.value)
88+
return splitGroupsWithCapacity(groups, 5)
89+
})
90+
91+
onMounted(async () => {
92+
const settingsStore = await context.docks.getSettingsStore()
93+
const settingsRef = sharedStateToRef(settingsStore)
94+
settings.value = settingsRef.value
95+
watch(settingsRef, v => settings.value = v)
96+
7797
windowSize.width = window.innerWidth
7898
windowSize.height = window.innerHeight
7999
@@ -312,23 +332,23 @@ onMounted(() => {
312332
>
313333
<DockEntriesWithCategories
314334
:context="context"
315-
:capacity="5"
316-
:entries="context.docks.entries"
335+
:groups="groupedEntries.visible"
336+
:overflow="groupedEntries.overflow"
317337
:is-vertical="context.panel.isVertical"
318338
:selected="context.docks.selected"
319339
@select="(e) => context.docks.switchEntry(e?.id)"
320-
>
321-
<template #overflow="{ entries }">
322-
<div class="border-base m1 h-20px w-px border-r-1.5" />
323-
<DockOverflowButton
324-
:context="context"
325-
:is-vertical="context.panel.isVertical"
326-
:entries="entries.flatMap(([_, entries]) => entries)"
327-
:selected="context.docks.selected"
328-
@select="(e) => context.docks.switchEntry(e?.id)"
329-
/>
330-
</template>
331-
</DockEntriesWithCategories>
340+
/>
341+
342+
<template v-if="groupedEntries.overflow.length > 0">
343+
<div class="border-base m1 h-20px w-px border-r-1.5" />
344+
<DockOverflowButton
345+
:context="context"
346+
:is-vertical="context.panel.isVertical"
347+
:groups="groupedEntries.overflow"
348+
:selected="context.docks.selected"
349+
@select="(e) => context.docks.switchEntry(e?.id)"
350+
/>
351+
</template>
332352
</div>
333353
</div>
334354
</div>
Lines changed: 4 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,23 @@
11
<script setup lang="ts">
22
import type { DevToolsDockEntry } from '@vitejs/devtools-kit'
33
import type { DocksContext } from '@vitejs/devtools-kit/client'
4-
import { computed, toRefs } from 'vue'
5-
import { DEFAULT_CATEGORIES_ORDER } from '../constants'
4+
import type { GroupedDockEntries } from '../state/dock-settings'
65
import DockEntries from './DockEntries.vue'
76
8-
const props = defineProps<{
7+
defineProps<{
98
context: DocksContext
10-
entries: DevToolsDockEntry[]
9+
groups: GroupedDockEntries
1110
selected: DevToolsDockEntry | null
12-
capacity?: number
1311
isVertical: boolean
1412
}>()
1513
1614
const emit = defineEmits<{
1715
(e: 'select', entry: DevToolsDockEntry): void
1816
}>()
19-
20-
const { capacity } = toRefs(props)
21-
22-
const groups = computed(() => {
23-
const map = new Map<string, DevToolsDockEntry[]>()
24-
for (const entry of props.entries) {
25-
if (entry.isHidden)
26-
continue
27-
const category = entry.category ?? 'default'
28-
if (!map.has(category))
29-
map.set(category, [])
30-
map.get(category)!.push(entry)
31-
}
32-
33-
const entries = Array
34-
.from(map.entries())
35-
.sort(([a], [b]) => {
36-
const ia = DEFAULT_CATEGORIES_ORDER[a] || 0
37-
const ib = DEFAULT_CATEGORIES_ORDER[b] || 0
38-
return ib === ia ? b.localeCompare(a) : ia - ib
39-
})
40-
41-
entries.forEach(([_, entries]) => {
42-
entries.sort((a, b) => {
43-
const ia = a.defaultOrder ?? 0
44-
const ib = b.defaultOrder ?? 0
45-
return ib === ia ? b.title.localeCompare(a.title) : ia - ib
46-
})
47-
})
48-
49-
let visible = entries
50-
const overflow: typeof entries = []
51-
52-
if (capacity.value != null) {
53-
visible = []
54-
let left = capacity.value
55-
for (const [category, items] of entries) {
56-
if (left <= 0) {
57-
overflow.push([category, items])
58-
}
59-
else if (items.length > left) {
60-
visible.push([category, items.slice(0, left)])
61-
overflow.push([category, items.slice(left)])
62-
left = 0
63-
}
64-
else {
65-
left -= items.length
66-
visible.push([category, items])
67-
}
68-
}
69-
}
70-
71-
return {
72-
entries,
73-
visible,
74-
overflow,
75-
}
76-
})
7717
</script>
7818

7919
<template>
80-
<template v-for="[category, entries], idx of groups.visible" :key="category">
20+
<template v-for="[category, entries], idx of groups" :key="category">
8121
<slot v-if="idx > 0" name="separator" :category="category" :index="idx" :is-vertical="isVertical">
8222
<div class="border-base m1 h-20px w-px border-r-1.5" />
8323
</slot>
@@ -89,5 +29,4 @@ const groups = computed(() => {
8929
@select="(e) => emit('select', e)"
9030
/>
9131
</template>
92-
<slot v-if="groups.overflow.length > 0" name="overflow" :entries="groups.overflow" />
9332
</template>

packages/core/src/client/webcomponents/components/DockOverflowButton.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script setup lang="ts">
22
import type { DevToolsDockEntry } from '@vitejs/devtools-kit'
33
import type { DocksContext } from '@vitejs/devtools-kit/client'
4+
import type { GroupedDockEntries } from '../state/dock-settings'
45
import { watchDebounced } from '@vueuse/core'
56
import { computed, h, ref, useTemplateRef } from 'vue'
67
import { setDocksOverflowPanel, useDocksOverflowPanel } from '../state/floating-tooltip'
@@ -10,7 +11,7 @@ import DockEntry from './DockEntry.vue'
1011
const props = defineProps<{
1112
context: DocksContext
1213
isVertical: boolean
13-
entries: DevToolsDockEntry[]
14+
groups: GroupedDockEntries
1415
selected: DevToolsDockEntry | null
1516
}>()
1617
@@ -20,7 +21,7 @@ const emit = defineEmits<{
2021
2122
const overflowButton = useTemplateRef<HTMLButtonElement>('overflowButton')
2223
const overflowBadge = computed(() => {
23-
const count = props.entries.length
24+
const count = props.groups.reduce((acc, [_, items]) => acc + items.length, 0)
2425
if (count > 9)
2526
return '9+'
2627
return count.toString()
@@ -39,7 +40,7 @@ function showOverflowPanel() {
3940
}, [
4041
h(DockEntriesWithCategories, {
4142
context: props.context,
42-
entries: props.entries,
43+
groups: props.groups,
4344
isVertical: false,
4445
selected: props.selected,
4546
onSelect: e => emit('select', e),

0 commit comments

Comments
 (0)