useExpand.js 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
  2. import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
  3. import _typeof from "@babel/runtime/helpers/esm/typeof";
  4. import warning from "rc-util/es/warning";
  5. import * as React from 'react';
  6. import { INTERNAL_HOOKS } from "../constant";
  7. import { findAllChildrenKeys, renderExpandIcon } from "../utils/expandUtil";
  8. import { getExpandableProps } from "../utils/legacyUtil";
  9. export default function useExpand(props, mergedData, getRowKey) {
  10. var expandableConfig = getExpandableProps(props);
  11. var expandIcon = expandableConfig.expandIcon,
  12. expandedRowKeys = expandableConfig.expandedRowKeys,
  13. defaultExpandedRowKeys = expandableConfig.defaultExpandedRowKeys,
  14. defaultExpandAllRows = expandableConfig.defaultExpandAllRows,
  15. expandedRowRender = expandableConfig.expandedRowRender,
  16. onExpand = expandableConfig.onExpand,
  17. onExpandedRowsChange = expandableConfig.onExpandedRowsChange,
  18. childrenColumnName = expandableConfig.childrenColumnName;
  19. var mergedExpandIcon = expandIcon || renderExpandIcon;
  20. var mergedChildrenColumnName = childrenColumnName || 'children';
  21. var expandableType = React.useMemo(function () {
  22. if (expandedRowRender) {
  23. return 'row';
  24. }
  25. /* eslint-disable no-underscore-dangle */
  26. /**
  27. * Fix https://github.com/ant-design/ant-design/issues/21154
  28. * This is a workaround to not to break current behavior.
  29. * We can remove follow code after final release.
  30. *
  31. * To other developer:
  32. * Do not use `__PARENT_RENDER_ICON__` in prod since we will remove this when refactor
  33. */
  34. if (props.expandable && props.internalHooks === INTERNAL_HOOKS && props.expandable.__PARENT_RENDER_ICON__ || mergedData.some(function (record) {
  35. return record && _typeof(record) === 'object' && record[mergedChildrenColumnName];
  36. })) {
  37. return 'nest';
  38. }
  39. /* eslint-enable */
  40. return false;
  41. }, [!!expandedRowRender, mergedData]);
  42. var _React$useState = React.useState(function () {
  43. if (defaultExpandedRowKeys) {
  44. return defaultExpandedRowKeys;
  45. }
  46. if (defaultExpandAllRows) {
  47. return findAllChildrenKeys(mergedData, getRowKey, mergedChildrenColumnName);
  48. }
  49. return [];
  50. }),
  51. _React$useState2 = _slicedToArray(_React$useState, 2),
  52. innerExpandedKeys = _React$useState2[0],
  53. setInnerExpandedKeys = _React$useState2[1];
  54. var mergedExpandedKeys = React.useMemo(function () {
  55. return new Set(expandedRowKeys || innerExpandedKeys || []);
  56. }, [expandedRowKeys, innerExpandedKeys]);
  57. var onTriggerExpand = React.useCallback(function (record) {
  58. var key = getRowKey(record, mergedData.indexOf(record));
  59. var newExpandedKeys;
  60. var hasKey = mergedExpandedKeys.has(key);
  61. if (hasKey) {
  62. mergedExpandedKeys.delete(key);
  63. newExpandedKeys = _toConsumableArray(mergedExpandedKeys);
  64. } else {
  65. newExpandedKeys = [].concat(_toConsumableArray(mergedExpandedKeys), [key]);
  66. }
  67. setInnerExpandedKeys(newExpandedKeys);
  68. if (onExpand) {
  69. onExpand(!hasKey, record);
  70. }
  71. if (onExpandedRowsChange) {
  72. onExpandedRowsChange(newExpandedKeys);
  73. }
  74. }, [getRowKey, mergedExpandedKeys, mergedData, onExpand, onExpandedRowsChange]);
  75. // Warning if use `expandedRowRender` and nest children in the same time
  76. if (process.env.NODE_ENV !== 'production' && expandedRowRender && mergedData.some(function (record) {
  77. return Array.isArray(record === null || record === void 0 ? void 0 : record[mergedChildrenColumnName]);
  78. })) {
  79. warning(false, '`expandedRowRender` should not use with nested Table');
  80. }
  81. return [expandableConfig, expandableType, mergedExpandedKeys, mergedExpandIcon, mergedChildrenColumnName, onTriggerExpand];
  82. }