refactor: 完善ColumnSetting的操作逻辑

pull/12/head
xingyu 2023-05-10 18:35:47 +08:00
parent a261242279
commit 7f9881fbc4
4 changed files with 76 additions and 32 deletions

View File

@ -160,7 +160,7 @@ function handleTableChange(...args) {
onChange && isFunction(onChange) && onChange.call(undefined, ...args)
}
const { getViewColumns, getColumns, setCacheColumnsByField, setColumns, getColumnsRef, getCacheColumns } = useColumns(
const { getViewColumns, getColumns, setCacheColumnsByField, setCacheColumns, setColumns, getColumnsRef, getCacheColumns } = useColumns(
getProps,
getPaginationInfo
)
@ -292,7 +292,8 @@ const tableAction: TableActionType = {
scrollTo,
getSize: () => {
return unref(getBindValues).size as SizeType
}
},
setCacheColumns
}
createTableContext({ ...tableAction, wrapRef, getBindValues })

View File

@ -83,7 +83,7 @@
</Tooltip>
</template>
<script lang="ts" setup name="ColumnSetting">
import type { BasicColumn, ColumnChangeParam } from '../../types/table'
import type { BasicColumn, BasicTableProps, ColumnChangeParam } from '../../types/table'
import { ref, reactive, useAttrs, watchEffect, nextTick, unref, computed } from 'vue'
import { Tooltip, Popover, Checkbox, Divider } from 'ant-design-vue'
import type { CheckboxChangeEvent } from 'ant-design-vue/lib/checkbox/interface'
@ -122,6 +122,10 @@ const table = useTableContext()
const defaultRowSelection = omit(table.getRowSelection(), 'selectedRowKeys')
let inited = false
// setColums
let isSetColumnsFromThis = false
// setProps
let isSetPropsFromThis = false
const cachePlainOptions = ref<Options[]>([])
const plainOptions = ref<Options[] | any>([])
@ -136,6 +140,8 @@ const state = reactive<State>({
defaultCheckList: []
})
/** 缓存初始化props */
let cacheTableProps: Partial<BasicTableProps<any>> = {}
const checkIndex = ref(false)
const checkSelect = ref(false)
@ -148,7 +154,9 @@ const getValues = computed(() => {
watchEffect(() => {
const columns = table.getColumns()
setTimeout(() => {
if (columns.length && !state.isInit) {
if (isSetColumnsFromThis) {
isSetColumnsFromThis = false
} else if (columns.length) {
init()
}
}, 0)
@ -156,6 +164,11 @@ watchEffect(() => {
watchEffect(() => {
const values = unref(getValues)
if (isSetPropsFromThis) {
isSetPropsFromThis = false
} else {
cacheTableProps = cloneDeep(values)
}
checkIndex.value = !!values.showIndexColumn
checkSelect.value = !!values.rowSelection
})
@ -172,8 +185,17 @@ function getColumns() {
return ret
}
function init() {
const columns = getColumns()
async function init(isReset = false) {
// Sortablejsbugel appendchildNodechildNode
//
plainOptions.value = []
const columnListEl = unref(columnListRef)
if (columnListEl && (columnListEl as any).$el) {
const el = (columnListEl as any).$el as Element
Array.from(el.children).forEach((item) => el.removeChild(item))
}
await nextTick()
const columns = isReset ? cloneDeep(cachePlainOptions.value) : getColumns()
const checkList = table
.getColumns({ ignoreAction: true, ignoreIndex: true })
@ -185,30 +207,24 @@ function init() {
})
.filter(Boolean) as string[]
if (!plainOptions.value.length) {
plainOptions.value = columns
plainSortOptions.value = columns
cachePlainOptions.value = columns
state.defaultCheckList = checkList
} else {
// const fixedColumns = columns.filter((item) =>
// Reflect.has(item, 'fixed')
// ) as BasicColumn[];
unref(plainOptions).forEach((item: BasicColumn) => {
const findItem = columns.find((col: BasicColumn) => col.dataIndex === item.dataIndex)
if (findItem) {
item.fixed = findItem.fixed
}
})
}
state.isInit = true
plainOptions.value = columns
plainSortOptions.value = columns
//
table.setCacheColumns?.(columns)
!isReset && (cachePlainOptions.value = cloneDeep(columns))
state.defaultCheckList = checkList
state.checkedList = checkList
//
state.checkAll = checkList.length === columns.length
inited = false
handleVisibleChange()
state.checkedList = checkList
}
// checkAll change
function onCheckAllChange(e: CheckboxChangeEvent) {
const checkList = plainOptions.value.map((item) => item.value)
const checkList = plainSortOptions.value.map((item) => item.value)
plainSortOptions.value.forEach((item) => ((item as BasicColumn).defaultHidden = !e.target.checked))
if (e.target.checked) {
state.checkedList = checkList
setColumns(checkList)
@ -233,6 +249,9 @@ function onChange(checkedList: string[]) {
checkedList.sort((prev, next) => {
return sortList.indexOf(prev) - sortList.indexOf(next)
})
unref(plainSortOptions).forEach((item) => {
;(item as BasicColumn).defaultHidden = !checkedList.includes(item.value)
})
setColumns(checkedList)
}
@ -240,11 +259,14 @@ let sortable: Sortable
let sortableOrder: string[] = []
// reset columns
function reset() {
state.checkedList = [...state.defaultCheckList]
state.checkAll = true
plainOptions.value = unref(cachePlainOptions)
plainSortOptions.value = unref(cachePlainOptions)
setColumns(table.getCacheColumns())
setColumns(cachePlainOptions.value)
init(true)
checkIndex.value = !!cacheTableProps.showIndexColumn
checkSelect.value = !!cacheTableProps.rowSelection
table.setProps({
showIndexColumn: checkIndex.value,
rowSelection: checkSelect.value ? defaultRowSelection : undefined
})
sortable.sort(sortableOrder)
}
@ -280,7 +302,7 @@ function handleVisibleChange() {
plainSortOptions.value = columns
setColumns(columns.map((col: Options) => col.value).filter((value: string) => state.checkedList.includes(value)))
setColumns(columns.filter((item) => state.checkedList.includes(item.value)))
}
})
// order
@ -291,6 +313,8 @@ function handleVisibleChange() {
// Control whether the serial number column is displayed
function handleIndexCheckChange(e: CheckboxChangeEvent) {
isSetPropsFromThis = true
isSetColumnsFromThis = true
table.setProps({
showIndexColumn: e.target.checked
})
@ -298,6 +322,8 @@ function handleIndexCheckChange(e: CheckboxChangeEvent) {
// Control whether the check box is displayed
function handleSelectCheckChange(e: CheckboxChangeEvent) {
isSetPropsFromThis = true
isSetColumnsFromThis = true
table.setProps({
rowSelection: e.target.checked ? defaultRowSelection : undefined
})
@ -317,11 +343,14 @@ function handleColumnFixed(item: BasicColumn, fixed?: 'left' | 'right') {
if (isFixed && !item.width) {
item.width = 100
}
updateSortOption(item)
table.setCacheColumnsByField?.(item.dataIndex as string, { fixed: isFixed })
setColumns(columns)
}
function setColumns(columns: BasicColumn[] | string[]) {
isSetPropsFromThis = true
isSetColumnsFromThis = true
table.setColumns(columns)
const data: ColumnChangeParam[] = unref(plainSortOptions).map((col) => {
const visible =
@ -335,6 +364,14 @@ function setColumns(columns: BasicColumn[] | string[]) {
function getPopupContainer() {
return isFunction(attrs.getPopupContainer) ? attrs.getPopupContainer() : getParentContainer()
}
function updateSortOption(column: BasicColumn) {
plainSortOptions.value.forEach((item) => {
if (item.value === column.dataIndex) {
Object.assign(item, column)
}
})
}
</script>
<style lang="less">
@prefix-cls: ~'@{namespace}-basic-column-setting';

View File

@ -251,6 +251,10 @@ export function useColumns(propsRef: ComputedRef<BasicTableProps>, getPagination
function getCacheColumns() {
return cacheColumns
}
function setCacheColumns(columns: BasicColumn[]) {
if (!isArray(columns)) return
cacheColumns = columns.filter((item) => !item.flag)
}
return {
getColumnsRef,
@ -258,7 +262,8 @@ export function useColumns(propsRef: ComputedRef<BasicTableProps>, getPagination
getColumns,
setColumns,
getViewColumns,
setCacheColumnsByField
setCacheColumnsByField,
setCacheColumns
}
}

View File

@ -116,6 +116,7 @@ export interface TableActionType {
setShowPagination: (show: boolean) => Promise<void>
getShowPagination: () => boolean
setCacheColumnsByField?: (dataIndex: string | undefined, value: BasicColumn) => void
setCacheColumns?: (columns: BasicColumn[]) => void
}
export interface FetchSetting {