vuecssuiant-designantdreactantantd-vueenterprisefrontendui-designvue-antdvue-antd-uivue3vuecomponent
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.6 KiB
139 lines
3.6 KiB
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<RowProps> = 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 ( |
|
<Cell |
|
key={`${type}-${String(key) || index}`} |
|
class={className} |
|
style={style} |
|
labelStyle={{ ...rootLabelStyle.value, ...labelStyle }} |
|
contentStyle={{ ...rootContentStyle.value, ...contentStyle }} |
|
span={span} |
|
colon={colon} |
|
component={component} |
|
itemPrefixCls={itemPrefixCls} |
|
bordered={bordered} |
|
label={showLabel ? label : null} |
|
content={showContent ? children : null} |
|
/> |
|
); |
|
} |
|
|
|
return [ |
|
<Cell |
|
key={`label-${String(key) || index}`} |
|
class={className} |
|
style={{ ...rootLabelStyle.value, ...style, ...labelStyle }} |
|
span={1} |
|
colon={colon} |
|
component={component[0]} |
|
itemPrefixCls={itemPrefixCls} |
|
bordered={bordered} |
|
label={label} |
|
/>, |
|
<Cell |
|
key={`content-${String(key) || index}`} |
|
class={className} |
|
style={{ ...rootContentStyle.value, ...style, ...contentStyle }} |
|
span={span * 2 - 1} |
|
component={component[1]} |
|
itemPrefixCls={itemPrefixCls} |
|
bordered={bordered} |
|
content={children} |
|
/>, |
|
]; |
|
}); |
|
}; |
|
|
|
const { prefixCls, vertical, row, index, bordered } = props; |
|
const { labelStyle, contentStyle } = inject(descriptionsContext, { |
|
labelStyle: ref({}), |
|
contentStyle: ref({}), |
|
}); |
|
if (vertical) { |
|
return ( |
|
<> |
|
<tr key={`label-${index}`} class={`${prefixCls}-row`}> |
|
{renderCells(row, props, { |
|
component: 'th', |
|
type: 'label', |
|
showLabel: true, |
|
labelStyle, |
|
contentStyle, |
|
})} |
|
</tr> |
|
<tr key={`content-${index}`} class={`${prefixCls}-row`}> |
|
{renderCells(row, props, { |
|
component: 'td', |
|
type: 'content', |
|
showContent: true, |
|
labelStyle, |
|
contentStyle, |
|
})} |
|
</tr> |
|
</> |
|
); |
|
} |
|
|
|
return ( |
|
<tr key={index} class={`${prefixCls}-row`}> |
|
{renderCells(row, props, { |
|
component: bordered ? ['th', 'td'] : 'td', |
|
type: 'item', |
|
showLabel: true, |
|
showContent: true, |
|
labelStyle, |
|
contentStyle, |
|
})} |
|
</tr> |
|
); |
|
}; |
|
|
|
export default Row;
|
|
|