58 lines
1.6 KiB
Vue
58 lines
1.6 KiB
Vue
import { defineComponent } from 'vue';
|
|
import Cell from '../Cell';
|
|
import { useInjectSummary } from '../context/SummaryContext';
|
|
import { useInjectTable } from '../context/TableContext';
|
|
import type { AlignType } from '../interface';
|
|
import { getCellFixedInfo } from '../utils/fixUtil';
|
|
|
|
export interface SummaryCellProps {
|
|
index: number;
|
|
colSpan?: number;
|
|
rowSpan?: number;
|
|
align?: AlignType;
|
|
}
|
|
|
|
export default defineComponent<SummaryCellProps>({
|
|
name: 'SummaryCell',
|
|
inheritAttrs: false,
|
|
props: ['index', 'colSpan', 'rowSpan', 'align'] as any,
|
|
setup(props, { attrs, slots }) {
|
|
const tableContext = useInjectTable();
|
|
const summaryContext = useInjectSummary();
|
|
return () => {
|
|
const { index, colSpan = 1, rowSpan, align } = props;
|
|
const { prefixCls, direction } = tableContext;
|
|
const { scrollColumnIndex, stickyOffsets, flattenColumns } = summaryContext;
|
|
const lastIndex = index + colSpan - 1;
|
|
const mergedColSpan = lastIndex + 1 === scrollColumnIndex ? colSpan + 1 : colSpan;
|
|
|
|
const fixedInfo = getCellFixedInfo(
|
|
index,
|
|
index + mergedColSpan - 1,
|
|
flattenColumns,
|
|
stickyOffsets,
|
|
direction,
|
|
);
|
|
return (
|
|
<Cell
|
|
class={attrs.class as string}
|
|
index={index}
|
|
component="td"
|
|
prefixCls={prefixCls}
|
|
record={null}
|
|
dataIndex={null}
|
|
align={align}
|
|
customRender={() => ({
|
|
children: slots.default?.(),
|
|
props: {
|
|
colSpan: mergedColSpan,
|
|
rowSpan,
|
|
},
|
|
})}
|
|
{...fixedInfo}
|
|
/>
|
|
);
|
|
};
|
|
},
|
|
});
|