UNPKG

@texttree/notepad-rcl

Version:

<a href="https://github.com/texttree/notepad-rcl"> <img src="https://github.com/texttree/notepad-rcl/raw/master/images/editorjs-screenshot.png" > </a>

396 lines (395 loc) 22.5 kB
"use strict"; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireWildcard(require("react")); var _reactArborist = require("react-arborist"); var _propTypes = _interopRequireDefault(require("prop-types")); var _helpers = require("../helpers"); var _useRtlDirection = _interopRequireDefault(require("../Redactor/useRtlDirection")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function TreeView(_ref) { var data = _ref.data, getCurrentNodeProps = _ref.getCurrentNodeProps, setSelectedNodeId = _ref.setSelectedNodeId, handleDoubleClick = _ref.handleDoubleClick, handleTripleClick = _ref.handleTripleClick, handleDeleteNode = _ref.handleDeleteNode, handleRenameNode = _ref.handleRenameNode, selectedNodeId = _ref.selectedNodeId, handleDragDrop = _ref.handleDragDrop, handleOnClick = _ref.handleOnClick, _ref$selection = _ref.selection, selection = _ref$selection === void 0 ? '' : _ref$selection, _ref$term = _ref.term, term = _ref$term === void 0 ? '' : _ref$term, _ref$style = _ref.style, style = _ref$style === void 0 ? {} : _ref$style, _ref$classes = _ref.classes, classes = _ref$classes === void 0 ? {} : _ref$classes, _ref$handleContextMen = _ref.handleContextMenu, handleContextMenu = _ref$handleContextMen === void 0 ? function () {} : _ref$handleContextMen, _ref$showRenameButton = _ref.showRenameButton, showRenameButton = _ref$showRenameButton === void 0 ? false : _ref$showRenameButton, _ref$showRemoveButton = _ref.showRemoveButton, showRemoveButton = _ref$showRemoveButton === void 0 ? false : _ref$showRemoveButton, _ref$openByDefault = _ref.openByDefault, openByDefault = _ref$openByDefault === void 0 ? true : _ref$openByDefault, _ref$maxDraggingNodeW = _ref.maxDraggingNodeWidth, maxDraggingNodeWidth = _ref$maxDraggingNodeW === void 0 ? '20%' : _ref$maxDraggingNodeW, _ref$minTreeHeight = _ref.minTreeHeight, minTreeHeight = _ref$minTreeHeight === void 0 ? 400 : _ref$minTreeHeight, _ref$treeWidth = _ref.treeWidth, treeWidth = _ref$treeWidth === void 0 ? 300 : _ref$treeWidth, _ref$nodeHeight = _ref.nodeHeight, nodeHeight = _ref$nodeHeight === void 0 ? 57 : _ref$nodeHeight, _ref$indent = _ref.indent, indent = _ref$indent === void 0 ? 20 : _ref$indent, _ref$icons = _ref.icons, icons = _ref$icons === void 0 ? { closeFolder: '🗀', openFolder: '🗁', arrowRight: '⏵', arrowDown: '⏷', file: '🗎' } : _ref$icons, _ref$removeButton = _ref.removeButton, removeButton = _ref$removeButton === void 0 ? { content: '🗑️', title: 'Delete' } : _ref$removeButton, _ref$renameButton = _ref.renameButton, renameButton = _ref$renameButton === void 0 ? { content: '✏️', title: 'Rename...' } : _ref$renameButton, setParentId = _ref.setParentId; var _useState = (0, _react.useState)(0), _useState2 = _slicedToArray(_useState, 2), calcTreeHeight = _useState2[0], setCalcTreeHeight = _useState2[1]; var _useState3 = (0, _react.useState)(0), _useState4 = _slicedToArray(_useState3, 2), visibleNodesCount = _useState4[0], setVisibleNodesCount = _useState4[1]; var clickCountRef = (0, _react.useRef)(0); var clickTimer = (0, _react.useRef)(null); (0, _react.useEffect)(function () { setCalcTreeHeight((visibleNodesCount + 1) * nodeHeight); }, [visibleNodesCount]); var handleClick = function handleClick(nodeProps) { var isSameNode = nodeProps.node.id === selectedNodeId; clickCountRef.current += 1; var handleAction = function handleAction(action, mode) { var handleBranch = function handleBranch() { return _toggleInternalNodes(nodeProps, nodeProps.node.isOpen ? 'close' : 'open'); }; if (action === 'openAll' || !action && mode === 'openAll') { handleBranch(); } else if (action === 'rename') { nodeProps.node.edit(); } else if (typeof action === 'function') { nodeProps.node.isInternal ? nodeProps.node.toggle() : action(nodeProps); } else if (action && action.changeNode) { action.changeNode(nodeProps); } else if (mode === 'edit') { nodeProps.node.edit(); } else { nodeProps.node.toggle(); } }; var resetClickCount = function resetClickCount() { clickCountRef.current = 0; }; if (clickCountRef.current === (isSameNode ? 2 : 3)) { clickTimer.current = setTimeout(function () { handleAction(handleDoubleClick, 'openAll'); resetClickCount(); }, 300); } if (clickCountRef.current === (isSameNode ? 3 : 4) && handleRenameNode) { clearTimeout(clickTimer.current); handleAction(handleTripleClick, 'edit'); resetClickCount(); } if (clickCountRef.current === 1) { setTimeout(function () { if (clickCountRef.current === 1) { handleAction(handleOnClick); } resetClickCount(); }, 400); } setTimeout(resetClickCount, 500); }; var _toggleInternalNodes = function toggleInternalNodes(nodeProps, action) { nodeProps.node.isInternal && (action === 'open' ? nodeProps.node.open() : nodeProps.node.close()); if (nodeProps.node.children !== null) { nodeProps.node.children.forEach(function (child) { _toggleInternalNodes({ node: child, tree: nodeProps.tree }, action); }); } }; return /*#__PURE__*/_react["default"].createElement("div", { onClick: function onClick(e) { e.stopPropagation(); }, className: classes === null || classes === void 0 ? void 0 : classes.treeContainer, style: style === null || style === void 0 ? void 0 : style.treeContainer, onContextMenu: function onContextMenu(event) { event.preventDefault(); setParentId(null); handleContextMenu && handleContextMenu(event); } }, /*#__PURE__*/_react["default"].createElement(_reactArborist.Tree, { selection: selection, data: data, width: treeWidth, searchTerm: term, height: calcTreeHeight > minTreeHeight ? calcTreeHeight : minTreeHeight, openByDefault: openByDefault, rowHeight: nodeHeight, rowClassName: 'focus:outline-none', disableDrag: typeof handleDragDrop !== 'function', onMove: handleDragDrop, onDelete: handleDeleteNode, onContextMenu: handleContextMenu, searchMatch: function searchMatch(node, term) { return node.data.name.toLowerCase().includes(term.toLowerCase()); } }, function (nodeProps) { var isFile = nodeProps.node.isLeaf; var isFolderOpen = nodeProps.node.isOpen; var isDragging = nodeProps.preview; (0, _react.useEffect)(function () { setVisibleNodesCount(nodeProps.tree.visibleNodes.length); }, [nodeProps.tree.visibleNodes.length]); var titleDirection = (0, _react.useMemo)(function () { return (0, _helpers.calculateRtlDirection)(nodeProps.node.data.name); }, []); var _useState5 = (0, _react.useState)(nodeProps.node.data.name), _useState6 = _slicedToArray(_useState5, 2), inputValue = _useState6[0], setInputValue = _useState6[1]; var editingTitleDirection = (0, _useRtlDirection["default"])(nodeProps.node.isEditing && inputValue ? inputValue : ''); return /*#__PURE__*/_react["default"].createElement("div", { className: classes === null || classes === void 0 ? void 0 : classes.nodeContainer, style: style === null || style === void 0 ? void 0 : style.nodeContainer }, /*#__PURE__*/_react["default"].createElement("div", { dir: titleDirection, ref: nodeProps.dragHandle, className: classes === null || classes === void 0 ? void 0 : classes.nodeWrapper, style: _objectSpread(_objectSpread({}, style === null || style === void 0 ? void 0 : style.nodeWrapper), {}, { marginLeft: "".concat(nodeProps.node.level * indent, "px"), backgroundColor: style !== null && style !== void 0 && style.nodeWrapper ? nodeProps.node.id === selectedNodeId ? style === null || style === void 0 ? void 0 : style.nodeWrapper.selectedColor : style === null || style === void 0 ? void 0 : style.nodeWrapper.backgroundColor : null, maxWidth: isDragging ? maxDraggingNodeWidth : '' }), onClick: function onClick() { handleClick(nodeProps); if (typeof setSelectedNodeId === 'function') { setSelectedNodeId(nodeProps.node.id); } }, onContextMenu: function onContextMenu(event) { event.preventDefault(); event.stopPropagation(); nodeProps.node.select(); if (typeof setParentId === 'function') { setParentId(!isFile ? nodeProps.node.id : null); } handleContextMenu && handleContextMenu(event); getCurrentNodeProps && getCurrentNodeProps(nodeProps); } }, /*#__PURE__*/_react["default"].createElement("div", { className: classes === null || classes === void 0 ? void 0 : classes.nodeTextBlock, style: _objectSpread(_objectSpread({}, style === null || style === void 0 ? void 0 : style.nodeTextBlock), {}, { display: 'flex', gap: '7px', zIndex: '10' }), dir: titleDirection }, !isFile ? nodeProps.node.children.length > 0 ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", null, isFolderOpen ? icons.arrowDown : icons.arrowRight), /*#__PURE__*/_react["default"].createElement("span", null, isFolderOpen ? icons.openFolder : icons.closeFolder)) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, isFolderOpen ? icons.openFolder : icons.closeFolder) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, icons.file), nodeProps.node.isEditing ? /*#__PURE__*/_react["default"].createElement("input", { type: "text", value: inputValue, onChange: function onChange(e) { return setInputValue(e.currentTarget.value); }, onFocus: function onFocus(e) { return e.currentTarget.select(); }, onBlur: function onBlur() { nodeProps.node.submit(inputValue); if (typeof handleRenameNode === 'function') { handleRenameNode(inputValue, nodeProps.node.id); } }, onKeyDown: function onKeyDown(e) { if (e.key === 'Escape') nodeProps.node.reset(); if (e.key === 'Enter') { nodeProps.node.submit(e.currentTarget.value); if (typeof handleRenameNode === 'function') { handleRenameNode(e.currentTarget.value, nodeProps.node.id); } } }, autoFocus: true, style: style === null || style === void 0 ? void 0 : style.renameInput, className: classes === null || classes === void 0 ? void 0 : classes.renameInput, dir: editingTitleDirection, onClick: function onClick(e) { return e.stopPropagation(); } }) : /*#__PURE__*/_react["default"].createElement("div", { className: classes === null || classes === void 0 ? void 0 : classes.nodeText, style: style === null || style === void 0 ? void 0 : style.nodeText }, nodeProps.node.data.name)), /*#__PURE__*/_react["default"].createElement("div", { className: classes === null || classes === void 0 ? void 0 : classes.nodeButtonBlock, style: style === null || style === void 0 ? void 0 : style.nodeButtonBlock }, showRenameButton && /*#__PURE__*/_react["default"].createElement("button", { onClick: function onClick(e) { e.stopPropagation(); nodeProps.node.edit(); }, title: renameButton.title, style: style === null || style === void 0 ? void 0 : style.renameButton, className: classes === null || classes === void 0 ? void 0 : classes.renameButton }, renameButton.content), showRemoveButton && /*#__PURE__*/_react["default"].createElement("button", { onClick: function onClick(e) { e.stopPropagation(); nodeProps.tree["delete"](nodeProps.node.id); }, title: removeButton.title, style: style === null || style === void 0 ? void 0 : style.removeButton, className: classes === null || classes === void 0 ? void 0 : classes.removeButton }, removeButton.content)))); })); } TreeView.propTypes = { /** An object with icons/symbols to display the node type */ icons: _propTypes["default"].shape({ file: _propTypes["default"].node, closeFolder: _propTypes["default"].node, openFolder: _propTypes["default"].node, arrowDown: _propTypes["default"].node, arrowRight: _propTypes["default"].node }), /** ID of the selected node */ selectedNodeId: _propTypes["default"].string, /** Passing an id to the selection prop will select and scroll to that node whenever that id changes */ selection: _propTypes["default"].string, /** Height of each node */ nodeHeight: _propTypes["default"].number, /** Minimum tree window height */ minTreeHeight: _propTypes["default"].number, /** If true, then all folders are open by default */ openByDefault: _propTypes["default"].bool, /** Tree element deletion event handler function */ handleDeleteNode: _propTypes["default"].func, /** Data for visual representation of hierarchy */ data: _propTypes["default"].arrayOf(_propTypes["default"].shape({ id: _propTypes["default"].string.isRequired, name: _propTypes["default"].string.isRequired, children: _propTypes["default"].array })).isRequired, /** Function to get properties of the current node */ getCurrentNodeProps: _propTypes["default"].func, /** Context menu handler function */ handleContextMenu: _propTypes["default"].func, /** Function to set the selected node */ setSelectedNodeId: _propTypes["default"].func.isRequired, /** Node rename handler function */ handleRenameNode: _propTypes["default"].func, /** Node drag handler function */ handleDragDrop: _propTypes["default"].func, /** Click handler function. By default, this is toggles the open/closed state of the folder. If you want to use the built-in function to rename or expand all nested elements, then pass a string with the corresponding 'rename' or 'openAll' values. If you want to pass a function that handles a node, whether it is a file or a folder, then you should provide the object with a "changeNode" function. */ handleOnClick: _propTypes["default"].oneOfType([_propTypes["default"].func, _propTypes["default"].string, _propTypes["default"].shape({ changeNode: _propTypes["default"].func })]), /** Double click handler function. By default, expands all children of a tree branch. If you want to use the built-in function to rename or expand all nested elements, then pass a string with the corresponding 'rename' or 'openAll' values. If you want to pass a function that handles a node, whether it is a file or a folder, then you should provide the object with a "changeNode" function. */ handleDoubleClick: _propTypes["default"].oneOfType([_propTypes["default"].func, _propTypes["default"].string, _propTypes["default"].shape({ changeNode: _propTypes["default"].func })]), /** Triple click handler function. By default, causes the node to be renamed if handleRenameNode is true. If you want to use the built-in function to rename or expand all nested elements, then pass a string with the corresponding 'rename' or 'openAll' values. If you want to pass a function that handles a node, whether it is a file or a folder, then you should provide the object with a "changeNode" function. */ handleTripleClick: _propTypes["default"].oneOfType([_propTypes["default"].func, _propTypes["default"].string, _propTypes["default"].shape({ changeNode: _propTypes["default"].func })]), /** Tree width */ treeWidth: _propTypes["default"].oneOfType([_propTypes["default"].number, _propTypes["default"].string]), /** Class names for various elements */ classes: _propTypes["default"].shape({ /** Class for the container of the tree */ treeContainer: _propTypes["default"].string, /** Class for a node in a tree */ nodeWrapper: _propTypes["default"].string, /** Class for the text block of a node */ nodeTextBlock: _propTypes["default"].string, /** Class for the input field when renaming */ renameInput: _propTypes["default"].string, /** Class for the text of a node */ nodeText: _propTypes["default"].string, /** Class for the button block of a node */ nodeButtonBlock: _propTypes["default"].string, /** Class for the rename button */ renameButton: _propTypes["default"].string, /** Class for the remove button */ removeButton: _propTypes["default"].string }), /** Component styles */ style: _propTypes["default"].shape({ /** Styles for the container of the tree */ treeContainer: _propTypes["default"].object, /** Style for a single node item with background colors for normal (backgroundColor), hover (hoveredColor), and selected (selectedColor) states. */ nodeWrapper: _propTypes["default"].object, /** Styles for the text block of a node */ nodeTextBlock: _propTypes["default"].object, /** Style for the input field when renaming */ renameInput: _propTypes["default"].object, /** Styles for the text of a node */ nodeText: _propTypes["default"].object, /** Styles for the button block of a node */ nodeButtonBlock: _propTypes["default"].object, /** Style for the rename button */ renameButton: _propTypes["default"].object, /** Style for the delete button */ removeButton: _propTypes["default"].object }), /** Search query */ term: _propTypes["default"].string, /** Indentation between nesting levels */ indent: _propTypes["default"].number, /** Show delete button */ showRemoveButton: _propTypes["default"].bool, /** Show rename button */ showRenameButton: _propTypes["default"].bool, /** Delete button with content and title */ removeButton: _propTypes["default"].shape({ content: _propTypes["default"].node, title: _propTypes["default"].string }), /** Rename button with content and title */ renameButton: _propTypes["default"].shape({ content: _propTypes["default"].node, title: _propTypes["default"].string }), /** max width of draggable node */ maxDraggingNodeWidth: _propTypes["default"].string }; var _default = exports["default"] = TreeView;