UNPKG

handsontable

Version:

Handsontable is a JavaScript Data Grid available for React, Angular and Vue.

125 lines (122 loc) 4.55 kB
"use strict"; exports.__esModule = true; require("core-js/modules/es.error.cause.js"); require("core-js/modules/es.array.push.js"); require("core-js/modules/esnext.iterator.constructor.js"); require("core-js/modules/esnext.iterator.find.js"); require("core-js/modules/esnext.iterator.for-each.js"); require("core-js/modules/esnext.iterator.reduce.js"); var _base = require("./_base"); var _object = require("../../../helpers/object"); 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); } /** * Action that tracks data changes. * * @class DataChangeAction * @private */ class DataChangeAction extends _base.BaseAction { constructor(_ref) { let { changes, selected, countCols, countRows } = _ref; super('change'); /** * @param {Array} changes 2D array containing information about each of the edited cells. */ _defineProperty(this, "changes", void 0); /** * @param {number[]} selected The cell selection. */ _defineProperty(this, "selected", void 0); /** * @param {number} countCols The number of columns before data change. */ _defineProperty(this, "countCols", void 0); /** * @param {number} countRows The number of rows before data change. */ _defineProperty(this, "countRows", void 0); this.changes = changes; this.selected = selected; this.countCols = countCols; this.countRows = countRows; } static startRegisteringEvents(hot, undoRedoPlugin) { hot.addHook('beforeChange', function (changes, source) { const changesLen = changes && changes.length; if (!changesLen) { return; } const hasDifferences = changes.find(change => { const [,, oldValue, newValue] = change; return oldValue !== newValue; }); if (!hasDifferences) { return; } const wrappedAction = () => { const clonedChanges = changes.reduce((arr, change) => { arr.push([...change]); return arr; }, []); clonedChanges.forEach(change => { change[1] = hot.propToCol(change[1]); }); const selected = changesLen > 1 ? this.getSelected() : [[clonedChanges[0][0], clonedChanges[0][1]]]; return new DataChangeAction({ changes: clonedChanges, selected, countCols: hot.countCols(), countRows: hot.countRows() }); }; undoRedoPlugin.done(wrappedAction, source); }); } /** * @param {Core} hot The Handsontable instance. * @param {function(): void} undoneCallback The callback to be called after the action is undone. */ undo(hot, undoneCallback) { const data = (0, _object.deepClone)(this.changes); for (let i = 0, len = data.length; i < len; i++) { data[i].splice(3, 1); } hot.addHookOnce('afterChange', () => { const rowsToRemove = hot.countRows() - this.countRows; if (rowsToRemove > 0) { hot.alter('remove_row', null, rowsToRemove, 'UndoRedo.undo'); } const columnsToRemove = hot.countCols() - this.countCols; if (columnsToRemove > 0 && hot.isColumnModificationAllowed()) { hot.alter('remove_col', null, columnsToRemove, 'UndoRedo.undo'); } hot.scrollToFocusedCell(); hot.selectCells(this.selected, false, false); undoneCallback(); }); hot.setDataAtCell(data, null, null, 'UndoRedo.undo'); } /** * @param {Core} hot The Handsontable instance. * @param {function(): void} redoneCallback The callback to be called after the action is redone. */ redo(hot, redoneCallback) { const data = (0, _object.deepClone)(this.changes); for (let i = 0, len = data.length; i < len; i++) { data[i].splice(2, 1); } hot.addHookOnce('afterChange', () => { hot.selectCells(this.selected, false, false); redoneCallback(); }); hot.setDataAtCell(data, null, null, 'UndoRedo.redo'); } } exports.DataChangeAction = DataChangeAction;