list.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.transferListProps = exports.default = void 0;
  7. var _vue = require("vue");
  8. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  9. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  10. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  11. var _classNames2 = _interopRequireDefault(require("../_util/classNames"));
  12. var _vueTypes = _interopRequireDefault(require("../_util/vue-types"));
  13. var _propsUtil = require("../_util/props-util");
  14. var _DownOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/DownOutlined"));
  15. var _checkbox = _interopRequireDefault(require("../checkbox"));
  16. var _menu = _interopRequireDefault(require("../menu"));
  17. var _dropdown = _interopRequireDefault(require("../dropdown"));
  18. var _search = _interopRequireDefault(require("./search"));
  19. var _ListBody = _interopRequireDefault(require("./ListBody"));
  20. var defaultRender = function defaultRender() {
  21. return null;
  22. };
  23. function isRenderResultPlainObject(result) {
  24. return result && !(0, _propsUtil.isValidElement)(result) && Object.prototype.toString.call(result) === '[object Object]';
  25. }
  26. function getEnabledItemKeys(items) {
  27. return items.filter(function (data) {
  28. return !data.disabled;
  29. }).map(function (data) {
  30. return data.key;
  31. });
  32. }
  33. var transferListProps = {
  34. prefixCls: String,
  35. dataSource: {
  36. type: Array,
  37. default: []
  38. },
  39. filter: String,
  40. filterOption: Function,
  41. checkedKeys: _vueTypes.default.arrayOf(_vueTypes.default.string),
  42. handleFilter: Function,
  43. handleClear: Function,
  44. renderItem: Function,
  45. showSearch: {
  46. type: Boolean,
  47. default: false
  48. },
  49. searchPlaceholder: String,
  50. notFoundContent: _vueTypes.default.any,
  51. itemUnit: String,
  52. itemsUnit: String,
  53. renderList: _vueTypes.default.any,
  54. disabled: {
  55. type: Boolean,
  56. default: undefined
  57. },
  58. direction: String,
  59. showSelectAll: {
  60. type: Boolean,
  61. default: undefined
  62. },
  63. remove: String,
  64. selectAll: String,
  65. selectCurrent: String,
  66. selectInvert: String,
  67. removeAll: String,
  68. removeCurrent: String,
  69. selectAllLabel: _vueTypes.default.any,
  70. showRemove: {
  71. type: Boolean,
  72. default: undefined
  73. },
  74. pagination: _vueTypes.default.any,
  75. onItemSelect: Function,
  76. onItemSelectAll: Function,
  77. onItemRemove: Function,
  78. onScroll: Function
  79. };
  80. exports.transferListProps = transferListProps;
  81. var _default2 = (0, _vue.defineComponent)({
  82. compatConfig: {
  83. MODE: 3
  84. },
  85. name: 'TransferList',
  86. inheritAttrs: false,
  87. props: transferListProps,
  88. // emits: ['scroll', 'itemSelectAll', 'itemRemove', 'itemSelect'],
  89. slots: ['footer', 'titleText'],
  90. setup: function setup(props, _ref) {
  91. var attrs = _ref.attrs,
  92. slots = _ref.slots;
  93. var filterValue = (0, _vue.ref)('');
  94. var transferNode = (0, _vue.ref)();
  95. var defaultListBodyRef = (0, _vue.ref)();
  96. var renderListBody = function renderListBody(renderList, props) {
  97. var bodyContent = renderList ? renderList(props) : null;
  98. var customize = !!bodyContent && (0, _propsUtil.filterEmpty)(bodyContent).length > 0;
  99. if (!customize) {
  100. bodyContent = (0, _vue.createVNode)(_ListBody.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
  101. "ref": defaultListBodyRef
  102. }), null);
  103. }
  104. return {
  105. customize: customize,
  106. bodyContent: bodyContent
  107. };
  108. };
  109. var renderItemHtml = function renderItemHtml(item) {
  110. var _props$renderItem = props.renderItem,
  111. renderItem = _props$renderItem === void 0 ? defaultRender : _props$renderItem;
  112. var renderResult = renderItem(item);
  113. var isRenderResultPlain = isRenderResultPlainObject(renderResult);
  114. return {
  115. renderedText: isRenderResultPlain ? renderResult.value : renderResult,
  116. renderedEl: isRenderResultPlain ? renderResult.label : renderResult,
  117. item: item
  118. };
  119. };
  120. var filteredItems = (0, _vue.ref)([]);
  121. var filteredRenderItems = (0, _vue.ref)([]);
  122. (0, _vue.watchEffect)(function () {
  123. var fItems = [];
  124. var fRenderItems = [];
  125. props.dataSource.forEach(function (item) {
  126. var renderedItem = renderItemHtml(item);
  127. var renderedText = renderedItem.renderedText;
  128. // Filter skip
  129. if (filterValue.value && filterValue.value.trim() && !matchFilter(renderedText, item)) {
  130. return null;
  131. }
  132. fItems.push(item);
  133. fRenderItems.push(renderedItem);
  134. });
  135. filteredItems.value = fItems;
  136. filteredRenderItems.value = fRenderItems;
  137. });
  138. var checkStatus = (0, _vue.computed)(function () {
  139. var checkedKeys = props.checkedKeys;
  140. if (checkedKeys.length === 0) {
  141. return 'none';
  142. }
  143. if (filteredItems.value.every(function (item) {
  144. return checkedKeys.indexOf(item.key) >= 0 || !!item.disabled;
  145. })) {
  146. return 'all';
  147. }
  148. return 'part';
  149. });
  150. var enabledItemKeys = (0, _vue.computed)(function () {
  151. return getEnabledItemKeys(filteredItems.value);
  152. });
  153. var getNewSelectKeys = function getNewSelectKeys(keys, unCheckedKeys) {
  154. return Array.from(new Set([].concat((0, _toConsumableArray2.default)(keys), (0, _toConsumableArray2.default)(props.checkedKeys)))).filter(function (key) {
  155. return unCheckedKeys.indexOf(key) === -1;
  156. });
  157. };
  158. var getCheckBox = function getCheckBox(_ref2) {
  159. var disabled = _ref2.disabled,
  160. prefixCls = _ref2.prefixCls;
  161. var checkedAll = checkStatus.value === 'all';
  162. var checkAllCheckbox = (0, _vue.createVNode)(_checkbox.default, {
  163. "disabled": disabled,
  164. "checked": checkedAll,
  165. "indeterminate": checkStatus.value === 'part',
  166. "class": "".concat(prefixCls, "-checkbox"),
  167. "onChange": function onChange() {
  168. // Only select enabled items
  169. var keys = enabledItemKeys.value;
  170. props.onItemSelectAll(getNewSelectKeys(!checkedAll ? keys : [], checkedAll ? props.checkedKeys : []));
  171. }
  172. }, null);
  173. return checkAllCheckbox;
  174. };
  175. var handleFilter = function handleFilter(e) {
  176. var _props$handleFilter;
  177. var filter = e.target.value;
  178. filterValue.value = filter;
  179. (_props$handleFilter = props.handleFilter) === null || _props$handleFilter === void 0 ? void 0 : _props$handleFilter.call(props, e);
  180. };
  181. var handleClear = function handleClear(e) {
  182. var _props$handleClear;
  183. filterValue.value = '';
  184. (_props$handleClear = props.handleClear) === null || _props$handleClear === void 0 ? void 0 : _props$handleClear.call(props, e);
  185. };
  186. var matchFilter = function matchFilter(text, item) {
  187. var filterOption = props.filterOption;
  188. if (filterOption) {
  189. return filterOption(filterValue.value, item);
  190. }
  191. return text.indexOf(filterValue.value) >= 0;
  192. };
  193. var getSelectAllLabel = function getSelectAllLabel(selectedCount, totalCount) {
  194. var itemsUnit = props.itemsUnit,
  195. itemUnit = props.itemUnit,
  196. selectAllLabel = props.selectAllLabel;
  197. if (selectAllLabel) {
  198. return typeof selectAllLabel === 'function' ? selectAllLabel({
  199. selectedCount: selectedCount,
  200. totalCount: totalCount
  201. }) : selectAllLabel;
  202. }
  203. var unit = totalCount > 1 ? itemsUnit : itemUnit;
  204. return (0, _vue.createVNode)(_vue.Fragment, null, [(selectedCount > 0 ? "".concat(selectedCount, "/") : '') + totalCount, (0, _vue.createTextVNode)(" "), unit]);
  205. };
  206. var getListBody = function getListBody(prefixCls, searchPlaceholder, checkedKeys, renderList, showSearch, disabled) {
  207. var search = showSearch ? (0, _vue.createVNode)("div", {
  208. "class": "".concat(prefixCls, "-body-search-wrapper")
  209. }, [(0, _vue.createVNode)(_search.default, {
  210. "prefixCls": "".concat(prefixCls, "-search"),
  211. "onChange": handleFilter,
  212. "handleClear": handleClear,
  213. "placeholder": searchPlaceholder,
  214. "value": filterValue.value,
  215. "disabled": disabled
  216. }, null)]) : null;
  217. var bodyNode;
  218. var _splitAttrs = (0, _propsUtil.splitAttrs)(attrs),
  219. onEvents = _splitAttrs.onEvents;
  220. var _renderListBody = renderListBody(renderList, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
  221. filteredItems: filteredItems.value,
  222. filteredRenderItems: filteredRenderItems.value,
  223. selectedKeys: checkedKeys
  224. }, onEvents)),
  225. bodyContent = _renderListBody.bodyContent,
  226. customize = _renderListBody.customize;
  227. // We should wrap customize list body in a classNamed div to use flex layout.
  228. if (customize) {
  229. bodyNode = (0, _vue.createVNode)("div", {
  230. "class": "".concat(prefixCls, "-body-customize-wrapper")
  231. }, [bodyContent]);
  232. } else {
  233. bodyNode = filteredItems.value.length ? bodyContent : (0, _vue.createVNode)("div", {
  234. "class": "".concat(prefixCls, "-body-not-found")
  235. }, [props.notFoundContent]);
  236. }
  237. return (0, _vue.createVNode)("div", {
  238. "class": showSearch ? "".concat(prefixCls, "-body ").concat(prefixCls, "-body-with-search") : "".concat(prefixCls, "-body"),
  239. "ref": transferNode
  240. }, [search, bodyNode]);
  241. };
  242. return function () {
  243. var _slots$footer, _classNames, _slots$titleText;
  244. var prefixCls = props.prefixCls,
  245. checkedKeys = props.checkedKeys,
  246. disabled = props.disabled,
  247. showSearch = props.showSearch,
  248. searchPlaceholder = props.searchPlaceholder,
  249. selectAll = props.selectAll,
  250. selectCurrent = props.selectCurrent,
  251. selectInvert = props.selectInvert,
  252. removeAll = props.removeAll,
  253. removeCurrent = props.removeCurrent,
  254. renderList = props.renderList,
  255. onItemSelectAll = props.onItemSelectAll,
  256. onItemRemove = props.onItemRemove,
  257. _props$showSelectAll = props.showSelectAll,
  258. showSelectAll = _props$showSelectAll === void 0 ? true : _props$showSelectAll,
  259. showRemove = props.showRemove,
  260. pagination = props.pagination;
  261. // Custom Layout
  262. var footerDom = (_slots$footer = slots.footer) === null || _slots$footer === void 0 ? void 0 : _slots$footer.call(slots, (0, _objectSpread2.default)({}, props));
  263. var listCls = (0, _classNames2.default)(prefixCls, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-with-pagination"), !!pagination), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-with-footer"), !!footerDom), _classNames));
  264. // ================================= List Body =================================
  265. var listBody = getListBody(prefixCls, searchPlaceholder, checkedKeys, renderList, showSearch, disabled);
  266. var listFooter = footerDom ? (0, _vue.createVNode)("div", {
  267. "class": "".concat(prefixCls, "-footer")
  268. }, [footerDom]) : null;
  269. var checkAllCheckbox = !showRemove && !pagination && getCheckBox({
  270. disabled: disabled,
  271. prefixCls: prefixCls
  272. });
  273. var menu = null;
  274. if (showRemove) {
  275. menu = (0, _vue.createVNode)(_menu.default, null, {
  276. default: function _default() {
  277. return [pagination && (0, _vue.createVNode)(_menu.default.Item, {
  278. "key": "removeCurrent",
  279. "onClick": function onClick() {
  280. var pageKeys = getEnabledItemKeys((defaultListBodyRef.value.items || []).map(function (entity) {
  281. return entity.item;
  282. }));
  283. onItemRemove === null || onItemRemove === void 0 ? void 0 : onItemRemove(pageKeys);
  284. }
  285. }, {
  286. default: function _default() {
  287. return [removeCurrent];
  288. }
  289. }), (0, _vue.createVNode)(_menu.default.Item, {
  290. "key": "removeAll",
  291. "onClick": function onClick() {
  292. onItemRemove === null || onItemRemove === void 0 ? void 0 : onItemRemove(enabledItemKeys.value);
  293. }
  294. }, {
  295. default: function _default() {
  296. return [removeAll];
  297. }
  298. })];
  299. }
  300. });
  301. } else {
  302. menu = (0, _vue.createVNode)(_menu.default, null, {
  303. default: function _default() {
  304. return [(0, _vue.createVNode)(_menu.default.Item, {
  305. "key": "selectAll",
  306. "onClick": function onClick() {
  307. var keys = enabledItemKeys.value;
  308. onItemSelectAll(getNewSelectKeys(keys, []));
  309. }
  310. }, {
  311. default: function _default() {
  312. return [selectAll];
  313. }
  314. }), pagination && (0, _vue.createVNode)(_menu.default.Item, {
  315. "onClick": function onClick() {
  316. var pageKeys = getEnabledItemKeys((defaultListBodyRef.value.items || []).map(function (entity) {
  317. return entity.item;
  318. }));
  319. onItemSelectAll(getNewSelectKeys(pageKeys, []));
  320. }
  321. }, {
  322. default: function _default() {
  323. return [selectCurrent];
  324. }
  325. }), (0, _vue.createVNode)(_menu.default.Item, {
  326. "key": "selectInvert",
  327. "onClick": function onClick() {
  328. var availableKeys;
  329. if (pagination) {
  330. availableKeys = getEnabledItemKeys((defaultListBodyRef.value.items || []).map(function (entity) {
  331. return entity.item;
  332. }));
  333. } else {
  334. availableKeys = enabledItemKeys.value;
  335. }
  336. var checkedKeySet = new Set(checkedKeys);
  337. var newCheckedKeys = [];
  338. var newUnCheckedKeys = [];
  339. availableKeys.forEach(function (key) {
  340. if (checkedKeySet.has(key)) {
  341. newUnCheckedKeys.push(key);
  342. } else {
  343. newCheckedKeys.push(key);
  344. }
  345. });
  346. onItemSelectAll(getNewSelectKeys(newCheckedKeys, newUnCheckedKeys));
  347. }
  348. }, {
  349. default: function _default() {
  350. return [selectInvert];
  351. }
  352. })];
  353. }
  354. });
  355. }
  356. var dropdown = (0, _vue.createVNode)(_dropdown.default, {
  357. "class": "".concat(prefixCls, "-header-dropdown"),
  358. "overlay": menu,
  359. "disabled": disabled
  360. }, {
  361. default: function _default() {
  362. return [(0, _vue.createVNode)(_DownOutlined.default, null, null)];
  363. }
  364. });
  365. return (0, _vue.createVNode)("div", {
  366. "class": listCls,
  367. "style": attrs.style
  368. }, [(0, _vue.createVNode)("div", {
  369. "class": "".concat(prefixCls, "-header")
  370. }, [showSelectAll ? (0, _vue.createVNode)(_vue.Fragment, null, [checkAllCheckbox, dropdown]) : null, (0, _vue.createVNode)("span", {
  371. "class": "".concat(prefixCls, "-header-selected")
  372. }, [(0, _vue.createVNode)("span", null, [getSelectAllLabel(checkedKeys.length, filteredItems.value.length)]), (0, _vue.createVNode)("span", {
  373. "class": "".concat(prefixCls, "-header-title")
  374. }, [(_slots$titleText = slots.titleText) === null || _slots$titleText === void 0 ? void 0 : _slots$titleText.call(slots)])])]), listBody, listFooter]);
  375. };
  376. }
  377. });
  378. exports.default = _default2;