import Hooks from './../../pluginHooks'; import { registerPlugin } from './../../plugins'; import { hasOwnProperty } from './../../helpers/object'; function Storage(prefix) { var savedKeys; var saveSavedKeys = function saveSavedKeys() { window.localStorage[prefix + '__persistentStateKeys'] = JSON.stringify(savedKeys); }; var loadSavedKeys = function loadSavedKeys() { var keysJSON = window.localStorage[prefix + '__persistentStateKeys']; var keys = typeof keysJSON == 'string' ? JSON.parse(keysJSON) : void 0; savedKeys = keys ? keys : []; }; var clearSavedKeys = function clearSavedKeys() { 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;