import type { ComputedRef, Ref } from 'vue'; import type { BasicTableProps } from '../types/table'; import { computed, unref, ref, toRaw } from 'vue'; import { ROW_KEY } from '../const'; export function useTableExpand( propsRef: ComputedRef, tableData: Ref, emit: EmitType, ) { const expandedRowKeys = ref([]); const getAutoCreateKey = computed(() => { return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey; }); const getRowKey = computed(() => { const { rowKey } = unref(propsRef); return unref(getAutoCreateKey) ? ROW_KEY : rowKey; }); const getExpandOption = computed(() => { const { isTreeTable } = unref(propsRef); if (!isTreeTable) return {}; return { expandedRowKeys: unref(expandedRowKeys), onExpandedRowsChange: (keys: string[]) => { expandedRowKeys.value = keys; emit('expanded-rows-change', keys); }, }; }); function expandAll() { const keys = getAllKeys(); expandedRowKeys.value = keys; } function expandRows(keys: string[]) { // use row ID expands the specified table row const { isTreeTable } = unref(propsRef); if (!isTreeTable) return; expandedRowKeys.value = [...expandedRowKeys.value, ...keys]; } function getAllKeys(data?: Recordable[]) { const keys: string[] = []; const { childrenColumnName } = unref(propsRef); toRaw(data || unref(tableData)).forEach((item) => { keys.push(item[unref(getRowKey) as string]); const children = item[childrenColumnName || 'children']; if (children?.length) { keys.push(...getAllKeys(children)); } }); return keys; } function collapseAll() { expandedRowKeys.value = []; } return { getExpandOption, expandAll, expandRows, collapseAll }; }