2 changed files with 219 additions and 3 deletions
@ -0,0 +1,216 @@ |
|||||
|
<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> |
||||
|
|
Loading…
Reference in new issue