UNPKG

@light-sheet/react

Version:

FortuneSheet is a drop-in javascript spreadsheet library that provides rich features like Excel and Google Sheets

246 lines (245 loc) 10.6 kB
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _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(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } 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(arr) { if (Array.isArray(arr)) return arr; } import { editSheetName, cancelNormalSelected, cancelActiveImgItem } from "@light-sheet/core"; import _ from "lodash"; import React, { useContext, useState, useEffect, useRef, useCallback } from "react"; import WorkbookContext from "../../context"; import { useAlert } from "../../hooks/useAlert"; import SVGIcon from "../SVGIcon"; var SheetItem = function SheetItem(_ref) { var sheet = _ref.sheet, isDropPlaceholder = _ref.isDropPlaceholder; var _useContext = useContext(WorkbookContext), context = _useContext.context, setContext = _useContext.setContext, refs = _useContext.refs; var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), editing = _useState2[0], setEditing = _useState2[1]; var containerRef = useRef(null); var editable = useRef(null); var _useState3 = useState(false), _useState4 = _slicedToArray(_useState3, 2), dragOver = _useState4[0], setDragOver = _useState4[1]; var _useState5 = useState("#c3c3c3"), _useState6 = _slicedToArray(_useState5, 2), svgColor = _useState6[0], setSvgColor = _useState6[1]; var _useAlert = useAlert(), showAlert = _useAlert.showAlert; useEffect(function () { setContext(function (draftCtx) { var r = context.sheetScrollRecord[draftCtx === null || draftCtx === void 0 ? void 0 : draftCtx.currentSheetId]; if (r) { var _r$scrollLeft, _r$scrollTop, _r$luckysheet_select_, _r$luckysheet_select_2; draftCtx.scrollLeft = (_r$scrollLeft = r.scrollLeft) !== null && _r$scrollLeft !== void 0 ? _r$scrollLeft : 0; draftCtx.scrollTop = (_r$scrollTop = r.scrollTop) !== null && _r$scrollTop !== void 0 ? _r$scrollTop : 0; draftCtx.luckysheet_select_status = (_r$luckysheet_select_ = r.luckysheet_select_status) !== null && _r$luckysheet_select_ !== void 0 ? _r$luckysheet_select_ : false; draftCtx.luckysheet_select_save = (_r$luckysheet_select_2 = r.luckysheet_select_save) !== null && _r$luckysheet_select_2 !== void 0 ? _r$luckysheet_select_2 : undefined; } else { draftCtx.scrollLeft = 0; draftCtx.scrollTop = 0; draftCtx.luckysheet_select_status = false; draftCtx.luckysheet_select_save = undefined; } draftCtx.luckysheet_selection_range = []; }); }, [context.currentSheetId, context.sheetScrollRecord, setContext]); useEffect(function () { if (!editable.current) return; if (editing) { // select all when enter editing mode if (window.getSelection) { var range = document.createRange(); range.selectNodeContents(editable.current); if (range.startContainer && document.body.contains(range.startContainer)) { var selection = window.getSelection(); selection === null || selection === void 0 || selection.removeAllRanges(); selection === null || selection === void 0 || selection.addRange(range); } // @ts-ignore } else if (document.selection) { // @ts-ignore var _range = document.body.createTextRange(); _range.moveToElementText(editable.current); _range.select(); } } // store the current text editable.current.dataset.oldText = editable.current.innerText; }, [editing]); var onBlur = useCallback(function () { setContext(function (draftCtx) { try { editSheetName(draftCtx, editable.current); } catch (e) { showAlert(e.message); } }); setEditing(false); }, [setContext, showAlert]); var onKeyDown = useCallback(function (e) { if (e.key === "Enter") { var _editable$current; (_editable$current = editable.current) === null || _editable$current === void 0 || _editable$current.blur(); } e.stopPropagation(); }, []); var onDragStart = useCallback(function (e) { if (context.allowEdit === true) e.dataTransfer.setData("sheetId", "".concat(sheet.id)); e.stopPropagation(); }, [context.allowEdit, sheet.id]); var onDrop = useCallback(function (e) { if (context.allowEdit === false) return; var draggingId = e.dataTransfer.getData("sheetId"); setContext(function (draftCtx) { var droppingId = sheet.id; var draggingSheet; var droppingSheet; _.sortBy(draftCtx.luckysheetfile, ["order"]).forEach(function (f, i) { f.order = i; if (f.id === draggingId) { draggingSheet = f; } else if (f.id === droppingId) { droppingSheet = f; } }); if (draggingSheet && droppingSheet) { draggingSheet.order = droppingSheet.order - 0.1; // re-order all sheets _.sortBy(draftCtx.luckysheetfile, ["order"]).forEach(function (f, i) { f.order = i; }); } else if (draggingSheet && isDropPlaceholder) { draggingSheet.order = draftCtx.luckysheetfile.length; } }); setDragOver(false); e.stopPropagation(); }, [context.allowEdit, isDropPlaceholder, setContext, sheet.id]); return /*#__PURE__*/React.createElement("div", { onDragOver: function onDragOver(e) { e.preventDefault(); e.stopPropagation(); }, onDragEnter: function onDragEnter(e) { setDragOver(true); e.stopPropagation(); }, onDragLeave: function onDragLeave(e) { setDragOver(false); e.stopPropagation(); }, onDragEnd: function onDragEnd(e) { setDragOver(false); e.stopPropagation(); }, onDrop: onDrop, onDragStart: onDragStart, draggable: context.allowEdit && !editing, key: sheet.id, ref: containerRef, className: isDropPlaceholder ? "fortune-sheettab-placeholder" : "luckysheet-sheets-item".concat(context.currentSheetId === sheet.id ? " luckysheet-sheets-item-active" : ""), onClick: function onClick() { if (isDropPlaceholder) return; setContext(function (draftCtx) { draftCtx.sheetScrollRecord[draftCtx.currentSheetId] = { scrollLeft: draftCtx.scrollLeft, scrollTop: draftCtx.scrollTop, luckysheet_select_status: draftCtx.luckysheet_select_status, luckysheet_select_save: draftCtx.luckysheet_select_save, luckysheet_selection_range: draftCtx.luckysheet_selection_range }; draftCtx.dataVerificationDropDownList = false; draftCtx.currentSheetId = sheet.id; draftCtx.zoomRatio = sheet.zoomRatio || 1; cancelActiveImgItem(draftCtx, refs.globalCache); cancelNormalSelected(draftCtx); }); }, tabIndex: 0, onContextMenu: function onContextMenu(e) { if (isDropPlaceholder) return; var rect = refs.workbookContainer.current.getBoundingClientRect(); var pageX = e.pageX, pageY = e.pageY; setContext(function (ctx) { // 右击的时候先进行跳转 ctx.dataVerificationDropDownList = false; ctx.currentSheetId = sheet.id; ctx.zoomRatio = sheet.zoomRatio || 1; ctx.sheetTabContextMenu = { x: pageX - rect.left - window.scrollX, y: pageY - rect.top - window.scrollY, sheet: sheet, onRename: function onRename() { return setEditing(true); } }; }); }, style: { borderLeft: dragOver ? "2px solid #0188fb" : "", display: sheet.hide === 1 ? "none" : "" } }, /*#__PURE__*/React.createElement("span", { className: "luckysheet-sheets-item-name", spellCheck: "false", suppressContentEditableWarning: true, contentEditable: isDropPlaceholder ? false : editing, onDoubleClick: function onDoubleClick() { return setEditing(true); }, onBlur: onBlur, onKeyDown: onKeyDown, ref: editable, style: dragOver ? { pointerEvents: "none" } : {} }, sheet.name), /*#__PURE__*/React.createElement("span", { className: "luckysheet-sheets-item-function", onMouseEnter: function onMouseEnter() { return setSvgColor("#5c5c5c"); }, onMouseLeave: function onMouseLeave() { return setSvgColor("#c3c3c3"); }, onClick: function onClick(e) { if (isDropPlaceholder || context.allowEdit === false) return; var rect = refs.workbookContainer.current.getBoundingClientRect(); var pageX = e.pageX, pageY = e.pageY; setContext(function (ctx) { // 右击的时候先进行跳转 ctx.currentSheetId = sheet.id; ctx.sheetTabContextMenu = { x: pageX - rect.left - window.scrollX, y: pageY - rect.top - window.scrollY, sheet: sheet, onRename: function onRename() { return setEditing(true); } }; }); }, tabIndex: 0 }, /*#__PURE__*/React.createElement(SVGIcon, { name: "downArrow", width: 12, style: { fill: svgColor } })), !!sheet.color && /*#__PURE__*/React.createElement("div", { className: "luckysheet-sheets-item-color", style: { background: sheet.color } })); }; export default SheetItem;