mirror of https://github.com/alibaba/arthas.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.3 KiB
Vue
128 lines
3.3 KiB
Vue
<script setup>
|
|
import Translate from "./icons/Translate.vue";
|
|
|
|
import AutoLink from "@theme/AutoLink.vue";
|
|
import DropdownTransition from "@theme/DropdownTransition.vue";
|
|
import { computed, ref, toRefs, watch } from "vue";
|
|
import { useRoute } from "vue-router";
|
|
|
|
const props = defineProps({
|
|
item: {
|
|
type: Object,
|
|
required: true,
|
|
},
|
|
});
|
|
|
|
const { item } = toRefs(props);
|
|
|
|
const dropdownAriaLabel = computed(
|
|
() => item.value.ariaLabel || item.value.text
|
|
);
|
|
|
|
const open = ref(false);
|
|
const route = useRoute();
|
|
watch(
|
|
() => route.path,
|
|
() => {
|
|
open.value = false;
|
|
}
|
|
);
|
|
|
|
/**
|
|
* Open the dropdown when user tab and click from keyboard.
|
|
*
|
|
* Use event.detail to detect tab and click from keyboard.
|
|
* The Tab + Click is UIEvent > KeyboardEvent, so the detail is 0.
|
|
*
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail
|
|
*/
|
|
const handleDropdown = (e) => {
|
|
const isTriggerByTab = e.detail === 0;
|
|
if (isTriggerByTab) {
|
|
open.value = !open.value;
|
|
} else {
|
|
open.value = false;
|
|
}
|
|
};
|
|
|
|
const isLastItemOfArray = (item, arr) => arr[arr.length - 1] === item;
|
|
</script>
|
|
|
|
<template>
|
|
<div class="navbar-dropdown-wrapper" :class="{ open }">
|
|
<button
|
|
class="navbar-dropdown-title"
|
|
type="button"
|
|
:aria-label="dropdownAriaLabel"
|
|
@click="handleDropdown"
|
|
>
|
|
<Translate v-if="item.text === 'Languages'" />
|
|
<span class="title" v-else>{{ item.text }}</span>
|
|
<span class="arrow down" />
|
|
</button>
|
|
|
|
<button
|
|
class="navbar-dropdown-title-mobile"
|
|
type="button"
|
|
:aria-label="dropdownAriaLabel"
|
|
@click="open = !open"
|
|
>
|
|
<Translate v-if="item.text === 'Languages'" />
|
|
<span class="title" v-else>{{ item.text }}</span>
|
|
<span class="arrow" :class="open ? 'down' : 'right'" />
|
|
</button>
|
|
|
|
<DropdownTransition>
|
|
<ul v-show="open" class="navbar-dropdown">
|
|
<li
|
|
v-for="child in item.children"
|
|
:key="child.text"
|
|
class="navbar-dropdown-item"
|
|
>
|
|
<template v-if="child.children">
|
|
<h4 class="navbar-dropdown-subtitle">
|
|
<AutoLink
|
|
v-if="child.link"
|
|
:item="child"
|
|
@focusout="
|
|
isLastItemOfArray(child, item.children) &&
|
|
child.children.length === 0 &&
|
|
(open = false)
|
|
"
|
|
/>
|
|
|
|
<span v-else>{{ child.text }}</span>
|
|
</h4>
|
|
|
|
<ul class="navbar-dropdown-subitem-wrapper">
|
|
<li
|
|
v-for="grandchild in child.children"
|
|
:key="grandchild.link"
|
|
class="navbar-dropdown-subitem"
|
|
>
|
|
<AutoLink
|
|
:item="grandchild"
|
|
@focusout="
|
|
isLastItemOfArray(grandchild, child.children) &&
|
|
isLastItemOfArray(child, item.children) &&
|
|
(open = false)
|
|
"
|
|
/>
|
|
</li>
|
|
</ul>
|
|
</template>
|
|
|
|
<template v-else>
|
|
<AutoLink
|
|
:item="child"
|
|
@focusout="
|
|
isLastItemOfArray(child, item.children) && (open = false)
|
|
"
|
|
/>
|
|
</template>
|
|
</li>
|
|
</ul>
|
|
</DropdownTransition>
|
|
</div>
|
|
</template>
|