@hi-ui/menu 4.3.1 → 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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,88 @@
1
1
  # @hi-ui/menu
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
+ - a1ad318d9: feat(menu): 增加 GroupMenu 和 SideMenu 组件 (5.0)
12
+ - d9b2b928c: feat(menu): GroupMenu 组件增加 titleRender 参数 (5.0)
13
+ - 2fec303ab: feat(menu): add showTitleOnMini api (5.0)
14
+ - 0d2737b09: chore(menu): 增加变更记录文件 (5.0)
15
+
16
+ ### Patch Changes
17
+
18
+ - 5de7a848b: chore: 将代码中 v4 改为 v5 (5.0)
19
+ - 307f68517: <br />
20
+ - perf(layout): 优化导航菜单交互体验 (5.0)
21
+ - perf(menu): 优化搜索菜单组件的样式和交互逻辑 & 修改分组菜单样式问题 (5.0)
22
+ - 8116f0304: fix: 修改 UI 问题 (5.0)
23
+ - 46dbd140f: style(layout): 修改 Sider 收起时宽度为 60px & 增加 width 参数 (5.0)
24
+ - 300d1573a: perf(layout&menu): 优化 FloatMenuContainer 组件的折叠逻辑 & 修改 SideMenu 组件 hover 样式 (5.0)
25
+ - 7f8760993: style(menu): 优化 GroupMenu 组件的样式和交互逻辑 (5.0)
26
+ - 61d132802: build: 将 package.json 中 exports 配置中的 types 配置放在最上面 (5.0)
27
+ - Updated dependencies [abebb5eed]
28
+ - Updated dependencies [7bda04e64]
29
+ - Updated dependencies [77ed66eac]
30
+ - Updated dependencies [ddd2acc79]
31
+ - Updated dependencies [5de7a848b]
32
+ - Updated dependencies [1b05b44a4]
33
+ - Updated dependencies [0cd15438e]
34
+ - Updated dependencies [eb69f0baa]
35
+ - Updated dependencies [a01771e8d]
36
+ - Updated dependencies [09451c7d9]
37
+ - Updated dependencies [67960d871]
38
+ - Updated dependencies [43da85a56]
39
+ - Updated dependencies [de7f92b26]
40
+ - Updated dependencies [8116f0304]
41
+ - Updated dependencies [85bb84874]
42
+ - Updated dependencies [5de7a848b]
43
+ - Updated dependencies [77ed66eac]
44
+ - Updated dependencies [632dbda3a]
45
+ - Updated dependencies [36bb992d3]
46
+ - Updated dependencies [1b51c1bbe]
47
+ - Updated dependencies [61d132802]
48
+ - Updated dependencies [6ebf40f96]
49
+ - Updated dependencies [9f2ee08cf]
50
+ - Updated dependencies [6eac4b78b]
51
+ - Updated dependencies [bcd3d08dd]
52
+ - Updated dependencies [4fb586f6f]
53
+ - Updated dependencies [c125e4c48]
54
+ - Updated dependencies [b7ad460d8]
55
+ - Updated dependencies [df25ec39b]
56
+ - @hi-ui/picker@5.0.0-alpha.0
57
+ - @hi-ui/input@5.0.0-alpha.0
58
+ - @hi-ui/tooltip@5.0.0-alpha.0
59
+ - @hi-ui/core@5.0.0-alpha.0
60
+ - @hi-ui/use-id@5.0.0-alpha.0
61
+ - @hi-ui/use-latest@5.0.0-alpha.0
62
+ - @hi-ui/use-merge-refs@5.0.0-alpha.0
63
+ - @hi-ui/use-outside-click@5.0.0-alpha.0
64
+ - @hi-ui/use-resize-observer@5.0.0-alpha.0
65
+ - @hi-ui/use-toggle@5.0.0-alpha.0
66
+ - @hi-ui/use-uncontrolled-state@5.0.0-alpha.0
67
+ - @hi-ui/icons@5.0.0-alpha.0
68
+ - @hi-ui/ellipsis-tooltip@5.0.0-alpha.0
69
+ - @hi-ui/highlighter@5.0.0-alpha.0
70
+ - @hi-ui/icon-button@5.0.0-alpha.0
71
+ - @hi-ui/popper@5.0.0-alpha.0
72
+ - @hi-ui/scrollbar@5.0.0-alpha.0
73
+ - @hi-ui/array-utils@5.0.0-alpha.0
74
+ - @hi-ui/classname@5.0.0-alpha.0
75
+ - @hi-ui/env@5.0.0-alpha.0
76
+ - @hi-ui/times@5.0.0-alpha.0
77
+ - @hi-ui/tree-utils@5.0.0-alpha.0
78
+ - @hi-ui/type-assertion@5.0.0-alpha.0
79
+
80
+ ## 4.3.2
81
+
82
+ ### Patch Changes
83
+
84
+ - [#3270](https://github.com/XiaoMi/hiui/pull/3270) [`9a241f9`](https://github.com/XiaoMi/hiui/commit/9a241f9ace65037a2dc6308566f1b36c2e1856a6) Thanks [@zyprepare](https://github.com/zyprepare)! - fix(menu): 添加国际化支持,更新“更多”菜单项的标题为本地化文本
85
+
3
86
  ## 4.3.1
4
87
 
5
88
  ### Patch Changes
@@ -0,0 +1,44 @@
1
+ /** @LICENSE
2
+ * @hi-ui/menu
3
+ * https://github.com/XiaoMi/hiui/tree/master/packages/ui/menu#readme
4
+ *
5
+ * Copyright (c) HiUI <mi-hiui@xiaomi.com>.
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */
10
+ 'use strict';
11
+
12
+ var _typeof = require("@babel/runtime/helpers/typeof");
13
+ Object.defineProperty(exports, '__esModule', {
14
+ value: true
15
+ });
16
+ var React = require('react');
17
+ function _interopDefaultCompat(e) {
18
+ return e && _typeof(e) === 'object' && 'default' in e ? e : {
19
+ 'default': e
20
+ };
21
+ }
22
+ var React__default = /*#__PURE__*/_interopDefaultCompat(React);
23
+ var EnterIcon = function EnterIcon() {
24
+ return /*#__PURE__*/React__default["default"].createElement("svg", {
25
+ width: "12",
26
+ height: "12",
27
+ viewBox: "0 0 12 12",
28
+ fill: "none",
29
+ xmlns: "http://www.w3.org/2000/svg"
30
+ }, /*#__PURE__*/React__default["default"].createElement("path", {
31
+ d: "M4 9L2 7L4 5",
32
+ stroke: "#91959e",
33
+ strokeWidth: "1.2",
34
+ strokeLinecap: "round",
35
+ strokeLinejoin: "round"
36
+ }), /*#__PURE__*/React__default["default"].createElement("path", {
37
+ d: "M10 3L10 6.25C10 6.66422 9.66423 7 9.25 7L2 7",
38
+ stroke: "#91959e",
39
+ strokeWidth: "1.2",
40
+ strokeLinecap: "round",
41
+ strokeLinejoin: "round"
42
+ }));
43
+ };
44
+ exports.EnterIcon = EnterIcon;
@@ -0,0 +1,96 @@
1
+ /** @LICENSE
2
+ * @hi-ui/menu
3
+ * https://github.com/XiaoMi/hiui/tree/master/packages/ui/menu#readme
4
+ *
5
+ * Copyright (c) HiUI <mi-hiui@xiaomi.com>.
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */
10
+ 'use strict';
11
+
12
+ var _typeof = require("@babel/runtime/helpers/typeof");
13
+ Object.defineProperty(exports, '__esModule', {
14
+ value: true
15
+ });
16
+ var tslib = require('tslib');
17
+ var React = require('react');
18
+ var classname = require('@hi-ui/classname');
19
+ var env = require('@hi-ui/env');
20
+ var typeAssertion = require('@hi-ui/type-assertion');
21
+ var useLatest = require('@hi-ui/use-latest');
22
+ var useUncontrolledState = require('@hi-ui/use-uncontrolled-state');
23
+ var Scrollbar = require('@hi-ui/scrollbar');
24
+ function _interopDefaultCompat(e) {
25
+ return e && _typeof(e) === 'object' && 'default' in e ? e : {
26
+ 'default': e
27
+ };
28
+ }
29
+ var React__default = /*#__PURE__*/_interopDefaultCompat(React);
30
+ var Scrollbar__default = /*#__PURE__*/_interopDefaultCompat(Scrollbar);
31
+ var _role = 'group-menu';
32
+ var GROUP_MENU_PREFIX = classname.getPrefixCls(_role);
33
+ /**
34
+ * 分组菜单
35
+ */
36
+ var GroupMenu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
37
+ var _a$prefixCls = _a.prefixCls,
38
+ prefixCls = _a$prefixCls === void 0 ? GROUP_MENU_PREFIX : _a$prefixCls,
39
+ _a$role = _a.role,
40
+ role = _a$role === void 0 ? _role : _a$role,
41
+ className = _a.className,
42
+ _a$data = _a.data,
43
+ data = _a$data === void 0 ? [] : _a$data,
44
+ onClick = _a.onClick,
45
+ _a$defaultActiveId = _a.defaultActiveId,
46
+ defaultActiveId = _a$defaultActiveId === void 0 ? '' : _a$defaultActiveId,
47
+ activeIdProp = _a.activeId,
48
+ titleRender = _a.titleRender,
49
+ rest = tslib.__rest(_a, ["prefixCls", "role", "className", "data", "onClick", "defaultActiveId", "activeId", "titleRender"]);
50
+ var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultActiveId, activeIdProp),
51
+ activeId = _useUncontrolledState[0],
52
+ tryChangeActiveId = _useUncontrolledState[1];
53
+ var handleClick = useLatest.useLatestCallback(function (evt, id, item) {
54
+ tryChangeActiveId(id);
55
+ onClick === null || onClick === void 0 ? void 0 : onClick(evt, id, item);
56
+ });
57
+ var renderItem = React.useCallback(function (data) {
58
+ return data.map(function (item) {
59
+ var _cx;
60
+ var id = item.id,
61
+ icon = item.icon,
62
+ title = item.title,
63
+ _item$children = item.children,
64
+ children = _item$children === void 0 ? [] : _item$children,
65
+ disabled = item.disabled;
66
+ var isParent = typeAssertion.isArrayNonEmpty(children);
67
+ return /*#__PURE__*/React__default["default"].createElement("div", {
68
+ key: id,
69
+ className: classname.cx(isParent ? prefixCls + "-parent-item" : prefixCls + "-item", (_cx = {}, _cx[prefixCls + "-item--active"] = activeId === id, _cx[prefixCls + "-item--disabled"] = disabled, _cx[prefixCls + "-item--empty"] = !title && !icon, _cx)),
70
+ onClick: function onClick(evt) {
71
+ if (disabled || isParent) return;
72
+ evt.stopPropagation();
73
+ handleClick(evt, id, item);
74
+ }
75
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
76
+ className: classname.cx(prefixCls + "-item__content")
77
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
78
+ className: classname.cx(prefixCls + "-item__icon")
79
+ }, icon), /*#__PURE__*/React__default["default"].createElement("div", {
80
+ className: classname.cx(prefixCls + "-item__title")
81
+ }, typeof titleRender === 'function' ? titleRender(item) : title)), isParent && renderItem(children));
82
+ });
83
+ }, [activeId, handleClick, prefixCls, titleRender]);
84
+ return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
85
+ className: classname.cx("" + prefixCls, className),
86
+ ref: ref,
87
+ role: role
88
+ }, rest), /*#__PURE__*/React__default["default"].createElement(Scrollbar__default["default"], {
89
+ onlyScrollVisible: true,
90
+ axes: "y"
91
+ }, renderItem(data)));
92
+ });
93
+ if (env.__DEV__) {
94
+ GroupMenu.displayName = 'GroupMenu';
95
+ }
96
+ exports.GroupMenu = GroupMenu;
package/lib/cjs/Menu.js CHANGED
@@ -19,6 +19,7 @@ var classname = require('@hi-ui/classname');
19
19
  var icons = require('@hi-ui/icons');
20
20
  var env = require('@hi-ui/env');
21
21
  var useUncontrolledState = require('@hi-ui/use-uncontrolled-state');
22
+ var core = require('@hi-ui/core');
22
23
  var Tooltip = require('@hi-ui/tooltip');
23
24
  var useToggle = require('@hi-ui/use-toggle');
24
25
  var treeUtils = require('@hi-ui/tree-utils');
@@ -82,7 +83,10 @@ var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
82
83
  onClick = _a.onClick,
83
84
  _a$size = _a.size,
84
85
  size = _a$size === void 0 ? 'lg' : _a$size,
85
- rest = tslib.__rest(_a, ["prefixCls", "role", "className", "data", "fieldNames", "placement", "showCollapse", "expandedType", "showAllSubMenus", "defaultExpandAll", "defaultExpandedIds", "expandedIds", "onExpand", "defaultActiveId", "activeId", "onClickSubMenu", "collapsed", "defaultCollapsed", "overlayClassName", "onCollapse", "footerRender", "render", "extraHeader", "onClick", "size"]);
86
+ _a$showTitleOnMini = _a.showTitleOnMini,
87
+ showTitleOnMini = _a$showTitleOnMini === void 0 ? false : _a$showTitleOnMini,
88
+ rest = tslib.__rest(_a, ["prefixCls", "role", "className", "data", "fieldNames", "placement", "showCollapse", "expandedType", "showAllSubMenus", "defaultExpandAll", "defaultExpandedIds", "expandedIds", "onExpand", "defaultActiveId", "activeId", "onClickSubMenu", "collapsed", "defaultCollapsed", "overlayClassName", "onCollapse", "footerRender", "render", "extraHeader", "onClick", "size", "showTitleOnMini"]);
89
+ var i18n = core.useLocaleContext();
86
90
  var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultActiveId, activeIdProp, onClick),
87
91
  activeId = _useUncontrolledState[0],
88
92
  updateActiveId = _useUncontrolledState[1];
@@ -104,6 +108,7 @@ var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
104
108
  }, expandedIdsProp, onExpand),
105
109
  expandedIds = _useUncontrolledState2[0],
106
110
  updateExpandedIds = _useUncontrolledState2[1];
111
+ var expandedIdsRef = React.useRef(expandedIds);
107
112
  var clickMenu = React.useCallback(function (id, raw) {
108
113
  updateActiveId(id, raw);
109
114
  }, [updateActiveId]);
@@ -112,14 +117,17 @@ var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
112
117
  return expandedId !== id;
113
118
  }) : expandedIds.concat(id);
114
119
  updateExpandedIds(nextExpandedIds);
120
+ expandedIdsRef.current = nextExpandedIds;
115
121
  if (onClickSubMenu) {
116
122
  onClickSubMenu(id, nextExpandedIds);
117
123
  }
118
124
  }, [onClickSubMenu, expandedIds, updateExpandedIds]);
119
125
  var closePopper = React.useCallback(function (id) {
120
- updateExpandedIds(expandedIds.filter(function (expandedId) {
126
+ var nextExpandedIds = expandedIds.filter(function (expandedId) {
121
127
  return expandedId !== id;
122
- }));
128
+ });
129
+ updateExpandedIds(nextExpandedIds);
130
+ expandedIdsRef.current = nextExpandedIds;
123
131
  }, [expandedIds, updateExpandedIds]);
124
132
  var closeAllPopper = React.useCallback(function () {
125
133
  updateExpandedIds([]);
@@ -152,6 +160,13 @@ var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
152
160
  setContainerWidth(width);
153
161
  }
154
162
  });
163
+ React.useEffect(function () {
164
+ if (mini) {
165
+ updateExpandedIds([]);
166
+ } else {
167
+ updateExpandedIds(expandedIdsRef.current);
168
+ }
169
+ }, [mini, updateExpandedIds]);
155
170
  var _useState4 = React.useState(0),
156
171
  tagMaxCount = _useState4[0],
157
172
  setTagMaxCount = _useState4[1];
@@ -166,7 +181,7 @@ var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
166
181
  }, [transformedData, tagMaxCount]);
167
182
  var getTagWidth = React.useCallback(function (index) {
168
183
  if (!containerElement) return MIN_WIDTH;
169
- var elements = containerElement.getElementsByClassName('hi-v4-menu-item');
184
+ var elements = containerElement.getElementsByClassName('hi-v5-menu-item');
170
185
  var element = elements && elements[index];
171
186
  if (!element) return MIN_WIDTH;
172
187
  return element.getBoundingClientRect().width;
@@ -202,9 +217,7 @@ var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
202
217
  var collapseNode = canToggle ? ( /*#__PURE__*/React__default["default"].createElement("div", {
203
218
  className: classname.cx(prefixCls + "__toggle"),
204
219
  onClick: function onClick() {
205
- miniToggleAction.not();
206
- // 关闭所有展开的子菜单,防止切换到 mini 模式后,子菜单还是展开的
207
- updateExpandedIds([]);
220
+ return miniToggleAction.not();
208
221
  }
209
222
  }, mini ? /*#__PURE__*/React__default["default"].createElement(icons.MenuUnfoldOutlined, null) : /*#__PURE__*/React__default["default"].createElement(icons.MenuFoldOutlined, null))) : null;
210
223
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, typeAssertion.isFunction(footerRender) ? footerRender({
@@ -214,12 +227,12 @@ var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
214
227
  };
215
228
  var renderItem = React.useCallback(function (menuItem, level) {
216
229
  // 显示缩略内容
217
- if (showMini && level === 1) {
230
+ if (showMini && level === 1 && !showTitleOnMini) {
218
231
  return renderMenuItemMini(menuItem);
219
232
  }
220
233
  return typeAssertion.isFunction(render) ? render(menuItem, level) : menuItem.title;
221
- }, [render, showMini]);
222
- var cls = classname.cx(prefixCls, className, prefixCls + "--" + placement, prefixCls + "--size-" + size, mini && prefixCls + "--mini", (expandedType === 'pop' || showAllSubMenus || mini) && prefixCls + "--popup");
234
+ }, [render, showMini, showTitleOnMini]);
235
+ var cls = classname.cx(prefixCls, className, prefixCls + "--" + placement, prefixCls + "--size-" + size, mini && prefixCls + "--mini", showTitleOnMini && prefixCls + "--show-title-on-mini", (expandedType === 'pop' || showAllSubMenus || mini) && prefixCls + "--popup");
223
236
  return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
224
237
  ref: useMergeRefs.useMergeRefs(ref, setContainerElement),
225
238
  role: role,
@@ -230,6 +243,7 @@ var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
230
243
  expandedType: expandedType,
231
244
  showAllSubMenus: showAllSubMenus,
232
245
  mini: mini,
246
+ showTitleOnMini: showTitleOnMini,
233
247
  clickMenu: clickMenu,
234
248
  clickSubMenu: clickSubMenu,
235
249
  closePopper: closePopper,
@@ -263,7 +277,7 @@ var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
263
277
  }), showVertical || restTagList.length === 0 ? null : ( /*#__PURE__*/React__default["default"].createElement(MenuItem.MenuItem, {
264
278
  key: MENU_MORE_ID,
265
279
  id: MENU_MORE_ID,
266
- title: "\u66F4\u591A",
280
+ title: i18n.tabs.more,
267
281
  children: restTagList
268
282
  }))), /*#__PURE__*/React__default["default"].createElement("div", {
269
283
  className: prefixCls + "__footer"
@@ -69,7 +69,8 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
69
69
  clickSubMenu = _useContext.clickSubMenu,
70
70
  closeAllPopper = _useContext.closeAllPopper,
71
71
  activeParents = _useContext.activeParents,
72
- overlayClassName = _useContext.overlayClassName;
72
+ overlayClassName = _useContext.overlayClassName,
73
+ showTitleOnMini = _useContext.showTitleOnMini;
73
74
  var _parentIds = (parentIds || []).concat(id);
74
75
  var hasChildren = typeAssertion.isArrayNonEmpty(children);
75
76
  var mergedRef = useMergeRefs.useMergeRefs(itemRef, ref);
@@ -135,7 +136,7 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
135
136
  visible: !!(expandedIds === null || expandedIds === void 0 ? void 0 : expandedIds.includes(id)),
136
137
  attachEl: itemRef.current,
137
138
  placement: 'right-start',
138
- gutterGap: 16,
139
+ gutterGap: showTitleOnMini ? 8 : 16,
139
140
  className: overlayClassName,
140
141
  onClose: function onClose() {
141
142
  closePopper === null || closePopper === void 0 ? void 0 : closePopper(id);
@@ -155,7 +156,7 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
155
156
  visible: !!(expandedIds === null || expandedIds === void 0 ? void 0 : expandedIds.includes(id)),
156
157
  attachEl: itemRef.current,
157
158
  placement: 'right-start',
158
- gutterGap: 16,
159
+ gutterGap: showTitleOnMini ? 12 : 16,
159
160
  disabledPortal: true,
160
161
  className: overlayClassName,
161
162
  onClose: function onClose() {