import Cell from './Cell'; import { getSlot, getClass, getStyle } from '../_util/props-util'; import type { FunctionalComponent, VNode } from 'vue'; import { inject, ref } from 'vue'; import type { DescriptionsContextProp } from './index'; import { descriptionsContext } from './index'; interface CellConfig { component: string | [string, string]; type: string; showLabel?: boolean; showContent?: boolean; } export interface RowProps { prefixCls: string; vertical: boolean; row: any[]; bordered: boolean; colon: boolean; index: number; } const Row: FunctionalComponent = props => { const renderCells = ( items: VNode[], { colon, prefixCls, bordered }, { component, type, showLabel, showContent, labelStyle: rootLabelStyle, contentStyle: rootContentStyle, }: CellConfig & DescriptionsContextProp, ) => { return items.map((item, index) => { const { prefixCls: itemPrefixCls = prefixCls, span = 1, labelStyle, contentStyle, label = (item.children as any)?.label?.(), } = item.props || {}; const children = getSlot(item); const className = getClass(item); const style = getStyle(item); const { key } = item; if (typeof component === 'string') { return ( ); } return [ , , ]; }); }; const { prefixCls, vertical, row, index, bordered } = props; const { labelStyle, contentStyle } = inject(descriptionsContext, { labelStyle: ref({}), contentStyle: ref({}), }); if (vertical) { return ( <> {renderCells(row, props, { component: 'th', type: 'label', showLabel: true, labelStyle, contentStyle, })} {renderCells(row, props, { component: 'td', type: 'content', showContent: true, labelStyle, contentStyle, })} ); } return ( {renderCells(row, props, { component: bordered ? ['th', 'td'] : 'td', type: 'item', showLabel: true, showContent: true, labelStyle, contentStyle, })} ); }; export default Row;