index.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.transferProps = 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 _vueTypes = _interopRequireDefault(require("../_util/vue-types"));
  12. var _propsUtil = require("../_util/props-util");
  13. var _classNames2 = _interopRequireDefault(require("../_util/classNames"));
  14. var _list = _interopRequireDefault(require("./list"));
  15. var _operation = _interopRequireDefault(require("./operation"));
  16. var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver"));
  17. var _default3 = _interopRequireDefault(require("../locale-provider/default"));
  18. var _type = require("../_util/type");
  19. var _useConfigInject2 = _interopRequireDefault(require("../_util/hooks/useConfigInject"));
  20. var _FormItemContext = require("../form/FormItemContext");
  21. var transferProps = function transferProps() {
  22. return {
  23. id: String,
  24. prefixCls: String,
  25. dataSource: {
  26. type: Array,
  27. default: []
  28. },
  29. disabled: {
  30. type: Boolean,
  31. default: undefined
  32. },
  33. targetKeys: {
  34. type: Array,
  35. default: undefined
  36. },
  37. selectedKeys: {
  38. type: Array,
  39. default: undefined
  40. },
  41. render: {
  42. type: Function
  43. },
  44. listStyle: {
  45. type: [Function, Object],
  46. default: function _default() {
  47. return {};
  48. }
  49. },
  50. operationStyle: {
  51. type: Object,
  52. default: undefined
  53. },
  54. titles: {
  55. type: Array
  56. },
  57. operations: {
  58. type: Array
  59. },
  60. showSearch: {
  61. type: Boolean,
  62. default: false
  63. },
  64. filterOption: {
  65. type: Function
  66. },
  67. searchPlaceholder: String,
  68. notFoundContent: _vueTypes.default.any,
  69. locale: {
  70. type: Object,
  71. default: function _default() {
  72. return {};
  73. }
  74. },
  75. rowKey: {
  76. type: Function
  77. },
  78. showSelectAll: {
  79. type: Boolean,
  80. default: undefined
  81. },
  82. selectAllLabels: {
  83. type: Array
  84. },
  85. children: {
  86. type: Function
  87. },
  88. oneWay: {
  89. type: Boolean,
  90. default: undefined
  91. },
  92. pagination: {
  93. type: [Object, Boolean],
  94. default: undefined
  95. },
  96. onChange: Function,
  97. onSelectChange: Function,
  98. onSearch: Function,
  99. onScroll: Function,
  100. 'onUpdate:targetKeys': Function,
  101. 'onUpdate:selectedKeys': Function
  102. };
  103. };
  104. exports.transferProps = transferProps;
  105. var Transfer = (0, _vue.defineComponent)({
  106. compatConfig: {
  107. MODE: 3
  108. },
  109. name: 'ATransfer',
  110. inheritAttrs: false,
  111. props: transferProps(),
  112. slots: ['leftTitle', 'rightTitle', 'children', 'render', 'notFoundContent', 'leftSelectAllLabel', 'rightSelectAllLabel', 'footer'],
  113. // emits: ['update:targetKeys', 'update:selectedKeys', 'change', 'search', 'scroll', 'selectChange'],
  114. setup: function setup(props, _ref) {
  115. var emit = _ref.emit,
  116. attrs = _ref.attrs,
  117. slots = _ref.slots,
  118. expose = _ref.expose;
  119. var _useConfigInject = (0, _useConfigInject2.default)('transfer', props),
  120. configProvider = _useConfigInject.configProvider,
  121. prefixCls = _useConfigInject.prefixCls,
  122. direction = _useConfigInject.direction;
  123. var sourceSelectedKeys = (0, _vue.ref)([]);
  124. var targetSelectedKeys = (0, _vue.ref)([]);
  125. var formItemContext = (0, _FormItemContext.useInjectFormItemContext)();
  126. (0, _vue.watch)(function () {
  127. return props.selectedKeys;
  128. }, function () {
  129. var _props$selectedKeys, _props$selectedKeys2;
  130. sourceSelectedKeys.value = ((_props$selectedKeys = props.selectedKeys) === null || _props$selectedKeys === void 0 ? void 0 : _props$selectedKeys.filter(function (key) {
  131. return props.targetKeys.indexOf(key) === -1;
  132. })) || [];
  133. targetSelectedKeys.value = ((_props$selectedKeys2 = props.selectedKeys) === null || _props$selectedKeys2 === void 0 ? void 0 : _props$selectedKeys2.filter(function (key) {
  134. return props.targetKeys.indexOf(key) > -1;
  135. })) || [];
  136. }, {
  137. immediate: true
  138. });
  139. var getLocale = function getLocale(transferLocale, renderEmpty) {
  140. // Keep old locale props still working.
  141. var oldLocale = {
  142. notFoundContent: renderEmpty('Transfer')
  143. };
  144. var notFoundContent = (0, _propsUtil.getPropsSlot)(slots, props, 'notFoundContent');
  145. if (notFoundContent) {
  146. oldLocale.notFoundContent = notFoundContent;
  147. }
  148. if (props.searchPlaceholder !== undefined) {
  149. oldLocale.searchPlaceholder = props.searchPlaceholder;
  150. }
  151. return (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, transferLocale), oldLocale), props.locale);
  152. };
  153. var moveTo = function moveTo(direction) {
  154. var _props$targetKeys = props.targetKeys,
  155. targetKeys = _props$targetKeys === void 0 ? [] : _props$targetKeys,
  156. _props$dataSource = props.dataSource,
  157. dataSource = _props$dataSource === void 0 ? [] : _props$dataSource;
  158. var moveKeys = direction === 'right' ? sourceSelectedKeys.value : targetSelectedKeys.value;
  159. // filter the disabled options
  160. var newMoveKeys = moveKeys.filter(function (key) {
  161. return !dataSource.some(function (data) {
  162. return !!(key === data.key && data.disabled);
  163. });
  164. });
  165. // move items to target box
  166. var newTargetKeys = direction === 'right' ? newMoveKeys.concat(targetKeys) : targetKeys.filter(function (targetKey) {
  167. return newMoveKeys.indexOf(targetKey) === -1;
  168. });
  169. // empty checked keys
  170. var oppositeDirection = direction === 'right' ? 'left' : 'right';
  171. direction === 'right' ? sourceSelectedKeys.value = [] : targetSelectedKeys.value = [];
  172. emit('update:targetKeys', newTargetKeys);
  173. handleSelectChange(oppositeDirection, []);
  174. emit('change', newTargetKeys, direction, newMoveKeys);
  175. formItemContext.onFieldChange();
  176. };
  177. var moveToLeft = function moveToLeft() {
  178. moveTo('left');
  179. };
  180. var moveToRight = function moveToRight() {
  181. moveTo('right');
  182. };
  183. var onItemSelectAll = function onItemSelectAll(direction, selectedKeys) {
  184. handleSelectChange(direction, selectedKeys);
  185. };
  186. var onLeftItemSelectAll = function onLeftItemSelectAll(selectedKeys) {
  187. return onItemSelectAll('left', selectedKeys);
  188. };
  189. var onRightItemSelectAll = function onRightItemSelectAll(selectedKeys) {
  190. return onItemSelectAll('right', selectedKeys);
  191. };
  192. var handleSelectChange = function handleSelectChange(direction, holder) {
  193. if (direction === 'left') {
  194. if (!props.selectedKeys) {
  195. sourceSelectedKeys.value = holder;
  196. }
  197. emit('update:selectedKeys', [].concat((0, _toConsumableArray2.default)(holder), (0, _toConsumableArray2.default)(targetSelectedKeys.value)));
  198. emit('selectChange', holder, (0, _vue.toRaw)(targetSelectedKeys.value));
  199. } else {
  200. if (!props.selectedKeys) {
  201. targetSelectedKeys.value = holder;
  202. }
  203. emit('update:selectedKeys', [].concat((0, _toConsumableArray2.default)(holder), (0, _toConsumableArray2.default)(sourceSelectedKeys.value)));
  204. emit('selectChange', (0, _vue.toRaw)(sourceSelectedKeys.value), holder);
  205. }
  206. };
  207. var handleFilter = function handleFilter(direction, e) {
  208. var value = e.target.value;
  209. emit('search', direction, value);
  210. };
  211. var handleLeftFilter = function handleLeftFilter(e) {
  212. handleFilter('left', e);
  213. };
  214. var handleRightFilter = function handleRightFilter(e) {
  215. handleFilter('right', e);
  216. };
  217. var handleClear = function handleClear(direction) {
  218. emit('search', direction, '');
  219. };
  220. var handleLeftClear = function handleLeftClear() {
  221. handleClear('left');
  222. };
  223. var handleRightClear = function handleRightClear() {
  224. handleClear('right');
  225. };
  226. var onItemSelect = function onItemSelect(direction, selectedKey, checked) {
  227. var holder = direction === 'left' ? (0, _toConsumableArray2.default)(sourceSelectedKeys.value) : (0, _toConsumableArray2.default)(targetSelectedKeys.value);
  228. var index = holder.indexOf(selectedKey);
  229. if (index > -1) {
  230. holder.splice(index, 1);
  231. }
  232. if (checked) {
  233. holder.push(selectedKey);
  234. }
  235. handleSelectChange(direction, holder);
  236. };
  237. var onLeftItemSelect = function onLeftItemSelect(selectedKey, checked) {
  238. return onItemSelect('left', selectedKey, checked);
  239. };
  240. var onRightItemSelect = function onRightItemSelect(selectedKey, checked) {
  241. return onItemSelect('right', selectedKey, checked);
  242. };
  243. var onRightItemRemove = function onRightItemRemove(targetedKeys) {
  244. var _props$targetKeys2 = props.targetKeys,
  245. targetKeys = _props$targetKeys2 === void 0 ? [] : _props$targetKeys2;
  246. var newTargetKeys = targetKeys.filter(function (key) {
  247. return !targetedKeys.includes(key);
  248. });
  249. emit('update:targetKeys', newTargetKeys);
  250. emit('change', newTargetKeys, 'left', (0, _toConsumableArray2.default)(targetedKeys));
  251. };
  252. var handleScroll = function handleScroll(direction, e) {
  253. emit('scroll', direction, e);
  254. };
  255. var handleLeftScroll = function handleLeftScroll(e) {
  256. handleScroll('left', e);
  257. };
  258. var handleRightScroll = function handleRightScroll(e) {
  259. handleScroll('right', e);
  260. };
  261. var handleListStyle = function handleListStyle(listStyle, direction) {
  262. if (typeof listStyle === 'function') {
  263. return listStyle({
  264. direction: direction
  265. });
  266. }
  267. return listStyle;
  268. };
  269. var leftDataSource = (0, _vue.ref)([]);
  270. var rightDataSource = (0, _vue.ref)([]);
  271. (0, _vue.watchEffect)(function () {
  272. var dataSource = props.dataSource,
  273. rowKey = props.rowKey,
  274. _props$targetKeys3 = props.targetKeys,
  275. targetKeys = _props$targetKeys3 === void 0 ? [] : _props$targetKeys3;
  276. var ld = [];
  277. var rd = new Array(targetKeys.length);
  278. dataSource.forEach(function (record) {
  279. if (rowKey) {
  280. record.key = rowKey(record);
  281. }
  282. // rightDataSource should be ordered by targetKeys
  283. // leftDataSource should be ordered by dataSource
  284. var indexOfKey = targetKeys.indexOf(record.key);
  285. if (indexOfKey !== -1) {
  286. rd[indexOfKey] = record;
  287. } else {
  288. ld.push(record);
  289. }
  290. });
  291. leftDataSource.value = ld;
  292. rightDataSource.value = rd;
  293. });
  294. expose({
  295. handleSelectChange: handleSelectChange
  296. });
  297. var renderTransfer = function renderTransfer(transferLocale) {
  298. var _classNames, _ref2, _ref3, _slots$leftTitle, _ref4, _ref5, _slots$rightTitle;
  299. var disabled = props.disabled,
  300. _props$operations = props.operations,
  301. operations = _props$operations === void 0 ? [] : _props$operations,
  302. showSearch = props.showSearch,
  303. listStyle = props.listStyle,
  304. operationStyle = props.operationStyle,
  305. filterOption = props.filterOption,
  306. showSelectAll = props.showSelectAll,
  307. _props$selectAllLabel = props.selectAllLabels,
  308. selectAllLabels = _props$selectAllLabel === void 0 ? [] : _props$selectAllLabel,
  309. oneWay = props.oneWay,
  310. pagination = props.pagination,
  311. _props$id = props.id,
  312. id = _props$id === void 0 ? formItemContext.id.value : _props$id;
  313. var className = attrs.class,
  314. style = attrs.style;
  315. var children = slots.children;
  316. var mergedPagination = !children && pagination;
  317. var renderEmpty = configProvider.renderEmpty;
  318. var locale = getLocale(transferLocale, renderEmpty);
  319. var footer = slots.footer;
  320. var renderItem = props.render || slots.render;
  321. var leftActive = targetSelectedKeys.value.length > 0;
  322. var rightActive = sourceSelectedKeys.value.length > 0;
  323. var cls = (0, _classNames2.default)(prefixCls.value, className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls.value, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls.value, "-customize-list"), !!children), _classNames));
  324. var titles = props.titles;
  325. var leftTitle = (_ref2 = (_ref3 = titles && titles[0]) !== null && _ref3 !== void 0 ? _ref3 : (_slots$leftTitle = slots.leftTitle) === null || _slots$leftTitle === void 0 ? void 0 : _slots$leftTitle.call(slots)) !== null && _ref2 !== void 0 ? _ref2 : (locale.titles || ['', ''])[0];
  326. var rightTitle = (_ref4 = (_ref5 = titles && titles[1]) !== null && _ref5 !== void 0 ? _ref5 : (_slots$rightTitle = slots.rightTitle) === null || _slots$rightTitle === void 0 ? void 0 : _slots$rightTitle.call(slots)) !== null && _ref4 !== void 0 ? _ref4 : (locale.titles || ['', ''])[1];
  327. return (0, _vue.createVNode)("div", {
  328. "class": cls,
  329. "style": style,
  330. "id": id
  331. }, [(0, _vue.createVNode)(_list.default, (0, _objectSpread2.default)({
  332. "key": "leftList",
  333. "prefixCls": "".concat(prefixCls.value, "-list"),
  334. "dataSource": leftDataSource.value,
  335. "filterOption": filterOption,
  336. "style": handleListStyle(listStyle, 'left'),
  337. "checkedKeys": sourceSelectedKeys.value,
  338. "handleFilter": handleLeftFilter,
  339. "handleClear": handleLeftClear,
  340. "onItemSelect": onLeftItemSelect,
  341. "onItemSelectAll": onLeftItemSelectAll,
  342. "renderItem": renderItem,
  343. "showSearch": showSearch,
  344. "renderList": children,
  345. "onScroll": handleLeftScroll,
  346. "disabled": disabled,
  347. "direction": direction.value === 'rtl' ? 'right' : 'left',
  348. "showSelectAll": showSelectAll,
  349. "selectAllLabel": selectAllLabels[0] || slots.leftSelectAllLabel,
  350. "pagination": mergedPagination
  351. }, locale), {
  352. titleText: function titleText() {
  353. return leftTitle;
  354. },
  355. footer: footer
  356. }), (0, _vue.createVNode)(_operation.default, {
  357. "key": "operation",
  358. "class": "".concat(prefixCls.value, "-operation"),
  359. "rightActive": rightActive,
  360. "rightArrowText": operations[0],
  361. "moveToRight": moveToRight,
  362. "leftActive": leftActive,
  363. "leftArrowText": operations[1],
  364. "moveToLeft": moveToLeft,
  365. "style": operationStyle,
  366. "disabled": disabled,
  367. "direction": direction.value,
  368. "oneWay": oneWay
  369. }, null), (0, _vue.createVNode)(_list.default, (0, _objectSpread2.default)({
  370. "key": "rightList",
  371. "prefixCls": "".concat(prefixCls.value, "-list"),
  372. "dataSource": rightDataSource.value,
  373. "filterOption": filterOption,
  374. "style": handleListStyle(listStyle, 'right'),
  375. "checkedKeys": targetSelectedKeys.value,
  376. "handleFilter": handleRightFilter,
  377. "handleClear": handleRightClear,
  378. "onItemSelect": onRightItemSelect,
  379. "onItemSelectAll": onRightItemSelectAll,
  380. "onItemRemove": onRightItemRemove,
  381. "renderItem": renderItem,
  382. "showSearch": showSearch,
  383. "renderList": children,
  384. "onScroll": handleRightScroll,
  385. "disabled": disabled,
  386. "direction": direction.value === 'rtl' ? 'left' : 'right',
  387. "showSelectAll": showSelectAll,
  388. "selectAllLabel": selectAllLabels[1] || slots.rightSelectAllLabel,
  389. "showRemove": oneWay,
  390. "pagination": mergedPagination
  391. }, locale), {
  392. titleText: function titleText() {
  393. return rightTitle;
  394. },
  395. footer: footer
  396. })]);
  397. };
  398. return function () {
  399. return (0, _vue.createVNode)(_LocaleReceiver.default, {
  400. "componentName": "Transfer",
  401. "defaultLocale": _default3.default.Transfer,
  402. "children": renderTransfer
  403. }, null);
  404. };
  405. }
  406. });
  407. var _default2 = (0, _type.withInstall)(Transfer);
  408. exports.default = _default2;