Skip to content

Commit a35967a

Browse files
committed
feat: 🎸 support custome table header/footer
1 parent 4b0964f commit a35967a

File tree

2 files changed

+113
-46
lines changed

2 files changed

+113
-46
lines changed

src/pro-array-table/pro.tsx

+77-43
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,46 @@ import {
6262
} from "./mixin.pro";
6363
import { IChangeData, ProArrayTableProps } from "./types";
6464

65+
export const DefaultHeaderRender = (props: {
66+
title?: React.ReactNode;
67+
selection?: React.ReactNode;
68+
toolbars?: React.ReactNode;
69+
addition?: React.ReactNode;
70+
settings?: React.ReactNode;
71+
extra?: React.ReactNode;
72+
}) => {
73+
return (
74+
<Flex marginBottom={"8px"} marginTop={"8px"}>
75+
{props.title || props.selection ? (
76+
<Flex start>
77+
{props.title}
78+
{props.selection}
79+
</Flex>
80+
) : null}
81+
{props.toolbars ? <Flex center>{props.toolbars}</Flex> : null}
82+
{props.addition || props.extra || props.settings ? (
83+
<Flex end>
84+
{props.addition}
85+
{props.extra}
86+
{props.settings}
87+
</Flex>
88+
) : null}
89+
</Flex>
90+
);
91+
};
92+
93+
export const DefaultFooterRender = (props: {
94+
footer?: React.ReactNode;
95+
pagination?: React.ReactNode;
96+
}) => {
97+
return (
98+
<Flex between marginTop={`${8}px`}>
99+
{props.footer}
100+
{props.pagination}
101+
</Flex>
102+
);
103+
};
104+
65105
const ArrayTableProInside: ReactFC<ProArrayTableProps> = observer(
66106
({ onAdd, onRemove, onCopy, onMoveDown, onMoveUp, onSortEnd, ...props }) => {
67107
const wrapperRef = useRef<HTMLDivElement>(null);
@@ -177,63 +217,58 @@ const ArrayTableProInside: ReactFC<ProArrayTableProps> = observer(
177217
</div>
178218
) : null;
179219

180-
const showHeader =
181-
props.title ||
182-
props.rowSelection ||
183-
toolbar ||
184-
addition ||
185-
props.settings !== false;
220+
// const showHeader =
221+
// props.title ||
222+
// props.rowSelection ||
223+
// toolbar ||
224+
// addition ||
225+
// props.settings !== false;
186226

187-
const _header = !showHeader ? null : (
188-
<Flex {...props.headerFlex} marginBottom={"8px"} marginTop={"8px"}>
189-
{props.title ? (
227+
const HeaderRender = props.headerRender || DefaultHeaderRender;
228+
const _header = (
229+
<HeaderRender
230+
title={
231+
props.title ? (
190232
typeof props.title === "function" ? (
191233
props.title(dataSource)
192234
) : (
193235
<Typography.Title level={5} style={{ flex: 1 }}>
194236
{props.title}
195237
</Typography.Title>
196238
)
197-
) : null}
198-
{rowSelection?.showPro === "top" ? (
239+
) : null
240+
}
241+
selection={
242+
rowSelection?.showPro ? (
199243
<RowSelectionPro ds={dataSlice} rowKey={rowKey}></RowSelectionPro>
200-
) : null}
201-
{toolbar}
202-
{addition}
203-
{!props.extra && props.settings === false ? null : (
204-
<Space size="small">
205-
{props.extra}
206-
{props.settings !== false ? (
207-
<ProSettings columns={proColumns}></ProSettings>
208-
) : null}
209-
</Space>
210-
)}
211-
</Flex>
244+
) : null
245+
}
246+
toolbars={toolbar}
247+
addition={addition}
248+
extra={props.extra}
249+
settings={
250+
props.settings !== false ? (
251+
<ProSettings columns={proColumns}></ProSettings>
252+
) : null
253+
}
254+
></HeaderRender>
212255
);
213256

214-
const showFooter = props.footer || footer || pagination;
215-
const _footer = !showFooter ? null : (
216-
<Flex between marginTop={`${6}px`}>
217-
<Flex
218-
start
219-
hidden={!props.footer && rowSelection?.showPro !== "bottom"}
220-
>
221-
{props.footer ? (
257+
const FooterRender = props.footerRender || DefaultFooterRender;
258+
259+
const _footer = (
260+
<FooterRender
261+
footer={
262+
props.footer ? (
222263
typeof props.footer === "function" ? (
223264
props.footer(dataSource)
224265
) : (
225266
<Typography.Title level={5}>{props.footer}</Typography.Title>
226267
)
227-
) : null}
228-
{rowSelection?.showPro === "bottom" ? (
229-
<RowSelectionPro ds={dataSlice} rowKey={rowKey}></RowSelectionPro>
230-
) : null}
231-
</Flex>
232-
<Flex end>
233-
{footer}
234-
{pagination}
235-
</Flex>
236-
</Flex>
268+
) : null
269+
}
270+
pagination={pagination}
271+
></FooterRender>
237272
);
238273

239274
const header = useResizeHeader({
@@ -349,8 +384,7 @@ const ArrayTableProInside: ReactFC<ProArrayTableProps> = observer(
349384
},
350385
);
351386

352-
const useTableExpandable = () => {
353-
};
387+
const useTableExpandable = () => {};
354388

355389
const useTableRowSelection = () => {
356390
return useContext(TableRowSelectionContext);

src/pro-array-table/types.tsx

+36-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import type { Table } from "../adaptor";
44

55
type TableProps<T> = React.ComponentProps<typeof Table>;
66

7-
import { Flex } from './mixin.pro'
7+
import { Flex } from "./mixin.pro";
8+
import { DefaultFooterRender, DefaultHeaderRender } from "./pro";
89
export type TableChangeParams = Parameters<
910
Required<TableProps<any>>["onChange"]
1011
>;
@@ -56,14 +57,46 @@ export interface IProArrayTableBaseMixins {
5657
onMoveDown?: (index: number, arrayField: ArrayField) => void | Promise<void>;
5758
}
5859

60+
{
61+
/* <Flex {...props.headerFlex} marginBottom={"8px"} marginTop={"8px"}>
62+
{props.title ? (
63+
typeof props.title === "function" ? (
64+
props.title(dataSource)
65+
) : (
66+
<Typography.Title level={5} style={{ flex: 1 }}>
67+
{props.title}
68+
</Typography.Title>
69+
)
70+
) : null}
71+
{rowSelection?.showPro === "top" ? (
72+
<RowSelectionPro ds={dataSlice} rowKey={rowKey}></RowSelectionPro>
73+
) : null}
74+
{toolbar}
75+
{addition}
76+
{!props.extra && props.settings === false ? null : (
77+
<Space size="small">
78+
{props.extra}
79+
{props.settings !== false ? (
80+
<ProSettings columns={proColumns}></ProSettings>
81+
) : null}
82+
</Space>
83+
)}
84+
</Flex>
85+
type HeaderRender = (props: {
86+
87+
}) => React.ReactNode */
88+
}
89+
5990
export type ProArrayTableProps = Omit<TableProps<any>, "title"> &
6091
IProArrayTableBaseMixins & {
61-
headerFlex?: React.ComponentProps<typeof Flex>,
92+
headerRender?: typeof DefaultHeaderRender;
93+
footerRender?: typeof DefaultFooterRender;
94+
// headerFlex?: React.ComponentProps<typeof Flex>;
6295
title: string | TableProps<any>["title"];
6396
footer: string | TableProps<any>["footer"];
6497
rowSelection?:
6598
| (Exclude<RequiredTableProps["rowSelection"], undefined> & {
66-
showPro?: "top" | "bottom" | false;
99+
showPro?: boolean;
67100
})
68101
| true;
69102
/** 列表配置齿轮, 默认 true */

0 commit comments

Comments
 (0)