UNPKG

11.4 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _extends2 = require('babel-runtime/helpers/extends');
6
7var _extends3 = _interopRequireDefault(_extends2);
8
9var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
10
11var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
12
13var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
14
15var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
16
17var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
18
19var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
20
21var _inherits2 = require('babel-runtime/helpers/inherits');
22
23var _inherits3 = _interopRequireDefault(_inherits2);
24
25var _class, _temp;
26
27var _react = require('react');
28
29var _react2 = _interopRequireDefault(_react);
30
31var _propTypes = require('prop-types');
32
33var _propTypes2 = _interopRequireDefault(_propTypes);
34
35var _classnames = require('classnames');
36
37var _classnames2 = _interopRequireDefault(_classnames);
38
39var _configProvider = require('../config-provider');
40
41var _configProvider2 = _interopRequireDefault(_configProvider);
42
43var _menu = require('../menu');
44
45var _menu2 = _interopRequireDefault(_menu);
46
47function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
48
49/**
50 * Nav
51 * @description 继承自 `Menu` 的能力请查看 `Menu` 文档
52 */
53var Nav = (_temp = _class = function (_Component) {
54 (0, _inherits3.default)(Nav, _Component);
55
56 function Nav(props) {
57 (0, _classCallCheck3.default)(this, Nav);
58
59 var _this = (0, _possibleConstructorReturn3.default)(this, _Component.call(this, props));
60
61 _this.getMenuRef = _this.getMenuRef.bind(_this);
62 return _this;
63 }
64
65 Nav.prototype.getChildContext = function getChildContext() {
66 var _props = this.props,
67 prefix = _props.prefix,
68 direction = _props.direction,
69 mode = _props.mode,
70 iconOnly = _props.iconOnly,
71 iconOnlyWidth = _props.iconOnlyWidth,
72 iconTextOnly = _props.iconTextOnly,
73 hasTooltip = _props.hasTooltip,
74 hasArrow = _props.hasArrow;
75 var isCollapse = this.context.isCollapse;
76
77
78 return {
79 prefix: prefix,
80 mode: direction === 'hoz' ? 'popup' : mode,
81 iconOnly: 'iconOnly' in this.props ? iconOnly : isCollapse,
82 iconOnlyWidth: 'iconOnlyWidth' in this.props ? iconOnlyWidth : undefined,
83 iconTextOnly: iconTextOnly,
84 hasTooltip: hasTooltip,
85 hasArrow: hasArrow
86 };
87 };
88
89 Nav.prototype.getMenuRef = function getMenuRef(ref) {
90 this.menu = ref;
91 };
92
93 Nav.prototype.render = function render() {
94 var _classNames, _classNames2;
95
96 // eslint-disable-next-line
97 var _props2 = this.props,
98 prefix = _props2.prefix,
99 className = _props2.className,
100 style = _props2.style,
101 children = _props2.children,
102 type = _props2.type,
103 direction = _props2.direction,
104 activeDirection = _props2.activeDirection,
105 mode = _props2.mode,
106 triggerType = _props2.triggerType,
107 inlineIndent = _props2.inlineIndent,
108 openMode = _props2.openMode,
109 popupAlign = _props2.popupAlign,
110 popupClassName = _props2.popupClassName,
111 iconOnly = _props2.iconOnly,
112 iconOnlyWidth = _props2.iconOnlyWidth,
113 iconTextOnly = _props2.iconTextOnly,
114 hasArrow = _props2.hasArrow,
115 hasTooltip = _props2.hasTooltip,
116 embeddable = _props2.embeddable,
117 _popupProps = _props2.popupProps,
118 rtl = _props2.rtl,
119 others = (0, _objectWithoutProperties3.default)(_props2, ['prefix', 'className', 'style', 'children', 'type', 'direction', 'activeDirection', 'mode', 'triggerType', 'inlineIndent', 'openMode', 'popupAlign', 'popupClassName', 'iconOnly', 'iconOnlyWidth', 'iconTextOnly', 'hasArrow', 'hasTooltip', 'embeddable', 'popupProps', 'rtl']);
120 var isCollapse = this.context.isCollapse;
121
122
123 var newIconOnly = 'iconOnly' in this.props ? iconOnly : isCollapse;
124
125 var realActiveDirection = activeDirection;
126 if (realActiveDirection && (direction === 'hoz' && (realActiveDirection === 'left' || realActiveDirection === 'right') || direction === 'ver' && (realActiveDirection === 'top' || realActiveDirection === 'bottom'))) {
127 realActiveDirection = null;
128 }
129
130 if (!newIconOnly && realActiveDirection === undefined) {
131 realActiveDirection = direction === 'hoz' ? 'bottom' : type === 'line' ? 'right' : 'left';
132 }
133
134 var cls = (0, _classnames2.default)((_classNames = {}, _classNames[prefix + 'nav'] = true, _classNames['' + prefix + type] = type, _classNames[prefix + 'active'] = realActiveDirection, _classNames['' + prefix + realActiveDirection] = realActiveDirection, _classNames[prefix + 'icon-only'] = newIconOnly, _classNames[prefix + 'icon-only-text'] = newIconOnly && iconTextOnly, _classNames[prefix + 'custom-icon-only-width'] = newIconOnly && 'iconOnlyWidth' in this.props, _classNames[prefix + 'no-arrow'] = !hasArrow, _classNames[prefix + 'nav-embeddable'] = embeddable, _classNames[className] = !!className, _classNames));
135 var newStyle = newIconOnly ? (0, _extends3.default)({}, style, { width: iconOnlyWidth || 58 }) : style;
136
137 var props = {
138 prefix: prefix,
139 direction: direction,
140 openMode: openMode,
141 triggerType: triggerType,
142 mode: direction === 'hoz' ? 'popup' : mode,
143 popupAlign: direction === 'hoz' ? 'follow' : popupAlign,
144 inlineIndent: newIconOnly ? 0 : inlineIndent,
145 hasSelectedIcon: false,
146 popupAutoWidth: true,
147 selectMode: 'single',
148 itemClassName: prefix + 'nav-item',
149 popupClassName: (0, _classnames2.default)((_classNames2 = {}, _classNames2[cls.replace(prefix + 'icon-only', '').replace(prefix + 'nav-embeddable', '')] = mode === 'popup', _classNames2[prefix + 'icon-only'] = newIconOnly && mode === 'inline', _classNames2[popupClassName] = !!popupClassName, _classNames2)),
150 popupProps: function popupProps() {
151 return (0, _extends3.default)({}, _popupProps);
152 }
153 };
154
155 return _react2.default.createElement(
156 _menu2.default,
157 (0, _extends3.default)({ className: cls, style: newStyle }, props, others, { ref: this.getMenuRef }),
158 children
159 );
160 };
161
162 return Nav;
163}(_react.Component), _class.propTypes = {
164 prefix: _propTypes2.default.string,
165 pure: _propTypes2.default.bool,
166 rtl: _propTypes2.default.bool,
167 className: _propTypes2.default.string,
168 style: _propTypes2.default.object,
169 /**
170 * 导航项和子导航
171 */
172 children: _propTypes2.default.node,
173 /**
174 * 导航类型
175 * @enumdesc 普通, 主要, 次要, 线形
176 */
177 type: _propTypes2.default.oneOf(['normal', 'primary', 'secondary', 'line']),
178 /**
179 * 导航布局
180 * @enumdesc 水平, 垂直
181 */
182 direction: _propTypes2.default.oneOf(['hoz', 'ver']),
183 /**
184 * 横向导航条 items 和 footer 的对齐方向,在 direction 设置为 'hoz' 并且 header 存在时生效
185 */
186 hozAlign: _propTypes2.default.oneOf(['left', 'right']),
187 /**
188 * 设置组件选中状态的 active 边方向
189 * @enumdesc 无, 上, 下, 左, 右
190 * @default 当 direction 为 'hoz' 时,默认值为 'bottom',当 direction 为 'ver' 时,默认值为 'left'
191 */
192 activeDirection: _propTypes2.default.oneOf([null, 'top', 'bottom', 'left', 'right']),
193 /**
194 * 子导航打开的模式(水平导航只支持弹出)
195 * @eumdesc 行内, 弹出
196 */
197 mode: _propTypes2.default.oneOf(['inline', 'popup']),
198 /**
199 * 子导航打开的触发方式
200 */
201 triggerType: _propTypes2.default.oneOf(['click', 'hover']),
202 /**
203 * 内联子导航缩进距离
204 */
205 inlineIndent: _propTypes2.default.number,
206 /**
207 * 首次渲染展开所有的子导航,只在 mode 设置为 'inline' 以及 openMode 设置为 'multiple' 下生效
208 */
209 defaultOpenAll: _propTypes2.default.bool,
210 /**
211 * 内联子导航的展开模式,同时可以展开一个同级子导航还是多个同级子导航,该属性仅在 mode 为 inline 时生效
212 * @eumdesc 一个, 多个
213 */
214 openMode: _propTypes2.default.oneOf(['single', 'multiple']),
215 /**
216 * 当前选中导航项的 key 值
217 */
218 selectedKeys: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.array]),
219 /**
220 * 初始选中导航项的 key 值
221 */
222 defaultSelectedKeys: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.array]),
223 /**
224 * 选中或取消选中导航项触发的回调函数
225 * @param {Array} selectedKeys 选中的所有导航项的 key
226 * @param {Object} item 选中或取消选中的导航项
227 * @param {Object} extra 额外参数
228 * @param {Boolean} extra.select 是否是选中
229 * @param {Array} extra.key 导航项的 key
230 * @param {Object} extra.label 导航项的文本
231 * @param {Array} extra.keyPath 导航项 key 的路径
232 */
233 onSelect: _propTypes2.default.func,
234 /**
235 * 弹出子导航的对齐方式(水平导航只支持 follow )
236 * @eumdesc Item 顶端对齐, Nav 顶端对齐
237 */
238 popupAlign: _propTypes2.default.oneOf(['follow', 'outside']),
239 /**
240 * 弹出子导航的自定义类名
241 */
242 popupClassName: _propTypes2.default.string,
243 /**
244 * 是否只显示图标
245 */
246 iconOnly: _propTypes2.default.bool,
247 /**
248 * iconOnly 模式下的宽度(仅在 iconOnly=true 时生效) 如果传入了iconOnlyWidth,那么会隐藏文本,例如 Nav.Item 的 label
249 */
250 iconOnlyWidth: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),
251 /**
252 * iconOnly模式下是否展示文字(仅在 iconOnly=true 时生效)
253 */
254 iconTextOnly: _propTypes2.default.bool,
255 /**
256 * 是否显示右侧的箭头(仅在 iconOnly=true 时生效)
257 */
258 hasArrow: _propTypes2.default.bool,
259 /**
260 * 是否有 ToolTips (仅在 iconOnly=true 时生效)
261 */
262 hasTooltip: _propTypes2.default.bool,
263 /**
264 * 自定义导航头部
265 */
266 header: _propTypes2.default.node,
267 /**
268 * 自定义导航尾部
269 */
270 footer: _propTypes2.default.node,
271 /**
272 * 是否开启嵌入式模式,一般用于Layout的布局中,开启后没有默认背景、外层border、box-shadow,可以配合`<Nav style={{lineHeight: '100px'}}>` 自定义高度
273 * @version 1.18
274 */
275 embeddable: _propTypes2.default.bool,
276 popupProps: _propTypes2.default.object
277}, _class.defaultProps = {
278 prefix: 'next-',
279 pure: false,
280 type: 'normal',
281 direction: 'ver',
282 hozAlign: 'left',
283 mode: 'inline',
284 triggerType: 'click',
285 inlineIndent: 20,
286 defaultOpenAll: false,
287 openMode: 'multiple',
288 defaultSelectedKeys: [],
289 popupAlign: 'follow',
290 hasTooltip: false,
291 embeddable: false,
292 hasArrow: true,
293 popupProps: {}
294}, _class.childContextTypes = {
295 prefix: _propTypes2.default.string,
296 mode: _propTypes2.default.string,
297 iconOnly: _propTypes2.default.bool,
298 iconOnlyWidth: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),
299 iconTextOnly: _propTypes2.default.bool,
300 hasTooltip: _propTypes2.default.bool,
301 hasArrow: _propTypes2.default.bool
302}, _class.contextTypes = {
303 isCollapse: _propTypes2.default.bool
304}, _temp);
305Nav.displayName = 'Nav';
306exports.default = _configProvider2.default.config(Nav);
307module.exports = exports['default'];
\No newline at end of file