useSelection.js 25 KB

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