|
| 1 | +<script setup lang="ts"> |
| 2 | +import type { ComponentTreeNode } from '@vue/devtools-kit' |
| 3 | +import ToggleExpanded from '~/components/basic/ToggleExpanded.vue' |
| 4 | +import ComponentTreeViewer from '~/components/tree/TreeViewer.vue' |
| 5 | +import NodeTag from '~/components/basic/NodeTag.vue' |
| 6 | +
|
| 7 | +import { useToggleExpanded } from '~/composables/toggle-expanded' |
| 8 | +import { useSelect } from '~/composables/select' |
| 9 | +
|
| 10 | +withDefaults(defineProps<{ |
| 11 | + data: ComponentTreeNode[] |
| 12 | + depth: number |
| 13 | +}>(), { |
| 14 | + depth: 0, |
| 15 | +}) |
| 16 | +const selectedNodeId = defineModel() |
| 17 | +const { expanded, toggleExpanded } = useToggleExpanded() |
| 18 | +const { select: _select } = useSelect() |
| 19 | +
|
| 20 | +function select(id: string) { |
| 21 | + selectedNodeId.value = id |
| 22 | +} |
| 23 | +</script> |
| 24 | + |
| 25 | +<template> |
| 26 | + <div |
| 27 | + v-for="(item, index) in data" |
| 28 | + :key="index" |
| 29 | + > |
| 30 | + <div |
| 31 | + class="group flex cursor-pointer items-center rounded-1 hover:(bg-primary-300 dark:bg-gray-600)" |
| 32 | + :style=" { paddingLeft: `${15 * depth + 4}px` }" |
| 33 | + :class="{ 'bg-primary-600! active': selectedNodeId === item.id }" |
| 34 | + @click="select(item.id)" |
| 35 | + > |
| 36 | + <ToggleExpanded |
| 37 | + v-if="item?.children?.length" |
| 38 | + :value="expanded.includes(item.id)" |
| 39 | + class="[.active_&]:op20 group-hover:op20" |
| 40 | + @click.stop="toggleExpanded(item.id)" |
| 41 | + /> |
| 42 | + <!-- placeholder --> |
| 43 | + <span v-else pl5 /> |
| 44 | + <span font-state-field text-4> |
| 45 | + <span class="text-gray-400 dark:text-gray-600 group-hover:(text-white op50) [.active_&]:(op50 text-white!)"><</span> |
| 46 | + <span group-hover:text-white class="[.active_&]:(text-white)">{{ item.name }}</span> |
| 47 | + <span class="text-gray-400 dark:text-gray-600 group-hover:(text-white op50) [.active_&]:(op50 text-white!)">></span> |
| 48 | + </span> |
| 49 | + <NodeTag v-for="(_item, index) in item.tags" :key="index" :tag="_item" /> |
| 50 | + </div> |
| 51 | + <div |
| 52 | + v-if="item?.children?.length && expanded.includes(item.id)" |
| 53 | + > |
| 54 | + <ComponentTreeViewer v-model="selectedNodeId" :data="item?.children" :depth="depth + 1" /> |
| 55 | + </div> |
| 56 | + </div> |
| 57 | +</template> |
0 commit comments