UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 14 kB
{"version":3,"file":"useSorter.mjs","sources":["../../../src/table/hooks/useSorter.tsx"],"sourcesContent":["import { SetupContext, computed, toRefs, ref, watch } from 'vue';\nimport isFunction from 'lodash/isFunction';\nimport { SortInfo, TdPrimaryTableProps, PrimaryTableCol, TableRowData } from '../type';\nimport SorterButton from '../sorter-button';\nimport useDefaultValue from '../../hooks/useDefaultValue';\nimport isArray from 'lodash/isArray';\n\nexport type SortMap = Record<string, SortInfo & { index: number }>;\n\nexport default function useSorter(props: TdPrimaryTableProps, { slots }: SetupContext) {\n const { sort, data } = toRefs(props);\n const originalData = ref();\n const [tSortInfo, setTSortInfo] = useDefaultValue(sort, props.defaultSort, props.onSortChange, 'sort');\n const [tData, setTData] = useDefaultValue(data, [], props.onDataChange, 'data');\n // 本地数据排序:用于记录哪些字段是自定义排序函数\n const sorterFuncMap = computed(() => getSorterFuncMap(props.columns));\n const innerSort = ref<SortInfo | SortInfo[]>();\n\n const sortArray = computed<Array<SortInfo>>(() => {\n const sort = tSortInfo.value;\n if (!sort) return [];\n return isArray(sort) ? sort : [sort];\n });\n\n const sortMap = computed<SortMap>(() => {\n const sortMap = {};\n sortArray.value.forEach((info, index) => {\n const { sortBy } = info;\n sortMap[sortBy] = { index, ...info };\n });\n return sortMap;\n });\n\n function getSorterFuncMap(columns: PrimaryTableCol[], map: { [key: string]: Function } = {}) {\n for (let i = 0, len = columns.length; i < len; i++) {\n const col = columns[i];\n if (isFunction(col.sorter)) {\n // eslint-disable-next-line no-param-reassign\n map[col.colKey] = col.sorter;\n }\n // 多级表头中的排序功能\n if (col.children?.length) {\n getSorterFuncMap(col.children, map);\n }\n }\n return map;\n }\n\n function handleDataSort(sortInfo: SortInfo | Array<SortInfo>) {\n const sort = sortInfo;\n if (!Object.keys(sorterFuncMap.value).length) return;\n if (!originalData.value) {\n originalData.value = tData.value;\n }\n const isEmptyArraySort = !sort || (sort instanceof Array && !sort.length);\n const isEmptyObjectSort = !(sort instanceof Array) && !sort?.sortBy;\n if (isEmptyArraySort || isEmptyObjectSort) {\n setTData(originalData.value, { trigger: 'sort' });\n return originalData.value;\n }\n const formatedSort = sort instanceof Array ? sort : [sort];\n // data 为受控属性,data.slice() 浅拷贝,防止 sort 导致原数据变异\n const newData: TableRowData[] = tData.value.slice().sort((a: TableRowData, b: TableRowData) => {\n let sortResult = 0;\n for (let i = 0, len = formatedSort.length; i < len; i++) {\n const item = formatedSort[i];\n const sortFunc = sorterFuncMap.value[item.sortBy];\n // 上一个排序字段值相同时才会进行下一个字段的大小对比\n if (sortResult === 0 && sortFunc) {\n sortResult = item.descending ? sortFunc(b, a) : sortFunc(a, b);\n } else {\n break;\n }\n }\n return sortResult;\n });\n // Data 变化返回的是数据引用,为避免死循环,特此检测排序数据前后是否相同,如果相同则不再触发事件\n if (JSON.stringify(newData) === JSON.stringify(tData.value)) return;\n setTData(newData, { trigger: 'sort' });\n return newData;\n }\n\n function handleSortHeaderClick(col: PrimaryTableCol<TableRowData>, p: { descending: boolean }) {\n let sortInfo: SortInfo | Array<SortInfo>;\n if (props.multipleSort) {\n sortInfo = getMultipleNextSort(col, p);\n } else {\n // 如果此次调用之前开启了multipleSort,tSortInfo可能为数组,尝试取数组中第一个排序字段的参数\n const sort = tSortInfo.value instanceof Array ? tSortInfo.value[0] : tSortInfo.value;\n sortInfo = getSingleNextSort(col, sort, p);\n }\n // 本地数据 data 排序,需同时抛出 data-change\n const newData = handleDataSort(sortInfo);\n const currentData = newData || tData.value;\n const currentDataSource = currentData;\n setTSortInfo(sortInfo, { currentDataSource, col });\n props.onChange?.({ sorter: sortInfo }, { currentData, trigger: 'sorter' });\n innerSort.value = sortInfo;\n }\n\n function getSortOrder(descending: boolean) {\n if (descending === undefined) return;\n return descending ? 'desc' : 'asc';\n }\n\n // 点击新排序字段,则默认按照降序排序;点击原字段,则排序字段不变仅切换排序方式\n function getSingleNextSort(col: PrimaryTableCol, sortInfo: SortInfo, p: { descending: boolean }): SortInfo {\n // 排序字段和排序方式均相同,则取消排序\n if (sortInfo && sortInfo.sortBy === col.colKey && sortInfo.descending === p.descending) {\n return undefined;\n }\n return { sortBy: col.colKey, descending: p.descending };\n }\n\n function getMultipleNextSort(col: PrimaryTableCol<TableRowData>, p: { descending: boolean }): Array<SortInfo> {\n // 如tSortInfo不是数组,判断是否存在,如存在作为第一个排序字段(保留之前未开启multipleSort时的字段),否则初始化为空数组\n if (!Array.isArray(tSortInfo.value)) {\n tSortInfo.value = tSortInfo.value ? [tSortInfo.value] : [];\n }\n const sort = tSortInfo.value;\n const { colKey } = col;\n const result = [...sort];\n for (let i = 0, len = sort.length; i < len; i++) {\n if (sort[i].sortBy === colKey) {\n const next = getSingleNextSort(col, sort[i], p);\n next ? (result[i] = next) : result.splice(i, 1);\n return result;\n }\n }\n result.push({ sortBy: colKey, descending: p.descending });\n return result;\n }\n\n function renderSortIcon({ col }: { col: PrimaryTableCol<TableRowData>; colIndex: number }) {\n if (!col.sorter) return null;\n const sorterButtonsProps = {\n sortType: col.sortType,\n sortOrder: getSortOrder(sortMap.value[col.colKey]?.descending),\n sortIcon: props.sortIcon,\n hideSortTips: props.hideSortTips,\n };\n return (\n <SorterButton\n v-slots={{ sortIcon: slots.sortIcon }}\n {...sorterButtonsProps}\n onSortIconClick={(_: MouseEvent, p: { descending: boolean }) => handleSortHeaderClick(col, p)}\n />\n );\n }\n\n const isSortInfoSame = (a: SortInfo | SortInfo[], b: SortInfo | SortInfo[]) => {\n const tmpSortInfo = isArray(a) ? a : [a];\n const tmpInnerSortInfo = isArray(b) ? b : [b];\n if (tmpSortInfo.length && !b) return false;\n // eslint-disable-next-line\n for (let i = 0, len = tmpSortInfo.length; i < len; i++) {\n const item = tmpSortInfo[i];\n const result = tmpInnerSortInfo.find((t) => t.sortBy === item.sortBy);\n if (!result) return false;\n return item.descending === result.descending;\n }\n };\n\n /**\n * 如果外部的排序不为空,且和内部排序字段不同,说明传入的 sortInfo 和 data 可能存在不一致,\n * 此时,需要在组件内部进行排序,并输出事件\n */\n watch(\n () => [tSortInfo, props.data],\n () => {\n if (!tSortInfo.value || !Object.keys(tSortInfo.value).length || !tData.value.length) return;\n // isSortInfoSame 的两个参数顺序不可变\n if (!isSortInfoSame(tSortInfo.value, innerSort.value)) {\n handleDataSort(tSortInfo.value);\n }\n },\n { immediate: true },\n );\n\n return {\n renderSortIcon,\n };\n}\n"],"names":["tSortInfo","setTSortInfo","tData","setTData","sortMap","index","isFunction","getSorterFuncMap","originalData","trigger","sortResult","sortInfo","currentDataSource","col","sorter","currentData","next","sortBy","sortOrder","_createVNode","_mergeProps","v","_ret","watch","handleDataSort","immediate","renderSortIcon"],"mappings":"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"}