index.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
  2. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  3. import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
  4. import _typeof from "@babel/runtime/helpers/esm/typeof";
  5. import { createVNode as _createVNode } from "vue";
  6. import { provide, defineComponent, ref, watch, computed, toRef } from 'vue';
  7. import PropTypes from '../_util/vue-types';
  8. import Spin from '../spin';
  9. import Pagination from '../pagination';
  10. import { Row } from '../grid';
  11. import Item from './Item';
  12. import { flattenChildren } from '../_util/props-util';
  13. import initDefaultProps from '../_util/props-util/initDefaultProps';
  14. import ItemMeta from './ItemMeta';
  15. import useConfigInject from '../_util/hooks/useConfigInject';
  16. import useBreakpoint from '../_util/hooks/useBreakpoint';
  17. import { responsiveArray } from '../_util/responsiveObserve';
  18. import eagerComputed from '../_util/eagerComputed';
  19. export var listProps = function listProps() {
  20. return {
  21. bordered: {
  22. type: Boolean,
  23. default: undefined
  24. },
  25. dataSource: PropTypes.array,
  26. extra: PropTypes.any,
  27. grid: {
  28. type: Object,
  29. default: undefined
  30. },
  31. itemLayout: String,
  32. loading: {
  33. type: [Boolean, Object],
  34. default: undefined
  35. },
  36. loadMore: PropTypes.any,
  37. pagination: {
  38. type: [Boolean, Object],
  39. default: undefined
  40. },
  41. prefixCls: String,
  42. rowKey: [String, Number, Function],
  43. renderItem: Function,
  44. size: String,
  45. split: {
  46. type: Boolean,
  47. default: undefined
  48. },
  49. header: PropTypes.any,
  50. footer: PropTypes.any,
  51. locale: {
  52. type: Object
  53. }
  54. };
  55. };
  56. import { ListContextKey } from './contextKey';
  57. var List = defineComponent({
  58. compatConfig: {
  59. MODE: 3
  60. },
  61. name: 'AList',
  62. Item: Item,
  63. props: initDefaultProps(listProps(), {
  64. dataSource: [],
  65. bordered: false,
  66. split: true,
  67. loading: false,
  68. pagination: false
  69. }),
  70. slots: ['extra', 'loadMore', 'renderItem', 'header', 'footer'],
  71. setup: function setup(props, _ref) {
  72. var _paginationObj$value$, _paginationObj$value$2;
  73. var slots = _ref.slots;
  74. provide(ListContextKey, {
  75. grid: toRef(props, 'grid'),
  76. itemLayout: toRef(props, 'itemLayout')
  77. });
  78. var defaultPaginationProps = {
  79. current: 1,
  80. total: 0
  81. };
  82. var _useConfigInject = useConfigInject('list', props),
  83. prefixCls = _useConfigInject.prefixCls,
  84. direction = _useConfigInject.direction,
  85. renderEmpty = _useConfigInject.renderEmpty;
  86. var paginationObj = computed(function () {
  87. return props.pagination && _typeof(props.pagination) === 'object' ? props.pagination : {};
  88. });
  89. var paginationCurrent = ref((_paginationObj$value$ = paginationObj.value.defaultCurrent) !== null && _paginationObj$value$ !== void 0 ? _paginationObj$value$ : 1);
  90. var paginationSize = ref((_paginationObj$value$2 = paginationObj.value.defaultPageSize) !== null && _paginationObj$value$2 !== void 0 ? _paginationObj$value$2 : 10);
  91. watch(paginationObj, function () {
  92. if ('current' in paginationObj.value) {
  93. paginationCurrent.value = paginationObj.value.current;
  94. }
  95. if ('pageSize' in paginationObj.value) {
  96. paginationSize.value = paginationObj.value.pageSize;
  97. }
  98. });
  99. var listItemsKeys = [];
  100. var triggerPaginationEvent = function triggerPaginationEvent(eventName) {
  101. return function (page, pageSize) {
  102. paginationCurrent.value = page;
  103. paginationSize.value = pageSize;
  104. if (paginationObj.value[eventName]) {
  105. paginationObj.value[eventName](page, pageSize);
  106. }
  107. };
  108. };
  109. var onPaginationChange = triggerPaginationEvent('onChange');
  110. var onPaginationShowSizeChange = triggerPaginationEvent('onShowSizeChange');
  111. var renderEmptyFunc = function renderEmptyFunc(renderEmptyHandler) {
  112. var _props$locale;
  113. return _createVNode("div", {
  114. "class": "".concat(prefixCls.value, "-empty-text")
  115. }, [((_props$locale = props.locale) === null || _props$locale === void 0 ? void 0 : _props$locale.emptyText) || renderEmptyHandler('List')]);
  116. };
  117. var loadingProp = computed(function () {
  118. if (typeof props.loading === 'boolean') {
  119. return {
  120. spinning: props.loading
  121. };
  122. } else {
  123. return props.loading;
  124. }
  125. });
  126. var isLoading = computed(function () {
  127. return loadingProp.value && loadingProp.value.spinning;
  128. });
  129. var sizeCls = computed(function () {
  130. var size = '';
  131. switch (props.size) {
  132. case 'large':
  133. size = 'lg';
  134. break;
  135. case 'small':
  136. size = 'sm';
  137. break;
  138. default:
  139. break;
  140. }
  141. return size;
  142. });
  143. var classObj = computed(function () {
  144. var _ref2;
  145. return _ref2 = {}, _defineProperty(_ref2, "".concat(prefixCls.value), true), _defineProperty(_ref2, "".concat(prefixCls.value, "-vertical"), props.itemLayout === 'vertical'), _defineProperty(_ref2, "".concat(prefixCls.value, "-").concat(sizeCls.value), sizeCls.value), _defineProperty(_ref2, "".concat(prefixCls.value, "-split"), props.split), _defineProperty(_ref2, "".concat(prefixCls.value, "-bordered"), props.bordered), _defineProperty(_ref2, "".concat(prefixCls.value, "-loading"), isLoading.value), _defineProperty(_ref2, "".concat(prefixCls.value, "-grid"), !!props.grid), _defineProperty(_ref2, "".concat(prefixCls.value, "-rtl"), direction.value === 'rtl'), _ref2;
  146. });
  147. var paginationProps = computed(function () {
  148. var pp = _objectSpread(_objectSpread({}, defaultPaginationProps), {}, {
  149. total: props.dataSource.length,
  150. current: paginationCurrent.value,
  151. pageSize: paginationSize.value
  152. }, props.pagination || {});
  153. var largestPage = Math.ceil(pp.total / pp.pageSize);
  154. if (pp.current > largestPage) {
  155. pp.current = largestPage;
  156. }
  157. return pp;
  158. });
  159. var splitDataSource = computed(function () {
  160. var dd = _toConsumableArray(props.dataSource);
  161. if (props.pagination) {
  162. if (props.dataSource.length > (paginationProps.value.current - 1) * paginationProps.value.pageSize) {
  163. dd = _toConsumableArray(props.dataSource).splice((paginationProps.value.current - 1) * paginationProps.value.pageSize, paginationProps.value.pageSize);
  164. }
  165. }
  166. return dd;
  167. });
  168. var screens = useBreakpoint();
  169. var currentBreakpoint = eagerComputed(function () {
  170. for (var i = 0; i < responsiveArray.length; i += 1) {
  171. var breakpoint = responsiveArray[i];
  172. if (screens.value[breakpoint]) {
  173. return breakpoint;
  174. }
  175. }
  176. return undefined;
  177. });
  178. var colStyle = computed(function () {
  179. if (!props.grid) {
  180. return undefined;
  181. }
  182. var columnCount = currentBreakpoint.value && props.grid[currentBreakpoint.value] ? props.grid[currentBreakpoint.value] : props.grid.column;
  183. if (columnCount) {
  184. return {
  185. width: "".concat(100 / columnCount, "%"),
  186. maxWidth: "".concat(100 / columnCount, "%")
  187. };
  188. }
  189. return undefined;
  190. });
  191. var renderInnerItem = function renderInnerItem(item, index) {
  192. var _props$renderItem;
  193. var renderItem = (_props$renderItem = props.renderItem) !== null && _props$renderItem !== void 0 ? _props$renderItem : slots.renderItem;
  194. if (!renderItem) return null;
  195. var key;
  196. var rowKeyType = _typeof(props.rowKey);
  197. if (rowKeyType === 'function') {
  198. key = props.rowKey(item);
  199. } else if (rowKeyType === 'string' || rowKeyType === 'number') {
  200. key = item[props.rowKey];
  201. } else {
  202. key = item.key;
  203. }
  204. if (!key) {
  205. key = "list-item-".concat(index);
  206. }
  207. listItemsKeys[index] = key;
  208. return renderItem({
  209. item: item,
  210. index: index
  211. });
  212. };
  213. return function () {
  214. var _props$loadMore, _slots$loadMore, _props$footer, _slots$footer, _props$header, _slots$header, _slots$default;
  215. var loadMore = (_props$loadMore = props.loadMore) !== null && _props$loadMore !== void 0 ? _props$loadMore : (_slots$loadMore = slots.loadMore) === null || _slots$loadMore === void 0 ? void 0 : _slots$loadMore.call(slots);
  216. var footer = (_props$footer = props.footer) !== null && _props$footer !== void 0 ? _props$footer : (_slots$footer = slots.footer) === null || _slots$footer === void 0 ? void 0 : _slots$footer.call(slots);
  217. var header = (_props$header = props.header) !== null && _props$header !== void 0 ? _props$header : (_slots$header = slots.header) === null || _slots$header === void 0 ? void 0 : _slots$header.call(slots);
  218. var children = flattenChildren((_slots$default = slots.default) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots));
  219. var isSomethingAfterLastItem = !!(loadMore || props.pagination || footer);
  220. var classString = _objectSpread(_objectSpread({}, classObj.value), {}, _defineProperty({}, "".concat(prefixCls.value, "-something-after-last-item"), isSomethingAfterLastItem));
  221. var paginationContent = props.pagination ? _createVNode("div", {
  222. "class": "".concat(prefixCls.value, "-pagination")
  223. }, [_createVNode(Pagination, _objectSpread(_objectSpread({}, paginationProps.value), {}, {
  224. "onChange": onPaginationChange,
  225. "onShowSizeChange": onPaginationShowSizeChange
  226. }), null)]) : null;
  227. var childrenContent = isLoading.value && _createVNode("div", {
  228. "style": {
  229. minHeight: '53px'
  230. }
  231. }, null);
  232. if (splitDataSource.value.length > 0) {
  233. listItemsKeys.length = 0;
  234. var items = splitDataSource.value.map(function (item, index) {
  235. return renderInnerItem(item, index);
  236. });
  237. var childrenList = items.map(function (child, index) {
  238. return _createVNode("div", {
  239. "key": listItemsKeys[index],
  240. "style": colStyle.value
  241. }, [child]);
  242. });
  243. childrenContent = props.grid ? _createVNode(Row, {
  244. "gutter": props.grid.gutter
  245. }, {
  246. default: function _default() {
  247. return [childrenList];
  248. }
  249. }) : _createVNode("ul", {
  250. "class": "".concat(prefixCls.value, "-items")
  251. }, [items]);
  252. } else if (!children.length && !isLoading.value) {
  253. childrenContent = renderEmptyFunc(renderEmpty.value);
  254. }
  255. var paginationPosition = paginationProps.value.position || 'bottom';
  256. return _createVNode("div", {
  257. "class": classString
  258. }, [(paginationPosition === 'top' || paginationPosition === 'both') && paginationContent, header && _createVNode("div", {
  259. "class": "".concat(prefixCls.value, "-header")
  260. }, [header]), _createVNode(Spin, loadingProp.value, {
  261. default: function _default() {
  262. return [childrenContent, children];
  263. }
  264. }), footer && _createVNode("div", {
  265. "class": "".concat(prefixCls.value, "-footer")
  266. }, [footer]), loadMore || (paginationPosition === 'bottom' || paginationPosition === 'both') && paginationContent]);
  267. };
  268. }
  269. });
  270. /* istanbul ignore next */
  271. List.install = function (app) {
  272. app.component(List.name, List);
  273. app.component(List.Item.name, List.Item);
  274. app.component(List.Item.Meta.name, List.Item.Meta);
  275. return app;
  276. };
  277. export { ItemMeta as ListItemMeta, Item as ListItem };
  278. export default List;