UNPKG

23.2 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4var _typeof = require("@babel/runtime/helpers/typeof");
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = exports.InternalTreeNode = void 0;
9var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
13var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
14var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
16var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
18var React = _interopRequireWildcard(require("react"));
19var _classnames = _interopRequireDefault(require("classnames"));
20var _pickAttrs = _interopRequireDefault(require("rc-util/lib/pickAttrs"));
21var _contextTypes = require("./contextTypes");
22var _Indent = _interopRequireDefault(require("./Indent"));
23var _treeUtil = require("./utils/treeUtil");
24var _excluded = ["eventKey", "className", "style", "dragOver", "dragOverGapTop", "dragOverGapBottom", "isLeaf", "isStart", "isEnd", "expanded", "selected", "checked", "halfChecked", "loading", "domRef", "active", "data", "onMouseMove", "selectable"]; // @ts-ignore
25function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
26function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27var ICON_OPEN = 'open';
28var ICON_CLOSE = 'close';
29var defaultTitle = '---';
30var InternalTreeNode = /*#__PURE__*/function (_React$Component) {
31 (0, _inherits2.default)(InternalTreeNode, _React$Component);
32 var _super = (0, _createSuper2.default)(InternalTreeNode);
33 function InternalTreeNode() {
34 var _this;
35 (0, _classCallCheck2.default)(this, InternalTreeNode);
36 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
37 args[_key] = arguments[_key];
38 }
39 _this = _super.call.apply(_super, [this].concat(args));
40 _this.state = {
41 dragNodeHighlight: false
42 };
43 _this.selectHandle = void 0;
44 _this.onSelectorClick = function (e) {
45 // Click trigger before select/check operation
46 var onNodeClick = _this.props.context.onNodeClick;
47 onNodeClick(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props));
48 if (_this.isSelectable()) {
49 _this.onSelect(e);
50 } else {
51 _this.onCheck(e);
52 }
53 };
54 _this.onSelectorDoubleClick = function (e) {
55 var onNodeDoubleClick = _this.props.context.onNodeDoubleClick;
56 onNodeDoubleClick(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props));
57 };
58 _this.onSelect = function (e) {
59 if (_this.isDisabled()) return;
60 var onNodeSelect = _this.props.context.onNodeSelect;
61 e.preventDefault();
62 onNodeSelect(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props));
63 };
64 _this.onCheck = function (e) {
65 if (_this.isDisabled()) return;
66 var _this$props = _this.props,
67 disableCheckbox = _this$props.disableCheckbox,
68 checked = _this$props.checked;
69 var onNodeCheck = _this.props.context.onNodeCheck;
70 if (!_this.isCheckable() || disableCheckbox) return;
71 e.preventDefault();
72 var targetChecked = !checked;
73 onNodeCheck(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props), targetChecked);
74 };
75 _this.onMouseEnter = function (e) {
76 var onNodeMouseEnter = _this.props.context.onNodeMouseEnter;
77 onNodeMouseEnter(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props));
78 };
79 _this.onMouseLeave = function (e) {
80 var onNodeMouseLeave = _this.props.context.onNodeMouseLeave;
81 onNodeMouseLeave(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props));
82 };
83 _this.onContextMenu = function (e) {
84 var onNodeContextMenu = _this.props.context.onNodeContextMenu;
85 onNodeContextMenu(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props));
86 };
87 _this.onDragStart = function (e) {
88 var onNodeDragStart = _this.props.context.onNodeDragStart;
89 e.stopPropagation();
90 _this.setState({
91 dragNodeHighlight: true
92 });
93 onNodeDragStart(e, (0, _assertThisInitialized2.default)(_this));
94 try {
95 // ie throw error
96 // firefox-need-it
97 e.dataTransfer.setData('text/plain', '');
98 } catch (error) {
99 // empty
100 }
101 };
102 _this.onDragEnter = function (e) {
103 var onNodeDragEnter = _this.props.context.onNodeDragEnter;
104 e.preventDefault();
105 e.stopPropagation();
106 onNodeDragEnter(e, (0, _assertThisInitialized2.default)(_this));
107 };
108 _this.onDragOver = function (e) {
109 var onNodeDragOver = _this.props.context.onNodeDragOver;
110 e.preventDefault();
111 e.stopPropagation();
112 onNodeDragOver(e, (0, _assertThisInitialized2.default)(_this));
113 };
114 _this.onDragLeave = function (e) {
115 var onNodeDragLeave = _this.props.context.onNodeDragLeave;
116 e.stopPropagation();
117 onNodeDragLeave(e, (0, _assertThisInitialized2.default)(_this));
118 };
119 _this.onDragEnd = function (e) {
120 var onNodeDragEnd = _this.props.context.onNodeDragEnd;
121 e.stopPropagation();
122 _this.setState({
123 dragNodeHighlight: false
124 });
125 onNodeDragEnd(e, (0, _assertThisInitialized2.default)(_this));
126 };
127 _this.onDrop = function (e) {
128 var onNodeDrop = _this.props.context.onNodeDrop;
129 e.preventDefault();
130 e.stopPropagation();
131 _this.setState({
132 dragNodeHighlight: false
133 });
134 onNodeDrop(e, (0, _assertThisInitialized2.default)(_this));
135 };
136 // Disabled item still can be switch
137 _this.onExpand = function (e) {
138 var _this$props2 = _this.props,
139 loading = _this$props2.loading,
140 onNodeExpand = _this$props2.context.onNodeExpand;
141 if (loading) return;
142 onNodeExpand(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props));
143 };
144 // Drag usage
145 _this.setSelectHandle = function (node) {
146 _this.selectHandle = node;
147 };
148 _this.getNodeState = function () {
149 var expanded = _this.props.expanded;
150 if (_this.isLeaf()) {
151 return null;
152 }
153 return expanded ? ICON_OPEN : ICON_CLOSE;
154 };
155 _this.hasChildren = function () {
156 var eventKey = _this.props.eventKey;
157 var keyEntities = _this.props.context.keyEntities;
158 var _ref = keyEntities[eventKey] || {},
159 children = _ref.children;
160 return !!(children || []).length;
161 };
162 _this.isLeaf = function () {
163 var _this$props3 = _this.props,
164 isLeaf = _this$props3.isLeaf,
165 loaded = _this$props3.loaded;
166 var loadData = _this.props.context.loadData;
167 var hasChildren = _this.hasChildren();
168 if (isLeaf === false) {
169 return false;
170 }
171 return isLeaf || !loadData && !hasChildren || loadData && loaded && !hasChildren;
172 };
173 _this.isDisabled = function () {
174 var disabled = _this.props.disabled;
175 var treeDisabled = _this.props.context.disabled;
176 return !!(treeDisabled || disabled);
177 };
178 _this.isCheckable = function () {
179 var checkable = _this.props.checkable;
180 var treeCheckable = _this.props.context.checkable;
181 // Return false if tree or treeNode is not checkable
182 if (!treeCheckable || checkable === false) return false;
183 return treeCheckable;
184 };
185 // Load data to avoid default expanded tree without data
186 _this.syncLoadData = function (props) {
187 var expanded = props.expanded,
188 loading = props.loading,
189 loaded = props.loaded;
190 var _this$props$context = _this.props.context,
191 loadData = _this$props$context.loadData,
192 onNodeLoad = _this$props$context.onNodeLoad;
193 if (loading) {
194 return;
195 }
196 // read from state to avoid loadData at same time
197 if (loadData && expanded && !_this.isLeaf()) {
198 // We needn't reload data when has children in sync logic
199 // It's only needed in node expanded
200 if (!_this.hasChildren() && !loaded) {
201 onNodeLoad((0, _treeUtil.convertNodePropsToEventData)(_this.props));
202 }
203 }
204 };
205 _this.isDraggable = function () {
206 var _this$props4 = _this.props,
207 data = _this$props4.data,
208 draggable = _this$props4.context.draggable;
209 return !!(draggable && (!draggable.nodeDraggable || draggable.nodeDraggable(data)));
210 };
211 // ==================== Render: Drag Handler ====================
212 _this.renderDragHandler = function () {
213 var _this$props$context2 = _this.props.context,
214 draggable = _this$props$context2.draggable,
215 prefixCls = _this$props$context2.prefixCls;
216 return (draggable === null || draggable === void 0 ? void 0 : draggable.icon) ? /*#__PURE__*/React.createElement("span", {
217 className: "".concat(prefixCls, "-draggable-icon")
218 }, draggable.icon) : null;
219 };
220 // ====================== Render: Switcher ======================
221 _this.renderSwitcherIconDom = function (isLeaf) {
222 var switcherIconFromProps = _this.props.switcherIcon;
223 var switcherIconFromCtx = _this.props.context.switcherIcon;
224 var switcherIcon = switcherIconFromProps || switcherIconFromCtx;
225 // if switcherIconDom is null, no render switcher span
226 if (typeof switcherIcon === 'function') {
227 return switcherIcon((0, _objectSpread2.default)((0, _objectSpread2.default)({}, _this.props), {}, {
228 isLeaf: isLeaf
229 }));
230 }
231 return switcherIcon;
232 };
233 // Switcher
234 _this.renderSwitcher = function () {
235 var expanded = _this.props.expanded;
236 var prefixCls = _this.props.context.prefixCls;
237 if (_this.isLeaf()) {
238 // if switcherIconDom is null, no render switcher span
239 var _switcherIconDom = _this.renderSwitcherIconDom(true);
240 return _switcherIconDom !== false ? /*#__PURE__*/React.createElement("span", {
241 className: (0, _classnames.default)("".concat(prefixCls, "-switcher"), "".concat(prefixCls, "-switcher-noop"))
242 }, _switcherIconDom) : null;
243 }
244 var switcherCls = (0, _classnames.default)("".concat(prefixCls, "-switcher"), "".concat(prefixCls, "-switcher_").concat(expanded ? ICON_OPEN : ICON_CLOSE));
245 var switcherIconDom = _this.renderSwitcherIconDom(false);
246 return switcherIconDom !== false ? /*#__PURE__*/React.createElement("span", {
247 onClick: _this.onExpand,
248 className: switcherCls
249 }, switcherIconDom) : null;
250 };
251 // ====================== Render: Checkbox ======================
252 // Checkbox
253 _this.renderCheckbox = function () {
254 var _this$props5 = _this.props,
255 checked = _this$props5.checked,
256 halfChecked = _this$props5.halfChecked,
257 disableCheckbox = _this$props5.disableCheckbox;
258 var prefixCls = _this.props.context.prefixCls;
259 var disabled = _this.isDisabled();
260 var checkable = _this.isCheckable();
261 if (!checkable) return null;
262 // [Legacy] Custom element should be separate with `checkable` in future
263 var $custom = typeof checkable !== 'boolean' ? checkable : null;
264 return /*#__PURE__*/React.createElement("span", {
265 className: (0, _classnames.default)("".concat(prefixCls, "-checkbox"), checked && "".concat(prefixCls, "-checkbox-checked"), !checked && halfChecked && "".concat(prefixCls, "-checkbox-indeterminate"), (disabled || disableCheckbox) && "".concat(prefixCls, "-checkbox-disabled")),
266 onClick: _this.onCheck
267 }, $custom);
268 };
269 // ==================== Render: Title + Icon ====================
270 _this.renderIcon = function () {
271 var loading = _this.props.loading;
272 var prefixCls = _this.props.context.prefixCls;
273 return /*#__PURE__*/React.createElement("span", {
274 className: (0, _classnames.default)("".concat(prefixCls, "-iconEle"), "".concat(prefixCls, "-icon__").concat(_this.getNodeState() || 'docu'), loading && "".concat(prefixCls, "-icon_loading"))
275 });
276 };
277 // Icon + Title
278 _this.renderSelector = function () {
279 var dragNodeHighlight = _this.state.dragNodeHighlight;
280 var _this$props6 = _this.props,
281 _this$props6$title = _this$props6.title,
282 title = _this$props6$title === void 0 ? defaultTitle : _this$props6$title,
283 selected = _this$props6.selected,
284 icon = _this$props6.icon,
285 loading = _this$props6.loading,
286 data = _this$props6.data;
287 var _this$props$context3 = _this.props.context,
288 prefixCls = _this$props$context3.prefixCls,
289 showIcon = _this$props$context3.showIcon,
290 treeIcon = _this$props$context3.icon,
291 loadData = _this$props$context3.loadData,
292 titleRender = _this$props$context3.titleRender;
293 var disabled = _this.isDisabled();
294 var wrapClass = "".concat(prefixCls, "-node-content-wrapper");
295 // Icon - Still show loading icon when loading without showIcon
296 var $icon;
297 if (showIcon) {
298 var currentIcon = icon || treeIcon;
299 $icon = currentIcon ? /*#__PURE__*/React.createElement("span", {
300 className: (0, _classnames.default)("".concat(prefixCls, "-iconEle"), "".concat(prefixCls, "-icon__customize"))
301 }, typeof currentIcon === 'function' ? currentIcon(_this.props) : currentIcon) : _this.renderIcon();
302 } else if (loadData && loading) {
303 $icon = _this.renderIcon();
304 }
305 // Title
306 var titleNode;
307 if (typeof title === 'function') {
308 titleNode = title(data);
309 } else if (titleRender) {
310 titleNode = titleRender(data);
311 } else {
312 titleNode = title;
313 }
314 var $title = /*#__PURE__*/React.createElement("span", {
315 className: "".concat(prefixCls, "-title")
316 }, titleNode);
317 return /*#__PURE__*/React.createElement("span", {
318 ref: _this.setSelectHandle,
319 title: typeof title === 'string' ? title : '',
320 className: (0, _classnames.default)("".concat(wrapClass), "".concat(wrapClass, "-").concat(_this.getNodeState() || 'normal'), !disabled && (selected || dragNodeHighlight) && "".concat(prefixCls, "-node-selected")),
321 onMouseEnter: _this.onMouseEnter,
322 onMouseLeave: _this.onMouseLeave,
323 onContextMenu: _this.onContextMenu,
324 onClick: _this.onSelectorClick,
325 onDoubleClick: _this.onSelectorDoubleClick
326 }, $icon, $title, _this.renderDropIndicator());
327 };
328 // =================== Render: Drop Indicator ===================
329 _this.renderDropIndicator = function () {
330 var _this$props7 = _this.props,
331 disabled = _this$props7.disabled,
332 eventKey = _this$props7.eventKey;
333 var _this$props$context4 = _this.props.context,
334 draggable = _this$props$context4.draggable,
335 dropLevelOffset = _this$props$context4.dropLevelOffset,
336 dropPosition = _this$props$context4.dropPosition,
337 prefixCls = _this$props$context4.prefixCls,
338 indent = _this$props$context4.indent,
339 dropIndicatorRender = _this$props$context4.dropIndicatorRender,
340 dragOverNodeKey = _this$props$context4.dragOverNodeKey,
341 direction = _this$props$context4.direction;
342 var rootDraggable = !!draggable;
343 // allowDrop is calculated in Tree.tsx, there is no need for calc it here
344 var showIndicator = !disabled && rootDraggable && dragOverNodeKey === eventKey;
345 return showIndicator ? dropIndicatorRender({
346 dropPosition: dropPosition,
347 dropLevelOffset: dropLevelOffset,
348 indent: indent,
349 prefixCls: prefixCls,
350 direction: direction
351 }) : null;
352 };
353 return _this;
354 }
355 (0, _createClass2.default)(InternalTreeNode, [{
356 key: "componentDidMount",
357 value:
358 // Isomorphic needn't load data in server side
359 function componentDidMount() {
360 this.syncLoadData(this.props);
361 }
362 }, {
363 key: "componentDidUpdate",
364 value: function componentDidUpdate() {
365 this.syncLoadData(this.props);
366 }
367 }, {
368 key: "isSelectable",
369 value: function isSelectable() {
370 var selectable = this.props.selectable;
371 var treeSelectable = this.props.context.selectable;
372 // Ignore when selectable is undefined or null
373 if (typeof selectable === 'boolean') {
374 return selectable;
375 }
376 return treeSelectable;
377 }
378 }, {
379 key: "render",
380 value:
381 // =========================== Render ===========================
382 function render() {
383 var _classNames;
384 var _this$props8 = this.props,
385 eventKey = _this$props8.eventKey,
386 className = _this$props8.className,
387 style = _this$props8.style,
388 dragOver = _this$props8.dragOver,
389 dragOverGapTop = _this$props8.dragOverGapTop,
390 dragOverGapBottom = _this$props8.dragOverGapBottom,
391 isLeaf = _this$props8.isLeaf,
392 isStart = _this$props8.isStart,
393 isEnd = _this$props8.isEnd,
394 expanded = _this$props8.expanded,
395 selected = _this$props8.selected,
396 checked = _this$props8.checked,
397 halfChecked = _this$props8.halfChecked,
398 loading = _this$props8.loading,
399 domRef = _this$props8.domRef,
400 active = _this$props8.active,
401 data = _this$props8.data,
402 onMouseMove = _this$props8.onMouseMove,
403 selectable = _this$props8.selectable,
404 otherProps = (0, _objectWithoutProperties2.default)(_this$props8, _excluded);
405 var _this$props$context5 = this.props.context,
406 prefixCls = _this$props$context5.prefixCls,
407 filterTreeNode = _this$props$context5.filterTreeNode,
408 keyEntities = _this$props$context5.keyEntities,
409 dropContainerKey = _this$props$context5.dropContainerKey,
410 dropTargetKey = _this$props$context5.dropTargetKey,
411 draggingNodeKey = _this$props$context5.draggingNodeKey;
412 var disabled = this.isDisabled();
413 var dataOrAriaAttributeProps = (0, _pickAttrs.default)(otherProps, {
414 aria: true,
415 data: true
416 });
417 var _ref2 = keyEntities[eventKey] || {},
418 level = _ref2.level;
419 var isEndNode = isEnd[isEnd.length - 1];
420 var mergedDraggable = this.isDraggable();
421 var draggableWithoutDisabled = !disabled && mergedDraggable;
422 var dragging = draggingNodeKey === eventKey;
423 var ariaSelected = selectable !== undefined ? {
424 'aria-selected': !!selectable
425 } : undefined;
426 return /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
427 ref: domRef,
428 className: (0, _classnames.default)(className, "".concat(prefixCls, "-treenode"), (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-disabled"), disabled), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-switcher-").concat(expanded ? 'open' : 'close'), !isLeaf), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-checkbox-checked"), checked), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-checkbox-indeterminate"), halfChecked), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-selected"), selected), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-loading"), loading), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-active"), active), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-leaf-last"), isEndNode), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-draggable"), mergedDraggable), (0, _defineProperty2.default)(_classNames, "dragging", dragging), (0, _defineProperty2.default)(_classNames, 'drop-target', dropTargetKey === eventKey), (0, _defineProperty2.default)(_classNames, 'drop-container', dropContainerKey === eventKey), (0, _defineProperty2.default)(_classNames, 'drag-over', !disabled && dragOver), (0, _defineProperty2.default)(_classNames, 'drag-over-gap-top', !disabled && dragOverGapTop), (0, _defineProperty2.default)(_classNames, 'drag-over-gap-bottom', !disabled && dragOverGapBottom), (0, _defineProperty2.default)(_classNames, 'filter-node', filterTreeNode && filterTreeNode((0, _treeUtil.convertNodePropsToEventData)(this.props))), _classNames)),
429 style: style
430 // Draggable config
431 ,
432 draggable: draggableWithoutDisabled,
433 "aria-grabbed": dragging,
434 onDragStart: draggableWithoutDisabled ? this.onDragStart : undefined
435 // Drop config
436 ,
437 onDragEnter: mergedDraggable ? this.onDragEnter : undefined,
438 onDragOver: mergedDraggable ? this.onDragOver : undefined,
439 onDragLeave: mergedDraggable ? this.onDragLeave : undefined,
440 onDrop: mergedDraggable ? this.onDrop : undefined,
441 onDragEnd: mergedDraggable ? this.onDragEnd : undefined,
442 onMouseMove: onMouseMove
443 }, ariaSelected, dataOrAriaAttributeProps), /*#__PURE__*/React.createElement(_Indent.default, {
444 prefixCls: prefixCls,
445 level: level,
446 isStart: isStart,
447 isEnd: isEnd
448 }), this.renderDragHandler(), this.renderSwitcher(), this.renderCheckbox(), this.renderSelector());
449 }
450 }]);
451 return InternalTreeNode;
452}(React.Component);
453exports.InternalTreeNode = InternalTreeNode;
454var ContextTreeNode = function ContextTreeNode(props) {
455 return /*#__PURE__*/React.createElement(_contextTypes.TreeContext.Consumer, null, function (context) {
456 return /*#__PURE__*/React.createElement(InternalTreeNode, (0, _extends2.default)({}, props, {
457 context: context
458 }));
459 });
460};
461ContextTreeNode.displayName = 'TreeNode';
462ContextTreeNode.isTreeNode = 1;
463var _default = ContextTreeNode;
464exports.default = _default;
\No newline at end of file