处理媒体表格复选框选中状态问题

This commit is contained in:
wangchengming 2025-10-15 22:26:56 +08:00
parent c99bbe1982
commit 1c2a3e84c7
2 changed files with 209 additions and 20 deletions

View File

@ -116,16 +116,20 @@
<el-row :gutter="10" class="my_row"><el-col :span="8">
<el-form :model="queryParams" :inline="true" class="searchInputForm">
<el-form-item label="">
<el-input v-model="queryParams.keyword" @keydown.enter.prevent="handleQuery" placeholder="请输入媒体名称/媒体编号" :prefix-icon="Search"
style="width: 400px;" />
<el-input v-model="queryParams.keyword" @keydown.enter.prevent="handleQuery"
placeholder="请输入媒体名称/媒体编号" :prefix-icon="Search" style="width: 400px;" />
</el-form-item>
</el-form>
</el-col>
<el-col :span="16" style="text-align: right;">
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:query']" @click="handleQuery">查询</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:reset']" @click="resetQuery">重置</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:add']" @click="handleOpenAddForm">新增</el-button>
<el-dropdown placement="bottom-start" style="margin-left: 12px;" v-hasPermi="['mediaLibrary:importQuotation']">
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:query']"
@click="handleQuery">查询</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:reset']"
@click="resetQuery">重置</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:add']"
@click="handleOpenAddForm">新增</el-button>
<el-dropdown placement="bottom-start" style="margin-left: 12px;"
v-hasPermi="['mediaLibrary:importQuotation']">
<el-button type="primary" class="primaryBtn">导入报价</el-button>
<template #dropdown>
<el-dropdown-menu>
@ -148,7 +152,8 @@
</el-dropdown-menu>
</template>
</el-dropdown>
<el-dropdown placement="bottom-start" style="margin: 0 12px;" v-hasPermi="['mediaLibrary:exportPPT']">
<el-dropdown placement="bottom-start" style="margin: 0 12px;"
v-hasPermi="['mediaLibrary:exportPPT']">
<el-button type="primary" class="primaryBtn">
导出PPT
</el-button>
@ -163,12 +168,14 @@
</el-dropdown-menu>
</template>
</el-dropdown>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:exportExcel']" @click="handleExportExcel">导出excel</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:mediaMap']" @click="handleGoMediaMap">媒体可视化地图</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:exportExcel']"
@click="handleExportExcel">导出excel</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:mediaMap']"
@click="handleGoMediaMap">媒体可视化地图</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="mediaList" @selection-change="handleSelectionChange"
<el-table ref="tableRef" v-loading="loading" :data="mediaList" @selection-change="handleSelectionChange"
:height="unfoldFlag ? 'calc(100vh - 372px)' : 'calc(100vh - 338px)'">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="媒体名称" align="left" prop="mediaName" width="320">
@ -179,7 +186,7 @@
<template #reference>
<span class="mediaNameLabel" @click="handleOpenDetail(scope.row)">{{
scope.row.mediaName
}}</span>
}}</span>
</template>
</el-popover>
@ -239,8 +246,8 @@
v-hasPermi="['mediaLibrary:historicalData']">历史数据</div>
<div class="popBtns" @click="handleAbolish(scope.row)"
v-hasPermi="['mediaLibrary:abolish']">废除</div>
<div class="popBtns" @click="handleLogs(scope.row)"
v-hasPermi="['mediaLibrary:log']">日志</div>
<div class="popBtns" @click="handleLogs(scope.row)" v-hasPermi="['mediaLibrary:log']">日志
</div>
<div class="popBtns" @click="handleDownFiles(scope.row)"
v-hasPermi="['mediaLibrary:download']">下载</div>
<template #reference>
@ -271,7 +278,7 @@
</div>
</template>
<script setup name="Post">
import { onMounted, ref } from 'vue';
import { onMounted, nextTick, ref } from 'vue';
import { useRouter } from 'vue-router'
import { ElMessageBox } from 'element-plus'
import { Search } from '@element-plus/icons-vue'
@ -377,6 +384,10 @@ const viewFileRef = ref(null)
const exportDialogRef = ref(null)
const exportPPTDialogRef = ref(null)
const downRecordsRef = ref(null)
//
const tableRef = ref(null)
//
const isSettingSelection = ref(false)
// PPT
const getpptTemplatePageList = () => {
@ -491,6 +502,11 @@ const getMediaPageList = () => {
mediaList.value = res.data.rows
total.value = res.data.total
loading.value = false
//
nextTick(() => {
setTableSelection()
})
})
}
/** 搜索按钮操作 */
@ -520,12 +536,89 @@ const resetQuery = () => {
}
//
const handleSelectionChange = (selection) => {
multipleChoseArr.value = selection
// multipleChoseArr
if (isSettingSelection.value) {
return
}
// ID
const currentPageIds = mediaList.value.map(item => item.id)
//
if (selection.length === 0 && currentPageIds.length > 0) {
//
const shouldHaveSelections = currentPageIds.some(id =>
multipleChoseArr.value.some(item => item.id === id)
)
// selection
if (shouldHaveSelections) {
return
}
}
//
const currentSelectedIds = selection.map(item => item.id)
multipleChoseArr.value = multipleChoseArr.value.filter(item =>
!currentPageIds.includes(item.id) || currentSelectedIds.includes(item.id)
)
//
selection.forEach(newItem => {
if (!multipleChoseArr.value.some(item => item.id === newItem.id)) {
multipleChoseArr.value.push(newItem)
}
})
}
// -
const setTableSelection = () => {
if (tableRef.value && mediaList.value.length > 0) {
// handleSelectionChange
isSettingSelection.value = true
// 使 nextTick DOM
nextTick(() => {
//
tableRef.value.clearSelection()
//
setTimeout(() => {
mediaList.value.forEach(row => {
const isSelected = multipleChoseArr.value.some(item => item.id === row.id)
if (isSelected) {
tableRef.value.toggleRowSelection(row, true)
}
})
//
setTimeout(() => {
isSettingSelection.value = false
}, 100)
}, 50)
})
}
}
//
const handleCloseTag = (tag) => {
const rowIndex = multipleChoseArr.value.findIndex(item => item.id == tag.id)
multipleChoseArr.value.splice(rowIndex, 1)
//
if (tableRef.value) {
// handleSelectionChange
isSettingSelection.value = true
//
const row = mediaList.value.find(item => item.id === tag.id)
if (row) {
tableRef.value.toggleRowSelection(row, false)
}
//
setTimeout(() => {
isSettingSelection.value = false
}, 100)
}
}
//
const handleOpenAddForm = () => {

View File

@ -107,7 +107,8 @@
</el-row>
<el-row :gutter="10" class="my_row" style="margin-bottom: 0;">
<el-col :span="12">
<el-table v-loading="loading" :data="outdoorMediaList" @selection-change="handleSelectionChange"
<el-table ref="tableRef" v-loading="loading" :data="outdoorMediaList"
@selection-change="handleSelectionChange"
:height="unfoldFlag ? 'calc(100vh - 372px)' : 'calc(100vh - 338px)'">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="实景图片" align="left" prop="mediaFileList" width="170">
@ -152,7 +153,7 @@
</div>
</template>
<script setup name="Post">
import { onMounted, onUnmounted, ref } from 'vue';
import { onMounted, onUnmounted, nextTick, ref } from 'vue';
import { Search } from '@element-plus/icons-vue'
import { sysRegionListByPid } from "@/api/system/administrativeRegion"
import { sysMediaTypeListByPid } from "@/api/system/mediaType"
@ -233,6 +234,10 @@ let minLng = Infinity; // 经度的最小值(最西边)
let minLat = Infinity; //
let maxLng = -Infinity; //
let maxLat = -Infinity; //
//
const tableRef = ref(null)
//
const isSettingSelection = ref(false)
//
const exportForm = ref({
@ -477,8 +482,13 @@ const getOutMediaPageList = () => {
outdoorMediaList.value = res.data.rows
total.value = res.data.total
loading.value = false
//
renderMassMarks();
//
nextTick(() => {
setTableSelection()
//
renderMassMarks();
})
})
}
/** 搜索按钮操作 */
@ -509,16 +519,102 @@ const resetQuery = () => {
}
//
const handleSelectionChange = (selection) => {
multipleChoseArr.value = selection
// multipleChoseArr
if (isSettingSelection.value) {
return
}
// ID
const currentPageIds = outdoorMediaList.value.map(item => item.id)
//
if (selection.length === 0 && currentPageIds.length > 0) {
//
const shouldHaveSelections = currentPageIds.some(id =>
multipleChoseArr.value.some(item => item.id === id)
)
// selection
if (shouldHaveSelections) {
return
}
}
//
const currentSelectedIds = selection.map(item => item.id)
multipleChoseArr.value = multipleChoseArr.value.filter(item =>
!currentPageIds.includes(item.id) || currentSelectedIds.includes(item.id)
)
//
selection.forEach(newItem => {
if (!multipleChoseArr.value.some(item => item.id === newItem.id)) {
multipleChoseArr.value.push(newItem)
}
})
}
// -
const setTableSelection = () => {
if (tableRef.value && outdoorMediaList.value.length > 0) {
// handleSelectionChange
isSettingSelection.value = true
// 使 nextTick DOM
nextTick(() => {
//
tableRef.value.clearSelection()
//
setTimeout(() => {
outdoorMediaList.value.forEach(row => {
const isSelected = multipleChoseArr.value.some(item => item.id === row.id)
if (isSelected) {
tableRef.value.toggleRowSelection(row, true)
}
})
//
setTimeout(() => {
isSettingSelection.value = false
}, 100)
}, 50)
})
}
}
//
const handleCloseTag = (tag) => {
const rowIndex = multipleChoseArr.value.findIndex(item => item.id == tag.id)
multipleChoseArr.value.splice(rowIndex, 1)
//
if (tableRef.value) {
// handleSelectionChange
isSettingSelection.value = true
//
const row = outdoorMediaList.value.find(item => item.id === tag.id)
if (row) {
tableRef.value.toggleRowSelection(row, false)
}
//
setTimeout(() => {
isSettingSelection.value = false
}, 100)
}
}
//
const handleClearChoseMedia = () => {
multipleChoseArr.value = []
if (tableRef.value) {
// handleSelectionChange
isSettingSelection.value = true
tableRef.value.clearSelection()
//
setTimeout(() => {
isSettingSelection.value = false
}, 100)
}
}
//
const handleViewMedia = (_mediaId) => {