import {Fragment, ReactNode} from 'react'; import classNames from 'classnames'; import {cls} from '../utils/cls'; import {TypeLayoutItem} from '../module-defs/ui-types'; function renderTitleRow(props: { titleRow?: { items: Array<{ text: string }> } }) { if (!props.titleRow) { return null; } return (
{props.titleRow.items.map( (item, index) => ( // eslint-disable-next-line react/no-array-index-key { index ? : null } {item.text} ) )}
); } export interface TypeLayoutRenderedItem { elem: ReactNode className?: string prevGapClassName?: string } function renderContent(props: { rows: Array<{ items: TypeLayoutItem[] }> renderItem: (item: TypeLayoutItem) => TypeLayoutRenderedItem onItemClick?: (item: TypeLayoutItem) => void onItemMouseEnter?: (item: TypeLayoutItem) => void }) { return props.rows.map( (row, rowIndex) => (
{ row.items.map( (item, colIndex) => { const { elem, prevGapClassName, } = props.renderItem(item); return ( // eslint-disable-next-line react/no-array-index-key { colIndex ? ( ) : null } {elem} ); } ) }
) ); } /** * * 所有 titleRow.items 与 rows.items 的 item 个数应该都应一致, 用于布局 * * @param props * @constructor */ export const UiItemLayout = (props: { titleRow?: { items: Array<{ text: string }> } rows: Array<{ items: TypeLayoutItem[] }> renderItem: (item: TypeLayoutItem) => TypeLayoutRenderedItem size?: 's' | 'm' onItemClick?: (item: TypeLayoutItem) => void onItemMouseEnter?: (item: TypeLayoutItem) => void }) => { const size = props.size === 's' ? 'small' : 'medium'; return (
{renderTitleRow(props)} {renderContent(props)}
); };