import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import ConfigProvider from '../config-provider'; import { obj } from '../util'; import createStyle, { getGridChildProps } from './create-style'; import Cell from './cell'; const { pickOthers } = obj; const createChildren = (children, device) => { const array = React.Children.toArray(children); if (!children) { return null; } return array.map((child) => { if ( React.isValidElement(child) && typeof child.type === 'function' && ['form_item', 'responsive_grid_cell'].indexOf(child.type._typeMark) > -1 ) { return React.cloneElement(child, { style: { ...getGridChildProps(child.props, device), ...(child.props.style || {}), }, }); } return child; }); }; const getStyle = (style = {}, props) => ({ ...createStyle({ display: 'grid', ...props }), ...style, }); /** * ResponsiveGrid */ class ResponsiveGrid extends Component { static _typeMark = 'responsive_grid'; static propTypes = { prefix: PropTypes.string, className: PropTypes.any, /** * 设备,用来做自适应,默认为 PC * @enumdesc 手机, 平板, PC */ device: PropTypes.oneOf(['phone', 'tablet', 'desktop']), rows: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), /** * 分为几列, 默认是 12 列 */ columns: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), /** * 每个 cell 之间的间距, [bottom&top, right&left] */ gap: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.number), PropTypes.number]), /** * 设置标签类型 */ component: PropTypes.elementType, }; static defaultProps = { prefix: 'next-', component: 'div', device: 'desktop', }; render() { const { prefix, component: View, style, className, children, device, rows, columns, gap, rowSpan, colSpan, component, } = this.props; const styleProps = { rows, columns, gap, device, rowSpan, colSpan, component, }; const others = pickOthers(Object.keys(ResponsiveGrid.propTypes), this.props); const styleSheet = getStyle(style, styleProps); const cls = classNames( { [`${prefix}responsive-grid`]: true, }, className, ); return ( {createChildren(children, device)} ); } } ResponsiveGrid.Cell = Cell; export default ConfigProvider.config(ResponsiveGrid);