useSelection.js 23 KB

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