UNPKG

tabulator-tables

Version:

Interactive table generation JavaScript library

135 lines (98 loc) 3.18 kB
var History = function(table){ this.table = table; //hold Tabulator object this.history = []; this.index = -1; }; History.prototype.clear = function(){ this.history = []; this.index = -1; }; History.prototype.action = function(type, component, data){ this.history = this.history.slice(0, this.index + 1); this.history.push({ type:type, component:component, data:data, }); this.index ++; }; History.prototype.getHistoryUndoSize = function(){ return this.index + 1; }; History.prototype.getHistoryRedoSize = function(){ return this.history.length - (this.index + 1); }; History.prototype.undo = function(){ if(this.index > -1){ let action = this.history[this.index]; this.undoers[action.type].call(this, action); this.index--; this.table.options.historyUndo.call(this.table, action.type, action.component.getComponent(), action.data); return true; }else{ console.warn("History Undo Error - No more history to undo"); return false; } }; History.prototype.redo = function(){ if(this.history.length-1 > this.index){ this.index++; let action = this.history[this.index]; this.redoers[action.type].call(this, action); this.table.options.historyRedo.call(this.table, action.type, action.component.getComponent(), action.data); return true; }else{ console.warn("History Redo Error - No more history to redo"); return false; } }; History.prototype.undoers = { cellEdit: function(action){ action.component.setValueProcessData(action.data.oldValue); }, rowAdd: function(action){ action.component.deleteActual(); }, rowDelete: function(action){ var newRow = this.table.rowManager.addRowActual(action.data.data, action.data.pos, action.data.index); this._rebindRow(action.component, newRow); }, rowMove: function(action){ this.table.rowManager.moveRowActual(action.component, this.table.rowManager.rows[action.data.pos], false); this.table.rowManager.redraw(); }, }; History.prototype.redoers = { cellEdit: function(action){ action.component.setValueProcessData(action.data.newValue); }, rowAdd: function(action){ var newRow = this.table.rowManager.addRowActual(action.data.data, action.data.pos, action.data.index); this._rebindRow(action.component, newRow); }, rowDelete:function(action){ action.component.deleteActual(); }, rowMove: function(action){ this.table.rowManager.moveRowActual(action.component, this.table.rowManager.rows[action.data.pos], false); this.table.rowManager.redraw(); }, }; //rebind rows to new element after deletion History.prototype._rebindRow = function(oldRow, newRow){ this.history.forEach(function(action){ if(action.component instanceof Row){ if(action.component === oldRow){ action.component = newRow; } }else if(action.component instanceof Cell){ if(action.component.row === oldRow){ var field = action.component.column.getField(); if(field){ action.component = newRow.getCell(field); } } } }); }; Tabulator.prototype.registerModule("history", History);