@quantlab/handsontable
Version:
Spreadsheet-like data grid editor that provides copy/paste functionality compatible with Excel/Google Docs
147 lines (108 loc) • 3.48 kB
JavaScript
import Hooks from './../../pluginHooks';
import {registerPlugin} from './../../plugins';
import {hasOwnProperty} from './../../helpers/object';
function Storage(prefix) {
var savedKeys;
var saveSavedKeys = function() {
window.localStorage[`${prefix}__persistentStateKeys`] = JSON.stringify(savedKeys);
};
var loadSavedKeys = function() {
var keysJSON = window.localStorage[`${prefix}__persistentStateKeys`];
var keys = typeof keysJSON == 'string' ? JSON.parse(keysJSON) : void 0;
savedKeys = keys ? keys : [];
};
var clearSavedKeys = function() {
savedKeys = [];
saveSavedKeys();
};
loadSavedKeys();
this.saveValue = function(key, value) {
window.localStorage[`${prefix}_${key}`] = JSON.stringify(value);
if (savedKeys.indexOf(key) == -1) {
savedKeys.push(key);
saveSavedKeys();
}
};
this.loadValue = function(key, defaultValue) {
key = typeof key === 'undefined' ? defaultValue : key;
var value = window.localStorage[`${prefix}_${key}`];
return typeof value == 'undefined' ? void 0 : JSON.parse(value);
};
this.reset = function(key) {
window.localStorage.removeItem(`${prefix}_${key}`);
};
this.resetAll = function() {
for (var index = 0; index < savedKeys.length; index++) {
window.localStorage.removeItem(`${prefix}_${savedKeys[index]}`);
}
clearSavedKeys();
};
}
/**
* @private
* @class PersistentState
* @plugin PersistentState
*/
function HandsontablePersistentState() {
var plugin = this;
this.init = function() {
var instance = this,
pluginSettings = instance.getSettings().persistentState;
plugin.enabled = !!(pluginSettings);
if (!plugin.enabled) {
removeHooks.call(instance);
return;
}
if (!instance.storage) {
instance.storage = new Storage(instance.rootElement.id);
}
instance.resetState = plugin.resetValue;
addHooks.call(instance);
};
this.saveValue = function(key, value) {
var instance = this;
instance.storage.saveValue(key, value);
};
this.loadValue = function(key, saveTo) {
var instance = this;
saveTo.value = instance.storage.loadValue(key);
};
this.resetValue = function(key) {
var instance = this;
if (typeof key === 'undefined') {
instance.storage.resetAll();
} else {
instance.storage.reset(key);
}
};
var hooks = {
persistentStateSave: plugin.saveValue,
persistentStateLoad: plugin.loadValue,
persistentStateReset: plugin.resetValue
};
for (var hookName in hooks) {
if (hasOwnProperty(hooks, hookName)) {
Hooks.getSingleton().register(hookName);
}
}
function addHooks() {
var instance = this;
for (var hookName in hooks) {
if (hasOwnProperty(hooks, hookName)) {
instance.addHook(hookName, hooks[hookName]);
}
}
}
function removeHooks() {
var instance = this;
for (var hookName in hooks) {
if (hasOwnProperty(hooks, hookName)) {
instance.removeHook(hookName, hooks[hookName]);
}
}
}
}
var htPersistentState = new HandsontablePersistentState();
Hooks.getSingleton().add('beforeInit', htPersistentState.init);
Hooks.getSingleton().add('afterUpdateSettings', htPersistentState.init);
export default HandsontablePersistentState;