|
|
@@ -28,12 +28,14 @@ import {useLatest} from 'ahooks';
|
|
|
function parseColumn<T extends Record<string, unknown>>(
|
|
|
columns: LDColumnsType<T>[],
|
|
|
enableSelect?: boolean,
|
|
|
+ enableNo?: boolean,
|
|
|
) {
|
|
|
const helper = createColumnHelper<Record<string, any>>();
|
|
|
- let hasSort = false;
|
|
|
+ let hasSort = false, hasGroup = false;
|
|
|
|
|
|
- const parseColumns: LDColumnsType<T>[] = [
|
|
|
- {
|
|
|
+ const parseColumns: LDColumnsType<T>[] = [...columns];
|
|
|
+ if (enableNo) {
|
|
|
+ parseColumns.unshift({
|
|
|
title: '序号',
|
|
|
dataIndex: 'no',
|
|
|
align: 'center',
|
|
|
@@ -41,11 +43,10 @@ function parseColumn<T extends Record<string, unknown>>(
|
|
|
render(_, index) {
|
|
|
return index + 1;
|
|
|
},
|
|
|
- },
|
|
|
- ...columns,
|
|
|
- ];
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- let leftPosition = enableSelect ? 48 : 0;
|
|
|
+ let leftPosition = enableSelect ? TABLE_CELL_WIDTH.checkbox : 0;
|
|
|
let rightPosition = parseColumns.reduce(function(prev, next) {
|
|
|
if (next.fixed !== 'right') return prev;
|
|
|
|
|
|
@@ -53,9 +54,7 @@ function parseColumn<T extends Record<string, unknown>>(
|
|
|
}, 0);
|
|
|
|
|
|
const columnList = parseColumns.map(function(val) {
|
|
|
- const {dataIndex, title, render, align, fixed, width, sort} = val;
|
|
|
-
|
|
|
- if (!hasSort && sort) hasSort = true;
|
|
|
+ const {dataIndex, title, render, align, fixed, width, sort, children} = val;
|
|
|
|
|
|
let fixedStyle: CSSProperties = {};
|
|
|
|
|
|
@@ -77,10 +76,34 @@ function parseColumn<T extends Record<string, unknown>>(
|
|
|
sort,
|
|
|
};
|
|
|
|
|
|
+ if (children && children.length) {
|
|
|
+ if (!hasGroup) hasGroup = true;
|
|
|
+
|
|
|
+ const {columnList: columns} = parseColumn(
|
|
|
+ children,
|
|
|
+ false,
|
|
|
+ false,
|
|
|
+ );
|
|
|
+
|
|
|
+ const group = helper.group({
|
|
|
+ header: title,
|
|
|
+ columns,
|
|
|
+ minSize: 0,
|
|
|
+ size: width,
|
|
|
+ meta,
|
|
|
+ });
|
|
|
+
|
|
|
+ return group;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!hasSort && sort) hasSort = true;
|
|
|
+
|
|
|
if (render) {
|
|
|
return helper.display({
|
|
|
id: dataIndex.toString(),
|
|
|
header: title.toString(),
|
|
|
+ size: width,
|
|
|
+ minSize: 0,
|
|
|
cell(props) {
|
|
|
return render(
|
|
|
props.row.original as T,
|
|
|
@@ -95,6 +118,7 @@ function parseColumn<T extends Record<string, unknown>>(
|
|
|
header: title?.toString(),
|
|
|
cell: props => props.getValue(),
|
|
|
minSize: 0,
|
|
|
+ size: width,
|
|
|
meta,
|
|
|
});
|
|
|
});
|
|
|
@@ -120,6 +144,7 @@ function parseColumn<T extends Record<string, unknown>>(
|
|
|
/>
|
|
|
);
|
|
|
},
|
|
|
+ size: TABLE_CELL_WIDTH.checkbox,
|
|
|
meta: {
|
|
|
align: 'center',
|
|
|
fixed: 'left',
|
|
|
@@ -129,7 +154,11 @@ function parseColumn<T extends Record<string, unknown>>(
|
|
|
}),
|
|
|
);
|
|
|
|
|
|
- return {columnList, hasSort};
|
|
|
+ return {
|
|
|
+ columnList,
|
|
|
+ hasSort,
|
|
|
+ hasGroup,
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
export function useTable<T extends Record<string, any>>(
|
|
|
@@ -151,9 +180,13 @@ export function useTable<T extends Record<string, any>>(
|
|
|
onSortingChange,
|
|
|
} = options;
|
|
|
|
|
|
- const {columnList, hasSort} = useMemo(
|
|
|
+ const {columnList, hasSort, hasGroup} = useMemo(
|
|
|
function() {
|
|
|
- return parseColumn(columns, Boolean(setRowSelection));
|
|
|
+ return parseColumn(
|
|
|
+ columns,
|
|
|
+ Boolean(setRowSelection),
|
|
|
+ true,
|
|
|
+ );
|
|
|
},
|
|
|
[columns, setRowSelection],
|
|
|
);
|
|
|
@@ -164,22 +197,13 @@ export function useTable<T extends Record<string, any>>(
|
|
|
if (preloadData?.tableWidth)
|
|
|
return JSON.parse(preloadData.tableWidth) as Record<string, number>;
|
|
|
|
|
|
- const obj: Record<string, number> = {no: 64, select: 48};
|
|
|
-
|
|
|
- columns.forEach(function({dataIndex, width}) {
|
|
|
- if (dataIndex && width)
|
|
|
- obj[dataIndex.toString()] = Number(width);
|
|
|
- });
|
|
|
-
|
|
|
- return obj;
|
|
|
+ return {};
|
|
|
});
|
|
|
const [columnOrder, setColumnOrder] = useState(function() {
|
|
|
if (preloadData?.tableOrder)
|
|
|
return JSON.parse(preloadData?.tableOrder) as string[];
|
|
|
|
|
|
- const nextList = columns.map(val => val.dataIndex.toString());
|
|
|
-
|
|
|
- return ['select', 'no', ...nextList];
|
|
|
+ return [];
|
|
|
});
|
|
|
const [sorting, setSorting] = useState<SortingState>([]);
|
|
|
const onSortingChangeFn = useLatest(onSortingChange);
|
|
|
@@ -241,7 +265,7 @@ export function useTable<T extends Record<string, any>>(
|
|
|
}
|
|
|
|
|
|
return [
|
|
|
- {...table, active, hasSort},
|
|
|
+ {...table, active, hasSort, hasGroup},
|
|
|
{onDragStart, onDragEnd},
|
|
|
] as const;
|
|
|
}
|