mirror of
https://github.com/ant-design/ant-design.git
synced 2024-11-28 21:19:37 +08:00
ecb36840bf
* feat: descriptions implement items api * docs: add jsx debug demo * refactor: add useRow hook * Update components/descriptions/index.tsx Co-authored-by: Wuxh <wxh1220@gmail.com> Signed-off-by: 红果汁 <pingfj77@gmail.com> * Update components/descriptions/index.zh-CN.md Co-authored-by: Wuxh <wxh1220@gmail.com> Signed-off-by: 红果汁 <pingfj77@gmail.com> * Update components/descriptions/index.en-US.md Co-authored-by: Wuxh <wxh1220@gmail.com> Signed-off-by: 红果汁 <pingfj77@gmail.com> * fix: decrease in coverage * refactor: enhancement code --------- Signed-off-by: 红果汁 <pingfj77@gmail.com> Co-authored-by: Wuxh <wxh1220@gmail.com>
138 lines
3.3 KiB
TypeScript
138 lines
3.3 KiB
TypeScript
import * as React from 'react';
|
|
import type { DescriptionsItemType } from '.';
|
|
import Cell from './Cell';
|
|
import type { DescriptionsContextProps } from './DescriptionsContext';
|
|
import DescriptionsContext from './DescriptionsContext';
|
|
|
|
interface CellConfig {
|
|
component: string | [string, string];
|
|
type: string;
|
|
showLabel?: boolean;
|
|
showContent?: boolean;
|
|
}
|
|
|
|
function renderCells(
|
|
items: DescriptionsItemType[],
|
|
{ colon, prefixCls, bordered }: RowProps,
|
|
{
|
|
component,
|
|
type,
|
|
showLabel,
|
|
showContent,
|
|
labelStyle: rootLabelStyle,
|
|
contentStyle: rootContentStyle,
|
|
}: CellConfig & DescriptionsContextProps,
|
|
) {
|
|
return items.map(
|
|
(
|
|
{
|
|
label,
|
|
children,
|
|
prefixCls: itemPrefixCls = prefixCls,
|
|
className,
|
|
style,
|
|
labelStyle,
|
|
contentStyle,
|
|
span = 1,
|
|
key,
|
|
},
|
|
index,
|
|
) => {
|
|
if (typeof component === 'string') {
|
|
return (
|
|
<Cell
|
|
key={`${type}-${key || index}`}
|
|
className={className}
|
|
style={style}
|
|
labelStyle={{ ...rootLabelStyle, ...labelStyle }}
|
|
contentStyle={{ ...rootContentStyle, ...contentStyle }}
|
|
span={span}
|
|
colon={colon}
|
|
component={component}
|
|
itemPrefixCls={itemPrefixCls}
|
|
bordered={bordered}
|
|
label={showLabel ? label : null}
|
|
content={showContent ? children : null}
|
|
/>
|
|
);
|
|
}
|
|
|
|
return [
|
|
<Cell
|
|
key={`label-${key || index}`}
|
|
className={className}
|
|
style={{ ...rootLabelStyle, ...style, ...labelStyle }}
|
|
span={1}
|
|
colon={colon}
|
|
component={component[0]}
|
|
itemPrefixCls={itemPrefixCls}
|
|
bordered={bordered}
|
|
label={label}
|
|
/>,
|
|
<Cell
|
|
key={`content-${key || index}`}
|
|
className={className}
|
|
style={{ ...rootContentStyle, ...style, ...contentStyle }}
|
|
span={span * 2 - 1}
|
|
component={component[1]}
|
|
itemPrefixCls={itemPrefixCls}
|
|
bordered={bordered}
|
|
content={children}
|
|
/>,
|
|
];
|
|
},
|
|
);
|
|
}
|
|
|
|
export interface RowProps {
|
|
prefixCls: string;
|
|
vertical: boolean;
|
|
row: DescriptionsItemType[];
|
|
bordered?: boolean;
|
|
colon: boolean;
|
|
index: number;
|
|
children?: React.ReactNode;
|
|
}
|
|
|
|
const Row: React.FC<RowProps> = (props) => {
|
|
const descContext = React.useContext(DescriptionsContext);
|
|
|
|
const { prefixCls, vertical, row, index, bordered } = props;
|
|
if (vertical) {
|
|
return (
|
|
<>
|
|
<tr key={`label-${index}`} className={`${prefixCls}-row`}>
|
|
{renderCells(row, props, {
|
|
component: 'th',
|
|
type: 'label',
|
|
showLabel: true,
|
|
...descContext,
|
|
})}
|
|
</tr>
|
|
<tr key={`content-${index}`} className={`${prefixCls}-row`}>
|
|
{renderCells(row, props, {
|
|
component: 'td',
|
|
type: 'content',
|
|
showContent: true,
|
|
...descContext,
|
|
})}
|
|
</tr>
|
|
</>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<tr key={index} className={`${prefixCls}-row`}>
|
|
{renderCells(row, props, {
|
|
component: bordered ? ['th', 'td'] : 'td',
|
|
type: 'item',
|
|
showLabel: true,
|
|
showContent: true,
|
|
...descContext,
|
|
})}
|
|
</tr>
|
|
);
|
|
};
|
|
|
|
export default Row;
|