@kdcloudjs/table 1.0.1 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +34 -33
  3. package/dist/@kdcloudjs/table.css +1 -1
  4. package/dist/@kdcloudjs/table.css.map +1 -1
  5. package/dist/@kdcloudjs/table.js +6555 -3388
  6. package/dist/@kdcloudjs/table.js.map +1 -1
  7. package/dist/@kdcloudjs/table.min.css +1 -1
  8. package/dist/@kdcloudjs/table.min.js +32 -24
  9. package/dist/@kdcloudjs/table.min.js.map +1 -1
  10. package/es/_utils/hooks.js +1 -2
  11. package/es/_utils/numberUtil.js +3 -4
  12. package/es/locale/locale.js +1 -2
  13. package/es/table/base/calculations.js +3 -4
  14. package/es/table/base/empty.js +2 -2
  15. package/es/table/base/header.d.ts +6 -2
  16. package/es/table/base/header.js +41 -22
  17. package/es/table/base/helpers/SpanManager.js +1 -1
  18. package/es/table/base/helpers/TableDOMUtils.d.ts +3 -0
  19. package/es/table/base/helpers/TableDOMUtils.js +23 -5
  20. package/es/table/base/helpers/getRichVisibleRectsStream.d.ts +23 -0
  21. package/es/table/base/helpers/getRichVisibleRectsStream.js +216 -0
  22. package/es/table/base/html-table.d.ts +3 -1
  23. package/es/table/base/html-table.js +43 -26
  24. package/es/table/base/interfaces.d.ts +1 -0
  25. package/es/table/base/renderTemplates.d.ts +1 -0
  26. package/es/table/base/renderTemplates.js +344 -0
  27. package/es/table/base/styles.d.ts +24 -0
  28. package/es/table/base/styles.js +31 -9
  29. package/es/table/base/table.d.ts +12 -4
  30. package/es/table/base/table.js +183 -136
  31. package/es/table/base/utils.d.ts +6 -3
  32. package/es/table/base/utils.js +27 -6
  33. package/es/table/common-views.js +3 -3
  34. package/es/table/pipeline/features/autoFill.js +7 -1
  35. package/es/table/pipeline/features/columnDrag.js +168 -59
  36. package/es/table/pipeline/features/columnFilter.js +7 -9
  37. package/es/table/pipeline/features/columnResizeWidth.d.ts +3 -0
  38. package/es/table/pipeline/features/columnResizeWidth.js +11 -4
  39. package/es/table/pipeline/features/contextMenu.js +78 -31
  40. package/es/table/pipeline/features/filter/Filter.js +74 -37
  41. package/es/table/pipeline/features/index.d.ts +1 -0
  42. package/es/table/pipeline/features/index.js +2 -1
  43. package/es/table/pipeline/features/multiSelect.js +85 -79
  44. package/es/table/pipeline/features/rangeSelection.d.ts +10 -0
  45. package/es/table/pipeline/features/rangeSelection.js +231 -0
  46. package/es/table/pipeline/features/rowDetail.js +39 -16
  47. package/es/table/pipeline/features/rowGrouping.js +2 -1
  48. package/es/table/pipeline/features/singleSelect.js +4 -1
  49. package/es/table/pipeline/features/sort.js +2 -3
  50. package/es/table/pipeline/features/treeMode.js +4 -4
  51. package/es/table/pipeline/pipeline.d.ts +8 -0
  52. package/es/table/pipeline/pipeline.js +49 -5
  53. package/es/table/pivot/cross-table/buildCrossTable.js +1 -2
  54. package/es/table/pivot/cross-tree-table/buildCrossTreeTable.js +1 -2
  55. package/es/table/pivot/pivot-utils/builders.js +1 -2
  56. package/es/table/pivot/pivot-utils/convert-utils.js +5 -4
  57. package/es/table/transforms/autoWidth.js +1 -2
  58. package/es/table/transforms/sort.js +1 -2
  59. package/es/table/transforms/treeMode.js +1 -2
  60. package/es/table/utils/applyTransforms.js +1 -3
  61. package/es/table/utils/browserType.d.ts +6 -0
  62. package/es/table/utils/browserType.js +6 -0
  63. package/es/table/utils/buildTree.js +4 -5
  64. package/es/table/utils/collectNodes.js +1 -2
  65. package/es/table/utils/exportTableAsExcel.js +1 -2
  66. package/es/table/utils/getTreeDepth.js +1 -2
  67. package/es/table/utils/groupBy.js +1 -2
  68. package/es/table/utils/index.d.ts +1 -0
  69. package/es/table/utils/index.js +2 -1
  70. package/es/table/utils/layeredSort.js +5 -2
  71. package/es/table/utils/makeRecursiveMapper.js +4 -5
  72. package/es/table/utils/others.d.ts +1 -1
  73. package/es/table/utils/others.js +20 -14
  74. package/es/table/utils/traverseColumn.js +1 -2
  75. package/es/table/utils/tree-data-helpers/StrictTreeDataHelper.js +4 -5
  76. package/es/table/utils/tree-data-helpers/TreeDataHelper.js +4 -5
  77. package/lib/_utils/formatUtil.js +1 -1
  78. package/lib/_utils/hooks.js +2 -4
  79. package/lib/_utils/numberUtil.js +7 -9
  80. package/lib/_utils/usePopper.js +9 -1
  81. package/lib/config-provider/configProvider.js +9 -1
  82. package/lib/config-provider/index.js +5 -5
  83. package/lib/locale/index.js +14 -6
  84. package/lib/locale/locale.js +2 -4
  85. package/lib/table/base/calculations.js +4 -6
  86. package/lib/table/base/empty.js +11 -3
  87. package/lib/table/base/header.d.ts +6 -2
  88. package/lib/table/base/header.js +39 -19
  89. package/lib/table/base/helpers/SpanManager.js +1 -1
  90. package/lib/table/base/helpers/TableDOMUtils.d.ts +3 -0
  91. package/lib/table/base/helpers/TableDOMUtils.js +21 -5
  92. package/lib/table/base/helpers/getRichVisibleRectsStream.d.ts +23 -0
  93. package/lib/table/base/helpers/getRichVisibleRectsStream.js +246 -0
  94. package/lib/table/base/html-table.d.ts +3 -1
  95. package/lib/table/base/html-table.js +44 -26
  96. package/lib/table/base/index.js +4 -4
  97. package/lib/table/base/interfaces.d.ts +1 -0
  98. package/lib/table/base/renderTemplates.d.ts +1 -0
  99. package/lib/table/base/renderTemplates.js +370 -0
  100. package/lib/table/base/styles.d.ts +24 -0
  101. package/lib/table/base/styles.js +42 -13
  102. package/lib/table/base/table.d.ts +12 -4
  103. package/lib/table/base/table.js +191 -137
  104. package/lib/table/base/utils.d.ts +6 -3
  105. package/lib/table/base/utils.js +47 -10
  106. package/lib/table/common-views.js +3 -3
  107. package/lib/table/pipeline/features/autoFill.js +9 -2
  108. package/lib/table/pipeline/features/columnDrag.js +168 -59
  109. package/lib/table/pipeline/features/columnFilter.js +6 -9
  110. package/lib/table/pipeline/features/columnResizeWidth.d.ts +3 -0
  111. package/lib/table/pipeline/features/columnResizeWidth.js +21 -5
  112. package/lib/table/pipeline/features/contextMenu.js +89 -32
  113. package/lib/table/pipeline/features/filter/DefaultFilterContent.js +10 -2
  114. package/lib/table/pipeline/features/filter/Filter.js +88 -37
  115. package/lib/table/pipeline/features/filter/FilterPanel.js +10 -2
  116. package/lib/table/pipeline/features/filter/index.js +4 -4
  117. package/lib/table/pipeline/features/index.d.ts +1 -0
  118. package/lib/table/pipeline/features/index.js +37 -27
  119. package/lib/table/pipeline/features/multiSelect.js +81 -75
  120. package/lib/table/pipeline/features/rangeSelection.d.ts +10 -0
  121. package/lib/table/pipeline/features/rangeSelection.js +256 -0
  122. package/lib/table/pipeline/features/rowDetail.js +42 -16
  123. package/lib/table/pipeline/features/rowGrouping.js +3 -1
  124. package/lib/table/pipeline/features/singleSelect.js +4 -1
  125. package/lib/table/pipeline/features/sort.js +2 -4
  126. package/lib/table/pipeline/features/treeMode.js +6 -6
  127. package/lib/table/pipeline/index.js +11 -3
  128. package/lib/table/pipeline/pipeline.d.ts +8 -0
  129. package/lib/table/pipeline/pipeline.js +50 -7
  130. package/lib/table/pivot/cross-table/buildCrossTable.js +1 -3
  131. package/lib/table/pivot/cross-table/index.js +4 -4
  132. package/lib/table/pivot/cross-tree-table/buildCrossTreeTable.js +1 -3
  133. package/lib/table/pivot/pivot-utils/builders.js +2 -4
  134. package/lib/table/pivot/pivot-utils/convert-utils.js +7 -5
  135. package/lib/table/pivot/pivot-utils/index.js +4 -4
  136. package/lib/table/transforms/autoWidth.js +10 -4
  137. package/lib/table/transforms/columnResize.js +10 -2
  138. package/lib/table/transforms/index.js +32 -32
  139. package/lib/table/transforms/sort.js +10 -4
  140. package/lib/table/transforms/treeMode.js +9 -3
  141. package/lib/table/utils/applyTransforms.js +1 -5
  142. package/lib/table/utils/browserType.d.ts +6 -0
  143. package/lib/table/utils/browserType.js +13 -0
  144. package/lib/table/utils/buildTree.js +1 -3
  145. package/lib/table/utils/collectNodes.js +1 -3
  146. package/lib/table/utils/copyToClipboard.js +1 -1
  147. package/lib/table/utils/element.js +3 -3
  148. package/lib/table/utils/exportTableAsExcel.js +1 -3
  149. package/lib/table/utils/getTreeDepth.js +1 -3
  150. package/lib/table/utils/groupBy.js +1 -3
  151. package/lib/table/utils/index.d.ts +1 -0
  152. package/lib/table/utils/index.js +57 -49
  153. package/lib/table/utils/layeredSort.js +6 -2
  154. package/lib/table/utils/makeRecursiveMapper.js +1 -3
  155. package/lib/table/utils/others.d.ts +1 -1
  156. package/lib/table/utils/others.js +23 -18
  157. package/lib/table/utils/traverseColumn.js +1 -3
  158. package/lib/table/utils/tree-data-helpers/StrictTreeDataHelper.js +5 -7
  159. package/lib/table/utils/tree-data-helpers/TreeDataHelper.js +5 -7
  160. package/package.json +6 -2
  161. package/dist/kd-table.css +0 -422
  162. package/dist/kd-table.css.map +0 -1
  163. package/dist/kd-table.js +0 -38578
  164. package/dist/kd-table.js.map +0 -1
  165. package/dist/kd-table.min.css +0 -9
  166. package/dist/kd-table.min.js +0 -208
  167. package/dist/kd-table.min.js.map +0 -1
  168. package/es/table/base/helpers/__test__/visible-part.test.d.ts +0 -1
  169. package/es/table/base/helpers/__test__/visible-part.test.js +0 -28
  170. package/es/table/base/helpers/visible-part.d.ts +0 -23
  171. package/es/table/base/helpers/visible-part.js +0 -58
  172. package/es/table/pipeline/features/__test__/multiSelect.test.d.ts +0 -1
  173. package/es/table/pipeline/features/__test__/multiSelect.test.js +0 -152
  174. package/es/table/pipeline/features/__test__/rowDetail.test.d.ts +0 -1
  175. package/es/table/pipeline/features/__test__/rowDetail.test.js +0 -223
  176. package/es/table/pipeline/features/__test__/rowGrouping.test.d.ts +0 -1
  177. package/es/table/pipeline/features/__test__/rowGrouping.test.js +0 -120
  178. package/es/table/pipeline/features/__test__/singleSelect.test.d.ts +0 -1
  179. package/es/table/pipeline/features/__test__/singleSelect.test.js +0 -191
  180. package/es/table/pipeline/features/__test__/sort.test.d.ts +0 -1
  181. package/es/table/pipeline/features/__test__/sort.test.js +0 -213
  182. package/es/table/pipeline/features/__test__/tips.test.d.ts +0 -1
  183. package/es/table/pipeline/features/__test__/tips.test.js +0 -123
  184. package/es/table/pipeline/features/__test__/treeMode.test.d.ts +0 -1
  185. package/es/table/pipeline/features/__test__/treeMode.test.js +0 -202
  186. package/es/table/pipeline/features/filter/__test__/Filter.test.d.ts +0 -1
  187. package/es/table/pipeline/features/filter/__test__/Filter.test.js +0 -29
  188. package/lib/table/base/helpers/__test__/visible-part.test.d.ts +0 -1
  189. package/lib/table/base/helpers/__test__/visible-part.test.js +0 -31
  190. package/lib/table/base/helpers/visible-part.d.ts +0 -23
  191. package/lib/table/base/helpers/visible-part.js +0 -72
  192. package/lib/table/pipeline/features/__test__/multiSelect.test.d.ts +0 -1
  193. package/lib/table/pipeline/features/__test__/multiSelect.test.js +0 -163
  194. package/lib/table/pipeline/features/__test__/rowDetail.test.d.ts +0 -1
  195. package/lib/table/pipeline/features/__test__/rowDetail.test.js +0 -230
  196. package/lib/table/pipeline/features/__test__/rowGrouping.test.d.ts +0 -1
  197. package/lib/table/pipeline/features/__test__/rowGrouping.test.js +0 -129
  198. package/lib/table/pipeline/features/__test__/singleSelect.test.d.ts +0 -1
  199. package/lib/table/pipeline/features/__test__/singleSelect.test.js +0 -201
  200. package/lib/table/pipeline/features/__test__/sort.test.d.ts +0 -1
  201. package/lib/table/pipeline/features/__test__/sort.test.js +0 -218
  202. package/lib/table/pipeline/features/__test__/tips.test.d.ts +0 -1
  203. package/lib/table/pipeline/features/__test__/tips.test.js +0 -133
  204. package/lib/table/pipeline/features/__test__/treeMode.test.d.ts +0 -1
  205. package/lib/table/pipeline/features/__test__/treeMode.test.js +0 -206
  206. package/lib/table/pipeline/features/filter/__test__/Filter.test.d.ts +0 -1
  207. package/lib/table/pipeline/features/filter/__test__/Filter.test.js +0 -36
@@ -1,38 +1,86 @@
1
+ import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
1
2
  import _slicedToArray from "@babel/runtime-corejs3/helpers/slicedToArray";
2
3
  import _taggedTemplateLiteral from "@babel/runtime-corejs3/helpers/taggedTemplateLiteral";
3
4
 
4
5
  var _templateObject;
5
6
 
6
- import React from 'react';
7
+ import React, { useEffect } from 'react';
7
8
  import { createPortal } from 'react-dom';
8
9
  import styled from 'styled-components';
9
10
  import { Classes } from '../../../base/styles';
10
11
  import FilterPanel from './FilterPanel';
11
12
  import DefaultFilterContent from './DefaultFilterContent';
12
13
  import { calculatePopupRelative } from '../../../utils';
13
- var HEADER_ICON_OFFSET_Y = 6 + 1; //padding-top + border
14
+ import { addResizeObserver } from '../../../base/utils';
15
+ import cx from 'classnames';
16
+ var HEADER_ICON_OFFSET_Y = 6 + 1; // padding-top + border
14
17
 
15
- var HEADER_ICON_OFFSET_X = 16 + 1; //padding-left+ border
18
+ var HEADER_ICON_OFFSET_X = 16 + 1; // padding-left+ border
16
19
 
17
- var FilterIconSpanStyle = styled.span(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n position: absolute;\n right: 4px;\n cursor: pointer;\n transform: translateY(-50%);\n top: 50%;\n height: 12px; \n"])));
20
+ var FilterIconSpanStyle = styled.span(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n // position: absolute;\n // right: 4px;\n // cursor: pointer;\n // transform: translateY(-50%);\n // top: 50%;\n // height: 12px; \n"])));
18
21
 
19
- function Filter(_ref) {
20
- var _ref$size = _ref.size,
21
- size = _ref$size === void 0 ? 12 : _ref$size,
22
- style = _ref.style,
23
- className = _ref.className,
24
- FilterPanelContent = _ref.FilterPanelContent,
22
+ function Panel(_ref) {
23
+ var ele = _ref.ele,
25
24
  filterIcon = _ref.filterIcon,
26
- setFilter = _ref.setFilter,
27
- setFilterModel = _ref.setFilterModel,
28
- filterModel = _ref.filterModel,
29
- isFilterActive = _ref.isFilterActive,
30
- stopClickEventPropagation = _ref.stopClickEventPropagation;
25
+ hidePanel = _ref.hidePanel,
26
+ renderPanelContent = _ref.renderPanelContent;
27
+ var filterPanelRef = React.useRef(null);
31
28
 
32
- var _React$useState = React.useState(false),
29
+ var _React$useState = React.useState(calculatePopupRelative(ele, document.body, {
30
+ x: HEADER_ICON_OFFSET_X,
31
+ y: HEADER_ICON_OFFSET_Y
32
+ })),
33
33
  _React$useState2 = _slicedToArray(_React$useState, 2),
34
- showPanel = _React$useState2[0],
35
- setShowPanel = _React$useState2[1];
34
+ position = _React$useState2[0],
35
+ setPosition = _React$useState2[1];
36
+
37
+ var style = {
38
+ position: 'absolute',
39
+ zIndex: 1050
40
+ };
41
+
42
+ var handleFilterPanelResize = function handleFilterPanelResize(resize) {
43
+ setPosition(calculatePopupRelative(ele, document.body, {
44
+ x: HEADER_ICON_OFFSET_X,
45
+ y: HEADER_ICON_OFFSET_Y
46
+ }));
47
+ };
48
+
49
+ useEffect(function () {
50
+ var resizeObserver = addResizeObserver(filterPanelRef.current.children[0], handleFilterPanelResize);
51
+ return function () {
52
+ resizeObserver && resizeObserver.disconnect();
53
+ };
54
+ }, []);
55
+ return /*#__PURE__*/React.createElement("div", {
56
+ ref: filterPanelRef
57
+ }, /*#__PURE__*/React.createElement(FilterPanel, {
58
+ style: style,
59
+ onClose: hidePanel,
60
+ position: position,
61
+ filterIcon: filterIcon
62
+ }, renderPanelContent()));
63
+ }
64
+
65
+ function Filter(_ref2) {
66
+ var _cx;
67
+
68
+ var _ref2$size = _ref2.size,
69
+ size = _ref2$size === void 0 ? 12 : _ref2$size,
70
+ style = _ref2.style,
71
+ className = _ref2.className,
72
+ FilterPanelContent = _ref2.FilterPanelContent,
73
+ filterIcon = _ref2.filterIcon,
74
+ setFilter = _ref2.setFilter,
75
+ setFilterModel = _ref2.setFilterModel,
76
+ filterModel = _ref2.filterModel,
77
+ isFilterActive = _ref2.isFilterActive,
78
+ stopClickEventPropagation = _ref2.stopClickEventPropagation;
79
+
80
+ var _React$useState3 = React.useState(false),
81
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
82
+ showPanel = _React$useState4[0],
83
+ setShowPanel = _React$useState4[1];
36
84
 
37
85
  var iconRef = React.useRef(null);
38
86
 
@@ -62,23 +110,6 @@ function Filter(_ref) {
62
110
  }
63
111
  };
64
112
 
65
- var renderPanel = function renderPanel(ele) {
66
- var position = calculatePopupRelative(ele, document.body, {
67
- x: HEADER_ICON_OFFSET_X,
68
- y: HEADER_ICON_OFFSET_Y
69
- });
70
- var style = {
71
- position: 'absolute',
72
- zIndex: 1050
73
- };
74
- return /*#__PURE__*/React.createElement(FilterPanel, {
75
- style: style,
76
- onClose: hidePanel,
77
- position: position,
78
- filterIcon: filterIcon
79
- }, renderPanelContent());
80
- };
81
-
82
113
  var handleIconClick = function handleIconClick(e) {
83
114
  if (stopClickEventPropagation) {
84
115
  e.stopPropagation();
@@ -87,9 +118,10 @@ function Filter(_ref) {
87
118
  setShowPanel(true);
88
119
  };
89
120
 
121
+ var iconClassName = cx((_cx = {}, _defineProperty(_cx, className, true), _defineProperty(_cx, 'filter-panel-open', showPanel), _cx));
90
122
  return /*#__PURE__*/React.createElement(FilterIconSpanStyle, {
91
123
  style: style,
92
- className: className,
124
+ className: iconClassName,
93
125
  onMouseDown: handleMouseDown,
94
126
  ref: iconRef
95
127
  }, /*#__PURE__*/React.createElement("span", {
@@ -105,7 +137,12 @@ function Filter(_ref) {
105
137
  "aria-hidden": "true"
106
138
  }, /*#__PURE__*/React.createElement("path", {
107
139
  d: "M349 838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3\n 31.8-32V642H349v196zm531.1-684H143.9c-24.5 0-39.8 26.7-27.5\n 48l221.3 376h348.8l221.3-376c12.1-21.3-3.2-48-27.7-48z"
108
- }))), showPanel && /*#__PURE__*/createPortal(renderPanel(iconRef.current), document.body));
140
+ }))), showPanel && /*#__PURE__*/createPortal( /*#__PURE__*/React.createElement(Panel, {
141
+ ele: iconRef.current,
142
+ filterIcon: filterIcon,
143
+ hidePanel: hidePanel,
144
+ renderPanelContent: renderPanelContent
145
+ }), document.body));
109
146
  }
110
147
 
111
148
  export default Filter;
@@ -14,3 +14,4 @@ export { columnDrag, ColumnDragOptions } from './columnDrag';
14
14
  export { columnResize, ColumnResizeOptions } from './columnResizeWidth';
15
15
  export { contextMenu, ContextMenuFeatureOptions } from './contextMenu';
16
16
  export { filter, FilterFeatureOptions } from './columnFilter';
17
+ export { rangeSelection, RangeSelectionFeatureOptions } from './rangeSelection';
@@ -13,4 +13,5 @@ export { treeSelect } from './treeSelect';
13
13
  export { columnDrag } from './columnDrag';
14
14
  export { columnResize } from './columnResizeWidth';
15
15
  export { contextMenu } from './contextMenu';
16
- export { filter } from './columnFilter';
16
+ export { filter } from './columnFilter';
17
+ export { rangeSelection } from './rangeSelection';
@@ -9,8 +9,6 @@ import { mergeCellProps } from '../../utils';
9
9
  export function multiSelect() {
10
10
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
11
11
  return function multiSelectStep(pipeline) {
12
- var _context;
13
-
14
12
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
15
13
 
16
14
  var stateKey = 'multiSelect';
@@ -54,94 +52,102 @@ export function multiSelect() {
54
52
  allKeys.push(rowKey);
55
53
  }
56
54
  });
57
- var set = new _Set(value);
58
- var isAllChecked = allKeys.length > 0 && allKeys.every(function (key) {
59
- return set.has(key);
60
- });
61
- var isAnyChecked = allKeys.some(function (key) {
62
- return set.has(key);
63
- });
64
- var defaultCheckboxColumnTitle = /*#__PURE__*/React.createElement(Checkbox, {
65
- checked: isAllChecked,
66
- indeterminate: !isAllChecked && isAnyChecked,
67
- onChange: function onChange(_) {
68
- if (isAllChecked) {
69
- _onChange(arrayUtils.diff(value, allKeys), '', allKeys, 'uncheck-all');
70
- } else {
71
- _onChange(arrayUtils.merge(value, allKeys), '', allKeys, 'check-all');
72
- }
73
- }
74
- });
55
+ var set = new _Set(value); // todo: 暂使用hidden隐藏选择列 后续增加配置
75
56
 
76
- var checkboxColumn = _extends(_extends({
77
- name: '是否选中',
78
- title: defaultCheckboxColumnTitle,
79
- width: 50,
80
- align: 'center'
81
- }, opts.checkboxColumn), {
82
- getCellProps: function getCellProps(value, row, rowIndex) {
83
- var _a, _b;
84
-
85
- var rowKey = internals.safeGetRowKey(primaryKey, row, rowIndex);
86
- var checkboxCellProps = {};
87
- var preCellProps = (_b = (_a = opts.checkboxColumn) === null || _a === void 0 ? void 0 : _a.getCellProps) === null || _b === void 0 ? void 0 : _b.call(_a, value, row, rowIndex);
88
-
89
- if (fullKeySet.has(rowKey) && clickArea === 'cell') {
90
- var prevChecked = set.has(rowKey);
91
- var disabled = isDisabled(row, rowIndex);
92
- checkboxCellProps = {
93
- style: {
94
- cursor: disabled ? 'not-allowed' : 'pointer'
95
- },
96
- onClick: disabled ? undefined : function (e) {
97
- if (opts.stopClickEventPropagation) {
98
- e.stopPropagation();
99
- }
57
+ var hiddenSelectColumn = opts.checkboxColumn && opts.checkboxColumn.hidden === true;
100
58
 
101
- onCheckboxChange(prevChecked, rowKey, e.shiftKey);
102
- }
103
- };
59
+ if (!hiddenSelectColumn) {
60
+ var _context;
61
+
62
+ var isAllChecked = allKeys.length > 0 && allKeys.every(function (key) {
63
+ return set.has(key);
64
+ });
65
+ var isAnyChecked = allKeys.some(function (key) {
66
+ return set.has(key);
67
+ });
68
+ var defaultCheckboxColumnTitle = /*#__PURE__*/React.createElement(Checkbox, {
69
+ checked: isAllChecked,
70
+ indeterminate: !isAllChecked && isAnyChecked,
71
+ onChange: function onChange(_) {
72
+ if (isAllChecked) {
73
+ _onChange(arrayUtils.diff(value, allKeys), '', allKeys, 'uncheck-all');
74
+ } else {
75
+ _onChange(arrayUtils.merge(value, allKeys), '', allKeys, 'check-all');
76
+ }
104
77
  }
78
+ });
105
79
 
106
- return mergeCellProps(preCellProps, checkboxCellProps);
107
- },
108
- render: function render(_, row, rowIndex) {
109
- var key = internals.safeGetRowKey(primaryKey, row, rowIndex);
110
- var checked = set.has(key);
111
- return /*#__PURE__*/React.createElement(Checkbox, {
112
- checked: checked,
113
- disabled: isDisabled(row, rowIndex),
114
- onChange: clickArea === 'checkbox' ? function (arg1, arg2) {
115
- var _a; // 这里要同时兼容 antd 和 fusion 的用法
116
- // fusion: arg2?.nativeEvent
117
- // antd: arg1.nativeEvent
118
-
119
-
120
- var nativeEvent = (_a = arg2 === null || arg2 === void 0 ? void 0 : arg2.nativeEvent) !== null && _a !== void 0 ? _a : arg1.nativeEvent;
121
-
122
- if (nativeEvent) {
123
- if (opts.stopClickEventPropagation) {
124
- nativeEvent.stopPropagation();
80
+ var checkboxColumn = _extends(_extends({
81
+ name: '是否选中',
82
+ title: defaultCheckboxColumnTitle,
83
+ width: 50,
84
+ align: 'center'
85
+ }, opts.checkboxColumn), {
86
+ getCellProps: function getCellProps(value, row, rowIndex) {
87
+ var _a, _b;
88
+
89
+ var rowKey = internals.safeGetRowKey(primaryKey, row, rowIndex);
90
+ var checkboxCellProps = {};
91
+ var preCellProps = (_b = (_a = opts.checkboxColumn) === null || _a === void 0 ? void 0 : _a.getCellProps) === null || _b === void 0 ? void 0 : _b.call(_a, value, row, rowIndex);
92
+
93
+ if (fullKeySet.has(rowKey) && clickArea === 'cell') {
94
+ var prevChecked = set.has(rowKey);
95
+ var disabled = isDisabled(row, rowIndex);
96
+ checkboxCellProps = {
97
+ style: {
98
+ cursor: disabled ? 'not-allowed' : 'pointer'
99
+ },
100
+ onClick: disabled ? undefined : function (e) {
101
+ if (opts.stopClickEventPropagation) {
102
+ e.stopPropagation();
103
+ }
104
+
105
+ onCheckboxChange(prevChecked, rowKey, e.shiftKey);
106
+ }
107
+ };
108
+ }
109
+
110
+ return mergeCellProps(preCellProps, checkboxCellProps);
111
+ },
112
+ render: function render(_, row, rowIndex) {
113
+ var key = internals.safeGetRowKey(primaryKey, row, rowIndex);
114
+ var checked = set.has(key);
115
+ return /*#__PURE__*/React.createElement(Checkbox, {
116
+ checked: checked,
117
+ disabled: isDisabled(row, rowIndex),
118
+ onChange: clickArea === 'checkbox' ? function (arg1, arg2) {
119
+ var _a; // 这里要同时兼容 antd 和 fusion 的用法
120
+ // fusion: arg2?.nativeEvent
121
+ // antd: arg1.nativeEvent
122
+
123
+
124
+ var nativeEvent = (_a = arg2 === null || arg2 === void 0 ? void 0 : arg2.nativeEvent) !== null && _a !== void 0 ? _a : arg1.nativeEvent;
125
+
126
+ if (nativeEvent) {
127
+ if (opts.stopClickEventPropagation) {
128
+ nativeEvent.stopPropagation();
129
+ }
130
+
131
+ onCheckboxChange(checked, key, nativeEvent.shiftKey);
125
132
  }
133
+ } : undefined
134
+ });
135
+ }
136
+ });
126
137
 
127
- onCheckboxChange(checked, key, nativeEvent.shiftKey);
128
- }
129
- } : undefined
130
- });
131
- }
132
- });
138
+ var nextColumns = _sliceInstanceProperty(_context = pipeline.getColumns()).call(_context);
133
139
 
134
- var nextColumns = _sliceInstanceProperty(_context = pipeline.getColumns()).call(_context);
140
+ var checkboxPlacement = (_l = opts.checkboxPlacement) !== null && _l !== void 0 ? _l : 'start';
135
141
 
136
- var checkboxPlacement = (_l = opts.checkboxPlacement) !== null && _l !== void 0 ? _l : 'start';
142
+ if (checkboxPlacement === 'start') {
143
+ nextColumns.unshift(checkboxColumn);
144
+ } else {
145
+ nextColumns.push(checkboxColumn);
146
+ }
137
147
 
138
- if (checkboxPlacement === 'start') {
139
- nextColumns.unshift(checkboxColumn);
140
- } else {
141
- nextColumns.push(checkboxColumn);
148
+ pipeline.columns(nextColumns);
142
149
  }
143
150
 
144
- pipeline.columns(nextColumns);
145
151
  pipeline.appendRowPropsGetter(function (row, rowIndex) {
146
152
  var rowKey = internals.safeGetRowKey(primaryKey, row, rowIndex);
147
153
 
@@ -0,0 +1,10 @@
1
+ import { TablePipeline } from '../pipeline';
2
+ export interface RangeSelectionFeatureOptions {
3
+ /** 范围选中回调函数 */
4
+ rangeSelectedChange?(params: any): void;
5
+ /** 是否阻止keydown的默认行为 */
6
+ preventkDefaultOfKeyDownEvent?: boolean;
7
+ }
8
+ export declare const rangeSelectionKey = "rangeSelection";
9
+ export declare const lastClickCell = "lastClickCell";
10
+ export declare function rangeSelection(opts: RangeSelectionFeatureOptions): (pipeline: TablePipeline) => TablePipeline;
@@ -0,0 +1,231 @@
1
+ import _typeof from "@babel/runtime-corejs3/helpers/typeof";
2
+ import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
3
+ import _extends from "@babel/runtime-corejs3/helpers/extends";
4
+ import _findIndexInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/find-index";
5
+ import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
6
+ import { mergeCellProps, makeRecursiveMapper, isElementInEventPath, collectNodes } from '../../utils';
7
+ import { findByTree } from '../../utils/others';
8
+ import { fromEvent } from 'rxjs';
9
+ import { map, takeUntil } from 'rxjs/operators';
10
+ import { Classes } from '../../base/styles';
11
+ import cx from 'classnames';
12
+ export var rangeSelectionKey = 'rangeSelection';
13
+ export var lastClickCell = 'lastClickCell';
14
+ export function rangeSelection(opts) {
15
+ return function step(pipeline) {
16
+ var SCROLL_SIZE = 30;
17
+ var tableBody = pipeline.ref.current.domHelper && pipeline.ref.current.domHelper.tableBody;
18
+
19
+ if (!tableBody) {
20
+ return pipeline;
21
+ }
22
+
23
+ var columns = pipeline.getColumns();
24
+
25
+ var rangeSelectedChange = function rangeSelectedChange(rangeSelection) {
26
+ var _a;
27
+
28
+ pipeline.setStateAtKey(rangeSelectionKey, rangeSelection);
29
+ (_a = opts === null || opts === void 0 ? void 0 : opts.rangeSelectedChange) === null || _a === void 0 ? void 0 : _a.call(opts, rangeSelection);
30
+ }; // if (!pipeline.getFeatureOptions(rangeSelectionKey)) {
31
+ // pipeline.setFeatureOptions(rangeSelectionKey, {
32
+ // optionKey: rangeSelectionKey,
33
+ // rangeSelectedChange: rangeSelectedChange
34
+ // })
35
+ // }
36
+
37
+
38
+ var setRangeSelection = function setRangeSelection(startDragCell, draggingCell) {
39
+ if (!startDragCell || !draggingCell || isSameCell(startDragCell, draggingCell)) return;
40
+ var rangeColumns = getRangeColumns(startDragCell, draggingCell, columns);
41
+ var isTopToBottom = startDragCell.rowIndex <= draggingCell.rowIndex;
42
+ var rangeSelection = {
43
+ startRow: isTopToBottom ? startDragCell.rowIndex : startDragCell.rowIndex + startDragCell.rowSpan - 1,
44
+ endRow: isTopToBottom ? draggingCell.rowIndex + draggingCell.rowSpan - 1 : draggingCell.rowIndex,
45
+ columns: rangeColumns,
46
+ startColumn: startDragCell.column
47
+ };
48
+ rangeSelectedChange(rangeSelection);
49
+ };
50
+
51
+ var shiftKeySelect = function shiftKeySelect(event) {
52
+ var target = event.target;
53
+ var clickCell = getTargetCell(target, columns);
54
+
55
+ if (clickCell) {
56
+ if (event.shiftKey) {
57
+ var _lastClickCell = pipeline.getStateAtKey(lastClickCell);
58
+
59
+ if (_lastClickCell) {
60
+ setRangeSelection(_lastClickCell, clickCell);
61
+ } else {
62
+ // 第一次进来就按住shift键,这时候要记住点击的单元格
63
+ pipeline.setStateAtKey(lastClickCell, clickCell);
64
+ }
65
+ } else {
66
+ pipeline.setStateAtKey(lastClickCell, clickCell);
67
+ rangeSelectedChange(null);
68
+ }
69
+ }
70
+ };
71
+
72
+ var onMouseDown = function onMouseDown(mouseDownEvent) {
73
+ if (mouseDownEvent.button !== 0 || !isElementInEventPath(tableBody, mouseDownEvent.nativeEvent)) return; // mouseDownEvent.preventDefault()
74
+ // shift + 点击选中
75
+
76
+ shiftKeySelect(mouseDownEvent);
77
+ var target = mouseDownEvent.target;
78
+ var startDragCell = getTargetCell(target, columns);
79
+ var mousemove$ = fromEvent(window, 'mousemove');
80
+ var mouseup$ = fromEvent(window, 'mouseup');
81
+ var tableBodyClientRect = tableBody.getBoundingClientRect();
82
+
83
+ var updateScrollPosition = function updateScrollPosition(client) {
84
+ var clientX = client.clientX,
85
+ clientY = client.clientY;
86
+ var left = tableBodyClientRect.left,
87
+ top = tableBodyClientRect.top,
88
+ height = tableBodyClientRect.height,
89
+ width = tableBodyClientRect.width;
90
+
91
+ if (clientX + SCROLL_SIZE >= left + width) {
92
+ pipeline.ref.current.domHelper.virtual.scrollLeft += SCROLL_SIZE;
93
+ }
94
+
95
+ if (clientX - SCROLL_SIZE <= left) {
96
+ pipeline.ref.current.domHelper.virtual.scrollLeft -= SCROLL_SIZE;
97
+ }
98
+
99
+ if (clientY + SCROLL_SIZE >= top + height) {
100
+ pipeline.ref.current.domHelper.tableBody.scrollTop += SCROLL_SIZE;
101
+ }
102
+
103
+ if (clientY + SCROLL_SIZE <= top) {
104
+ pipeline.ref.current.domHelper.tableBody.scrollTop -= SCROLL_SIZE;
105
+ }
106
+ };
107
+
108
+ var rangeSelected$ = mousemove$.pipe(map(function (mouseMoveEvent) {
109
+ var target = mouseMoveEvent.target || mouseMoveEvent.srcElement;
110
+ var draggingCell = getTargetCell(target, columns);
111
+ var client = {
112
+ clientX: mouseMoveEvent.clientX,
113
+ clientY: mouseMoveEvent.clientY
114
+ };
115
+ updateScrollPosition(client);
116
+ return {
117
+ startDragCell: startDragCell,
118
+ draggingCell: draggingCell
119
+ };
120
+ }), takeUntil(mouseup$));
121
+ rangeSelected$.subscribe(function (_ref) {
122
+ var startDragCell = _ref.startDragCell,
123
+ draggingCell = _ref.draggingCell;
124
+ setRangeSelection(startDragCell, draggingCell);
125
+ });
126
+ };
127
+
128
+ var onKeyDown = function onKeyDown(e) {
129
+ if ((e.ctrlKey || e.metaKey) && e.key === 'a') {
130
+ var rowLen = pipeline.getDataSource().length;
131
+
132
+ if (columns.length && rowLen) {
133
+ opts.preventkDefaultOfKeyDownEvent !== false && e.preventDefault();
134
+ rangeSelectedChange({
135
+ startRow: 0,
136
+ endRow: rowLen - 1,
137
+ columns: columns,
138
+ startColumn: columns[0]
139
+ });
140
+ }
141
+ }
142
+ };
143
+
144
+ pipeline.addTableProps({
145
+ onMouseDown: onMouseDown,
146
+ onKeyDown: onKeyDown,
147
+ tabIndex: -1
148
+ }); // todo: 后面可以把mousedown放到一个流里面
149
+
150
+ return pipeline.mapColumns(makeRecursiveMapper(function (col) {
151
+ var _context;
152
+
153
+ var rangeSelection = pipeline.getStateAtKey(rangeSelectionKey);
154
+ if (!rangeSelection || _findIndexInstanceProperty(_context = rangeSelection.columns).call(_context, function (selectedCol) {
155
+ return selectedCol.code === col.code;
156
+ }) === -1) return col;
157
+ var prevGetCellProps = col.getCellProps;
158
+ return _extends(_extends({}, col), {
159
+ getCellProps: function getCellProps(value, record, rowIndex) {
160
+ var _cx;
161
+
162
+ var prevCellProps = prevGetCellProps === null || prevGetCellProps === void 0 ? void 0 : prevGetCellProps(value, record, rowIndex);
163
+ var startRow = rangeSelection.startRow,
164
+ endRow = rangeSelection.endRow,
165
+ columns = rangeSelection.columns;
166
+ var startIndex = startRow < endRow ? startRow : endRow;
167
+ var endIndex = startRow < endRow ? endRow : startRow;
168
+ var startCol = columns[0];
169
+ var endCol = columns[columns.length - 1];
170
+ var match = rowIndex >= startIndex && rowIndex <= endIndex;
171
+ var className = cx((_cx = {}, _defineProperty(_cx, Classes.tableCellRangeSelected, match), _defineProperty(_cx, Classes.tableCellRangeTop, rowIndex === startIndex), _defineProperty(_cx, Classes.tableCellRangeLeft, col.code === startCol.code && match), _defineProperty(_cx, Classes.tableCellRangeBottom, rowIndex === endIndex), _defineProperty(_cx, Classes.tableCellRangeRight, col.code === endCol.code && match), _cx));
172
+ return mergeCellProps(prevCellProps, {
173
+ className: className
174
+ });
175
+ }
176
+ });
177
+ }));
178
+ };
179
+ }
180
+
181
+ function getTargetCell(target, columns) {
182
+ while (target) {
183
+ if (target.getAttribute('data-role') === 'table-cell') {
184
+ var _ret = function () {
185
+ var columnCode = target.getAttribute('data-code');
186
+ var column = findByTree(columns, function (item, index) {
187
+ return item.code === columnCode;
188
+ });
189
+ if (!column) return {
190
+ v: null
191
+ };
192
+ return {
193
+ v: {
194
+ rowIndex: parseInt(target.getAttribute('data-rowindex')),
195
+ rowSpan: parseInt(target.getAttribute('rowspan') || 1),
196
+ code: columnCode,
197
+ column: column
198
+ }
199
+ };
200
+ }();
201
+
202
+ if (_typeof(_ret) === "object") return _ret.v;
203
+ }
204
+
205
+ target = target.parentElement;
206
+ }
207
+
208
+ return null;
209
+ }
210
+
211
+ function isSameCell(cell1, cell2) {
212
+ return cell1.rowIndex === cell2.rowIndex && cell1.code === cell2.code;
213
+ }
214
+
215
+ function getRangeColumns(startCell, endCell, columns) {
216
+ var flatColumns = collectNodes(columns, 'leaf-only');
217
+
218
+ var startIndex = _findIndexInstanceProperty(flatColumns).call(flatColumns, function (col) {
219
+ return col.code === startCell.code;
220
+ });
221
+
222
+ var endIndex = _findIndexInstanceProperty(flatColumns).call(flatColumns, function (col) {
223
+ return col.code === endCell.code;
224
+ });
225
+
226
+ if (startIndex < endIndex) {
227
+ return _sliceInstanceProperty(flatColumns).call(flatColumns, startIndex, endIndex + 1);
228
+ } else {
229
+ return _sliceInstanceProperty(flatColumns).call(flatColumns, endIndex, startIndex + 1);
230
+ }
231
+ }