useSelection.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.SELECTION_NONE = exports.SELECTION_INVERT = exports.SELECTION_COLUMN = exports.SELECTION_ALL = void 0;
  7. exports.default = useSelection;
  8. var _vue = require("vue");
  9. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  10. var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
  11. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  12. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  13. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  14. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  15. var _DownOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/DownOutlined"));
  16. var _vcTable = require("../../vc-table");
  17. var _util = require("../../vc-tree/util");
  18. var _conductUtil = require("../../vc-tree/utils/conductUtil");
  19. var _treeUtil = require("../../vc-tree/utils/treeUtil");
  20. var _devWarning = _interopRequireDefault(require("../../vc-util/devWarning"));
  21. var _useMergedState3 = _interopRequireDefault(require("../../_util/hooks/useMergedState"));
  22. var _useState3 = _interopRequireDefault(require("../../_util/hooks/useState"));
  23. var _checkbox = _interopRequireDefault(require("../../checkbox"));
  24. var _dropdown = _interopRequireDefault(require("../../dropdown"));
  25. var _menu = _interopRequireDefault(require("../../menu"));
  26. var _radio = _interopRequireDefault(require("../../radio"));
  27. var _useMaxLevel2 = _interopRequireDefault(require("../../vc-tree/useMaxLevel"));
  28. // TODO: warning if use ajax!!!
  29. var SELECTION_COLUMN = {};
  30. exports.SELECTION_COLUMN = SELECTION_COLUMN;
  31. var SELECTION_ALL = 'SELECT_ALL';
  32. exports.SELECTION_ALL = SELECTION_ALL;
  33. var SELECTION_INVERT = 'SELECT_INVERT';
  34. exports.SELECTION_INVERT = SELECTION_INVERT;
  35. var SELECTION_NONE = 'SELECT_NONE';
  36. exports.SELECTION_NONE = SELECTION_NONE;
  37. var EMPTY_LIST = [];
  38. function flattenData(data, childrenColumnName) {
  39. var list = [];
  40. (data || []).forEach(function (record) {
  41. list.push(record);
  42. if (record && (0, _typeof2.default)(record) === 'object' && childrenColumnName in record) {
  43. list = [].concat((0, _toConsumableArray2.default)(list), (0, _toConsumableArray2.default)(flattenData(record[childrenColumnName], childrenColumnName)));
  44. }
  45. });
  46. return list;
  47. }
  48. function useSelection(rowSelectionRef, configRef) {
  49. var mergedRowSelection = (0, _vue.computed)(function () {
  50. var temp = rowSelectionRef.value || {};
  51. var _temp$checkStrictly = temp.checkStrictly,
  52. checkStrictly = _temp$checkStrictly === void 0 ? true : _temp$checkStrictly;
  53. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, temp), {}, {
  54. checkStrictly: checkStrictly
  55. });
  56. });
  57. // ========================= Keys =========================
  58. var _useMergedState = (0, _useMergedState3.default)(mergedRowSelection.value.selectedRowKeys || mergedRowSelection.value.defaultSelectedRowKeys || EMPTY_LIST, {
  59. value: (0, _vue.computed)(function () {
  60. return mergedRowSelection.value.selectedRowKeys;
  61. })
  62. }),
  63. _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
  64. mergedSelectedKeys = _useMergedState2[0],
  65. setMergedSelectedKeys = _useMergedState2[1];
  66. // ======================== Caches ========================
  67. var preserveRecordsRef = (0, _vue.shallowRef)(new Map());
  68. var updatePreserveRecordsCache = function updatePreserveRecordsCache(keys) {
  69. if (mergedRowSelection.value.preserveSelectedRowKeys) {
  70. var newCache = new Map();
  71. // Keep key if mark as preserveSelectedRowKeys
  72. keys.forEach(function (key) {
  73. var record = configRef.getRecordByKey(key);
  74. if (!record && preserveRecordsRef.value.has(key)) {
  75. record = preserveRecordsRef.value.get(key);
  76. }
  77. newCache.set(key, record);
  78. });
  79. // Refresh to new cache
  80. preserveRecordsRef.value = newCache;
  81. }
  82. };
  83. (0, _vue.watchEffect)(function () {
  84. updatePreserveRecordsCache(mergedSelectedKeys.value);
  85. });
  86. var keyEntities = (0, _vue.computed)(function () {
  87. return mergedRowSelection.value.checkStrictly ? null : (0, _treeUtil.convertDataToEntities)(configRef.data.value, {
  88. externalGetKey: configRef.getRowKey.value,
  89. childrenPropName: configRef.childrenColumnName.value
  90. }).keyEntities;
  91. });
  92. // Get flatten data
  93. var flattedData = (0, _vue.computed)(function () {
  94. return flattenData(configRef.pageData.value, configRef.childrenColumnName.value);
  95. });
  96. // Get all checkbox props
  97. var checkboxPropsMap = (0, _vue.computed)(function () {
  98. var map = new Map();
  99. var getRowKey = configRef.getRowKey.value;
  100. var getCheckboxProps = mergedRowSelection.value.getCheckboxProps;
  101. flattedData.value.forEach(function (record, index) {
  102. var key = getRowKey(record, index);
  103. var checkboxProps = (getCheckboxProps ? getCheckboxProps(record) : null) || {};
  104. map.set(key, checkboxProps);
  105. if (process.env.NODE_ENV !== 'production' && ('checked' in checkboxProps || 'defaultChecked' in checkboxProps)) {
  106. (0, _devWarning.default)(false, 'Table', 'Do not set `checked` or `defaultChecked` in `getCheckboxProps`. Please use `selectedRowKeys` instead.');
  107. }
  108. });
  109. return map;
  110. });
  111. var _useMaxLevel = (0, _useMaxLevel2.default)(keyEntities),
  112. maxLevel = _useMaxLevel.maxLevel,
  113. levelEntities = _useMaxLevel.levelEntities;
  114. var isCheckboxDisabled = function isCheckboxDisabled(r) {
  115. var _checkboxPropsMap$val;
  116. return !!((_checkboxPropsMap$val = checkboxPropsMap.value.get(configRef.getRowKey.value(r))) !== null && _checkboxPropsMap$val !== void 0 && _checkboxPropsMap$val.disabled);
  117. };
  118. var selectKeysState = (0, _vue.computed)(function () {
  119. if (mergedRowSelection.value.checkStrictly) {
  120. return [mergedSelectedKeys.value || [], []];
  121. }
  122. var _conductCheck = (0, _conductUtil.conductCheck)(mergedSelectedKeys.value, true, keyEntities.value, maxLevel.value, levelEntities.value, isCheckboxDisabled),
  123. checkedKeys = _conductCheck.checkedKeys,
  124. halfCheckedKeys = _conductCheck.halfCheckedKeys;
  125. return [checkedKeys || [], halfCheckedKeys];
  126. });
  127. var derivedSelectedKeys = (0, _vue.computed)(function () {
  128. return selectKeysState.value[0];
  129. });
  130. var derivedHalfSelectedKeys = (0, _vue.computed)(function () {
  131. return selectKeysState.value[1];
  132. });
  133. var derivedSelectedKeySet = (0, _vue.computed)(function () {
  134. var keys = mergedRowSelection.value.type === 'radio' ? derivedSelectedKeys.value.slice(0, 1) : derivedSelectedKeys.value;
  135. return new Set(keys);
  136. });
  137. var derivedHalfSelectedKeySet = (0, _vue.computed)(function () {
  138. return mergedRowSelection.value.type === 'radio' ? new Set() : new Set(derivedHalfSelectedKeys.value);
  139. });
  140. // Save last selected key to enable range selection
  141. var _useState = (0, _useState3.default)(null),
  142. _useState2 = (0, _slicedToArray2.default)(_useState, 2),
  143. lastSelectedKey = _useState2[0],
  144. setLastSelectedKey = _useState2[1];
  145. // // Reset if rowSelection reset
  146. // we use computed to reset, donot need setMergedSelectedKeys again like react
  147. // https://github.com/vueComponent/ant-design-vue/issues/4885
  148. // watchEffect(() => {
  149. // if (!rowSelectionRef.value) {
  150. // setMergedSelectedKeys([]);
  151. // }
  152. // });
  153. var setSelectedKeys = function setSelectedKeys(keys) {
  154. var availableKeys;
  155. var records;
  156. updatePreserveRecordsCache(keys);
  157. var _mergedRowSelection$v = mergedRowSelection.value,
  158. preserveSelectedRowKeys = _mergedRowSelection$v.preserveSelectedRowKeys,
  159. onSelectionChange = _mergedRowSelection$v.onChange;
  160. var getRecordByKey = configRef.getRecordByKey;
  161. if (preserveSelectedRowKeys) {
  162. availableKeys = keys;
  163. records = keys.map(function (key) {
  164. return preserveRecordsRef.value.get(key);
  165. });
  166. } else {
  167. // Filter key which not exist in the `dataSource`
  168. availableKeys = [];
  169. records = [];
  170. keys.forEach(function (key) {
  171. var record = getRecordByKey(key);
  172. if (record !== undefined) {
  173. availableKeys.push(key);
  174. records.push(record);
  175. }
  176. });
  177. }
  178. setMergedSelectedKeys(availableKeys);
  179. onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(availableKeys, records);
  180. };
  181. // ====================== Selections ======================
  182. // Trigger single `onSelect` event
  183. var triggerSingleSelection = function triggerSingleSelection(key, selected, keys, event) {
  184. var onSelect = mergedRowSelection.value.onSelect;
  185. var _ref = configRef || {},
  186. getRecordByKey = _ref.getRecordByKey;
  187. if (onSelect) {
  188. var rows = keys.map(function (k) {
  189. return getRecordByKey(k);
  190. });
  191. onSelect(getRecordByKey(key), selected, rows, event);
  192. }
  193. setSelectedKeys(keys);
  194. };
  195. var mergedSelections = (0, _vue.computed)(function () {
  196. var _mergedRowSelection$v2 = mergedRowSelection.value,
  197. onSelectInvert = _mergedRowSelection$v2.onSelectInvert,
  198. onSelectNone = _mergedRowSelection$v2.onSelectNone,
  199. selections = _mergedRowSelection$v2.selections,
  200. hideSelectAll = _mergedRowSelection$v2.hideSelectAll;
  201. var data = configRef.data,
  202. pageData = configRef.pageData,
  203. getRowKey = configRef.getRowKey,
  204. tableLocale = configRef.locale;
  205. if (!selections || hideSelectAll) {
  206. return null;
  207. }
  208. var selectionList = selections === true ? [SELECTION_ALL, SELECTION_INVERT, SELECTION_NONE] : selections;
  209. return selectionList.map(function (selection) {
  210. if (selection === SELECTION_ALL) {
  211. return {
  212. key: 'all',
  213. text: tableLocale.value.selectionAll,
  214. onSelect: function onSelect() {
  215. setSelectedKeys(data.value.map(function (record, index) {
  216. return getRowKey.value(record, index);
  217. }).filter(function (key) {
  218. var checkProps = checkboxPropsMap.value.get(key);
  219. return !(checkProps !== null && checkProps !== void 0 && checkProps.disabled) || derivedSelectedKeySet.value.has(key);
  220. }));
  221. }
  222. };
  223. }
  224. if (selection === SELECTION_INVERT) {
  225. return {
  226. key: 'invert',
  227. text: tableLocale.value.selectInvert,
  228. onSelect: function onSelect() {
  229. var keySet = new Set(derivedSelectedKeySet.value);
  230. pageData.value.forEach(function (record, index) {
  231. var key = getRowKey.value(record, index);
  232. var checkProps = checkboxPropsMap.value.get(key);
  233. if (!(checkProps !== null && checkProps !== void 0 && checkProps.disabled)) {
  234. if (keySet.has(key)) {
  235. keySet.delete(key);
  236. } else {
  237. keySet.add(key);
  238. }
  239. }
  240. });
  241. var keys = Array.from(keySet);
  242. if (onSelectInvert) {
  243. (0, _devWarning.default)(false, 'Table', '`onSelectInvert` will be removed in future. Please use `onChange` instead.');
  244. onSelectInvert(keys);
  245. }
  246. setSelectedKeys(keys);
  247. }
  248. };
  249. }
  250. if (selection === SELECTION_NONE) {
  251. return {
  252. key: 'none',
  253. text: tableLocale.value.selectNone,
  254. onSelect: function onSelect() {
  255. onSelectNone === null || onSelectNone === void 0 ? void 0 : onSelectNone();
  256. setSelectedKeys(Array.from(derivedSelectedKeySet.value).filter(function (key) {
  257. var checkProps = checkboxPropsMap.value.get(key);
  258. return checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled;
  259. }));
  260. }
  261. };
  262. }
  263. return selection;
  264. });
  265. });
  266. var flattedDataLength = (0, _vue.computed)(function () {
  267. return flattedData.value.length;
  268. });
  269. // ======================= Columns ========================
  270. var transformColumns = function transformColumns(columns) {
  271. var _prevCol$INTERNAL_COL;
  272. var _mergedRowSelection$v3 = mergedRowSelection.value,
  273. onSelectAll = _mergedRowSelection$v3.onSelectAll,
  274. onSelectMultiple = _mergedRowSelection$v3.onSelectMultiple,
  275. selectionColWidth = _mergedRowSelection$v3.columnWidth,
  276. selectionType = _mergedRowSelection$v3.type,
  277. fixed = _mergedRowSelection$v3.fixed,
  278. customizeRenderCell = _mergedRowSelection$v3.renderCell,
  279. hideSelectAll = _mergedRowSelection$v3.hideSelectAll,
  280. checkStrictly = _mergedRowSelection$v3.checkStrictly;
  281. var prefixCls = configRef.prefixCls,
  282. getRecordByKey = configRef.getRecordByKey,
  283. getRowKey = configRef.getRowKey,
  284. expandType = configRef.expandType,
  285. getPopupContainer = configRef.getPopupContainer;
  286. if (!rowSelectionRef.value) {
  287. if (process.env.NODE_ENV !== 'production') {
  288. (0, _devWarning.default)(!columns.includes(SELECTION_COLUMN), 'Table', '`rowSelection` is not config but `SELECTION_COLUMN` exists in the `columns`.');
  289. }
  290. return columns.filter(function (col) {
  291. return col !== SELECTION_COLUMN;
  292. });
  293. }
  294. // Support selection
  295. var cloneColumns = columns.slice();
  296. var keySet = new Set(derivedSelectedKeySet.value);
  297. // Record key only need check with enabled
  298. var recordKeys = flattedData.value.map(getRowKey.value).filter(function (key) {
  299. return !checkboxPropsMap.value.get(key).disabled;
  300. });
  301. var checkedCurrentAll = recordKeys.every(function (key) {
  302. return keySet.has(key);
  303. });
  304. var checkedCurrentSome = recordKeys.some(function (key) {
  305. return keySet.has(key);
  306. });
  307. var onSelectAllChange = function onSelectAllChange() {
  308. var changeKeys = [];
  309. if (checkedCurrentAll) {
  310. recordKeys.forEach(function (key) {
  311. keySet.delete(key);
  312. changeKeys.push(key);
  313. });
  314. } else {
  315. recordKeys.forEach(function (key) {
  316. if (!keySet.has(key)) {
  317. keySet.add(key);
  318. changeKeys.push(key);
  319. }
  320. });
  321. }
  322. var keys = Array.from(keySet);
  323. onSelectAll === null || onSelectAll === void 0 ? void 0 : onSelectAll(!checkedCurrentAll, keys.map(function (k) {
  324. return getRecordByKey(k);
  325. }), changeKeys.map(function (k) {
  326. return getRecordByKey(k);
  327. }));
  328. setSelectedKeys(keys);
  329. };
  330. // ===================== Render =====================
  331. // Title Cell
  332. var title;
  333. if (selectionType !== 'radio') {
  334. var customizeSelections;
  335. if (mergedSelections.value) {
  336. var menu = (0, _vue.createVNode)(_menu.default, {
  337. "getPopupContainer": getPopupContainer.value
  338. }, {
  339. default: function _default() {
  340. return [mergedSelections.value.map(function (selection, index) {
  341. var key = selection.key,
  342. text = selection.text,
  343. onSelectionClick = selection.onSelect;
  344. return (0, _vue.createVNode)(_menu.default.Item, {
  345. "key": key || index,
  346. "onClick": function onClick() {
  347. onSelectionClick === null || onSelectionClick === void 0 ? void 0 : onSelectionClick(recordKeys);
  348. }
  349. }, {
  350. default: function _default() {
  351. return [text];
  352. }
  353. });
  354. })];
  355. }
  356. });
  357. customizeSelections = (0, _vue.createVNode)("div", {
  358. "class": "".concat(prefixCls.value, "-selection-extra")
  359. }, [(0, _vue.createVNode)(_dropdown.default, {
  360. "overlay": menu,
  361. "getPopupContainer": getPopupContainer.value
  362. }, {
  363. default: function _default() {
  364. return [(0, _vue.createVNode)("span", null, [(0, _vue.createVNode)(_DownOutlined.default, null, null)])];
  365. }
  366. })]);
  367. }
  368. var allDisabledData = flattedData.value.map(function (record, index) {
  369. var key = getRowKey.value(record, index);
  370. var checkboxProps = checkboxPropsMap.value.get(key) || {};
  371. return (0, _objectSpread2.default)({
  372. checked: keySet.has(key)
  373. }, checkboxProps);
  374. }).filter(function (_ref2) {
  375. var disabled = _ref2.disabled;
  376. return disabled;
  377. });
  378. var allDisabled = !!allDisabledData.length && allDisabledData.length === flattedDataLength.value;
  379. var allDisabledAndChecked = allDisabled && allDisabledData.every(function (_ref3) {
  380. var checked = _ref3.checked;
  381. return checked;
  382. });
  383. var allDisabledSomeChecked = allDisabled && allDisabledData.some(function (_ref4) {
  384. var checked = _ref4.checked;
  385. return checked;
  386. });
  387. title = !hideSelectAll && (0, _vue.createVNode)("div", {
  388. "class": "".concat(prefixCls.value, "-selection")
  389. }, [(0, _vue.createVNode)(_checkbox.default, {
  390. "checked": !allDisabled ? !!flattedDataLength.value && checkedCurrentAll : allDisabledAndChecked,
  391. "indeterminate": !allDisabled ? !checkedCurrentAll && checkedCurrentSome : !allDisabledAndChecked && allDisabledSomeChecked,
  392. "onChange": onSelectAllChange,
  393. "disabled": flattedDataLength.value === 0 || allDisabled,
  394. "skipGroup": true
  395. }, null), customizeSelections]);
  396. }
  397. // Body Cell
  398. var renderCell;
  399. if (selectionType === 'radio') {
  400. renderCell = function renderCell(_ref5) {
  401. var record = _ref5.record,
  402. index = _ref5.index;
  403. var key = getRowKey.value(record, index);
  404. var checked = keySet.has(key);
  405. return {
  406. node: (0, _vue.createVNode)(_radio.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, checkboxPropsMap.value.get(key)), {}, {
  407. "checked": checked,
  408. "onClick": function onClick(e) {
  409. return e.stopPropagation();
  410. },
  411. "onChange": function onChange(event) {
  412. if (!keySet.has(key)) {
  413. triggerSingleSelection(key, true, [key], event.nativeEvent);
  414. }
  415. }
  416. }), null),
  417. checked: checked
  418. };
  419. };
  420. } else {
  421. renderCell = function renderCell(_ref6) {
  422. var record = _ref6.record,
  423. index = _ref6.index;
  424. var key = getRowKey.value(record, index);
  425. var checked = keySet.has(key);
  426. var indeterminate = derivedHalfSelectedKeySet.value.has(key);
  427. var checkboxProps = checkboxPropsMap.value.get(key);
  428. var mergedIndeterminate;
  429. if (expandType.value === 'nest') {
  430. mergedIndeterminate = indeterminate;
  431. (0, _devWarning.default)(typeof (checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.indeterminate) !== 'boolean', 'Table', 'set `indeterminate` using `rowSelection.getCheckboxProps` is not allowed with tree structured dataSource.');
  432. } else {
  433. var _checkboxProps$indete;
  434. mergedIndeterminate = (_checkboxProps$indete = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.indeterminate) !== null && _checkboxProps$indete !== void 0 ? _checkboxProps$indete : indeterminate;
  435. }
  436. // Record checked
  437. return {
  438. node: (0, _vue.createVNode)(_checkbox.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, checkboxProps), {}, {
  439. "indeterminate": mergedIndeterminate,
  440. "checked": checked,
  441. "skipGroup": true,
  442. "onClick": function onClick(e) {
  443. return e.stopPropagation();
  444. },
  445. "onChange": function onChange(_ref7) {
  446. var nativeEvent = _ref7.nativeEvent;
  447. var shiftKey = nativeEvent.shiftKey;
  448. var startIndex = -1;
  449. var endIndex = -1;
  450. // Get range of this
  451. if (shiftKey && checkStrictly) {
  452. var pointKeys = new Set([lastSelectedKey.value, key]);
  453. recordKeys.some(function (recordKey, recordIndex) {
  454. if (pointKeys.has(recordKey)) {
  455. if (startIndex === -1) {
  456. startIndex = recordIndex;
  457. } else {
  458. endIndex = recordIndex;
  459. return true;
  460. }
  461. }
  462. return false;
  463. });
  464. }
  465. if (endIndex !== -1 && startIndex !== endIndex && checkStrictly) {
  466. // Batch update selections
  467. var rangeKeys = recordKeys.slice(startIndex, endIndex + 1);
  468. var changedKeys = [];
  469. if (checked) {
  470. rangeKeys.forEach(function (recordKey) {
  471. if (keySet.has(recordKey)) {
  472. changedKeys.push(recordKey);
  473. keySet.delete(recordKey);
  474. }
  475. });
  476. } else {
  477. rangeKeys.forEach(function (recordKey) {
  478. if (!keySet.has(recordKey)) {
  479. changedKeys.push(recordKey);
  480. keySet.add(recordKey);
  481. }
  482. });
  483. }
  484. var keys = Array.from(keySet);
  485. onSelectMultiple === null || onSelectMultiple === void 0 ? void 0 : onSelectMultiple(!checked, keys.map(function (recordKey) {
  486. return getRecordByKey(recordKey);
  487. }), changedKeys.map(function (recordKey) {
  488. return getRecordByKey(recordKey);
  489. }));
  490. setSelectedKeys(keys);
  491. } else {
  492. // Single record selected
  493. var originCheckedKeys = derivedSelectedKeys.value;
  494. if (checkStrictly) {
  495. var checkedKeys = checked ? (0, _util.arrDel)(originCheckedKeys, key) : (0, _util.arrAdd)(originCheckedKeys, key);
  496. triggerSingleSelection(key, !checked, checkedKeys, nativeEvent);
  497. } else {
  498. // Always fill first
  499. var result = (0, _conductUtil.conductCheck)([].concat((0, _toConsumableArray2.default)(originCheckedKeys), [key]), true, keyEntities.value, maxLevel.value, levelEntities.value, isCheckboxDisabled);
  500. var _checkedKeys = result.checkedKeys,
  501. halfCheckedKeys = result.halfCheckedKeys;
  502. var nextCheckedKeys = _checkedKeys;
  503. // If remove, we do it again to correction
  504. if (checked) {
  505. var tempKeySet = new Set(_checkedKeys);
  506. tempKeySet.delete(key);
  507. nextCheckedKeys = (0, _conductUtil.conductCheck)(Array.from(tempKeySet), {
  508. checked: false,
  509. halfCheckedKeys: halfCheckedKeys
  510. }, keyEntities.value, maxLevel.value, levelEntities.value, isCheckboxDisabled).checkedKeys;
  511. }
  512. triggerSingleSelection(key, !checked, nextCheckedKeys, nativeEvent);
  513. }
  514. }
  515. setLastSelectedKey(key);
  516. }
  517. }), null),
  518. checked: checked
  519. };
  520. };
  521. }
  522. var renderSelectionCell = function renderSelectionCell(_ref8) {
  523. var record = _ref8.record,
  524. index = _ref8.index;
  525. var _renderCell = renderCell({
  526. record: record,
  527. index: index
  528. }),
  529. node = _renderCell.node,
  530. checked = _renderCell.checked;
  531. if (customizeRenderCell) {
  532. return customizeRenderCell(checked, record, index, node);
  533. }
  534. return node;
  535. };
  536. // Insert selection column if not exist
  537. if (!cloneColumns.includes(SELECTION_COLUMN)) {
  538. // Always after expand icon
  539. if (cloneColumns.findIndex(function (col) {
  540. var _col$INTERNAL_COL_DEF;
  541. return ((_col$INTERNAL_COL_DEF = col[_vcTable.INTERNAL_COL_DEFINE]) === null || _col$INTERNAL_COL_DEF === void 0 ? void 0 : _col$INTERNAL_COL_DEF.columnType) === 'EXPAND_COLUMN';
  542. }) === 0) {
  543. var _cloneColumns = cloneColumns,
  544. _cloneColumns2 = (0, _toArray2.default)(_cloneColumns),
  545. expandColumn = _cloneColumns2[0],
  546. restColumns = _cloneColumns2.slice(1);
  547. cloneColumns = [expandColumn, SELECTION_COLUMN].concat((0, _toConsumableArray2.default)(restColumns));
  548. } else {
  549. // Normal insert at first column
  550. cloneColumns = [SELECTION_COLUMN].concat((0, _toConsumableArray2.default)(cloneColumns));
  551. }
  552. }
  553. // Deduplicate selection column
  554. var selectionColumnIndex = cloneColumns.indexOf(SELECTION_COLUMN);
  555. if (process.env.NODE_ENV !== 'production' && cloneColumns.filter(function (col) {
  556. return col === SELECTION_COLUMN;
  557. }).length > 1) {
  558. (0, _devWarning.default)(false, 'Table', 'Multiple `SELECTION_COLUMN` exist in `columns`.');
  559. }
  560. cloneColumns = cloneColumns.filter(function (column, index) {
  561. return column !== SELECTION_COLUMN || index === selectionColumnIndex;
  562. });
  563. // Fixed column logic
  564. var prevCol = cloneColumns[selectionColumnIndex - 1];
  565. var nextCol = cloneColumns[selectionColumnIndex + 1];
  566. var mergedFixed = fixed;
  567. if (mergedFixed === undefined) {
  568. if ((nextCol === null || nextCol === void 0 ? void 0 : nextCol.fixed) !== undefined) {
  569. mergedFixed = nextCol.fixed;
  570. } else if ((prevCol === null || prevCol === void 0 ? void 0 : prevCol.fixed) !== undefined) {
  571. mergedFixed = prevCol.fixed;
  572. }
  573. }
  574. if (mergedFixed && prevCol && ((_prevCol$INTERNAL_COL = prevCol[_vcTable.INTERNAL_COL_DEFINE]) === null || _prevCol$INTERNAL_COL === void 0 ? void 0 : _prevCol$INTERNAL_COL.columnType) === 'EXPAND_COLUMN' && prevCol.fixed === undefined) {
  575. prevCol.fixed = mergedFixed;
  576. }
  577. // Replace with real selection column
  578. var selectionColumn = (0, _defineProperty2.default)({
  579. fixed: mergedFixed,
  580. width: selectionColWidth,
  581. className: "".concat(prefixCls.value, "-selection-column"),
  582. title: mergedRowSelection.value.columnTitle || title,
  583. customRender: renderSelectionCell
  584. }, _vcTable.INTERNAL_COL_DEFINE, {
  585. class: "".concat(prefixCls.value, "-selection-col")
  586. });
  587. return cloneColumns.map(function (col) {
  588. return col === SELECTION_COLUMN ? selectionColumn : col;
  589. });
  590. };
  591. return [transformColumns, derivedSelectedKeySet];
  592. }