You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

216 lines
5.7 KiB

<template>
<el-dropdown :hide-on-click="false">
<el-button :icon="'Setting'" plain :type="hasChange ? 'primary' : null">字段设置</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<el-checkbox
v-model="checkAll"
@change="handleCheckAllChange"
:indeterminate="isIndeterminate"
><span style="color:#333">全选</span></el-checkbox>
</el-dropdown-item>
<el-checkbox-group
class="columsList"
v-model="checkedItems"
>
<el-dropdown-item
v-for="(colum,index) in columsList"
:key="index"
:draggable="true"
@dragstart="dragstart(colum)"
@dragenter="dragenter(colum,$event)"
@dragend="dragend(colum,$event)"
@dragover="dragover($event)"
>
<el-checkbox @change="(data)=>{handleCheckedItemChange(data,colum)}" :label="colum.title" :value="colum.prop"></el-checkbox>
</el-dropdown-item>
</el-checkbox-group>
</el-dropdown-menu>
<el-button class="restBtn" @click="reset">重置</el-button>
</template>
</el-dropdown>
</template>
<script setup>
defineOptions({ name: 'setColumsPop' })
import { reactive, ref, onMounted } from 'vue'
import { useRoute } from 'vue-router'
const props = defineProps({
// table表头
tableColumns: {
type: Object,
default: null
},
//初始化表头,未从缓存获取之前
initTableColums: {
type: Object,
default: null
},
localTableColumnsName: {
type: String,
default: null
},
})
const checkAll = ref(false)//是否全选
const isIndeterminate = ref(false)//半选样式
const checkedItems = ref([])
const columsList = ref([])
const hasChange = ref(false)//是否有变化
// 判断是否有变化
const getHasChange = () => {
hasChange.value = false
let _noShow = columsList.value.filter(item=>item.setNoShow == true)
// 显示发生变化
if(_noShow && _noShow.length > 0){
hasChange.value = true
}
// 顺序发生变化
else{
let _initIndex = []
props.initTableColums.forEach(item=>{_initIndex.push(item.prop)})
let _nowIndex = []
columsList.value.forEach(item=>{ _nowIndex.push(item.prop)})
hasChange.value = _initIndex.join(",") != _nowIndex.join(",")
}
}
// 初始化数据
const getLocalColumsList = () => {
// 设置字段列表
columsList.value = props.tableColumns
checkedItems.value = []
// 设置已选字段
columsList.value.forEach(item=>{ if(!item.setNoShow)checkedItems.value.push(item.prop) })
// 设置全选是否全选
setCheckAllSta()
// 判断是否有变化
getHasChange()
}
// 配置全选状态
const setCheckAllSta = () => {
checkAll.value = checkedItems.value.length === columsList.value.length
isIndeterminate.value = (checkedItems.value.length < columsList.value.length) && checkedItems.value.length != 0
}
// 全选/全不选
const handleCheckAllChange = (val) => {
// 全选
if(val){
hasChange.value = false
checkedItems.value = []
columsList.value.forEach(item=>{
checkedItems.value.push(item.prop)
item.setNoShow = false
})
save()
}
// 全不选
else{
hasChange.value = true
checkedItems.value = []
columsList.value.forEach(item=>{ item.setNoShow = true})
save()
}
}
// 更改
const handleCheckedItemChange = (isCheck,colum) => {
let _prop = colum.prop
checkedItems.value = []
columsList.value.forEach(item=>{
if(item.prop == _prop){item.setNoShow = !isCheck}
if(!item.setNoShow)checkedItems.value.push(item.prop)
})
setCheckAllSta()
getHasChange()
save()
}
// 重置
const reset = () => {
hasChange.value = false
checkedItems.value = []
columsList.value = JSON.parse(JSON.stringify(props.initTableColums))
columsList.value.forEach(item=>{ checkedItems.value.push(item.prop) })
setCheckAllSta()
save()
}
// 存入缓存
const save = () => {
localStorage.setItem(props.localTableColumnsName,JSON.stringify(columsList.value))
//判断是否有变化
getHasChange()
// 判断全选按钮状态
setCheckAllSta()
}
const dragOldData = ref(null)
const dragNewData = ref(null)
// 拖拽相关功能
const dragstart = (value) => {
dragOldData.value = value
}
// 记录移动过程中信息
const dragenter = (value, e) => {
dragNewData.value = value
e.preventDefault()
}
const dragend = (value, e) => {
// 拖拽最终操作
if (dragOldData.value !== dragNewData.value) {
let oldIndex = columsList.value.indexOf(dragOldData.value)
let newIndex = columsList.value.indexOf(dragNewData.value)
let newItems = [...columsList.value]
// 删除老的节点
newItems.splice(oldIndex, 1)
// 在列表中目标位置增加新的节点
newItems.splice(newIndex, 0, dragOldData.value)
columsList.value = [...newItems]
save()
}
}
const dragover = (e) => {
// 拖动事件(主要是为了拖动时鼠标光标不变为禁止)
e.preventDefault()
}
onMounted(() => {
getLocalColumsList()
})
</script>
<style scoped lang="scss">
.columsList{
height:calc(100vh - 400px) !important;
overflow:auto !important;
padding:10 20px !important;
}
::v-deep .el-checkbox{
min-width:200px !important;
}
.restBtn{
width:calc(100% - 20px);
margin:10px;
text-align:center
}
::-webkit-scrollbar{
width:6px;
height:6px;
}
::-webkit-scrollbar-track{
border-radius: 10px;
background-color: #F5F5F5;
}
::-webkit-scrollbar-thumb {
border-radius:10px;
background-color:#ddd;
}
</style>