ant-design-vue/components/vc-table/Body/ExpandedRow.tsx

68 lines
2.1 KiB
Vue

import type { CustomizeComponent } from '../interface';
import Cell from '../Cell';
import { defineComponent } from 'vue';
import { useInjectTable } from '../context/TableContext';
import { useInjectExpandedRow } from '../context/ExpandedRowContext';
export interface ExpandedRowProps {
prefixCls: string;
component: CustomizeComponent;
cellComponent: CustomizeComponent;
expanded: boolean;
colSpan: number;
isEmpty: boolean;
}
export default defineComponent<ExpandedRowProps>({
name: 'ExpandedRow',
inheritAttrs: false,
props: ['prefixCls', 'component', 'cellComponent', 'expanded', 'colSpan', 'isEmpty'] as any,
setup(props, { slots, attrs }) {
const tableContext = useInjectTable();
const expandedRowContext = useInjectExpandedRow();
const { fixHeader, fixColumn, componentWidth, horizonScroll } = expandedRowContext;
return () => {
const { prefixCls, component: Component, cellComponent, expanded, colSpan, isEmpty } = props;
return (
<Component
class={attrs.class}
style={{
display: expanded ? null : 'none',
}}
>
<Cell
component={cellComponent}
prefixCls={prefixCls}
colSpan={colSpan}
v-slots={{
default: () => {
let contentNode: any = slots.default?.();
if (isEmpty ? horizonScroll.value : fixColumn.value) {
contentNode = (
<div
style={{
width: `${
componentWidth.value - (fixHeader.value ? tableContext.scrollbarSize : 0)
}px`,
position: 'sticky',
left: 0,
overflow: 'hidden',
}}
class={`${prefixCls}-expanded-row-fixed`}
>
{contentNode}
</div>
);
}
return contentNode;
},
}}
></Cell>
</Component>
);
};
},
});