PresetSelect.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <template>
  2. <div class="presetSetting">
  3. <div style="margin-right: 10px">预置位 </div>
  4. <div>
  5. <ElSelect
  6. class="pre-select"
  7. :model-value="currentPresetToken"
  8. size="small"
  9. filterable
  10. @update:model-value="handleChangeValue"
  11. :loading="loading"
  12. :disabled="Boolean(!cameraDetailStore.detail?.isPtz)"
  13. placeholder="请选择预置位"
  14. >
  15. <ElOption v-for="item in presetOptions" :key="item.token" :label="item.name" :value="item.token">
  16. <span style="float: left">{{ item.name }}</span>
  17. <span style="float: right; color: var(--el-text-color-secondary); font-size: 13px">
  18. <!-- 点击删除的时候,阻止选中菜单 -->
  19. <el-icon @click.stop="handleDeletePreset(item.token)">
  20. <CircleCloseFilled />
  21. </el-icon>
  22. </span>
  23. </ElOption>
  24. </ElSelect>
  25. </div>
  26. </div>
  27. </template>
  28. <script lang="ts" setup>
  29. import { ElSelect, ElOption, ElMessage, ElMessageBox, ElLoading } from 'element-plus';
  30. import { CircleCloseFilled } from '@element-plus/icons-vue';
  31. import usePresetListStore from '../../store/usePresetListStore';
  32. import { storeToRefs } from 'pinia';
  33. import { deletePresetApi, goToPresetApi } from '@/api/camera/camera-preview';
  34. import useCameraDetailStore from '../../store/useCameraDetailStore';
  35. import useFenceStore from '../../store/useFenceStore';
  36. import useCameraAlgoStore from '../../store/useCameraAlgoStore';
  37. const presetListStore = usePresetListStore();
  38. const cameraAlgoStore = useCameraAlgoStore();
  39. const cameraDetailStore = useCameraDetailStore();
  40. const { data: presetOptions, currentPresetToken, loading } = storeToRefs(presetListStore);
  41. const fenceStore = useFenceStore();
  42. const handleDeletePreset = (token: string) => {
  43. ElMessageBox({
  44. message: '该预置位可能存在关联的电子围栏。删除该预置位将会删除对应的电子围栏信息,请确认是否删除',
  45. title: '删除确认',
  46. showCancelButton: true,
  47. confirmButtonText: '确认删除',
  48. beforeClose: (action, instance, done) => {
  49. if (action === 'confirm') {
  50. instance.confirmButtonLoading = true;
  51. deletePresetApi({ presetToken: token, cameraId: cameraDetailStore.cameraId })
  52. .then((res) => {
  53. ElMessage.success('删除成功!');
  54. presetListStore.getPresetList(cameraDetailStore.cameraId);
  55. currentPresetToken.value = presetOptions.value?.[0].token || '';
  56. done();
  57. })
  58. .finally(() => {
  59. instance.confirmButtonLoading = true;
  60. });
  61. } else {
  62. done();
  63. }
  64. },
  65. });
  66. };
  67. const handleChangeValue = (val) => {
  68. currentPresetToken.value = val;
  69. goToPresetApi({ presetToken: val, cameraId: cameraDetailStore.cameraId });
  70. fenceStore.getFence({
  71. presetToken: val,
  72. algoId: cameraAlgoStore.selectedAlgoId!,
  73. cameraId: cameraDetailStore.cameraId,
  74. });
  75. };
  76. </script>
  77. <style scoped>
  78. .presetSetting {
  79. display: flex;
  80. align-items: center;
  81. height: 34px;
  82. }
  83. .pre-select {
  84. width: 145px;
  85. }
  86. .circular {
  87. display: inline;
  88. height: 30px;
  89. width: 30px;
  90. animation: loading-rotate 2s linear infinite;
  91. }
  92. .path {
  93. animation: loading-dash 1.5s ease-in-out infinite;
  94. stroke-dasharray: 90, 150;
  95. stroke-dashoffset: 0;
  96. stroke-width: 2;
  97. stroke: var(--el-color-primary);
  98. stroke-linecap: round;
  99. }
  100. </style>