CameraTree.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <template>
  2. <div class="cameraTreeWrapper">
  3. <div class="cameraTreeTitle">场景树</div>
  4. <div class="cameraTreeInputWrapper">
  5. <el-input
  6. v-model="filterText"
  7. placeholder="请输入相机的名称进行搜索"
  8. :suffix-icon="Search"
  9. class="filterTextInput"
  10. />
  11. <el-tree
  12. :data="props.cameraTree"
  13. :props="defaultProps"
  14. @node-click="handleNodeClick"
  15. node-key="code"
  16. :default-expand-all="true"
  17. :filter-node-method="filterNode"
  18. ref="treeRef"
  19. v-loading="props.loading"
  20. >
  21. <template #default="{ node, data }">
  22. <span class="custom-tree-node">
  23. <span
  24. ><span
  25. class="cameraCommon"
  26. :class="{
  27. cameraSelect:
  28. data.nodeType === CameraTreeNodeType.camera && data.id === Number(cameraId),
  29. }"
  30. ></span
  31. >{{ node.label }}</span
  32. >
  33. </span>
  34. </template>
  35. </el-tree>
  36. </div>
  37. </div>
  38. </template>
  39. <script lang="ts" setup>
  40. import { ElTree } from 'element-plus';
  41. import { ref, watch } from 'vue';
  42. import { useRouteQuery } from '@vueuse/router';
  43. import { Search } from '@element-plus/icons-vue';
  44. import useCameraDetail from '../../store/useCameraDetailStore';
  45. import { CameraTree, CameraTreeNodeType } from '@/api/camera/camera-preview';
  46. const props = defineProps<{ cameraTree: Tree[]; loading: boolean }>();
  47. interface Tree {
  48. [key: string]: any;
  49. }
  50. const { setDetail } = useCameraDetail();
  51. const cameraId = useRouteQuery('cameraId');
  52. const defaultProps = {
  53. children: 'children',
  54. label: 'name',
  55. };
  56. const handleNodeClick = (e: CameraTree) => {
  57. console.log('e', e);
  58. console.log('CameraTreeNodeType', CameraTreeNodeType);
  59. if (e.nodeType === CameraTreeNodeType.camera) {
  60. console.log('aaa');
  61. cameraId.value = String(e.id);
  62. setDetail(e);
  63. }
  64. };
  65. const filterText = ref('');
  66. const treeRef = ref<InstanceType<typeof ElTree>>();
  67. watch(filterText, (val) => {
  68. treeRef.value!.filter(val);
  69. });
  70. const filterNode = (value: string, data: Tree) => {
  71. if (!value) return true;
  72. return data.name?.includes(value);
  73. };
  74. </script>
  75. <style scoped>
  76. .cameraCommon {
  77. width: 6px;
  78. height: 6px;
  79. display: inline-block;
  80. margin-right: 6px;
  81. }
  82. .cameraSelect {
  83. width: 6px;
  84. height: 6px;
  85. background: #0052d9;
  86. display: inline-block;
  87. border-radius: 6px;
  88. margin-right: 6px;
  89. }
  90. .cameraTreeTitle {
  91. background: #f0f2f5;
  92. padding: 12px;
  93. }
  94. .cameraTreeInputWrapper {
  95. padding: 8px;
  96. }
  97. .filterTextInput {
  98. margin: 8px 0;
  99. }
  100. </style>