UNPKG

@light-sheet/react

Version:

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

605 lines (603 loc) 32.6 kB
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); } var _excluded = ["onChange", "onOp", "data"]; 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(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } 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; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } import { defaultContext, defaultSettings, initSheetIndex, handleGlobalKeyDown, getSheetIndex, handlePaste, filterPatch, patchToOp, inverseRowColOptions, ensureSheetIndex, insertRowCol, locale, calcSelectionInfo, groupValuesRefresh, setFormulaCellInfoMap } from "@light-sheet/core"; import React, { useMemo, useState, useCallback, useEffect, useRef, useImperativeHandle } from "react"; import "./index.css"; import produce, { applyPatches, enablePatches, produceWithPatches } from "immer"; import _ from "lodash"; import Sheet from "../Sheet"; import WorkbookContext from "../../context"; import Toolbar from "../Toolbar"; import FxEditor from "../FxEditor"; import SheetTab from "../SheetTab"; import ContextMenu from "../ContextMenu"; import SVGDefines from "../SVGDefines"; import SheetTabContextMenu from "../ContextMenu/SheetTab"; import MoreItemsContaier from "../Toolbar/MoreItemsContainer"; import { generateAPIs } from "./api"; import { ModalProvider } from "../../context/modal"; import { RightPanelProvider } from "../../context/rightPanel"; import FilterMenu from "../ContextMenu/FilterMenu"; import SheetList from "../SheetList"; enablePatches(); var triggerGroupValuesRefresh = function triggerGroupValuesRefresh(ctx) { if (ctx.groupValuesRefreshData.length > 0) { groupValuesRefresh(ctx); } }; var concatProducer = function concatProducer() { for (var _len = arguments.length, producers = new Array(_len), _key = 0; _key < _len; _key++) { producers[_key] = arguments[_key]; } return function (ctx) { producers.forEach(function (producer) { producer(ctx); }); }; }; var Workbook = /*#__PURE__*/React.forwardRef(function (_ref, ref) { var _context$luckysheetfi; var onChange = _ref.onChange, onOp = _ref.onOp, originalData = _ref.data, props = _objectWithoutProperties(_ref, _excluded); var layoutRef = useRef(null); var globalCache = useRef({ undoList: [], redoList: [] }); var cellInput = useRef(null); var fxInput = useRef(null); var canvas = useRef(null); var scrollbarX = useRef(null); var scrollbarY = useRef(null); var cellArea = useRef(null); var workbookContainer = useRef(null); var refs = useMemo(function () { return { globalCache: globalCache.current, cellInput: cellInput, fxInput: fxInput, canvas: canvas, scrollbarX: scrollbarX, scrollbarY: scrollbarY, cellArea: cellArea, workbookContainer: workbookContainer }; }, []); var _useState = useState(defaultContext(refs)), _useState2 = _slicedToArray(_useState, 2), context = _useState2[0], setContext = _useState2[1]; var _locale = locale(context), formula = _locale.formula; var _useState3 = useState(null), _useState4 = _slicedToArray(_useState3, 2), moreToolbarItems = _useState4[0], setMoreToolbarItems = _useState4[1]; var _useState5 = useState({ numberC: 0, count: 0, sum: 0, max: 0, min: 0, average: "" }), _useState6 = _slicedToArray(_useState5, 2), calInfo = _useState6[0], setCalInfo = _useState6[1]; var mergedSettings = useMemo(function () { return _.assign(_.cloneDeep(defaultSettings), props); }, // props expect data, onChage, onOp // eslint-disable-next-line react-hooks/exhaustive-deps _toConsumableArray(_.values(props))); // 计算选区的信息 useEffect(function () { var selection = context.luckysheet_select_save; var lang = props.lang; if (selection) { var re = calcSelectionInfo(context, lang); setCalInfo(re); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [context.luckysheet_select_save]); var initSheetData = useCallback(function (draftCtx, newData, index) { var _lastRow$r, _lastCol$c; var celldata = newData.celldata, row = newData.row, column = newData.column; var lastRow = _.maxBy(celldata, "r"); var lastCol = _.maxBy(celldata, "c"); var lastRowNum = ((_lastRow$r = lastRow === null || lastRow === void 0 ? void 0 : lastRow.r) !== null && _lastRow$r !== void 0 ? _lastRow$r : 0) + 1; var lastColNum = ((_lastCol$c = lastCol === null || lastCol === void 0 ? void 0 : lastCol.c) !== null && _lastCol$c !== void 0 ? _lastCol$c : 0) + 1; if (row != null && column != null && row > 0 && column > 0) { lastRowNum = Math.max(lastRowNum, row); lastColNum = Math.max(lastColNum, column); } else { lastRowNum = Math.max(lastRowNum, draftCtx.defaultrowNum); lastColNum = Math.max(lastColNum, draftCtx.defaultcolumnNum); } if (lastRowNum && lastColNum) { var expandedData = _.times(lastRowNum, function () { return _.times(lastColNum, function () { return null; }); }); celldata === null || celldata === void 0 || celldata.forEach(function (d) { // TODO setCellValue(draftCtx, d.r, d.c, expandedData, d.v); expandedData[d.r][d.c] = d.v; }); draftCtx.luckysheetfile = produce(draftCtx.luckysheetfile, function (d) { d[index].data = expandedData; delete d[index].celldata; return d; }); return expandedData; } return null; }, []); var emitOp = useCallback(function (ctx, patches, options) { var undo = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; if (onOp) { onOp(patchToOp(ctx, patches, options, undo)); } }, [onOp]); function reduceUndoList(ctx, ctxBefore) { var sheetsId = ctx.luckysheetfile.map(function (sheet) { return sheet.id; }); var sheetDeletedByMe = globalCache.current.undoList.filter(function (undo) { var _undo$options; return (_undo$options = undo.options) === null || _undo$options === void 0 ? void 0 : _undo$options.deleteSheetOp; }).map(function (item) { var _item$options; return (_item$options = item.options) === null || _item$options === void 0 || (_item$options = _item$options.deleteSheetOp) === null || _item$options === void 0 ? void 0 : _item$options.id; }); globalCache.current.undoList = globalCache.current.undoList.filter(function (undo) { var _undo$options2, _undo$options3, _undo$options4, _undo$options5; return ((_undo$options2 = undo.options) === null || _undo$options2 === void 0 ? void 0 : _undo$options2.deleteSheetOp) || ((_undo$options3 = undo.options) === null || _undo$options3 === void 0 ? void 0 : _undo$options3.id) === undefined || _.indexOf(sheetsId, (_undo$options4 = undo.options) === null || _undo$options4 === void 0 ? void 0 : _undo$options4.id) !== -1 || _.indexOf(sheetDeletedByMe, (_undo$options5 = undo.options) === null || _undo$options5 === void 0 ? void 0 : _undo$options5.id) !== -1; }); if (ctxBefore.luckysheetfile.length > ctx.luckysheetfile.length) { var sheetDeleted = ctxBefore.luckysheetfile.filter(function (oneSheet) { return _.indexOf(ctx.luckysheetfile.map(function (item) { return item.id; }), oneSheet.id) === -1; }).map(function (item) { return getSheetIndex(ctxBefore, item.id); }); var deletedIndex = sheetDeleted[0]; globalCache.current.undoList = globalCache.current.undoList.map(function (oneStep) { oneStep.patches = oneStep.patches.map(function (onePatch) { if (typeof onePatch.path[1] === "number" && onePatch.path[1] > deletedIndex) { onePatch.path[1] -= 1; } return onePatch; }); oneStep.inversePatches = oneStep.inversePatches.map(function (onePatch) { if (typeof onePatch.path[1] === "number" && onePatch.path[1] > deletedIndex) { onePatch.path[1] -= 1; } return onePatch; }); return oneStep; }); } } function dataToCelldata(data) { var cellData = []; for (var row = 0; row < (data === null || data === void 0 ? void 0 : data.length); row += 1) { for (var col = 0; col < ((_data$row = data[row]) === null || _data$row === void 0 ? void 0 : _data$row.length); col += 1) { var _data$row; if (data[row][col] !== null) { cellData.push({ r: row, c: col, v: data[row][col] }); } } } return cellData; } var setContextWithProduce = useCallback(function (recipe) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; setContext(function (ctx_) { var _produceWithPatches = produceWithPatches(ctx_, concatProducer(recipe, triggerGroupValuesRefresh)), _produceWithPatches2 = _slicedToArray(_produceWithPatches, 3), result = _produceWithPatches2[0], patches = _produceWithPatches2[1], inversePatches = _produceWithPatches2[2]; if (patches.length > 0 && !options.noHistory) { if (options.logPatch) { // eslint-disable-next-line no-console console.info("patch", patches); } var filteredPatches = filterPatch(patches); var filteredInversePatches = filterPatch(inversePatches); if (filteredInversePatches.length > 0) { options.id = ctx_.currentSheetId; if (options.deleteSheetOp) { var target = ctx_.luckysheetfile.filter(function (sheet) { var _options$deleteSheetO; return sheet.id === ((_options$deleteSheetO = options.deleteSheetOp) === null || _options$deleteSheetO === void 0 ? void 0 : _options$deleteSheetO.id); }); if (target) { var index = getSheetIndex(ctx_, options.deleteSheetOp.id); options.deletedSheet = { id: options.deleteSheetOp.id, index: index, value: _.cloneDeep(ctx_.luckysheetfile[index]) }; options.deletedSheet.value.celldata = dataToCelldata(options.deletedSheet.value.data); delete options.deletedSheet.value.data; options.deletedSheet.value.status = 0; filteredInversePatches = [{ op: "add", path: ["luckysheetfile", 0], value: options.deletedSheet.value }]; } } else if (options.addSheetOp) { options.addSheet = {}; options.addSheet.id = result.luckysheetfile[result.luckysheetfile.length - 1].id; } globalCache.current.undoList.push({ patches: filteredPatches, inversePatches: filteredInversePatches, options: options }); globalCache.current.redoList = []; emitOp(result, filteredPatches, options); } } else { var _patches$, _ctx_$luckysheetfile; if ((patches === null || patches === void 0 || (_patches$ = patches[0]) === null || _patches$ === void 0 || (_patches$ = _patches$.value) === null || _patches$ === void 0 ? void 0 : _patches$.length) < (ctx_ === null || ctx_ === void 0 || (_ctx_$luckysheetfile = ctx_.luckysheetfile) === null || _ctx_$luckysheetfile === void 0 ? void 0 : _ctx_$luckysheetfile.length)) { reduceUndoList(result, ctx_); } } return result; }); }, [emitOp]); var handleUndo = useCallback(function () { var history = globalCache.current.undoList.pop(); if (history) { setContext(function (ctx_) { var _history$options, _history$options3; if ((_history$options = history.options) !== null && _history$options !== void 0 && _history$options.deleteSheetOp) { var _history$options$dele; history.inversePatches[0].path[1] = ctx_.luckysheetfile.length; var order = (_history$options$dele = history.options.deletedSheet) === null || _history$options$dele === void 0 || (_history$options$dele = _history$options$dele.value) === null || _history$options$dele === void 0 ? void 0 : _history$options$dele.order; var sheetsRight = ctx_.luckysheetfile.filter(function (sheet) { var _history$options2; return (sheet === null || sheet === void 0 ? void 0 : sheet.order) >= order && sheet.id !== (history === null || history === void 0 || (_history$options2 = history.options) === null || _history$options2 === void 0 || (_history$options2 = _history$options2.deleteSheetOp) === null || _history$options2 === void 0 ? void 0 : _history$options2.id); }); _.forEach(sheetsRight, function (sheet) { history.inversePatches.push({ op: "replace", path: ["luckysheetfile", getSheetIndex(ctx_, sheet.id), "order"], value: (sheet === null || sheet === void 0 ? void 0 : sheet.order) + 1 }); }); } var newContext = applyPatches(ctx_, history.inversePatches); globalCache.current.redoList.push(history); var inversedOptions = inverseRowColOptions(history.options); if (inversedOptions !== null && inversedOptions !== void 0 && inversedOptions.insertRowColOp) { inversedOptions.restoreDeletedCells = true; } if ((_history$options3 = history.options) !== null && _history$options3 !== void 0 && _history$options3.addSheetOp) { var _value; var index = getSheetIndex(ctx_, history.options.addSheet.id); inversedOptions.addSheet = { id: history.options.addSheet.id, index: index, value: _.cloneDeep(ctx_.luckysheetfile[index]) }; inversedOptions.addSheet.value.celldata = dataToCelldata((_value = inversedOptions.addSheet.value) === null || _value === void 0 ? void 0 : _value.data); delete inversedOptions.addSheet.value.data; } emitOp(newContext, history.inversePatches, inversedOptions, true); newContext.formulaCache.updateFormulaCache(newContext, history, "undo"); return newContext; }); } }, [emitOp]); var handleRedo = useCallback(function () { var history = globalCache.current.redoList.pop(); if (history) { setContext(function (ctx_) { var newContext = applyPatches(ctx_, history.patches); globalCache.current.undoList.push(history); emitOp(newContext, history.patches, history.options); newContext.formulaCache.updateFormulaCache(newContext, history, "redo"); return newContext; }); } }, [emitOp]); useEffect(function () { if (context.luckysheet_select_save != null) { var _mergedSettings$hooks, _mergedSettings$hooks2; (_mergedSettings$hooks = mergedSettings.hooks) === null || _mergedSettings$hooks === void 0 || (_mergedSettings$hooks2 = _mergedSettings$hooks.afterSelectionChange) === null || _mergedSettings$hooks2 === void 0 || _mergedSettings$hooks2.call(_mergedSettings$hooks, context.currentSheetId, context.luckysheet_select_save[0]); } }, [context.currentSheetId, context.luckysheet_select_save, mergedSettings.hooks]); var providerValue = useMemo(function () { return { context: context, setContext: setContextWithProduce, settings: mergedSettings, handleUndo: handleUndo, handleRedo: handleRedo, refs: refs }; }, [context, handleRedo, handleUndo, mergedSettings, refs, setContextWithProduce]); useEffect(function () { if (!_.isEmpty(context.luckysheetfile)) { onChange === null || onChange === void 0 || onChange(context.luckysheetfile); } }, [context.luckysheetfile, onChange]); useEffect(function () { setContextWithProduce(function (draftCtx) { var _draftCtx$luckysheetf4, _draftCtx$luckysheet_; draftCtx.defaultcolumnNum = mergedSettings.column; draftCtx.defaultrowNum = mergedSettings.row; draftCtx.defaultFontSize = mergedSettings.defaultFontSize; if (_.isEmpty(draftCtx.luckysheetfile)) { var newData = produce(originalData, function (draftData) { ensureSheetIndex(draftData, mergedSettings.generateSheetId); }); draftCtx.luckysheetfile = newData; newData.forEach(function (newDatum) { var _draftCtx$luckysheetf; var index = getSheetIndex(draftCtx, newDatum.id); var sheet = (_draftCtx$luckysheetf = draftCtx.luckysheetfile) === null || _draftCtx$luckysheetf === void 0 ? void 0 : _draftCtx$luckysheetf[index]; var cellMatrixData = initSheetData(draftCtx, sheet, index); setFormulaCellInfoMap(draftCtx, sheet.calcChain, cellMatrixData || undefined); }); } if (mergedSettings.devicePixelRatio > 0) { draftCtx.devicePixelRatio = mergedSettings.devicePixelRatio; } draftCtx.lang = mergedSettings.lang; draftCtx.allowEdit = mergedSettings.allowEdit; draftCtx.hooks = mergedSettings.hooks; // draftCtx.fontList = mergedSettings.fontList; if (_.isEmpty(draftCtx.currentSheetId)) { initSheetIndex(draftCtx); } var sheetIdx = getSheetIndex(draftCtx, draftCtx.currentSheetId); if (sheetIdx == null) { var _draftCtx$luckysheetf2, _draftCtx$luckysheetf3; if (((_draftCtx$luckysheetf2 = (_draftCtx$luckysheetf3 = draftCtx.luckysheetfile) === null || _draftCtx$luckysheetf3 === void 0 ? void 0 : _draftCtx$luckysheetf3.length) !== null && _draftCtx$luckysheetf2 !== void 0 ? _draftCtx$luckysheetf2 : 0) > 0) { sheetIdx = 0; draftCtx.currentSheetId = draftCtx.luckysheetfile[0].id; } } if (sheetIdx == null) return; var sheet = (_draftCtx$luckysheetf4 = draftCtx.luckysheetfile) === null || _draftCtx$luckysheetf4 === void 0 ? void 0 : _draftCtx$luckysheetf4[sheetIdx]; if (!sheet) return; var data = sheet.data; // expand cell data if (_.isEmpty(data)) { var temp = initSheetData(draftCtx, sheet, sheetIdx); if (!_.isNull(temp)) { data = temp; } } if (_.isEmpty(draftCtx.luckysheet_select_save) && !_.isEmpty(sheet.luckysheet_select_save)) { draftCtx.luckysheet_select_save = sheet.luckysheet_select_save; } if (((_draftCtx$luckysheet_ = draftCtx.luckysheet_select_save) === null || _draftCtx$luckysheet_ === void 0 ? void 0 : _draftCtx$luckysheet_.length) === 0) { var _data, _data2, _data3; if ((_data = data) !== null && _data !== void 0 && (_data = _data[0]) !== null && _data !== void 0 && (_data = _data[0]) !== null && _data !== void 0 && _data.mc && !_.isNil((_data2 = data) === null || _data2 === void 0 || (_data2 = _data2[0]) === null || _data2 === void 0 || (_data2 = _data2[0]) === null || _data2 === void 0 || (_data2 = _data2.mc) === null || _data2 === void 0 ? void 0 : _data2.rs) && !_.isNil((_data3 = data) === null || _data3 === void 0 || (_data3 = _data3[0]) === null || _data3 === void 0 || (_data3 = _data3[0]) === null || _data3 === void 0 || (_data3 = _data3.mc) === null || _data3 === void 0 ? void 0 : _data3.cs)) { draftCtx.luckysheet_select_save = [{ row: [0, data[0][0].mc.rs - 1], column: [0, data[0][0].mc.cs - 1] }]; } else { draftCtx.luckysheet_select_save = [{ row: [0, 0], column: [0, 0] }]; } } draftCtx.config = _.isNil(sheet.config) ? {} : sheet.config; draftCtx.insertedImgs = sheet.images; draftCtx.currency = mergedSettings.currency || "¥"; draftCtx.zoomRatio = _.isNil(sheet.zoomRatio) ? 1 : sheet.zoomRatio; draftCtx.rowHeaderWidth = mergedSettings.rowHeaderWidth * draftCtx.zoomRatio; draftCtx.columnHeaderHeight = mergedSettings.columnHeaderHeight * draftCtx.zoomRatio; if (!_.isNil(sheet.defaultRowHeight)) { draftCtx.defaultrowlen = Number(sheet.defaultRowHeight); } else { draftCtx.defaultrowlen = mergedSettings.defaultRowHeight; } if (!_.isNil(sheet.addRows)) { draftCtx.addDefaultRows = Number(sheet.addRows); } else { draftCtx.addDefaultRows = mergedSettings.addRows; } if (!_.isNil(sheet.defaultColWidth)) { draftCtx.defaultcollen = Number(sheet.defaultColWidth); } else { draftCtx.defaultcollen = mergedSettings.defaultColWidth; } if (!_.isNil(sheet.showGridLines)) { var showGridLines = sheet.showGridLines; if (showGridLines === 0 || showGridLines === false) { draftCtx.showGridLines = false; } else { draftCtx.showGridLines = true; } } else { draftCtx.showGridLines = true; } if (_.isNil(mergedSettings.lang)) { var lang = navigator.languages && navigator.languages[0] || // 兼容chromium内核浏览器 navigator.language || // 兼容剩余浏览器 // @ts-ignore navigator.userLanguage; // 兼容IE浏览器 draftCtx.lang = lang; } }, { noHistory: true }); }, [context.currentSheetId, context.luckysheetfile.length, originalData, mergedSettings.defaultRowHeight, mergedSettings.defaultColWidth, mergedSettings.column, mergedSettings.row, mergedSettings.defaultFontSize, mergedSettings.devicePixelRatio, mergedSettings.lang, mergedSettings.allowEdit, mergedSettings.hooks, mergedSettings.generateSheetId, setContextWithProduce, initSheetData, mergedSettings.rowHeaderWidth, mergedSettings.columnHeaderHeight, mergedSettings.addRows, mergedSettings.currency]); var onKeyDown = useCallback(function (e) { var nativeEvent = e.nativeEvent; // handling undo and redo ahead because handleUndo and handleRedo // themselves are calling setContext, and should not be nested // in setContextWithProduce. if ((e.ctrlKey || e.metaKey) && e.code === "KeyZ") { if (e.shiftKey) { handleRedo(); } else { handleUndo(); } e.stopPropagation(); return; } if ((e.ctrlKey || e.metaKey) && e.code === "KeyY") { handleRedo(); e.stopPropagation(); e.preventDefault(); return; } setContextWithProduce(function (draftCtx) { handleGlobalKeyDown(draftCtx, cellInput.current, fxInput.current, nativeEvent, globalCache.current, handleUndo, // still passing handleUndo and handleRedo here to satisfy API handleRedo, canvas.current.getContext("2d")); }); }, [handleRedo, handleUndo, setContextWithProduce]); var onPaste = useCallback(function (e) { var _document$activeEleme; // deal with multi instance case, only the focused sheet handles the paste if (cellInput.current === document.activeElement || ((_document$activeEleme = document.activeElement) === null || _document$activeEleme === void 0 ? void 0 : _document$activeEleme.className) === "fortune-sheet-overlay") { var clipboardData = e.clipboardData; if (!clipboardData) { // @ts-ignore // for IE clipboardData = window.clipboardData; } var txtdata = clipboardData.getData("text/html") || clipboardData.getData("text/plain"); var ele = document.createElement("div"); ele.innerHTML = txtdata; var trList = ele.querySelectorAll("table tr"); var maxRow = trList.length + context.luckysheet_select_save[0].row[0]; var rowToBeAdded = maxRow - context.luckysheetfile[getSheetIndex(context, context.currentSheetId)].data.length; var range = context.luckysheet_select_save; if (rowToBeAdded > 0) { var insertRowColOp = { type: "row", index: context.luckysheetfile[getSheetIndex(context, context.currentSheetId)].data.length - 1, count: rowToBeAdded, direction: "rightbottom", id: context.currentSheetId }; setContextWithProduce(function (draftCtx) { insertRowCol(draftCtx, insertRowColOp); draftCtx.luckysheet_select_save = range; }, { insertRowColOp: insertRowColOp }); } setContextWithProduce(function (draftCtx) { try { handlePaste(draftCtx, e); } catch (err) { console.error(err); } }); } }, [context, setContextWithProduce]); var onMoreToolbarItemsClose = useCallback(function () { setMoreToolbarItems(null); }, []); useEffect(function () { document.addEventListener("paste", onPaste); return function () { document.removeEventListener("paste", onPaste); }; }, [onPaste]); // expose APIs useImperativeHandle(ref, function () { var APIS = _objectSpread(_objectSpread({}, generateAPIs(context, setContextWithProduce, handleUndo, handleRedo, mergedSettings, cellInput.current, scrollbarX.current, scrollbarY.current)), {}, { // TODO: add ui api layout: layoutRef.current }); return APIS; }, [context, setContextWithProduce, handleUndo, handleRedo, mergedSettings]); var i = getSheetIndex(context, context.currentSheetId); if (i == null) { return null; } var sheet = (_context$luckysheetfi = context.luckysheetfile) === null || _context$luckysheetfi === void 0 ? void 0 : _context$luckysheetfi[i]; if (!sheet) { return null; } return /*#__PURE__*/React.createElement(WorkbookContext.Provider, { value: providerValue }, /*#__PURE__*/React.createElement(RightPanelProvider, null, /*#__PURE__*/React.createElement(ModalProvider, null, /*#__PURE__*/React.createElement("div", { className: "fortune-container", ref: workbookContainer, onKeyDown: onKeyDown }, /*#__PURE__*/React.createElement(SVGDefines, { currency: mergedSettings.currency }), /*#__PURE__*/React.createElement("div", { className: "fortune-workarea" }, mergedSettings.showToolbar && /*#__PURE__*/React.createElement(Toolbar, { moreItemsOpen: moreToolbarItems !== null, setMoreItems: setMoreToolbarItems }), mergedSettings.showFormulaBar && /*#__PURE__*/React.createElement(FxEditor, null)), /*#__PURE__*/React.createElement(Sheet, { sheet: sheet, refLayout: layoutRef }), mergedSettings.showSheetTabs && /*#__PURE__*/React.createElement(SheetTab, null), /*#__PURE__*/React.createElement(ContextMenu, null), /*#__PURE__*/React.createElement(FilterMenu, null), /*#__PURE__*/React.createElement(SheetTabContextMenu, null), context.showSheetList && /*#__PURE__*/React.createElement(SheetList, null), moreToolbarItems && /*#__PURE__*/React.createElement(MoreItemsContaier, { onClose: onMoreToolbarItemsClose }, moreToolbarItems), !_.isEmpty(context.contextMenu) && /*#__PURE__*/React.createElement("div", { onMouseDown: function onMouseDown() { setContextWithProduce(function (draftCtx) { draftCtx.contextMenu = {}; draftCtx.filterContextMenu = undefined; draftCtx.showSheetList = undefined; }); }, onMouseMove: function onMouseMove(e) { return e.stopPropagation(); }, onMouseUp: function onMouseUp(e) { return e.stopPropagation(); }, onContextMenu: function onContextMenu(e) { e.preventDefault(); e.stopPropagation(); }, className: "fortune-popover-backdrop" }), /*#__PURE__*/React.createElement("div", { className: "fortune-stat-area" }, /*#__PURE__*/React.createElement("div", { className: "luckysheet-sheet-selection-calInfo" }, !!calInfo.count && /*#__PURE__*/React.createElement("div", { style: { width: "60px" } }, formula.count, ": ", calInfo.count), !!calInfo.numberC && !!calInfo.sum && /*#__PURE__*/React.createElement("div", null, formula.sum, ": ", calInfo.sum), !!calInfo.numberC && !!calInfo.average && /*#__PURE__*/React.createElement("div", null, formula.average, ": ", calInfo.average), !!calInfo.numberC && !!calInfo.max && /*#__PURE__*/React.createElement("div", null, formula.max, ": ", calInfo.max), !!calInfo.numberC && !!calInfo.min && /*#__PURE__*/React.createElement("div", null, formula.min, ": ", calInfo.min))))))); }); export default Workbook;