useSelection.js 24 KB

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