chore(VPSidebarItem): revert 3805 work: active groups toggle open

pull/3806/head
Henry Bley-Vroman 1 year ago
parent b96cc8fd12
commit 8dee2681e1

@ -10,10 +10,13 @@ const props = defineProps<{
}>() }>()
const { const {
collapsed,
collapsible,
isLink, isLink,
isActiveLink, isActiveLink,
hasActiveLink, hasActiveLink,
hasChildren hasChildren,
handleToggle,
} = useSidebarControl(computed(() => props.item)) } = useSidebarControl(computed(() => props.item))
const sectionTag = computed(() => (hasChildren.value ? 'section' : `div`)) const sectionTag = computed(() => (hasChildren.value ? 'section' : `div`))
@ -34,14 +37,23 @@ const classes = computed(() => [
{ 'is-active': isActiveLink.value }, { 'is-active': isActiveLink.value },
{ 'has-active': hasActiveLink.value } { 'has-active': hasActiveLink.value }
]) ])
function onToggle(payload: ToggleEvent): void {
handleToggle(payload.newState)
}
</script> </script>
<template> <template>
<component :is="sectionTag" class="VPSidebarItem" :class="classes"> <component :is="sectionTag" class="VPSidebarItem" :class="classes">
<!-- @TODO @toggle TS error blocked by
https://github.com/vuejs/core/pull/10938.
See also https://github.com/vuejs/core/issues/10928
-->
<details <details
v-if="item.text && item.collapsed != null && hasChildren" v-if="item.text && collapsible && hasChildren"
class="item" class="item"
:open="!item.collapsed" :open="!collapsed"
@toggle="onToggle"
> >
<summary> <summary>
<div class="indicator" /> <div class="indicator" />
@ -94,7 +106,7 @@ const classes = computed(() => [
<component v-else :is="textTag" class="text" v-html="item.text" /> <component v-else :is="textTag" class="text" v-html="item.text" />
</div> </div>
<div v-if="(item.collapsed == null || !item.text) && hasChildren" class="items"> <div v-if="(!collapsible || !item.text) && hasChildren" class="items">
<template v-if="depth < 5"> <template v-if="depth < 5">
<VPSidebarItem <VPSidebarItem
v-for="i in item.items" v-for="i in item.items"

@ -20,11 +20,13 @@ import {
import { useData } from './data' import { useData } from './data'
export interface SidebarControl { export interface SidebarControl {
collapsed: Ref<boolean>
collapsible: ComputedRef<boolean> collapsible: ComputedRef<boolean>
isLink: ComputedRef<boolean> isLink: ComputedRef<boolean>
isActiveLink: Ref<boolean> isActiveLink: Ref<boolean>
hasActiveLink: ComputedRef<boolean> hasActiveLink: ComputedRef<boolean>
hasChildren: ComputedRef<boolean> hasChildren: ComputedRef<boolean>
handleToggle(newState: string): void
} }
export function useSidebar() { export function useSidebar() {
@ -137,6 +139,8 @@ export function useSidebarControl(
): SidebarControl { ): SidebarControl {
const { page, hash } = useData() const { page, hash } = useData()
const collapsed = ref(false)
const collapsible = computed(() => { const collapsible = computed(() => {
return item.value.collapsed != null return item.value.collapsed != null
}) })
@ -167,15 +171,26 @@ export function useSidebarControl(
return !!(item.value.items && item.value.items.length) return !!(item.value.items && item.value.items.length)
}) })
watchEffect(() => {
collapsed.value = !!(collapsible.value && item.value.collapsed)
})
watchPostEffect(() => { watchPostEffect(() => {
isActiveLink.value || hasActiveLink.value console.log(item.value.text, isActiveLink.value, hasActiveLink.value)
;(isActiveLink.value || hasActiveLink.value) && (collapsed.value = false)
}) })
function handleToggle(newState: string) {
collapsed.value = newState === 'closed'
}
return { return {
collapsed,
collapsible, collapsible,
isLink, isLink,
isActiveLink, isActiveLink,
hasActiveLink, hasActiveLink,
hasChildren hasChildren,
handleToggle
} }
} }

Loading…
Cancel
Save