From 0796eebe3520fafb0ac5d36ee584af81506d7e9c Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期六, 20 九月 2025 14:05:52 +0800 Subject: [PATCH] 2025.9.20 数据产品(待完成) --- src/components/FYImageSelectDialog.vue | 160 ++++++++++++++++++++++++----------------------------- 1 files changed, 73 insertions(+), 87 deletions(-) diff --git a/src/components/FYImageSelectDialog.vue b/src/components/FYImageSelectDialog.vue index 04bc1b3..c35bc94 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; -- Gitblit v1.9.3