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)}
);
};