From f19e5267cc23b1c714dc746239864f33ed715dd9 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期五, 05 十二月 2025 17:55:02 +0800
Subject: [PATCH] 完成地图制作任务功能初版
---
src/components/FYImageSelectDialog.vue | 162 ++++++++++++++++++++++++-----------------------------
1 files changed, 74 insertions(+), 88 deletions(-)
diff --git a/src/components/FYImageSelectDialog.vue b/src/components/FYImageSelectDialog.vue
index 04bc1b3..3bffbf1 100644
--- a/src/components/FYImageSelectDialog.vue
+++ b/src/components/FYImageSelectDialog.vue
@@ -8,35 +8,55 @@
destroy-on-close
:close-on-press-escape="false"
>
- <!-- <div class="main"> -->
- <el-row justify="end" v-if="!readonly">
- <el-text size="small" type="info" class="m-r-8"
- >鏈�澶氶�夋嫨{{ maxSelect }}寮犲浘鐗�</el-text
- >
- <el-button
- size="small"
- type="primary"
- @click="handleSubmit"
- :disabled="selectedImgUrlList.length == 0"
- >纭畾</el-button
- >
- <el-button size="small" type="primary" @click="handleCancel"
- >鍙栨秷</el-button
- >
+ <el-row justify="end">
+ <el-space v-if="onContextMenu != undefined">
+ <el-switch
+ v-model="useContextMenu"
+ inline-prompt
+ active-text="寮�"
+ inactive-text="鍏�"
+ />
+ <el-text size="small" type="info">
+ {{ `锛�${contextMenuStr}锛塦 }}
+ </el-text>
+ </el-space>
+
+ <div v-if="!readonly">
+ <el-text size="small" type="info" class="m-r-8"
+ >鏈�澶氶�夋嫨{{ maxSelect }}寮犲浘鐗�</el-text
+ >
+ <el-button
+ size="small"
+ type="primary"
+ @click="handleSubmit"
+ :disabled="selectedImgUrlList.length == 0"
+ >纭畾</el-button
+ >
+ <el-button size="small" type="primary" @click="handleCancel"
+ >鍙栨秷</el-button
+ >
+ </div>
</el-row>
<div class="center">
- <el-tabs v-if="typeList.length > 0" v-model="activeId" type="card">
- <el-tab-pane
- v-for="item in typeList"
- :key="item.typeId"
- :label="
- item.typeName + ' (' + typeImgMap.get(item.typeId).length + ')'
- "
- :name="item.typeId"
+ <el-scrollbar class="scrollbar-flex-content">
+ <el-tabs
+ v-if="typeList.length > 0"
+ v-model="activeId"
+ type="card"
+ stretch
>
- </el-tab-pane>
- </el-tabs>
+ <el-tab-pane
+ v-for="item in typeList"
+ :key="item.typeId"
+ :label="
+ item.typeName + ' (' + typeImgMap.get(item.typeId).length + ')'
+ "
+ :name="item.typeId"
+ >
+ </el-tab-pane>
+ </el-tabs>
+ </el-scrollbar>
<el-scrollbar height="70vh">
<div
v-if="typeImgMap.get(activeId) && typeImgMap.get(activeId).length > 0"
@@ -49,8 +69,12 @@
:class="[img.isSelect ? 'selected' : 'noActive', 'image']"
fit="cover"
:src="img.url"
- :preview-src-list="readonly ? typeImgMap.get(activeId).map((v) => v.url) : []"
+ :preview-src-list="
+ readonly ? typeImgMap.get(activeId).map((v) => v.url) : []
+ "
+ crossOrigin="Anonymous"
:initial-index="i"
+ @contextmenu="(e) => showContextMenu(e, i)"
@click="onSelect(img, i)"
@load="onOneImgLoadSuccess(img)"
@error="onOneImgLoadError(img)"
@@ -61,7 +85,6 @@
</el-row>
</el-scrollbar>
</div>
- <!-- </div> -->
</el-dialog>
</template>
<script setup>
@@ -86,22 +109,28 @@
type: Boolean,
default: false
},
- defaultFile: {
- type: Array,
- default: () => []
- },
// 鍥剧墖鍙�夋暟閲忥紝褰撲紶鍏ユ暟瀛楁椂锛屼唬琛ㄥ浘鐗囨暟閲�
maxSelect: {
type: Number,
default: 3
+ },
+ // 鍥剧墖鍙抽敭鐐瑰嚮浜嬩欢
+ onContextMenu: {
+ type: Function
+ },
+ contextMenuStr: {
+ type: String,
+ default: '鍙抽敭鐐瑰嚮鍥剧墖绉诲姩'
}
});
const emit = defineEmits(['submit', 'cancel', 'update:dialogVisible']);
const activeId = ref('');
-// const typeImgMap = ref(new Map());
+
const selectedImgUrlList = ref([]);
+
+const useContextMenu = ref(false);
let loadedImgCount = ref(0);
// 鍔犺浇鐘舵��
@@ -158,20 +187,6 @@
}
}
function handleOpen() {
- // if (props.typeImgMap.get(activeId.value) == undefined) {
- // return;
- // }
- // props.typeImgMap.get(activeId.value).forEach((i) => {
- // if (i.isSelect == true) {
- // return;
- // }
- // props.defaultFile.forEach((imgItem) => {
- // if (imgItem.url == i.url) {
- // i.isSelect = true;
- // selectedImgUrlList.value.push(i);
- // }
- // });
- // });
emit('update:dialogVisible', true);
}
function handleClose() {
@@ -189,6 +204,14 @@
emit('update:dialogVisible', false);
}
+// 鍥剧墖鍙抽敭鐐瑰嚮浜嬩欢
+function showContextMenu(event, index) {
+ if (props.onContextMenu && useContextMenu.value) {
+ event.preventDefault();
+ props.onContextMenu(event, activeId.value, index);
+ }
+}
+
watch(
() => props.typeList,
(nV, oV) => {
@@ -198,49 +221,12 @@
},
{ immediate: true }
);
-// watch(
-// () => props.defaultFile,
-// (nV, oV) => {
-// if (props.typeImgMap.get(activeId.value) == undefined) {
-// return;
-// }
-// props.typeImgMap.get(activeId.value).forEach((i) => {
-// if (i.isSelect == true) {
-// return;
-// }
-// nV.forEach((imgItem) => {
-// if (imgItem.url == i.url) {
-// i.isSelect = true;
-// selectedImgUrlList.value.push(i);
-// }
-// });
-// });
-// },
-// { deep: true, immediate: true }
-// );
-
-// watch(
-// () => props.typeImgMap,
-// (newMap, oldMap) => {
-// if (newMap.get(activeId.value) == undefined) {
-// return;
-// }
-// newMap.get(activeId.value).forEach((i) => {
-// if (i.isSelect == true) {
-// return;
-// }
-// props.defaultFile.forEach((imgItem) => {
-// if (imgItem.url == i.url) {
-// i.isSelect = true;
-// selectedImgUrlList.value.push(i);
-// }
-// });
-// });
-// },
-// { immediate: true }
-// );
</script>
<style scoped>
+.scrollbar-flex-content {
+ display: flex;
+ width: 100%;
+}
.center {
display: flex;
flex-direction: column;
@@ -318,7 +304,7 @@
padding: 5px;
}
-::v-deep .el-dialog__body {
+:deep(.el-dialog__body) {
padding: 10px calc(var(--el-dialog-padding-primary) + 10px) !important;
}
</style>
--
Gitblit v1.9.3