import PropTypes from '../_util/vue-types'; import classNames from 'classnames'; import omit from 'omit.js'; import { ConfigConsumerProps } from '../config-provider'; import Spin from '../spin'; import Pagination, { PaginationConfig } from '../pagination'; import { Row } from '../grid'; import Item from './Item'; import { initDefaultProps, getComponentFromProp, filterEmpty, getListeners, } from '../_util/props-util'; import { cloneElement } from '../_util/vnode'; import Base from '../base'; export { ListItemProps, ListItemMetaProps } from './Item'; export const ColumnCount = ['', 1, 2, 3, 4, 6, 8, 12, 24]; export const ColumnType = ['gutter', 'column', 'xs', 'sm', 'md', 'lg', 'xl', 'xxl']; export const ListGridType = { gutter: PropTypes.number, column: PropTypes.oneOf(ColumnCount), xs: PropTypes.oneOf(ColumnCount), sm: PropTypes.oneOf(ColumnCount), md: PropTypes.oneOf(ColumnCount), lg: PropTypes.oneOf(ColumnCount), xl: PropTypes.oneOf(ColumnCount), xxl: PropTypes.oneOf(ColumnCount), }; export const ListSize = ['small', 'default', 'large']; export const ListProps = () => ({ bordered: PropTypes.bool, dataSource: PropTypes.array, extra: PropTypes.any, grid: PropTypes.shape(ListGridType).loose, itemLayout: PropTypes.string, loading: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]), loadMore: PropTypes.any, pagination: PropTypes.oneOfType([PropTypes.shape(PaginationConfig()).loose, PropTypes.bool]), prefixCls: PropTypes.string, rowKey: PropTypes.any, renderItem: PropTypes.any, size: PropTypes.oneOf(ListSize), split: PropTypes.bool, header: PropTypes.any, footer: PropTypes.any, locale: PropTypes.object, }); const List = { Item, name: 'AList', props: initDefaultProps(ListProps(), { dataSource: [], bordered: false, split: true, loading: false, pagination: false, }), provide() { return { listContext: this, }; }, inject: { configProvider: { default: () => ConfigConsumerProps }, }, data() { this.keys = []; this.defaultPaginationProps = { current: 1, pageSize: 10, onChange: (page, pageSize) => { const { pagination } = this; this.paginationCurrent = page; if (pagination && pagination.onChange) { pagination.onChange(page, pageSize); } }, total: 0, }; this.onPaginationChange = this.triggerPaginationEvent('onChange'); this.onPaginationShowSizeChange = this.triggerPaginationEvent('onShowSizeChange'); const { pagination } = this.$props; const paginationObj = pagination && typeof pagination === 'object' ? pagination : {}; return { paginationCurrent: paginationObj.defaultCurrent || 1, paginationSize: paginationObj.defaultPageSize || 10, }; }, methods: { triggerPaginationEvent(eventName) { return (page, pageSize) => { const { pagination } = this.$props; this.paginationCurrent = page; this.paginationSize = pageSize; if (pagination && pagination[eventName]) { pagination[eventName](page, pageSize); } }; }, renderItem2(item, index) { const { $scopedSlots, rowKey } = this; const renderItem = this.renderItem || $scopedSlots.renderItem; if (!renderItem) return null; let key; if (typeof rowKey === 'function') { key = rowKey(item); } else if (typeof rowKey === 'string') { key = item[rowKey]; } else { key = item.key; } if (!key) { key = `list-item-${index}`; } this.keys[index] = key; return renderItem(item, index); }, isSomethingAfterLastItem() { const { pagination } = this; const loadMore = getComponentFromProp(this, 'loadMore'); const footer = getComponentFromProp(this, 'footer'); return !!(loadMore || pagination || footer); }, renderEmpty(prefixCls, renderEmpty) { const { locale } = this; return (