@hi-ui/tabs 4.1.6 → 5.0.0-alpha.0

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 (35) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/lib/cjs/TabInk.js +10 -1
  3. package/lib/cjs/TabItem.js +131 -18
  4. package/lib/cjs/TabList.js +184 -12
  5. package/lib/cjs/TabPane.js +7 -3
  6. package/lib/cjs/Tabs.js +17 -2
  7. package/lib/cjs/hooks/index.js +8 -3
  8. package/lib/cjs/hooks/use-id/lib/esm/index.js +34 -0
  9. package/lib/cjs/hooks/use-id/node_modules/uuid/dist/esm-browser/regex.js +16 -0
  10. package/lib/cjs/hooks/use-id/node_modules/uuid/dist/esm-browser/rng.js +33 -0
  11. package/lib/cjs/hooks/use-id/node_modules/uuid/dist/esm-browser/stringify.js +41 -0
  12. package/lib/cjs/hooks/use-id/node_modules/uuid/dist/esm-browser/v4.js +33 -0
  13. package/lib/cjs/hooks/use-id/node_modules/uuid/dist/esm-browser/validate.js +19 -0
  14. package/lib/cjs/styles/index.scss.js +1 -1
  15. package/lib/cjs/utils/index.js +7 -2
  16. package/lib/esm/TabInk.js +10 -1
  17. package/lib/esm/TabItem.js +131 -19
  18. package/lib/esm/TabList.js +184 -13
  19. package/lib/esm/TabPane.js +7 -3
  20. package/lib/esm/Tabs.js +17 -2
  21. package/lib/esm/hooks/index.js +8 -3
  22. package/lib/esm/hooks/use-id/lib/esm/index.js +29 -0
  23. package/lib/esm/hooks/use-id/node_modules/uuid/dist/esm-browser/regex.js +11 -0
  24. package/lib/esm/hooks/use-id/node_modules/uuid/dist/esm-browser/rng.js +27 -0
  25. package/lib/esm/hooks/use-id/node_modules/uuid/dist/esm-browser/stringify.js +36 -0
  26. package/lib/esm/hooks/use-id/node_modules/uuid/dist/esm-browser/v4.js +28 -0
  27. package/lib/esm/hooks/use-id/node_modules/uuid/dist/esm-browser/validate.js +14 -0
  28. package/lib/esm/styles/index.scss.js +1 -1
  29. package/lib/esm/utils/index.js +7 -2
  30. package/lib/types/TabInk.d.ts +1 -0
  31. package/lib/types/TabItem.d.ts +12 -2
  32. package/lib/types/TabList.d.ts +31 -2
  33. package/lib/types/TabPane.d.ts +5 -0
  34. package/lib/types/Tabs.d.ts +31 -2
  35. package/package.json +16 -13
package/CHANGELOG.md CHANGED
@@ -1,5 +1,61 @@
1
1
  # @hi-ui/tabs
2
2
 
3
+ ## 5.0.0-alpha.0
4
+
5
+ ### Major Changes
6
+
7
+ - 1b05b44a4: feat: 组件的 package.json 中的 exports 统一加上 types 配置 (5.0)
8
+
9
+ ### Minor Changes
10
+
11
+ - abebb5eed: feat(tabs): 支持拖拽 (5.0)
12
+ - 58bef969c: <br>
13
+ - feat(tabs): 增加 size 参数 (5.0)
14
+ - feat(tabs): 修改标签选中下标样式 (5.0)
15
+ - 1517a3349: feat(tabs): 支持编辑功能和设置最大标题宽度 (5.0)
16
+ - 9f2b6bab4: feat(tabs): add editRender api (5.0)
17
+ - 5de7a848b: feat(tabs): 增加 showDivider 参数 (5.0)
18
+
19
+ ### Patch Changes
20
+
21
+ - 36bb992d3: style: 修改 UI 问题 (5.0)
22
+ - 61d132802: build: 将 package.json 中 exports 配置中的 types 配置放在最上面 (5.0)
23
+ - b7ad460d8: style: 修改 UI (5.0)
24
+ - Updated dependencies [7bda04e64]
25
+ - Updated dependencies [77ed66eac]
26
+ - Updated dependencies [ddd2acc79]
27
+ - Updated dependencies [5de7a848b]
28
+ - Updated dependencies [1b05b44a4]
29
+ - Updated dependencies [0cd15438e]
30
+ - Updated dependencies [eb69f0baa]
31
+ - Updated dependencies [a01771e8d]
32
+ - Updated dependencies [5de7a848b]
33
+ - Updated dependencies [77ed66eac]
34
+ - Updated dependencies [632dbda3a]
35
+ - Updated dependencies [1b51c1bbe]
36
+ - Updated dependencies [61d132802]
37
+ - Updated dependencies [6ebf40f96]
38
+ - Updated dependencies [6eac4b78b]
39
+ - Updated dependencies [c125e4c48]
40
+ - @hi-ui/input@5.0.0-alpha.0
41
+ - @hi-ui/tooltip@5.0.0-alpha.0
42
+ - @hi-ui/core@5.0.0-alpha.0
43
+ - @hi-ui/use-latest@5.0.0-alpha.0
44
+ - @hi-ui/use-uncontrolled-state@5.0.0-alpha.0
45
+ - @hi-ui/use-unmount-effect@5.0.0-alpha.0
46
+ - @hi-ui/icons@5.0.0-alpha.0
47
+ - @hi-ui/icon-button@5.0.0-alpha.0
48
+ - @hi-ui/classname@5.0.0-alpha.0
49
+ - @hi-ui/env@5.0.0-alpha.0
50
+ - @hi-ui/react-utils@5.0.0-alpha.0
51
+ - @hi-ui/type-assertion@5.0.0-alpha.0
52
+
53
+ ## 4.2.0
54
+
55
+ ### Minor Changes
56
+
57
+ - [#3211](https://github.com/XiaoMi/hiui/pull/3211) [`7e21457`](https://github.com/XiaoMi/hiui/commit/7e2145754dcc7a94d0f8219ee720657a0693acc3) Thanks [@zyprepare](https://github.com/zyprepare)! - feat(tabs): 增加 TabPane 组件的 preload 属性以支持内容预加载 (#3210)
58
+
3
59
  ## 4.1.6
4
60
 
5
61
  ### Patch Changes
package/lib/cjs/TabInk.js CHANGED
@@ -29,7 +29,8 @@ var TabInk = function TabInk(_ref) {
29
29
  activeItemElement = _ref.activeItemElement,
30
30
  activeTabId = _ref.activeTabId,
31
31
  getTabOffset = _ref.getTabOffset,
32
- showHorizontal = _ref.showHorizontal;
32
+ showHorizontal = _ref.showHorizontal,
33
+ containerElement = _ref.containerElement;
33
34
  var inkRef = React.useRef(null);
34
35
  var setTabLnkPositionStyle = React.useCallback(function () {
35
36
  if (!inkRef.current) return;
@@ -75,6 +76,14 @@ var TabInk = function TabInk(_ref) {
75
76
  },
76
77
  onResize: setTabLnkPositionStyle
77
78
  });
79
+ index.useResizeObserver({
80
+ element: containerElement,
81
+ getSize: function getSize(element) {
82
+ var itemRect = element.getBoundingClientRect();
83
+ return showHorizontal ? itemRect.width : itemRect.height;
84
+ },
85
+ onResize: setTabLnkPositionStyle
86
+ });
78
87
  return /*#__PURE__*/React__default["default"].createElement("div", {
79
88
  className: classname.cx(prefixCls + "__ink", (_cx = {}, _cx[prefixCls + "__ink--disabled"] = disabled, _cx)),
80
89
  ref: inkRef
@@ -13,28 +13,37 @@ var _typeof = require("@babel/runtime/helpers/typeof");
13
13
  Object.defineProperty(exports, '__esModule', {
14
14
  value: true
15
15
  });
16
+ var _regeneratorRuntime = require('@babel/runtime/regenerator');
17
+ var tslib = require('tslib');
16
18
  var React = require('react');
17
19
  var classname = require('@hi-ui/classname');
18
20
  var env = require('@hi-ui/env');
19
21
  var icons = require('@hi-ui/icons');
22
+ var input = require('@hi-ui/input');
23
+ var tooltip = require('@hi-ui/tooltip');
20
24
  function _interopDefaultCompat(e) {
21
25
  return e && _typeof(e) === 'object' && 'default' in e ? e : {
22
26
  'default': e
23
27
  };
24
28
  }
29
+ var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultCompat(_regeneratorRuntime);
25
30
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
26
31
  var TabItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
27
32
  var _cx;
28
33
  var className = _ref.className,
29
34
  style = _ref.style,
30
35
  disabled = _ref.disabled,
31
- tabTitle = _ref.tabTitle,
36
+ tabTitleProp = _ref.tabTitle,
32
37
  tabDesc = _ref.tabDesc,
33
38
  prefixCls = _ref.prefixCls,
34
39
  tabId = _ref.tabId,
35
40
  onTabClick = _ref.onTabClick,
36
41
  active = _ref.active,
37
42
  editable = _ref.editable,
43
+ editingProp = _ref.editing,
44
+ editRender = _ref.editRender,
45
+ onEdit = _ref.onEdit,
46
+ onCopy = _ref.onCopy,
38
47
  onDelete = _ref.onDelete,
39
48
  index = _ref.index,
40
49
  _onDragStart = _ref.onDragStart,
@@ -48,25 +57,119 @@ var TabItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
48
57
  _ref$closeable = _ref.closeable,
49
58
  closeable = _ref$closeable === void 0 ? true : _ref$closeable,
50
59
  _ref$direction = _ref.direction,
51
- layout = _ref$direction === void 0 ? 'horizontal' : _ref$direction;
60
+ layout = _ref$direction === void 0 ? 'horizontal' : _ref$direction,
61
+ maxTitleWidth = _ref.maxTitleWidth;
62
+ var _a, _b;
52
63
  var _useState = React.useState(null),
53
64
  dragId = _useState[0],
54
65
  setDragId = _useState[1];
55
66
  var _useState2 = React.useState(null),
56
67
  direction = _useState2[0],
57
68
  setDirection = _useState2[1];
69
+ var _useState3 = React.useState(editingProp),
70
+ editing = _useState3[0],
71
+ setEditing = _useState3[1];
72
+ var _useState4 = React.useState(tabTitleProp),
73
+ tabTitle = _useState4[0],
74
+ setTabTitle = _useState4[1];
75
+ var titleRef = React.useRef(null);
76
+ React.useEffect(function () {
77
+ setEditing(editingProp);
78
+ }, [editingProp]);
79
+ React.useEffect(function () {
80
+ setTabTitle(tabTitleProp);
81
+ }, [tabTitleProp]);
58
82
  var _onClick = React.useCallback(function (e) {
59
83
  if (onTabClick) {
60
84
  onTabClick(tabId, e);
61
85
  }
62
86
  }, [onTabClick, tabId]);
63
- return /*#__PURE__*/React__default["default"].createElement("div", {
87
+ var handleEditDone = React.useCallback(function (evt) {
88
+ return tslib.__awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee() {
89
+ var value, newTitle, result;
90
+ return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) {
91
+ while (1) {
92
+ switch (_context.prev = _context.next) {
93
+ case 0:
94
+ value = evt.target.value;
95
+ newTitle = value;
96
+ if (!value) {
97
+ newTitle = tabTitleProp;
98
+ } else {
99
+ newTitle = value;
100
+ }
101
+ setTabTitle(newTitle);
102
+ _context.next = 6;
103
+ return onEdit === null || onEdit === void 0 ? void 0 : onEdit(newTitle);
104
+ case 6:
105
+ result = _context.sent;
106
+ if (!(result === false)) {
107
+ _context.next = 9;
108
+ break;
109
+ }
110
+ return _context.abrupt("return");
111
+ case 9:
112
+ setEditing(false);
113
+ onTabClick === null || onTabClick === void 0 ? void 0 : onTabClick(tabId, evt);
114
+ case 11:
115
+ case "end":
116
+ return _context.stop();
117
+ }
118
+ }
119
+ }, _callee);
120
+ }));
121
+ }, [onEdit, onTabClick, tabId, tabTitleProp]);
122
+ var renderEditor = React.useMemo(function () {
123
+ if (editable) {
124
+ if (editRender && active) {
125
+ return editRender({
126
+ tabId: tabId,
127
+ tabTitle: tabTitle
128
+ }, index, {
129
+ copy: function copy(targetIndex) {
130
+ return onCopy === null || onCopy === void 0 ? void 0 : onCopy(targetIndex);
131
+ },
132
+ edit: function edit() {
133
+ return setEditing(true);
134
+ },
135
+ "delete": function _delete() {
136
+ return onDelete === null || onDelete === void 0 ? void 0 : onDelete({
137
+ tabId: tabId,
138
+ tabTitle: tabTitle
139
+ }, {});
140
+ }
141
+ });
142
+ }
143
+ if (closeable && !editRender) {
144
+ return /*#__PURE__*/React__default["default"].createElement("span", {
145
+ className: prefixCls + "__close-btn",
146
+ onClick: function onClick(evt) {
147
+ evt.stopPropagation();
148
+ if (onDelete) {
149
+ onDelete({
150
+ tabId: tabId,
151
+ tabTitle: tabTitle
152
+ }, evt);
153
+ }
154
+ }
155
+ }, /*#__PURE__*/React__default["default"].createElement(icons.CloseOutlined, null));
156
+ }
157
+ }
158
+ return null;
159
+ }, [active, closeable, editRender, editable, index, onCopy, onDelete, prefixCls, tabId, tabTitle]);
160
+ return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
64
161
  style: style,
65
162
  className: classname.cx(prefixCls + "__item", className, (_cx = {}, _cx[prefixCls + "__item--active"] = active, _cx[prefixCls + "__item--disabled"] = disabled, _cx[prefixCls + "__item--" + direction] = direction, _cx)),
66
163
  ref: ref,
67
164
  draggable: draggable,
68
165
  tabIndex: disabled ? 0 : -1,
69
- onClick: disabled ? undefined : _onClick,
166
+ onClick: disabled ? undefined : _onClick
167
+ }, editable ? {
168
+ onDoubleClick: function onDoubleClick(e) {
169
+ e.stopPropagation();
170
+ setEditing(true);
171
+ }
172
+ } : {}, {
70
173
  onDragStart: function onDragStart(e) {
71
174
  e.stopPropagation();
72
175
  e.dataTransfer.setData('tab', JSON.stringify({
@@ -154,22 +257,32 @@ var TabItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
154
257
  });
155
258
  }
156
259
  }
157
- }, /*#__PURE__*/React__default["default"].createElement("span", {
158
- className: prefixCls + "-item__title"
159
- }, tabTitle), type === 'desc' && /*#__PURE__*/React__default["default"].createElement("span", {
160
- className: prefixCls + "-item__desc"
161
- }, tabDesc), editable && closeable && ( /*#__PURE__*/React__default["default"].createElement("span", {
162
- className: prefixCls + "__close-btn",
163
- onClick: function onClick(e) {
164
- e.stopPropagation();
165
- if (onDelete) {
166
- onDelete({
167
- tabId: tabId,
168
- tabTitle: tabTitle
169
- }, index);
260
+ }), editing ? ( /*#__PURE__*/React__default["default"].createElement("div", {
261
+ className: prefixCls + "__edit-input"
262
+ }, /*#__PURE__*/React__default["default"].createElement(input.Input, {
263
+ value: tabTitle,
264
+ autoFocus: true,
265
+ onBlur: handleEditDone,
266
+ onKeyDown: function onKeyDown(evt) {
267
+ if (evt.key === 'Enter') {
268
+ handleEditDone(evt);
170
269
  }
270
+ },
271
+ onChange: function onChange(e) {
272
+ setTabTitle(e.target.value);
171
273
  }
172
- }, /*#__PURE__*/React__default["default"].createElement(icons.CloseOutlined, null))));
274
+ }))) : ( /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(tooltip.Tooltip, {
275
+ title: tabTitle,
276
+ disabled: !maxTitleWidth || ((_b = (_a = titleRef.current) === null || _a === void 0 ? void 0 : _a.offsetWidth) !== null && _b !== void 0 ? _b : 0) < maxTitleWidth
277
+ }, /*#__PURE__*/React__default["default"].createElement("span", {
278
+ ref: titleRef,
279
+ className: prefixCls + "-item__title",
280
+ style: {
281
+ maxWidth: maxTitleWidth
282
+ }
283
+ }, tabTitle)), type === 'desc' && /*#__PURE__*/React__default["default"].createElement("span", {
284
+ className: prefixCls + "-item__desc"
285
+ }, tabDesc), renderEditor)));
173
286
  });
174
287
  if (env.__DEV__) {
175
288
  TabItem.displayName = 'TabItem';
@@ -13,6 +13,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
13
13
  Object.defineProperty(exports, '__esModule', {
14
14
  value: true
15
15
  });
16
+ var _regeneratorRuntime = require('@babel/runtime/regenerator');
16
17
  var tslib = require('tslib');
17
18
  var React = require('react');
18
19
  var env = require('@hi-ui/env');
@@ -26,16 +27,19 @@ var iconButton = require('@hi-ui/icon-button');
26
27
  var index = require('./hooks/index.js');
27
28
  var useLatest = require('@hi-ui/use-latest');
28
29
  var index$1 = require('./utils/index.js');
30
+ var input = require('@hi-ui/input');
31
+ var index$2 = require('./hooks/use-id/lib/esm/index.js');
29
32
  function _interopDefaultCompat(e) {
30
33
  return e && _typeof(e) === 'object' && 'default' in e ? e : {
31
34
  'default': e
32
35
  };
33
36
  }
37
+ var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultCompat(_regeneratorRuntime);
34
38
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
35
39
  var _role = 'tabs';
36
40
  var _prefix = classname.getPrefixCls(_role);
37
41
  var TabList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
38
- var _cx;
42
+ var _cx, _cx2, _cx3, _cx4;
39
43
  var _b;
40
44
  var data = _a.data,
41
45
  className = _a.className,
@@ -50,8 +54,12 @@ var TabList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
50
54
  _a$placement = _a.placement,
51
55
  placement = _a$placement === void 0 ? 'horizontal' : _a$placement,
52
56
  editable = _a.editable,
57
+ editRender = _a.editRender,
53
58
  onAdd = _a.onAdd,
59
+ onAdded = _a.onAdded,
54
60
  onDelete = _a.onDelete,
61
+ onEdit = _a.onEdit,
62
+ onCopy = _a.onCopy,
55
63
  draggable = _a.draggable,
56
64
  onDragStart = _a.onDragStart,
57
65
  onDragOver = _a.onDragOver,
@@ -59,8 +67,12 @@ var TabList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
59
67
  onDragEnd = _a.onDragEnd,
60
68
  _a$type = _a.type,
61
69
  type = _a$type === void 0 ? 'line' : _a$type,
70
+ _a$size = _a.size,
71
+ size = _a$size === void 0 ? 'md' : _a$size,
72
+ showDivider = _a.showDivider,
62
73
  extra = _a.extra,
63
- rest = tslib.__rest(_a, ["data", "className", "style", "activeId", "defaultActiveId", "onChange", "onTabClick", "prefixCls", "direction", "placement", "editable", "onAdd", "onDelete", "draggable", "onDragStart", "onDragOver", "onDrop", "onDragEnd", "type", "extra"]);
74
+ maxTabTitleWidth = _a.maxTabTitleWidth,
75
+ rest = tslib.__rest(_a, ["data", "className", "style", "activeId", "defaultActiveId", "onChange", "onTabClick", "prefixCls", "direction", "placement", "editable", "editRender", "onAdd", "onAdded", "onDelete", "onEdit", "onCopy", "draggable", "onDragStart", "onDragOver", "onDrop", "onDragEnd", "type", "size", "showDivider", "extra", "maxTabTitleWidth"]);
64
76
  var direction = (_b = placement !== null && placement !== void 0 ? placement : directionProp) !== null && _b !== void 0 ? _b : 'horizontal';
65
77
  var _useUncontrolledState = useUncontrolledState.useUncontrolledState(function () {
66
78
  if (typeAssertion.isUndef(defaultActiveId)) {
@@ -174,13 +186,135 @@ var TabList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
174
186
  setActiveTabId(tabId);
175
187
  syncScrollPosition(tabId);
176
188
  });
189
+ var _useState6 = React.useState(false),
190
+ adding = _useState6[0],
191
+ setAdding = _useState6[1];
192
+ var _useState7 = React.useState(data),
193
+ showData = _useState7[0],
194
+ setShowData = _useState7[1];
195
+ var addInputRef = React.useRef(null);
196
+ React.useEffect(function () {
197
+ setShowData(data);
198
+ }, [data]);
199
+ var handleAdd = useLatest.useLatestCallback(function () {
200
+ onAdd === null || onAdd === void 0 ? void 0 : onAdd();
201
+ setAdding(true);
202
+ });
203
+ var handleAddDone = useLatest.useLatestCallback(function (evt) {
204
+ return tslib.__awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee() {
205
+ var newTabTitle, newTabId, newTab, result;
206
+ return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) {
207
+ while (1) {
208
+ switch (_context.prev = _context.next) {
209
+ case 0:
210
+ newTabTitle = evt.target.value;
211
+ if (newTabTitle) {
212
+ _context.next = 4;
213
+ break;
214
+ }
215
+ setAdding(false);
216
+ return _context.abrupt("return");
217
+ case 4:
218
+ newTabId = index$2.uuid();
219
+ newTab = {
220
+ tabId: newTabId,
221
+ tabTitle: newTabTitle
222
+ };
223
+ _context.next = 8;
224
+ return onAdded === null || onAdded === void 0 ? void 0 : onAdded(newTab);
225
+ case 8:
226
+ result = _context.sent;
227
+ if (!(result === false)) {
228
+ _context.next = 11;
229
+ break;
230
+ }
231
+ return _context.abrupt("return");
232
+ case 11:
233
+ setActiveTabId(newTabId);
234
+ setAdding(false);
235
+ case 13:
236
+ case "end":
237
+ return _context.stop();
238
+ }
239
+ }
240
+ }, _callee);
241
+ }));
242
+ });
243
+ var handleEdit = useLatest.useLatestCallback(function (value, item) {
244
+ return tslib.__awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee2() {
245
+ var result;
246
+ return _regeneratorRuntime__default["default"].wrap(function _callee2$(_context2) {
247
+ while (1) {
248
+ switch (_context2.prev = _context2.next) {
249
+ case 0:
250
+ _context2.next = 2;
251
+ return onEdit === null || onEdit === void 0 ? void 0 : onEdit(value, item);
252
+ case 2:
253
+ result = _context2.sent;
254
+ if (!(result === false)) {
255
+ _context2.next = 5;
256
+ break;
257
+ }
258
+ return _context2.abrupt("return", false);
259
+ case 5:
260
+ syncScrollPosition(activeTabId);
261
+ return _context2.abrupt("return", true);
262
+ case 7:
263
+ case "end":
264
+ return _context2.stop();
265
+ }
266
+ }
267
+ }, _callee2);
268
+ }));
269
+ });
270
+ var handleDelete = useLatest.useLatestCallback(function (deletedNode, evt) {
271
+ return tslib.__awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee3() {
272
+ var result, nextTabId;
273
+ return _regeneratorRuntime__default["default"].wrap(function _callee3$(_context3) {
274
+ while (1) {
275
+ switch (_context3.prev = _context3.next) {
276
+ case 0:
277
+ _context3.next = 2;
278
+ return onDelete === null || onDelete === void 0 ? void 0 : onDelete(deletedNode, evt);
279
+ case 2:
280
+ result = _context3.sent;
281
+ if (!(result === false)) {
282
+ _context3.next = 5;
283
+ break;
284
+ }
285
+ return _context3.abrupt("return");
286
+ case 5:
287
+ nextTabId = index$1.getNextTabId(data, deletedNode.tabId === activeTabId ? activeTabId : deletedNode.tabId);
288
+ nextTabId && setActiveTabId(nextTabId);
289
+ nextTabId && syncScrollPosition(nextTabId);
290
+ case 8:
291
+ case "end":
292
+ return _context3.stop();
293
+ }
294
+ }
295
+ }, _callee3);
296
+ }));
297
+ });
298
+ var handleCopy = useLatest.useLatestCallback(function (targetIndex) {
299
+ var currentTab = showData.find(function (item) {
300
+ return item.tabId === activeTabId;
301
+ });
302
+ if (!currentTab) return;
303
+ var copiedTab = {
304
+ tabId: currentTab.tabId + "-" + index$2.uuid(),
305
+ tabTitle: currentTab.tabTitle
306
+ };
307
+ var insertIndex = targetIndex !== null && targetIndex !== void 0 ? targetIndex : showData.length;
308
+ var newItems = [].concat(showData.slice(0, insertIndex), [copiedTab], showData.slice(insertIndex));
309
+ onCopy === null || onCopy === void 0 ? void 0 : onCopy(currentTab, copiedTab, newItems);
310
+ });
177
311
  React.useEffect(function () {
178
312
  // activeId 受控模式下改变后,同步更新滚动位置
179
313
  initScrollPosition(activeId);
180
314
  }, [activeId, initScrollPosition]);
181
315
  return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
182
316
  style: style,
183
- className: classname.cx(prefixCls + "__list", prefixCls + "__list--placement-" + direction, (_cx = {}, _cx[prefixCls + "__list--" + type] = type, _cx), className),
317
+ className: classname.cx(prefixCls + "__list", prefixCls + "__list--placement-" + direction, (_cx = {}, _cx[prefixCls + "__list--type-" + type] = type, _cx), (_cx2 = {}, _cx2[prefixCls + "__list--size-" + size] = size, _cx2), (_cx3 = {}, _cx3[prefixCls + "__list--show-divider"] = showDivider, _cx3), (_cx4 = {}, _cx4[prefixCls + "__list--editable"] = editable, _cx4), className),
184
318
  ref: ref
185
319
  }, rest), showScrollBtn ? ( /*#__PURE__*/React__default["default"].createElement(iconButton.IconButton, {
186
320
  className: showHorizontal ? prefixCls + "__left-btn" : prefixCls + "__up-btn",
@@ -207,9 +341,9 @@ var TabList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
207
341
  style: showScrollBtn ? {
208
342
  transform: direction === 'horizontal' ? "translateX(" + translatePos + "px)" : "translateY(" + translatePos + "px)"
209
343
  } : undefined
210
- }, data.map(function (item, index) {
344
+ }, showData.map(function (item, index) {
211
345
  return /*#__PURE__*/React__default["default"].createElement(TabItem.TabItem, Object.assign({
212
- key: index
346
+ key: item.tabId
213
347
  }, item, {
214
348
  ref: function ref(node) {
215
349
  itemsRef.current["" + item.tabId] = node;
@@ -219,22 +353,56 @@ var TabList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
219
353
  index: index,
220
354
  active: activeTabId === item.tabId,
221
355
  prefixCls: prefixCls,
356
+ closeable: item.closeable !== undefined ? item.closeable && showData.length > 1 : showData.length > 1,
222
357
  draggable: draggable,
223
358
  onTabClick: onClickTab,
224
359
  editable: editable,
225
- onDelete: onDelete,
360
+ editRender: editRender,
361
+ onCopy: handleCopy,
362
+ onEdit: function onEdit(value) {
363
+ return tslib.__awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee4() {
364
+ return _regeneratorRuntime__default["default"].wrap(function _callee4$(_context4) {
365
+ while (1) {
366
+ switch (_context4.prev = _context4.next) {
367
+ case 0:
368
+ _context4.next = 2;
369
+ return handleEdit(value, item);
370
+ case 2:
371
+ return _context4.abrupt("return", _context4.sent);
372
+ case 3:
373
+ case "end":
374
+ return _context4.stop();
375
+ }
376
+ }
377
+ }, _callee4);
378
+ }));
379
+ },
380
+ onDelete: handleDelete,
226
381
  onDragStart: onDragStart,
227
382
  onDragOver: onDragOver,
228
383
  onDrop: onDrop,
229
384
  onDragEnd: onDragEnd,
230
- direction: direction
385
+ direction: direction,
386
+ maxTitleWidth: maxTabTitleWidth
231
387
  }));
232
- }), type === 'line' && data.some(function (item) {
388
+ }), adding ? ( /*#__PURE__*/React__default["default"].createElement("div", {
389
+ className: prefixCls + "__add-input",
390
+ ref: addInputRef
391
+ }, /*#__PURE__*/React__default["default"].createElement(input.Input, {
392
+ onBlur: handleAddDone,
393
+ autoFocus: true,
394
+ onKeyDown: function onKeyDown(evt) {
395
+ if (evt.key === 'Enter') {
396
+ handleAddDone(evt);
397
+ }
398
+ }
399
+ }))) : null, type === 'line' && showData.some(function (item) {
233
400
  return item.tabId === activeTabId;
234
401
  }) ? ( /*#__PURE__*/React__default["default"].createElement(TabInk.TabInk, {
235
402
  prefixCls: prefixCls,
236
403
  showHorizontal: showHorizontal,
237
404
  activeItemElement: itemsRef.current[activeTabId],
405
+ containerElement: scrollElement,
238
406
  activeTabId: activeTabId,
239
407
  getTabOffset: getTabOffset
240
408
  })) : null)), showScrollBtn ? ( /*#__PURE__*/React__default["default"].createElement(iconButton.IconButton, {
@@ -254,11 +422,15 @@ var TabList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
254
422
  return prev - moveWidth;
255
423
  });
256
424
  }
257
- })) : null, editable ? ( /*#__PURE__*/React__default["default"].createElement(iconButton.IconButton, {
425
+ })) : null, editable ? ( /*#__PURE__*/React__default["default"].createElement("div", {
426
+ className: prefixCls + "__add-btn-wrap"
427
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
428
+ className: prefixCls + "__add-btn"
429
+ }, /*#__PURE__*/React__default["default"].createElement(iconButton.IconButton, {
430
+ effect: true,
258
431
  icon: /*#__PURE__*/React__default["default"].createElement(icons.PlusOutlined, null),
259
- className: prefixCls + "__add-btn",
260
- onClick: onAdd
261
- })) : null, extra);
432
+ onClick: handleAdd
433
+ })))) : null, extra);
262
434
  });
263
435
  if (env.__DEV__) {
264
436
  TabList.displayName = 'TabList';
@@ -33,12 +33,16 @@ var TabPane = function TabPane(_a) {
33
33
  active = _a.active,
34
34
  _a$unmountOnInactive = _a.unmountOnInactive,
35
35
  unmountOnInactive = _a$unmountOnInactive === void 0 ? true : _a$unmountOnInactive,
36
- rest = tslib.__rest(_a, ["children", "className", "style", "active", "unmountOnInactive"]);
36
+ preload = _a.preload,
37
+ rest = tslib.__rest(_a, ["children", "className", "style", "active", "unmountOnInactive", "preload"]);
37
38
  var htmlProps = reactUtils.filterProps(rest, omitProps);
38
39
  var _React$useState = React__default["default"].useState(false),
39
40
  isLoaded = _React$useState[0],
40
41
  setIsLoaded = _React$useState[1];
41
42
  var childrenContentMemo = React__default["default"].useMemo(function () {
43
+ if (preload && !active && !isLoaded) {
44
+ return children;
45
+ }
42
46
  if (!unmountOnInactive) {
43
47
  if (active && !isLoaded) {
44
48
  setIsLoaded(true);
@@ -50,10 +54,10 @@ var TabPane = function TabPane(_a) {
50
54
  return children;
51
55
  }
52
56
  return null;
53
- }, [active, children, isLoaded, unmountOnInactive]);
57
+ }, [active, children, isLoaded, unmountOnInactive, preload]);
54
58
  return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
55
59
  style: style,
56
- className: classname.cx(className, !unmountOnInactive && !active && _prefix + "--hide")
60
+ className: classname.cx(className, !active && (preload || !unmountOnInactive) && _prefix + "--hide")
57
61
  }, htmlProps), childrenContentMemo);
58
62
  };
59
63
  exports.TabPane = TabPane;
package/lib/cjs/Tabs.js CHANGED
@@ -45,7 +45,11 @@ var Tabs = /*#__PURE__*/React.forwardRef(function (_a, ref) {
45
45
  editable = _a.editable,
46
46
  _a$placement = _a.placement,
47
47
  placement = _a$placement === void 0 ? 'horizontal' : _a$placement,
48
+ editRender = _a.editRender,
49
+ onEdit = _a.onEdit,
50
+ onCopy = _a.onCopy,
48
51
  onAdd = _a.onAdd,
52
+ onAdded = _a.onAdded,
49
53
  onDelete = _a.onDelete,
50
54
  _a$draggable = _a.draggable,
51
55
  draggable = _a$draggable === void 0 ? false : _a$draggable,
@@ -56,8 +60,12 @@ var Tabs = /*#__PURE__*/React.forwardRef(function (_a, ref) {
56
60
  style = _a.style,
57
61
  _a$type = _a.type,
58
62
  type = _a$type === void 0 ? 'line' : _a$type,
63
+ _a$size = _a.size,
64
+ size = _a$size === void 0 ? 'md' : _a$size,
65
+ showDivider = _a.showDivider,
66
+ maxTabTitleWidth = _a.maxTabTitleWidth,
59
67
  extra = _a.extra,
60
- rest = tslib.__rest(_a, ["prefixCls", "role", "className", "children", "defaultActiveId", "activeId", "onChange", "onTabClick", "editable", "placement", "onAdd", "onDelete", "draggable", "onDragStart", "onDragOver", "onDragEnd", "onDrop", "style", "type", "extra"]);
68
+ rest = tslib.__rest(_a, ["prefixCls", "role", "className", "children", "defaultActiveId", "activeId", "onChange", "onTabClick", "editable", "placement", "editRender", "onEdit", "onCopy", "onAdd", "onAdded", "onDelete", "draggable", "onDragStart", "onDragOver", "onDragEnd", "onDrop", "style", "type", "size", "showDivider", "maxTabTitleWidth", "extra"]);
61
69
  var tabList = React.useMemo(function () {
62
70
  var list = [];
63
71
  React__default["default"].Children.map(children, function (child) {
@@ -102,15 +110,22 @@ var Tabs = /*#__PURE__*/React.forwardRef(function (_a, ref) {
102
110
  onTabClick: onTabClick,
103
111
  placement: placement,
104
112
  editable: editable,
113
+ editRender: editRender,
114
+ onEdit: onEdit,
115
+ onCopy: onCopy,
105
116
  onAdd: onAdd,
117
+ onAdded: onAdded,
106
118
  onDelete: onDelete,
107
119
  draggable: draggable,
108
120
  onDragEnd: onDragEnd,
109
121
  onDragOver: onDragOver,
110
122
  onDrop: onDrop,
111
123
  type: type,
124
+ size: size,
125
+ showDivider: showDivider,
112
126
  onDragStart: onDragStart,
113
- extra: extra
127
+ extra: extra,
128
+ maxTabTitleWidth: maxTabTitleWidth
114
129
  }), /*#__PURE__*/React__default["default"].createElement("div", {
115
130
  className: _prefix + "__content"
116
131
  }, React__default["default"].Children.map(children, function (child) {