@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
JavaScript
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;