FenceToolbar.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <template>
  2. <div class="fenceWrapper">
  3. <div>
  4. <div>电子围栏</div>
  5. <ElSwitch size="small" class="fenceSwitchBtn" />
  6. </div>
  7. <PresetSelect />
  8. <div style="display: flex"> <ElCheckbox label="检测围栏外部" /> <ElCheckbox label="前台画面显示" /> </div>
  9. <div class="fenceListWrapper">
  10. <FenceNameItem
  11. :active="item.id === fenceStore.currentFenceId"
  12. v-for="item in fenceStore.allFences"
  13. :detail="item"
  14. :key="item.id"
  15. @click="handleSelectFence(item.id)"
  16. @delete="handleDeleteFence"
  17. @edit="handleEditFenceInfo(item)"
  18. />
  19. </div>
  20. <div>
  21. <EditFenceDialog
  22. v-if="showEditFenceDialog"
  23. @cancel="handleEditCancel"
  24. @submit="handleEditSubmit"
  25. :detail="selectedDetail"
  26. />
  27. </div>
  28. <!-- <div class="toolbar"> -->
  29. <!-- <div class="fenceDrawingTip" v-if="isEdit">
  30. {{ cameraAlgoStore.selectedAlgoDetail?.algoInfo?.name }}算法电子围栏绘制中
  31. </div> -->
  32. <!-- <template v-if="props.isEdit"> -->
  33. <!-- <ToolbarIcon
  34. :src="deleteIcon"
  35. :active="false"
  36. @click="emits('toggleFence')"
  37. tip="检测范围反选"
  38. /> -->
  39. <!-- <ToggleFenceStatus @click="emits('toggleRange')" />
  40. <ToolbarIcon :src="deleteIcon" :active="false" @click="emits('remove')" tip="删除电子围栏" />
  41. <ToolbarIcon :src="saveIcon" :active="false" @click="emits('save')" tip="保存电子围栏" />
  42. </template> -->
  43. <!-- <ElButton type="primary" size="small" @click="toggleEdit">{{
  44. props.isEdit ? '退出编辑' : '编辑电子围栏'
  45. }}</ElButton> -->
  46. <!-- </div> -->
  47. </div>
  48. </template>
  49. <script setup lang="ts">
  50. import { defineEmits, ref } from 'vue';
  51. import { ElButton, ElSwitch } from 'element-plus';
  52. import ToolbarIcon from '../ToolbarIcon/ToolbarIcon.vue';
  53. import saveIcon from '@/assets/images/camera/save.png';
  54. import deleteIcon from '@/assets/images/camera/delete.png';
  55. import ToggleFenceStatus from './ToggleFenceStatus.vue';
  56. import useCameraAlgoStore from '../../store/useCameraAlgoStore';
  57. import PresetSelect from '../PresetSelect/PresetSelect.vue';
  58. import FenceNameItem from './FenceNameItem.vue';
  59. import useFenceStore from '../../store/useFenceStore';
  60. import useCameraDetailStore from '../../store/useCameraDetailStore';
  61. import usePresetListStore from '../../store/usePresetListStore';
  62. import EditFenceDialog from './EditFenceDialog.vue';
  63. import { ServerLineInfo } from '../FenceEditor/constants';
  64. const cameraAlgoStore = useCameraAlgoStore();
  65. const fenceStore = useFenceStore();
  66. const cameraDetailStore = useCameraDetailStore();
  67. const presetStore = usePresetListStore();
  68. const props = defineProps<{ isEdit: boolean }>();
  69. const showEditFenceDialog = ref(false);
  70. const selectedDetail = ref<ServerLineInfo | null>(null);
  71. const emits = defineEmits<{
  72. (e: 'toggleEditable', editState: boolean): unknown;
  73. (e: 'toggleRange'): unknown;
  74. (e: 'remove'): unknown;
  75. (e: 'save'): unknown;
  76. (e: 'select', fenceId: number): unknown;
  77. }>();
  78. const toggleEdit = () => {
  79. emits('toggleEditable', !props.isEdit);
  80. };
  81. const handleSelectFence = (nextFenceId: number) => {
  82. emits('select', nextFenceId);
  83. };
  84. const handleEditFenceInfo = (detail) => {
  85. showEditFenceDialog.value = true;
  86. selectedDetail.value = detail;
  87. };
  88. const handleEditCancel = () => {
  89. showEditFenceDialog.value = false;
  90. selectedDetail.value = null;
  91. };
  92. const handleDeleteFence = (fenceId: number) => {
  93. const cameraId = cameraDetailStore.cameraId;
  94. const algoId = cameraAlgoStore.selectedAlgoId!;
  95. const presetToken = presetStore.currentPresetToken;
  96. fenceStore.deleteFence({ cameraId, algoId, presetToken, fenceId });
  97. };
  98. const handleEditSubmit = (data: { label: string; name: string }) => {
  99. const cameraId = cameraDetailStore.cameraId;
  100. const algoId = cameraAlgoStore.selectedAlgoId!;
  101. const presetToken = presetStore.currentPresetToken;
  102. const fenceId = selectedDetail.value?.id;
  103. if (!fenceId) return;
  104. fenceStore
  105. .editFence({
  106. cameraId,
  107. algoId,
  108. presetToken,
  109. fenceId: fenceId,
  110. fenceLabel: data.label,
  111. fenceName: data.name,
  112. })
  113. .then(() => {
  114. handleEditCancel();
  115. });
  116. };
  117. </script>
  118. <style scoped>
  119. .toolbar {
  120. display: flex;
  121. align-items: center;
  122. z-index: 10;
  123. padding: 5px;
  124. border-radius: 50px;
  125. }
  126. .fenceDrawingTip {
  127. background: #e8f5ff;
  128. border-radius: 6px;
  129. border: 1px solid #bae0ff;
  130. text-align: center;
  131. font-size: 12px;
  132. padding: 2px 20px;
  133. margin-right: 30px;
  134. color: #1890ff;
  135. }
  136. .fenceSwitchBtn {
  137. position: absolute;
  138. right: 10px;
  139. top: 10px;
  140. }
  141. .fenceWrapper {
  142. padding: 10px;
  143. }
  144. .fenceListWrapper {
  145. max-height: 435px;
  146. overflow-y: auto;
  147. }
  148. </style>