@hi-ui/menu 4.0.0-beta.3 → 4.0.0-beta.30

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.
@@ -36,7 +36,7 @@ var Expander = function Expander(_ref) {
36
36
  height = _useState[0],
37
37
  setHeight = _useState[1];
38
38
 
39
- return /*#__PURE__*/React__default['default'].createElement(reactTransitionGroup.CSSTransition, {
39
+ return /*#__PURE__*/React__default["default"].createElement(reactTransitionGroup.CSSTransition, {
40
40
  "in": visible,
41
41
  timeout: 200,
42
42
  classNames: className,
@@ -56,7 +56,7 @@ var Expander = function Expander(_ref) {
56
56
  setHeight(0);
57
57
  });
58
58
  }
59
- }, /*#__PURE__*/React__default['default'].createElement("div", {
59
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
60
60
  style: {
61
61
  height: height,
62
62
  overflow: 'hidden',
@@ -66,4 +66,3 @@ var Expander = function Expander(_ref) {
66
66
  };
67
67
 
68
68
  exports.Expander = Expander;
69
- //# sourceMappingURL=Expander.js.map
package/lib/cjs/Menu.js CHANGED
@@ -33,6 +33,18 @@ var util = require('./util.js');
33
33
 
34
34
  var useUncontrolledState = require('@hi-ui/use-uncontrolled-state');
35
35
 
36
+ var Tooltip = require('@hi-ui/tooltip');
37
+
38
+ var useToggle = require('@hi-ui/use-toggle');
39
+
40
+ var treeUtils = require('@hi-ui/tree-utils');
41
+
42
+ var typeAssertion = require('@hi-ui/type-assertion');
43
+
44
+ var useResizeObserver = require('@hi-ui/use-resize-observer');
45
+
46
+ var useMergeRefs = require('@hi-ui/use-merge-refs');
47
+
36
48
  function _interopDefaultLegacy(e) {
37
49
  return e && _typeof(e) === 'object' && 'default' in e ? e : {
38
50
  'default': e
@@ -41,86 +53,198 @@ function _interopDefaultLegacy(e) {
41
53
 
42
54
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
43
55
 
56
+ var Tooltip__default = /*#__PURE__*/_interopDefaultLegacy(Tooltip);
57
+
44
58
  var MENU_PREFIX = classname.getPrefixCls('menu');
59
+ var DEFAULT_EXPANDED_IDS = [];
60
+ var NOOP_ARRAY = [];
61
+ var MIN_WIDTH = 56;
45
62
  /**
46
63
  * TODO: What is Menu
47
64
  */
48
65
 
49
66
  var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
50
- var _cx;
51
-
52
67
  var _a$prefixCls = _a.prefixCls,
53
68
  prefixCls = _a$prefixCls === void 0 ? MENU_PREFIX : _a$prefixCls,
54
69
  _a$role = _a.role,
55
70
  role = _a$role === void 0 ? 'menu' : _a$role,
56
71
  className = _a.className,
57
- data = _a.data,
72
+ _a$data = _a.data,
73
+ data = _a$data === void 0 ? NOOP_ARRAY : _a$data,
58
74
  _a$placement = _a.placement,
59
75
  placement = _a$placement === void 0 ? 'vertical' : _a$placement,
60
- showCollapse = _a.showCollapse,
76
+ _a$showCollapse = _a.showCollapse,
77
+ showCollapse = _a$showCollapse === void 0 ? false : _a$showCollapse,
61
78
  _a$expandedType = _a.expandedType,
62
79
  expandedType = _a$expandedType === void 0 ? 'collapse' : _a$expandedType,
63
80
  _a$showAllSubMenus = _a.showAllSubMenus,
64
81
  showAllSubMenus = _a$showAllSubMenus === void 0 ? false : _a$showAllSubMenus,
65
- defaultExpandedIds = _a.defaultExpandedIds,
66
- defaultActiveId = _a.defaultActiveId,
67
- activeId = _a.activeId,
82
+ _a$defaultExpandedAll = _a.defaultExpandedAll,
83
+ defaultExpandedAll = _a$defaultExpandedAll === void 0 ? false : _a$defaultExpandedAll,
84
+ _a$defaultExpandedIds = _a.defaultExpandedIds,
85
+ defaultExpandedIds = _a$defaultExpandedIds === void 0 ? DEFAULT_EXPANDED_IDS : _a$defaultExpandedIds,
86
+ expandedIdsProp = _a.expandedIds,
87
+ onExpand = _a.onExpand,
88
+ _a$defaultActiveId = _a.defaultActiveId,
89
+ defaultActiveId = _a$defaultActiveId === void 0 ? '' : _a$defaultActiveId,
90
+ activeIdProp = _a.activeId,
68
91
  onClickSubMenu = _a.onClickSubMenu,
92
+ collapsed = _a.collapsed,
93
+ _a$defaultCollapsed = _a.defaultCollapsed,
94
+ defaultCollapsed = _a$defaultCollapsed === void 0 ? false : _a$defaultCollapsed,
95
+ onCollapse = _a.onCollapse,
96
+ footerRender = _a.footerRender,
69
97
  onClick = _a.onClick,
70
- rest = tslib.__rest(_a, ["prefixCls", "role", "className", "data", "placement", "showCollapse", "expandedType", "showAllSubMenus", "defaultExpandedIds", "defaultActiveId", "activeId", "onClickSubMenu", "onClick"]);
98
+ rest = tslib.__rest(_a, ["prefixCls", "role", "className", "data", "placement", "showCollapse", "expandedType", "showAllSubMenus", "defaultExpandedAll", "defaultExpandedIds", "expandedIds", "onExpand", "defaultActiveId", "activeId", "onClickSubMenu", "collapsed", "defaultCollapsed", "onCollapse", "footerRender", "onClick"]);
71
99
 
72
- var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultActiveId || '', activeId, onClick),
73
- _activeId = _useUncontrolledState[0],
100
+ var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultActiveId, activeIdProp, onClick),
101
+ activeId = _useUncontrolledState[0],
74
102
  updateActiveId = _useUncontrolledState[1];
75
103
 
76
- var _useState = React.useState(util.getAncestorIds(_activeId, data)),
104
+ var _useState = React.useState(function () {
105
+ return util.getAncestorIds(activeId, data);
106
+ }),
77
107
  activeParents = _useState[0],
78
108
  updateActiveParents = _useState[1];
79
109
 
80
110
  React.useEffect(function () {
81
- updateActiveParents(util.getAncestorIds(_activeId, data));
82
- }, [_activeId, data]);
111
+ updateActiveParents(util.getAncestorIds(activeId, data));
112
+ }, [activeId, data]);
83
113
 
84
- var _useState2 = React.useState(defaultExpandedIds || []),
85
- _expandedIds = _useState2[0],
86
- updateExpanedIds = _useState2[1];
114
+ var _useUncontrolledState2 = useUncontrolledState.useUncontrolledState(function () {
115
+ return defaultExpandedAll ? treeUtils.getTreeNodesWithChildren(data).map(function (node) {
116
+ return node.id;
117
+ }) : defaultExpandedIds;
118
+ }, expandedIdsProp, onExpand),
119
+ expandedIds = _useUncontrolledState2[0],
120
+ updateExpandedIds = _useUncontrolledState2[1];
87
121
 
88
- var clickMenu = React.useCallback(function (id) {
89
- updateActiveId(id);
122
+ var clickMenu = React.useCallback(function (id, raw) {
123
+ updateActiveId(id, raw);
90
124
  }, [updateActiveId]);
91
125
  var clickSubMenu = React.useCallback(function (id) {
92
- var expandedIds = _expandedIds.includes(id) ? _expandedIds.filter(function (expandedid) {
93
- return expandedid !== id;
94
- }) : _expandedIds.concat(id);
95
- updateExpanedIds(expandedIds);
126
+ var nextExpandedIds = expandedIds.includes(id) ? expandedIds.filter(function (expandedId) {
127
+ return expandedId !== id;
128
+ }) : expandedIds.concat(id);
129
+ updateExpandedIds(nextExpandedIds);
96
130
 
97
131
  if (onClickSubMenu) {
98
- onClickSubMenu(id, expandedIds);
132
+ onClickSubMenu(id, nextExpandedIds);
99
133
  }
100
- }, [onClickSubMenu, _expandedIds]);
134
+ }, [onClickSubMenu, expandedIds, updateExpandedIds]);
101
135
  var closePopper = React.useCallback(function (id) {
102
- updateExpanedIds(_expandedIds.filter(function (expandedid) {
103
- return expandedid !== id;
136
+ updateExpandedIds(expandedIds.filter(function (expandedId) {
137
+ return expandedId !== id;
104
138
  }));
105
- }, [_expandedIds]);
139
+ }, [expandedIds, updateExpandedIds]);
106
140
  var closeAllPopper = React.useCallback(function () {
107
- updateExpanedIds([]);
108
- }, []);
109
-
110
- var _useState3 = React.useState(false),
111
- mini = _useState3[0],
112
- setMini = _useState3[1];
113
-
114
- var cls = classname.cx(prefixCls, className, prefixCls + "--" + placement, (_cx = {}, _cx[prefixCls + "--mini"] = mini, _cx));
115
- var onToggle = React.useCallback(function () {
116
- setMini(!mini);
117
- closeAllPopper();
118
- }, [mini, closeAllPopper]);
119
- return /*#__PURE__*/React__default['default'].createElement("div", Object.assign({
120
- ref: ref,
141
+ updateExpandedIds([]);
142
+ }, [updateExpandedIds]);
143
+
144
+ var _useUncontrolledToggl = useToggle.useUncontrolledToggle({
145
+ defaultVisible: defaultCollapsed,
146
+ visible: collapsed,
147
+ onToggle: onCollapse
148
+ }),
149
+ mini = _useUncontrolledToggl[0],
150
+ miniToggleAction = _useUncontrolledToggl[1];
151
+
152
+ var showVertical = placement === 'vertical';
153
+ var canToggle = showVertical && showCollapse;
154
+ var showMini = showVertical && mini;
155
+
156
+ var _useState2 = React.useState(null),
157
+ containerElement = _useState2[0],
158
+ setContainerElement = _useState2[1];
159
+
160
+ var _useState3 = React.useState(),
161
+ _useState3$ = _useState3[0],
162
+ containerWidth = _useState3$ === void 0 ? 0 : _useState3$,
163
+ setContainerWidth = _useState3[1];
164
+
165
+ useResizeObserver.useResizeObserver({
166
+ element: containerElement,
167
+ disabled: showVertical,
168
+ getSize: function getSize(element) {
169
+ var itemRect = element.getBoundingClientRect();
170
+ return itemRect.width;
171
+ },
172
+ onResize: function onResize(el, width) {
173
+ setContainerWidth(width);
174
+ }
175
+ });
176
+
177
+ var _useState4 = React.useState(0),
178
+ tagMaxCount = _useState4[0],
179
+ setTagMaxCount = _useState4[1];
180
+
181
+ var mergedTagList = React.useMemo(function () {
182
+ if (showVertical) return data;
183
+ if (containerWidth < MIN_WIDTH) return data;
184
+ return data.slice(0, Math.min(data.length, containerWidth / MIN_WIDTH));
185
+ }, [showVertical, data, containerWidth]);
186
+ var restTagList = React.useMemo(function () {
187
+ if (tagMaxCount > 0) return data.slice(tagMaxCount);
188
+ return [];
189
+ }, [data, tagMaxCount]);
190
+ var getTagWidth = React.useCallback(function (index) {
191
+ if (!containerElement) return MIN_WIDTH;
192
+ var elements = containerElement.getElementsByClassName('hi-v4-menu-item');
193
+ var element = elements && elements[index];
194
+ if (!element) return MIN_WIDTH;
195
+ return element.getBoundingClientRect().width;
196
+ }, [containerElement]);
197
+ React.useLayoutEffect(function () {
198
+ if (showVertical) return;
199
+ var tagMaxCount = 0;
200
+
201
+ if (typeAssertion.isArrayNonEmpty(mergedTagList)) {
202
+ var len = mergedTagList.length;
203
+ var lastIndex = len - 1;
204
+ var totalWidth = 72; // 更多
205
+
206
+ for (var i = 0; i < len; ++i) {
207
+ var currentTagWidth = getTagWidth(i);
208
+
209
+ if (currentTagWidth === undefined) {
210
+ break;
211
+ }
212
+
213
+ totalWidth += currentTagWidth;
214
+
215
+ if (lastIndex === 0 && totalWidth <= containerWidth || i === lastIndex - 1 && totalWidth + getTagWidth(lastIndex) <= containerWidth) {
216
+ tagMaxCount = lastIndex;
217
+ break;
218
+ } else if (totalWidth > containerWidth) {
219
+ tagMaxCount = i - 1;
220
+ break;
221
+ }
222
+ }
223
+ } else {
224
+ tagMaxCount = 0;
225
+ } // 保底要展示 1 个
226
+
227
+
228
+ setTagMaxCount(typeAssertion.isArrayNonEmpty(mergedTagList) && tagMaxCount < 1 ? 1 : tagMaxCount + 1);
229
+ }, [showVertical, getTagWidth, containerWidth, mergedTagList]);
230
+
231
+ var renderFooter = function renderFooter() {
232
+ var collapseNode = canToggle ? /*#__PURE__*/React__default["default"].createElement("div", {
233
+ className: classname.cx(prefixCls + "__toggle"),
234
+ onClick: miniToggleAction.not
235
+ }, mini ? /*#__PURE__*/React__default["default"].createElement(icons.MenuUnfoldOutlined, null) : /*#__PURE__*/React__default["default"].createElement(icons.MenuFoldOutlined, null)) : null;
236
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, typeAssertion.isFunction(footerRender) ? footerRender({
237
+ collapsed: showMini,
238
+ collapseNode: collapseNode
239
+ }) : collapseNode);
240
+ };
241
+
242
+ var cls = classname.cx(prefixCls, className, prefixCls + "--" + placement, mini && prefixCls + "--mini", (expandedType === 'pop' || showAllSubMenus || mini) && prefixCls + "--popup");
243
+ return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
244
+ ref: useMergeRefs.useMergeRefs(ref, setContainerElement),
121
245
  role: role,
122
246
  className: cls
123
- }, rest), /*#__PURE__*/React__default['default'].createElement(context['default'].Provider, {
247
+ }, rest), /*#__PURE__*/React__default["default"].createElement(context["default"].Provider, {
124
248
  value: {
125
249
  placement: placement,
126
250
  expandedType: expandedType,
@@ -131,25 +255,55 @@ var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
131
255
  closePopper: closePopper,
132
256
  closeAllPopper: closeAllPopper,
133
257
  activeParents: activeParents,
134
- activeId: _activeId,
135
- expandedIds: _expandedIds
258
+ activeId: activeId,
259
+ expandedIds: expandedIds
136
260
  }
137
- }, /*#__PURE__*/React__default['default'].createElement("ul", {
261
+ }, /*#__PURE__*/React__default["default"].createElement("ul", {
138
262
  className: classname.cx(prefixCls + "__wrapper")
139
- }, data.map(function (d) {
140
- return /*#__PURE__*/React__default['default'].createElement(MenuItem.MenuItem, Object.assign({}, d, {
141
- key: d.id,
142
- level: 1
263
+ }, mergedTagList.map(function (item, index) {
264
+ return showMini ? /*#__PURE__*/React__default["default"].createElement(Tooltip__default["default"], {
265
+ title: item.title,
266
+ key: item.id,
267
+ placement: "right"
268
+ }, /*#__PURE__*/React__default["default"].createElement(MenuItem.MenuItem, Object.assign({}, item, {
269
+ level: 1,
270
+ render: renderMenuItemMini,
271
+ raw: item
272
+ }))) : /*#__PURE__*/React__default["default"].createElement(MenuItem.MenuItem, Object.assign({
273
+ hidden: !showVertical && index >= tagMaxCount
274
+ }, item, {
275
+ key: item.id,
276
+ level: 1,
277
+ raw: item
143
278
  }));
144
- })), placement === 'vertical' && showCollapse && /*#__PURE__*/React__default['default'].createElement("div", {
145
- className: classname.cx(prefixCls + "__toggle"),
146
- onClick: onToggle
147
- }, mini ? /*#__PURE__*/React__default['default'].createElement(icons.MenuUnfoldOutlined, null) : /*#__PURE__*/React__default['default'].createElement(icons.MenuFoldOutlined, null))));
279
+ }), /*#__PURE__*/React__default["default"].createElement(MenuItem.MenuItem, {
280
+ hidden: showVertical || restTagList.length === 0,
281
+ id: "hi-v4-menu-more",
282
+ title: "\u66F4\u591A",
283
+ children: restTagList
284
+ })), /*#__PURE__*/React__default["default"].createElement("div", {
285
+ className: prefixCls + "__footer"
286
+ }, renderFooter())));
148
287
  });
149
288
 
150
289
  if (env.__DEV__) {
151
290
  Menu.displayName = 'Menu';
152
291
  }
292
+ /**
293
+ * Mini 模式下渲染 item
294
+ */
295
+
296
+
297
+ var renderMenuItemMini = function renderMenuItemMini(menu) {
298
+ if (typeof menu.icon !== 'undefined') {
299
+ return menu.icon;
300
+ }
301
+
302
+ if (typeof menu.title === 'string') {
303
+ return menu.title.substring(0, 1);
304
+ }
305
+
306
+ return menu.title;
307
+ };
153
308
 
154
309
  exports.Menu = Menu;
155
- //# sourceMappingURL=Menu.js.map