import PropTypes from '../_util/vue-types'; import classNames from 'classnames'; import { getSlotOptions, getComponentFromProp, isEmptyElement } from '../_util/props-util'; import { Col } from '../grid'; import { ListGridType } from './index'; export const ListItemProps = { prefixCls: PropTypes.string, extra: PropTypes.any, actions: PropTypes.arrayOf(PropTypes.any), grid: ListGridType, }; export const ListItemMetaProps = { avatar: PropTypes.any, description: PropTypes.any, prefixCls: PropTypes.string, title: PropTypes.any, }; export const Meta = { functional: true, name: 'AListItemMeta', __ANT_LIST_ITEM_META: true, render(h, context) { const { props, slots, listeners } = context; const slotsMap = slots(); const { prefixCls = 'ant-list' } = props; const avatar = props.avatar || slotsMap.avatar; const title = props.title || slotsMap.title; const description = props.description || slotsMap.description; const content = ( <div class={`${prefixCls}-item-meta-content`}> {title && <h4 class={`${prefixCls}-item-meta-title`}>{title}</h4>} {description && <div class={`${prefixCls}-item-meta-description`}>{description}</div>} </div> ); return ( <div {...{ on: listeners }} class={`${prefixCls}-item-meta`}> {avatar && <div class={`${prefixCls}-item-meta-avatar`}>{avatar}</div>} {(title || description) && content} </div> ); }, }; function getGrid(grid, t) { return grid[t] && Math.floor(24 / grid[t]); } export default { name: 'AListItem', Meta, props: ListItemProps, inject: { listContext: { default: () => ({}) }, }, render() { const { grid } = this.listContext; const { prefixCls = 'ant-list', $slots, $listeners } = this; const classString = `${prefixCls}-item`; const extra = getComponentFromProp(this, 'extra'); const actions = getComponentFromProp(this, 'actions'); const metaContent = []; const otherContent = []; ($slots.default || []).forEach(element => { if (!isEmptyElement(element)) { if (getSlotOptions(element).__ANT_LIST_ITEM_META) { metaContent.push(element); } else { otherContent.push(element); } } }); const contentClassString = classNames(`${prefixCls}-item-content`, { [`${prefixCls}-item-content-single`]: metaContent.length < 1, }); const content = otherContent.length > 0 ? <div class={contentClassString}>{otherContent}</div> : null; let actionsContent; if (actions && actions.length > 0) { const actionsContentItem = (action, i) => ( <li key={`${prefixCls}-item-action-${i}`}> {action} {i !== actions.length - 1 && <em class={`${prefixCls}-item-action-split`} />} </li> ); actionsContent = ( <ul class={`${prefixCls}-item-action`}> {actions.map((action, i) => actionsContentItem(action, i))} </ul> ); } const extraContent = ( <div class={`${prefixCls}-item-extra-wrap`}> <div class={`${prefixCls}-item-main`}> {metaContent} {content} {actionsContent} </div> <div class={`${prefixCls}-item-extra`}>{extra}</div> </div> ); const mainContent = grid ? ( <Col span={getGrid(grid, 'column')} xs={getGrid(grid, 'xs')} sm={getGrid(grid, 'sm')} md={getGrid(grid, 'md')} lg={getGrid(grid, 'lg')} xl={getGrid(grid, 'xl')} xxl={getGrid(grid, 'xxl')} > <div {...{ on: $listeners }} class={classString}> {extra && extraContent} {!extra && metaContent} {!extra && content} {!extra && actionsContent} </div> </Col> ) : ( <div {...{ on: $listeners }} class={classString}> {extra && extraContent} {!extra && metaContent} {!extra && content} {!extra && actionsContent} </div> ); return mainContent; }, };