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.
288 lines
7.8 KiB
288 lines
7.8 KiB
<template> |
|
<el-drawer :model-value="drawerShow" @close="close" title="编辑列表" size="40%"> |
|
<!-- <el-checkbox label="12" /> |
|
<el-checkbox label="2" /> --> |
|
<el-table :data="columnList" style="width: 100%; height: 700px" border ref="tableEl1"> |
|
<el-table-column v-for="column in headtop" :key="column.prop" :prop="column.prop" :label="column.label" |
|
:width="column.width" flexible> |
|
<template #header> |
|
<el-text class="mx-1">{{ column.label }}</el-text> |
|
</template> |
|
<template #default="scope"> |
|
<el-text class="mx-1" v-if="column.prop == 'label'">{{ scope.row[column.prop] }}</el-text> |
|
<el-checkbox-group v-else-if="column.label == '隐藏'" v-model="checkList"> |
|
<el-checkbox :key="scope.row['label']" :label="scope.row['label']" true-label="" false-label="" |
|
@change="checkboxitem(1)"> |
|
<!-- 用于隐藏文字 --> |
|
<template #default="scope"> |
|
<!-- {{ scope }} --> |
|
</template> |
|
</el-checkbox> |
|
</el-checkbox-group> |
|
<el-checkbox-group v-else-if="column.label == '冻结'" v-model="flexList"> |
|
<el-checkbox :key="scope.row['label']" :label="scope.row['label']" true-label="" false-label="" |
|
@change="checkboxitem(2)"> |
|
<!-- 用于隐藏文字 --> |
|
<template #default="scope"> |
|
<!-- {{ scope }} --> |
|
</template> |
|
</el-checkbox> |
|
</el-checkbox-group> |
|
<el-checkbox-group v-else-if="column.label == '排序'" v-model="sortlist"> |
|
<el-checkbox :key="scope.row['label']" :label="scope.row['label']" true-label="" false-label="" |
|
@change="checkboxitem(3)"> |
|
<!-- 用于隐藏文字 --> |
|
<template #default="scope"> |
|
<!-- {{ scope }} --> |
|
</template> |
|
</el-checkbox> |
|
</el-checkbox-group> |
|
</template> |
|
</el-table-column> |
|
</el-table> |
|
<!-- </el-checkbox-group> --> |
|
<div></div> |
|
</el-drawer> |
|
</template> |
|
|
|
<script lang="ts" setup> |
|
import { ref, watchEffect, onMounted, watch, inject, nextTick } from 'vue'; |
|
import type { PropType } from 'vue'; |
|
const functions = inject('functions') as any; |
|
import Sortable from "sortablejs"; |
|
interface TableColumnType { |
|
/** 表格列的key */ |
|
prop: string; |
|
/** 表格列的名字 */ |
|
label: string; |
|
/** |
|
* 对应列表头的类型 |
|
* 0:直接显示为单选,prop,label,全部传空 |
|
* 1:普通表格,正常显示 |
|
* 2:带输入框表格 |
|
* 3:带下拉框表格 |
|
* 4:带日期选择器列 |
|
* 5:带日期时间选择器 |
|
* 6:操作栏,prop,label,全部传空 |
|
* 7:测试 |
|
*/ |
|
type: number | string; |
|
/** 用于接受表头的值 */ |
|
values: number | string; |
|
/** 表头宽度 number string undefined */ |
|
width: number | string | undefined; |
|
/** 下拉框可选项 */ |
|
checkarr?: { |
|
value: string | number; |
|
label: string | number; |
|
}[]; |
|
/** 是否固定表头 |
|
* true false |
|
* left right |
|
*/ |
|
fixed: boolean | string; |
|
/** 是否统计 |
|
* true false 或者直接不写该参数 |
|
*/ |
|
isshowSummary?: boolean; |
|
/** 是否排序 |
|
* true false 或者直接不写该参数 |
|
*/ |
|
sortable?: boolean; |
|
/** 是否显示列 |
|
* true false 或者直接不写该参数 |
|
*/ |
|
head?: boolean; |
|
} |
|
interface headtoptype { |
|
prop: string; |
|
label: string; |
|
width?: string | number; |
|
} |
|
const checkList = ref<(string | number)[]>([]); |
|
const flexList = ref<(string | number)[]>([]); |
|
const sortlist = ref<(string | number)[]>([]); |
|
const tableEl1 = ref(null); |
|
|
|
|
|
if (functions.getStorage(window.location.pathname + 'checkList')) { |
|
checkList.value = functions.getStorage(window.location.pathname + 'checkList'); |
|
console.log(checkList.value); |
|
} |
|
if (functions.getStorage(window.location.pathname + 'flexList')) { |
|
flexList.value = functions.getStorage(window.location.pathname + 'flexList'); |
|
console.log(flexList.value); |
|
} |
|
if (functions.getStorage(window.location.pathname + 'sortlist')) { |
|
sortlist.value = functions.getStorage(window.location.pathname + 'sortlist'); |
|
console.log(sortlist.value); |
|
} |
|
let emit = defineEmits(['setcolum', 'closce']); |
|
let props = defineProps({ |
|
columnList: { |
|
type: Array as PropType<TableColumnType[]>, |
|
required: true, |
|
}, |
|
drawerShow: { |
|
type: Boolean as PropType<boolean>, |
|
required: true, |
|
}, |
|
}); |
|
|
|
onMounted(() => { |
|
nextTick(() => { |
|
console.log('onMounted') |
|
initSortable(); |
|
}); |
|
}) |
|
|
|
|
|
watch( |
|
() => props.drawerShow, |
|
(val) => { |
|
if (val) |
|
nextTick(() => { |
|
initSortable(); |
|
console.log('watch') |
|
}); |
|
} |
|
); |
|
|
|
const initSortable = () => { |
|
if (tableEl1.value && tableEl1.value.$el) { |
|
const el1 = tableEl1.value.$el.querySelector('.el-table__body tbody') |
|
console.log(el1) |
|
Sortable.create(el1, { |
|
// handle: '.move-icon', |
|
animation: 150, // 动画 |
|
onEnd: ({ newIndex, oldIndex }) => { |
|
console.log(newIndex, oldIndex) |
|
const arr = props.columnList |
|
const currRow = arr.splice(oldIndex, 1)[0] |
|
arr.splice(newIndex, 0, currRow) |
|
// nextTick(() => { |
|
// emit('setcolum', arr, 4); |
|
// }) |
|
} |
|
}) |
|
} |
|
|
|
} |
|
|
|
function close() { |
|
emit('closce', false); |
|
} |
|
// watch(checkList, post => { |
|
// console.log(post, '++++++++'); |
|
// props.columnList.map(item => { |
|
// if (post.length == 0) { |
|
// item.head = false; |
|
// } |
|
// (post as []).map(ite => { |
|
// // console.log(item.label,ite,'-+-+-+-+-+-+-+-+-+-+-+-+') |
|
// if (ite == item.label) { |
|
// item.head = true; |
|
// } else { |
|
// item.head = false; |
|
// } |
|
// }); |
|
// return item; |
|
// }); |
|
// emit('setcolum', props.columnList,post); |
|
// }); |
|
// watchEffect(() => { |
|
// console.log(checkList.value); |
|
// props.columnList.map(item => { |
|
// if (checkList.value.length == 0) { |
|
// item.head = false; |
|
// } |
|
// (checkList.value as []).map(ite => { |
|
// // console.log(item.label,ite,'-+-+-+-+-+-+-+-+-+-+-+-+') |
|
// if (ite == item.label) { |
|
// item.head = true; |
|
// } else { |
|
// item.head = false; |
|
// } |
|
// }); |
|
// return item; |
|
// }); |
|
// emit('setcolum', props.columnList); |
|
// }); |
|
|
|
// watchEffect(()=>{ |
|
// props.columnList.map(item => { |
|
// if(item.head){ |
|
// (checkList.value as string[]).push(item.label) |
|
// } |
|
// }); |
|
// }) |
|
function checkboxitem(type: number) { |
|
if (type == 1) { |
|
props.columnList.map(item => { |
|
item.head = false; |
|
}); |
|
(checkList.value as []).map(ite => { |
|
props.columnList.map(item => { |
|
if (ite == item.label) { |
|
item.head = true; |
|
} |
|
}); |
|
}); |
|
emit('setcolum', props.columnList, checkList.value, type); |
|
} else if (type == 2) { |
|
props.columnList.map(item => { |
|
item.fixed = false; |
|
}); |
|
(flexList.value as []).map(ite => { |
|
props.columnList.map(item => { |
|
if (ite == item.label) { |
|
if (item.type == 6) { |
|
item.fixed = 'right'; |
|
} else { |
|
item.fixed = true; |
|
} |
|
} |
|
}); |
|
}); |
|
emit('setcolum', props.columnList, flexList.value, type); |
|
} else if (type == 3) { |
|
props.columnList.map(item => { |
|
item.sortable = false; |
|
}); |
|
(sortlist.value as []).map(ite => { |
|
props.columnList.map(item => { |
|
if (ite == item.label) { |
|
item.sortable = true; |
|
} |
|
}); |
|
}); |
|
emit('setcolum', props.columnList, sortlist.value, type); |
|
} |
|
} |
|
let headtop = ref<headtoptype[]>([ |
|
{ |
|
prop: 'label', |
|
label: '列名', |
|
width: '', |
|
}, |
|
{ |
|
prop: '', |
|
label: '隐藏', |
|
// width:'150' |
|
}, |
|
{ |
|
prop: '', |
|
label: '冻结', |
|
// width:'150' |
|
}, |
|
{ |
|
prop: '', |
|
label: '排序', |
|
// width:'150' |
|
}, |
|
]); |
|
|
|
setTimeout(() => { |
|
}, 2000); |
|
</script> |
|
<style lang="scss"></style>
|
|
|