annotate vakata-jstree-3.3.5/src/jstree.state.js @ 5:aacd5f53ac99 draft

v2.0.0
author mingchen0919
date Wed, 18 Apr 2018 13:17:28 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
mingchen0919
parents:
diff changeset
1 /**
mingchen0919
parents:
diff changeset
2 * ### State plugin
mingchen0919
parents:
diff changeset
3 *
mingchen0919
parents:
diff changeset
4 * Saves the state of the tree (selected nodes, opened nodes) on the user's computer using available options (localStorage, cookies, etc)
mingchen0919
parents:
diff changeset
5 */
mingchen0919
parents:
diff changeset
6 /*globals jQuery, define, exports, require */
mingchen0919
parents:
diff changeset
7 (function (factory) {
mingchen0919
parents:
diff changeset
8 "use strict";
mingchen0919
parents:
diff changeset
9 if (typeof define === 'function' && define.amd) {
mingchen0919
parents:
diff changeset
10 define('jstree.state', ['jquery','jstree'], factory);
mingchen0919
parents:
diff changeset
11 }
mingchen0919
parents:
diff changeset
12 else if(typeof exports === 'object') {
mingchen0919
parents:
diff changeset
13 factory(require('jquery'), require('jstree'));
mingchen0919
parents:
diff changeset
14 }
mingchen0919
parents:
diff changeset
15 else {
mingchen0919
parents:
diff changeset
16 factory(jQuery, jQuery.jstree);
mingchen0919
parents:
diff changeset
17 }
mingchen0919
parents:
diff changeset
18 }(function ($, jstree, undefined) {
mingchen0919
parents:
diff changeset
19 "use strict";
mingchen0919
parents:
diff changeset
20
mingchen0919
parents:
diff changeset
21 if($.jstree.plugins.state) { return; }
mingchen0919
parents:
diff changeset
22
mingchen0919
parents:
diff changeset
23 var to = false;
mingchen0919
parents:
diff changeset
24 /**
mingchen0919
parents:
diff changeset
25 * stores all defaults for the state plugin
mingchen0919
parents:
diff changeset
26 * @name $.jstree.defaults.state
mingchen0919
parents:
diff changeset
27 * @plugin state
mingchen0919
parents:
diff changeset
28 */
mingchen0919
parents:
diff changeset
29 $.jstree.defaults.state = {
mingchen0919
parents:
diff changeset
30 /**
mingchen0919
parents:
diff changeset
31 * A string for the key to use when saving the current tree (change if using multiple trees in your project). Defaults to `jstree`.
mingchen0919
parents:
diff changeset
32 * @name $.jstree.defaults.state.key
mingchen0919
parents:
diff changeset
33 * @plugin state
mingchen0919
parents:
diff changeset
34 */
mingchen0919
parents:
diff changeset
35 key : 'jstree',
mingchen0919
parents:
diff changeset
36 /**
mingchen0919
parents:
diff changeset
37 * A space separated list of events that trigger a state save. Defaults to `changed.jstree open_node.jstree close_node.jstree`.
mingchen0919
parents:
diff changeset
38 * @name $.jstree.defaults.state.events
mingchen0919
parents:
diff changeset
39 * @plugin state
mingchen0919
parents:
diff changeset
40 */
mingchen0919
parents:
diff changeset
41 events : 'changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree',
mingchen0919
parents:
diff changeset
42 /**
mingchen0919
parents:
diff changeset
43 * Time in milliseconds after which the state will expire. Defaults to 'false' meaning - no expire.
mingchen0919
parents:
diff changeset
44 * @name $.jstree.defaults.state.ttl
mingchen0919
parents:
diff changeset
45 * @plugin state
mingchen0919
parents:
diff changeset
46 */
mingchen0919
parents:
diff changeset
47 ttl : false,
mingchen0919
parents:
diff changeset
48 /**
mingchen0919
parents:
diff changeset
49 * 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.
mingchen0919
parents:
diff changeset
50 * @name $.jstree.defaults.state.filter
mingchen0919
parents:
diff changeset
51 * @plugin state
mingchen0919
parents:
diff changeset
52 */
mingchen0919
parents:
diff changeset
53 filter : false,
mingchen0919
parents:
diff changeset
54 /**
mingchen0919
parents:
diff changeset
55 * 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`
mingchen0919
parents:
diff changeset
56 * @name $.jstree.defaults.state.preserve_loaded
mingchen0919
parents:
diff changeset
57 * @plugin state
mingchen0919
parents:
diff changeset
58 */
mingchen0919
parents:
diff changeset
59 preserve_loaded : false
mingchen0919
parents:
diff changeset
60 };
mingchen0919
parents:
diff changeset
61 $.jstree.plugins.state = function (options, parent) {
mingchen0919
parents:
diff changeset
62 this.bind = function () {
mingchen0919
parents:
diff changeset
63 parent.bind.call(this);
mingchen0919
parents:
diff changeset
64 var bind = $.proxy(function () {
mingchen0919
parents:
diff changeset
65 this.element.on(this.settings.state.events, $.proxy(function () {
mingchen0919
parents:
diff changeset
66 if(to) { clearTimeout(to); }
mingchen0919
parents:
diff changeset
67 to = setTimeout($.proxy(function () { this.save_state(); }, this), 100);
mingchen0919
parents:
diff changeset
68 }, this));
mingchen0919
parents:
diff changeset
69 /**
mingchen0919
parents:
diff changeset
70 * triggered when the state plugin is finished restoring the state (and immediately after ready if there is no state to restore).
mingchen0919
parents:
diff changeset
71 * @event
mingchen0919
parents:
diff changeset
72 * @name state_ready.jstree
mingchen0919
parents:
diff changeset
73 * @plugin state
mingchen0919
parents:
diff changeset
74 */
mingchen0919
parents:
diff changeset
75 this.trigger('state_ready');
mingchen0919
parents:
diff changeset
76 }, this);
mingchen0919
parents:
diff changeset
77 this.element
mingchen0919
parents:
diff changeset
78 .on("ready.jstree", $.proxy(function (e, data) {
mingchen0919
parents:
diff changeset
79 this.element.one("restore_state.jstree", bind);
mingchen0919
parents:
diff changeset
80 if(!this.restore_state()) { bind(); }
mingchen0919
parents:
diff changeset
81 }, this));
mingchen0919
parents:
diff changeset
82 };
mingchen0919
parents:
diff changeset
83 /**
mingchen0919
parents:
diff changeset
84 * save the state
mingchen0919
parents:
diff changeset
85 * @name save_state()
mingchen0919
parents:
diff changeset
86 * @plugin state
mingchen0919
parents:
diff changeset
87 */
mingchen0919
parents:
diff changeset
88 this.save_state = function () {
mingchen0919
parents:
diff changeset
89 var tm = this.get_state();
mingchen0919
parents:
diff changeset
90 if (!this.settings.state.preserve_loaded) {
mingchen0919
parents:
diff changeset
91 delete tm.core.loaded;
mingchen0919
parents:
diff changeset
92 }
mingchen0919
parents:
diff changeset
93 var st = { 'state' : tm, 'ttl' : this.settings.state.ttl, 'sec' : +(new Date()) };
mingchen0919
parents:
diff changeset
94 $.vakata.storage.set(this.settings.state.key, JSON.stringify(st));
mingchen0919
parents:
diff changeset
95 };
mingchen0919
parents:
diff changeset
96 /**
mingchen0919
parents:
diff changeset
97 * restore the state from the user's computer
mingchen0919
parents:
diff changeset
98 * @name restore_state()
mingchen0919
parents:
diff changeset
99 * @plugin state
mingchen0919
parents:
diff changeset
100 */
mingchen0919
parents:
diff changeset
101 this.restore_state = function () {
mingchen0919
parents:
diff changeset
102 var k = $.vakata.storage.get(this.settings.state.key);
mingchen0919
parents:
diff changeset
103 if(!!k) { try { k = JSON.parse(k); } catch(ex) { return false; } }
mingchen0919
parents:
diff changeset
104 if(!!k && k.ttl && k.sec && +(new Date()) - k.sec > k.ttl) { return false; }
mingchen0919
parents:
diff changeset
105 if(!!k && k.state) { k = k.state; }
mingchen0919
parents:
diff changeset
106 if(!!k && $.isFunction(this.settings.state.filter)) { k = this.settings.state.filter.call(this, k); }
mingchen0919
parents:
diff changeset
107 if(!!k) {
mingchen0919
parents:
diff changeset
108 if (!this.settings.state.preserve_loaded) {
mingchen0919
parents:
diff changeset
109 delete k.core.loaded;
mingchen0919
parents:
diff changeset
110 }
mingchen0919
parents:
diff changeset
111 this.element.one("set_state.jstree", function (e, data) { data.instance.trigger('restore_state', { 'state' : $.extend(true, {}, k) }); });
mingchen0919
parents:
diff changeset
112 this.set_state(k);
mingchen0919
parents:
diff changeset
113 return true;
mingchen0919
parents:
diff changeset
114 }
mingchen0919
parents:
diff changeset
115 return false;
mingchen0919
parents:
diff changeset
116 };
mingchen0919
parents:
diff changeset
117 /**
mingchen0919
parents:
diff changeset
118 * clear the state on the user's computer
mingchen0919
parents:
diff changeset
119 * @name clear_state()
mingchen0919
parents:
diff changeset
120 * @plugin state
mingchen0919
parents:
diff changeset
121 */
mingchen0919
parents:
diff changeset
122 this.clear_state = function () {
mingchen0919
parents:
diff changeset
123 return $.vakata.storage.del(this.settings.state.key);
mingchen0919
parents:
diff changeset
124 };
mingchen0919
parents:
diff changeset
125 };
mingchen0919
parents:
diff changeset
126
mingchen0919
parents:
diff changeset
127 (function ($, undefined) {
mingchen0919
parents:
diff changeset
128 $.vakata.storage = {
mingchen0919
parents:
diff changeset
129 // simply specifying the functions in FF throws an error
mingchen0919
parents:
diff changeset
130 set : function (key, val) { return window.localStorage.setItem(key, val); },
mingchen0919
parents:
diff changeset
131 get : function (key) { return window.localStorage.getItem(key); },
mingchen0919
parents:
diff changeset
132 del : function (key) { return window.localStorage.removeItem(key); }
mingchen0919
parents:
diff changeset
133 };
mingchen0919
parents:
diff changeset
134 }($));
mingchen0919
parents:
diff changeset
135
mingchen0919
parents:
diff changeset
136 // include the state plugin by default
mingchen0919
parents:
diff changeset
137 // $.jstree.defaults.plugins.push("state");
mingchen0919
parents:
diff changeset
138 }));