|
|
|
@ -1,8 +1,9 @@
|
|
|
|
|
<script lang="ts" setup> |
|
|
|
|
import { ref, watch } from 'vue' |
|
|
|
|
import { ref } from 'vue' |
|
|
|
|
import { PlusOutlined, SyncOutlined } from '@ant-design/icons-vue' |
|
|
|
|
import { useAsyncState } from '@vueuse/core' |
|
|
|
|
import { Empty, Popconfirm, Space, Tree } from 'ant-design-vue' |
|
|
|
|
import type { EventDataNode } from 'ant-design-vue/es/tree' |
|
|
|
|
import GroupFormModal from './GroupFormModal.vue' |
|
|
|
|
import { useModal } from '@/components/Modal' |
|
|
|
|
import { deleteDevicegroup, getDeviceGroupTree } from '@/api/device-manage/group' |
|
|
|
@ -10,7 +11,7 @@ import { useMessage } from '@/hooks/web/useMessage'
|
|
|
|
|
import { usePermission } from '@/hooks/web/usePermission' |
|
|
|
|
|
|
|
|
|
defineProps<{ selectedGroupId: string | undefined }>() |
|
|
|
|
const emit = defineEmits(['update:selectedGroupId']) |
|
|
|
|
const emit = defineEmits(['update:selectedGroupId', 'change']) |
|
|
|
|
|
|
|
|
|
const [registerModal, { openModal }] = useModal<{ id: string } | { parentId: string }>() |
|
|
|
|
|
|
|
|
@ -26,16 +27,15 @@ async function handleDelete(id: string) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const selectedKeys = ref<string[]>([]) |
|
|
|
|
watch(selectedKeys, (keys, oldKeys) => { |
|
|
|
|
const value = keys[0] |
|
|
|
|
if (!value) { |
|
|
|
|
// can't unselect |
|
|
|
|
selectedKeys.value = oldKeys |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
emit('update:selectedGroupId', value) |
|
|
|
|
}) |
|
|
|
|
function onSelectNode(_, { selected, node }: { selected: boolean, node: EventDataNode }) { |
|
|
|
|
// can't unselect |
|
|
|
|
if (!selected) |
|
|
|
|
return selectedKeys.value = [node.key as string] |
|
|
|
|
|
|
|
|
|
emit('update:selectedGroupId', node.key) |
|
|
|
|
emit('change') |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const { hasPermission } = usePermission() |
|
|
|
|
</script> |
|
|
|
@ -57,7 +57,7 @@ const { hasPermission } = usePermission()
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div mt="20px"> |
|
|
|
|
<Tree v-model:selected-keys="selectedKeys" :tree-data="state" :field-names="{ key: 'id' }"> |
|
|
|
|
<Tree v-model:selected-keys="selectedKeys" :tree-data="state" :field-names="{ key: 'id' }" @select="onSelectNode"> |
|
|
|
|
<template #title="{ title, data }"> |
|
|
|
|
<div flex="~ items-center justify-between" py="8px" px="5px" box-border> |
|
|
|
|
<div flex="1" width="0" truncate :title="title"> |
|
|
|
|