Blame | Letzte Änderung | Log anzeigen | RSS feed
/*** ### 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};$.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 st = { 'state' : this.get_state(), '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) {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 errorset : 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");}));