|
@@ -1,39 +1,53 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <el-tree
|
|
|
|
|
- :data="props.data"
|
|
|
|
|
- :props="defaultProps"
|
|
|
|
|
- @node-click="handleNodeClick"
|
|
|
|
|
- node-key="code"
|
|
|
|
|
- ref="treeRef"
|
|
|
|
|
- :default-expand-all="true"
|
|
|
|
|
- >
|
|
|
|
|
- <template #default="{ node, data }">
|
|
|
|
|
- <span class="custom-tree-node">
|
|
|
|
|
- <span
|
|
|
|
|
- ><span
|
|
|
|
|
- class="cameraCommon"
|
|
|
|
|
- :class="{
|
|
|
|
|
- cameraSelect:
|
|
|
|
|
- data.nodeType === CameraTreeNodeType.camera && data.id === Number(cameraId),
|
|
|
|
|
- }"
|
|
|
|
|
- ></span
|
|
|
|
|
- >{{ node.label }}</span
|
|
|
|
|
- >
|
|
|
|
|
- <div>
|
|
|
|
|
- <!-- {{ JSON.stringify(data) }} -->
|
|
|
|
|
- </div>
|
|
|
|
|
- </span>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-tree>
|
|
|
|
|
|
|
+ <div class="cameraTreeWrapper">
|
|
|
|
|
+ <div class="cameraTreeTitle">场景树</div>
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="filterText"
|
|
|
|
|
+ placeholder="请输入相机的名称进行搜索"
|
|
|
|
|
+ :suffix-icon="Search"
|
|
|
|
|
+ class="filterTextInput"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <el-tree
|
|
|
|
|
+ :data="props.data"
|
|
|
|
|
+ :props="defaultProps"
|
|
|
|
|
+ @node-click="handleNodeClick"
|
|
|
|
|
+ node-key="code"
|
|
|
|
|
+ :default-expand-all="true"
|
|
|
|
|
+ :filter-node-method="filterNode"
|
|
|
|
|
+ ref="treeRef"
|
|
|
|
|
+ >
|
|
|
|
|
+ <template #default="{ node, data }">
|
|
|
|
|
+ <span class="custom-tree-node">
|
|
|
|
|
+ <span
|
|
|
|
|
+ ><span
|
|
|
|
|
+ class="cameraCommon"
|
|
|
|
|
+ :class="{
|
|
|
|
|
+ cameraSelect:
|
|
|
|
|
+ data.nodeType === CameraTreeNodeType.camera && data.id === Number(cameraId),
|
|
|
|
|
+ }"
|
|
|
|
|
+ ></span
|
|
|
|
|
+ >{{ node.label }}</span
|
|
|
|
|
+ >
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-tree>
|
|
|
|
|
+ </div>
|
|
|
</template>
|
|
</template>
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
import { ElTree } from 'element-plus';
|
|
import { ElTree } from 'element-plus';
|
|
|
- import { ref } from 'vue';
|
|
|
|
|
|
|
+ import { ref, watch } from 'vue';
|
|
|
import { useRouteQuery } from '@vueuse/router';
|
|
import { useRouteQuery } from '@vueuse/router';
|
|
|
|
|
+ import { Search } from '@element-plus/icons-vue';
|
|
|
|
|
+
|
|
|
import useCameraDetail from '../../store/useCameraDetailStore';
|
|
import useCameraDetail from '../../store/useCameraDetailStore';
|
|
|
import { CameraTree, CameraTreeNodeType } from '@/api/camera/camera-preview';
|
|
import { CameraTree, CameraTreeNodeType } from '@/api/camera/camera-preview';
|
|
|
const props = defineProps<{ data }>();
|
|
const props = defineProps<{ data }>();
|
|
|
|
|
|
|
|
|
|
+ interface Tree {
|
|
|
|
|
+ [key: string]: any;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const { setDetail } = useCameraDetail();
|
|
const { setDetail } = useCameraDetail();
|
|
|
|
|
|
|
|
const cameraId = useRouteQuery('cameraId');
|
|
const cameraId = useRouteQuery('cameraId');
|
|
@@ -50,7 +64,17 @@
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- const treeRef = ref(null);
|
|
|
|
|
|
|
+ const filterText = ref('');
|
|
|
|
|
+ const treeRef = ref<InstanceType<typeof ElTree>>();
|
|
|
|
|
+
|
|
|
|
|
+ watch(filterText, (val) => {
|
|
|
|
|
+ treeRef.value!.filter(val);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ const filterNode = (value: string, data: Tree) => {
|
|
|
|
|
+ if (!value) return true;
|
|
|
|
|
+ return data.name?.includes(value);
|
|
|
|
|
+ };
|
|
|
</script>
|
|
</script>
|
|
|
<style scoped>
|
|
<style scoped>
|
|
|
.cameraCommon {
|
|
.cameraCommon {
|
|
@@ -68,4 +92,15 @@
|
|
|
border-radius: 6px;
|
|
border-radius: 6px;
|
|
|
margin-right: 6px;
|
|
margin-right: 6px;
|
|
|
}
|
|
}
|
|
|
|
|
+ .cameraTreeTitle {
|
|
|
|
|
+ background: #f0f2f5;
|
|
|
|
|
+ padding: 12px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .cameraTreeWrapper {
|
|
|
|
|
+ padding: 8px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .filterTextInput {
|
|
|
|
|
+ margin: 8px 0;
|
|
|
|
|
+ }
|
|
|
</style>
|
|
</style>
|