|
- /**
- * ### State plugin
- *
- * Saves the state of the tree (selected nodes, opened nodes) on the user's computer using available options (localStorage, cookies, etc)
- */
- /*globals jQuery, define, exports, require */
- (function (factory) {
- "use strict";
- if (typeof define === 'function' && define.amd) {
- define('jstree.state', ['jquery','jstree'], factory);
- }
- else if(typeof exports === 'object') {
- factory(require('jquery'), require('jstree'));
- }
- else {
- factory(jQuery, jQuery.jstree);
- }
- }(function ($, jstree, undefined) {
- "use strict";
-
- if($.jstree.plugins.state) { return; }
-
- var to = false;
- /**
- * stores all defaults for the state plugin
- * @name $.jstree.defaults.state
- * @plugin state
- */
- $.jstree.defaults.state = {
- /**
- * A string for the key to use when saving the current tree (change if using multiple trees in your project). Defaults to `jstree`.
- * @name $.jstree.defaults.state.key
- * @plugin state
- */
- key : 'jstree',
- /**
- * A space separated list of events that trigger a state save. Defaults to `changed.jstree open_node.jstree close_node.jstree`.
- * @name $.jstree.defaults.state.events
- * @plugin state
- */
- events : 'changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree',
- /**
- * Time in milliseconds after which the state will expire. Defaults to 'false' meaning - no expire.
- * @name $.jstree.defaults.state.ttl
- * @plugin state
- */
- ttl : false,
- /**
- * A function that will be executed prior to restoring state with one argument - the state object. Can be used to clear unwanted parts of the state.
- * @name $.jstree.defaults.state.filter
- * @plugin state
- */
- filter : false,
- /**
- * Should loaded nodes be restored (setting this to true means that it is possible that the whole tree will be loaded for some users - use with caution). Defaults to `false`
- * @name $.jstree.defaults.state.preserve_loaded
- * @plugin state
- */
- preserve_loaded : false
- };
- $.jstree.plugins.state = function (options, parent) {
- this.bind = function () {
- parent.bind.call(this);
- var bind = $.proxy(function () {
- this.element.on(this.settings.state.events, $.proxy(function () {
- if(to) { clearTimeout(to); }
- to = setTimeout($.proxy(function () { this.save_state(); }, this), 100);
- }, this));
- /**
- * triggered when the state plugin is finished restoring the state (and immediately after ready if there is no state to restore).
- * @event
- * @name state_ready.jstree
- * @plugin state
- */
- this.trigger('state_ready');
- }, this);
- this.element
- .on("ready.jstree", $.proxy(function (e, data) {
- this.element.one("restore_state.jstree", bind);
- if(!this.restore_state()) { bind(); }
- }, this));
- };
- /**
- * save the state
- * @name save_state()
- * @plugin state
- */
- this.save_state = function () {
- var tm = this.get_state();
- if (!this.settings.state.preserve_loaded) {
- delete tm.core.loaded;
- }
- var st = { 'state' : tm, 'ttl' : this.settings.state.ttl, 'sec' : +(new Date()) };
- $.vakata.storage.set(this.settings.state.key, JSON.stringify(st));
- };
- /**
- * restore the state from the user's computer
- * @name restore_state()
- * @plugin state
- */
- this.restore_state = function () {
- var k = $.vakata.storage.get(this.settings.state.key);
- if(!!k) { try { k = JSON.parse(k); } catch(ex) { return false; } }
- if(!!k && k.ttl && k.sec && +(new Date()) - k.sec > k.ttl) { return false; }
- if(!!k && k.state) { k = k.state; }
- if(!!k && $.isFunction(this.settings.state.filter)) { k = this.settings.state.filter.call(this, k); }
- if(!!k) {
- if (!this.settings.state.preserve_loaded) {
- delete k.core.loaded;
- }
- this.element.one("set_state.jstree", function (e, data) { data.instance.trigger('restore_state', { 'state' : $.extend(true, {}, k) }); });
- this.set_state(k);
- return true;
- }
- return false;
- };
- /**
- * clear the state on the user's computer
- * @name clear_state()
- * @plugin state
- */
- this.clear_state = function () {
- return $.vakata.storage.del(this.settings.state.key);
- };
- };
-
- (function ($, undefined) {
- $.vakata.storage = {
- // simply specifying the functions in FF throws an error
- set : function (key, val) { return window.localStorage.setItem(key, val); },
- get : function (key) { return window.localStorage.getItem(key); },
- del : function (key) { return window.localStorage.removeItem(key); }
- };
- }($));
-
- // include the state plugin by default
- // $.jstree.defaults.plugins.push("state");
- }));
|