sequenceserver 2.0.0.rc8 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/sequenceserver +22 -30
- data/lib/sequenceserver/api_errors.rb +5 -1
- data/lib/sequenceserver/blast/constants.rb +1 -1
- data/lib/sequenceserver/blast/hit.rb +5 -16
- data/lib/sequenceserver/blast/job.rb +9 -18
- data/lib/sequenceserver/blast/report.rb +5 -3
- data/lib/sequenceserver/config.rb +4 -1
- data/lib/sequenceserver/database.rb +69 -9
- data/lib/sequenceserver/job.rb +1 -1
- data/lib/sequenceserver/makeblastdb.rb +40 -45
- data/lib/sequenceserver/routes.rb +4 -0
- data/lib/sequenceserver/version.rb +1 -1
- data/lib/sequenceserver.rb +15 -11
- data/public/config.js +143 -142
- data/public/css/fonts.css +23 -22
- data/public/css/grapher.css +598 -594
- data/public/css/sequenceserver.css +86 -24
- data/public/css/sequenceserver.min.css +2 -2
- data/public/js/alignment_exporter.js +14 -14
- data/public/js/databases_tree.js +215 -0
- data/public/js/download_fasta.js +1 -1
- data/public/js/hit.js +6 -2
- data/public/js/hits_overview.js +1 -1
- data/public/js/length_distribution.js +5 -5
- data/public/js/query.js +4 -7
- data/public/js/report.js +12 -24
- data/public/js/search.js +21 -2
- data/public/js/sidebar.js +4 -4
- data/public/js/svgExporter.js +12 -12
- data/public/js/visualisation_helpers.js +4 -5
- data/public/sequenceserver-report.min.js +11 -11
- data/public/sequenceserver-search.min.js +15 -11
- data/public/vendor/github/vakata/jstree@3.3.8/LICENSE-MIT +22 -0
- data/public/vendor/github/vakata/jstree@3.3.8/README.md +663 -0
- data/public/vendor/github/vakata/jstree@3.3.8/bower.json +33 -0
- data/public/vendor/github/vakata/jstree@3.3.8/component.json +28 -0
- data/public/vendor/github/vakata/jstree@3.3.8/composer.json +46 -0
- data/public/vendor/github/vakata/jstree@3.3.8/demo/README.md +2 -0
- data/public/vendor/github/vakata/jstree@3.3.8/demo/basic/index.html +146 -0
- data/public/vendor/github/vakata/jstree@3.3.8/demo/basic/root.json +1 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/jstree.js +8612 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/jstree.min.js +6 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default/32px.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default/40px.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default/style.css +1102 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default/style.min.css +1 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default/throbber.gif +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default-dark/32px.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default-dark/40px.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default-dark/style.css +1146 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default-dark/style.min.css +1 -0
- data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default-dark/throbber.gif +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/gruntfile.js +242 -0
- data/public/vendor/github/vakata/jstree@3.3.8/jstree.jquery.json +28 -0
- data/public/vendor/github/vakata/jstree@3.3.8/package.json +58 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/intro.js +14 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.changed.js +69 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.checkbox.js +976 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.conditionalselect.js +38 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.contextmenu.js +661 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.dnd.js +669 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.js +4931 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.massload.js +137 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.search.js +421 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.sort.js +74 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.state.js +138 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.types.js +372 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.unique.js +164 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.wholerow.js +122 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/misc.js +656 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/outro.js +1 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/sample.js +93 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/base.less +93 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default/32px.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default/40px.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default/style.css +1102 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default/style.less +22 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default/throbber.gif +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default-dark/32px.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default-dark/40px.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default-dark/style.css +1146 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default-dark/style.less +50 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default-dark/throbber.gif +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/main.less +77 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/mixins.less +104 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/themes/responsive.less +67 -0
- data/public/vendor/github/vakata/jstree@3.3.8/src/vakata-jstree.js +38 -0
- data/public/vendor/github/vakata/jstree@3.3.8/test/unit/index.html +16 -0
- data/public/vendor/github/vakata/jstree@3.3.8/test/unit/libs/qunit.css +244 -0
- data/public/vendor/github/vakata/jstree@3.3.8/test/unit/libs/qunit.js +2212 -0
- data/public/vendor/github/vakata/jstree@3.3.8/test/unit/test.js +11 -0
- data/public/vendor/github/vakata/jstree@3.3.8/test/visual/desktop/index.html +44 -0
- data/public/vendor/github/vakata/jstree@3.3.8/test/visual/mobile/index.html +42 -0
- data/public/vendor/github/vakata/jstree@3.3.8/test/visual/screenshots/desktop/desktop.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/test/visual/screenshots/desktop/home.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/test/visual/screenshots/mobile/home.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8/test/visual/screenshots/mobile/mobile.png +0 -0
- data/public/vendor/github/vakata/jstree@3.3.8.js +3 -0
- data/public/vendor/system-csp-production.js +3 -3
- data/public/vendor/system-csp-production.js.map +1 -1
- data/public/vendor/system-csp-production.src.js +146 -140
- data/public/vendor/system-polyfills.js.map +1 -1
- data/public/vendor/system-polyfills.src.js +1 -0
- data/public/vendor/system.js +3 -3
- data/public/vendor/system.js.map +1 -1
- data/public/vendor/system.src.js +4771 -2383
- data/views/_options.erb +21 -0
- data/views/layout.erb +17 -18
- metadata +102 -43
- data/bin/chromedriver +0 -0
- data/bin/geckodriver +0 -0
- data/public/shims/form-core.js +0 -3
- data/public/shims/form-validation.js +0 -3
- data/public/shims/plugins/jquery.ui.position.js +0 -13
- data/public/shims/styles/shim.css +0 -1
@@ -0,0 +1,138 @@
|
|
1
|
+
/**
|
2
|
+
* ### State plugin
|
3
|
+
*
|
4
|
+
* Saves the state of the tree (selected nodes, opened nodes) on the user's computer using available options (localStorage, cookies, etc)
|
5
|
+
*/
|
6
|
+
/*globals jQuery, define, exports, require */
|
7
|
+
(function (factory) {
|
8
|
+
"use strict";
|
9
|
+
if (typeof define === 'function' && define.amd) {
|
10
|
+
define('jstree.state', ['jquery','jstree'], factory);
|
11
|
+
}
|
12
|
+
else if(typeof exports === 'object') {
|
13
|
+
factory(require('jquery'), require('jstree'));
|
14
|
+
}
|
15
|
+
else {
|
16
|
+
factory(jQuery, jQuery.jstree);
|
17
|
+
}
|
18
|
+
}(function ($, jstree, undefined) {
|
19
|
+
"use strict";
|
20
|
+
|
21
|
+
if($.jstree.plugins.state) { return; }
|
22
|
+
|
23
|
+
var to = false;
|
24
|
+
/**
|
25
|
+
* stores all defaults for the state plugin
|
26
|
+
* @name $.jstree.defaults.state
|
27
|
+
* @plugin state
|
28
|
+
*/
|
29
|
+
$.jstree.defaults.state = {
|
30
|
+
/**
|
31
|
+
* A string for the key to use when saving the current tree (change if using multiple trees in your project). Defaults to `jstree`.
|
32
|
+
* @name $.jstree.defaults.state.key
|
33
|
+
* @plugin state
|
34
|
+
*/
|
35
|
+
key : 'jstree',
|
36
|
+
/**
|
37
|
+
* A space separated list of events that trigger a state save. Defaults to `changed.jstree open_node.jstree close_node.jstree`.
|
38
|
+
* @name $.jstree.defaults.state.events
|
39
|
+
* @plugin state
|
40
|
+
*/
|
41
|
+
events : 'changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree',
|
42
|
+
/**
|
43
|
+
* Time in milliseconds after which the state will expire. Defaults to 'false' meaning - no expire.
|
44
|
+
* @name $.jstree.defaults.state.ttl
|
45
|
+
* @plugin state
|
46
|
+
*/
|
47
|
+
ttl : false,
|
48
|
+
/**
|
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.
|
50
|
+
* @name $.jstree.defaults.state.filter
|
51
|
+
* @plugin state
|
52
|
+
*/
|
53
|
+
filter : false,
|
54
|
+
/**
|
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`
|
56
|
+
* @name $.jstree.defaults.state.preserve_loaded
|
57
|
+
* @plugin state
|
58
|
+
*/
|
59
|
+
preserve_loaded : false
|
60
|
+
};
|
61
|
+
$.jstree.plugins.state = function (options, parent) {
|
62
|
+
this.bind = function () {
|
63
|
+
parent.bind.call(this);
|
64
|
+
var bind = $.proxy(function () {
|
65
|
+
this.element.on(this.settings.state.events, $.proxy(function () {
|
66
|
+
if(to) { clearTimeout(to); }
|
67
|
+
to = setTimeout($.proxy(function () { this.save_state(); }, this), 100);
|
68
|
+
}, this));
|
69
|
+
/**
|
70
|
+
* triggered when the state plugin is finished restoring the state (and immediately after ready if there is no state to restore).
|
71
|
+
* @event
|
72
|
+
* @name state_ready.jstree
|
73
|
+
* @plugin state
|
74
|
+
*/
|
75
|
+
this.trigger('state_ready');
|
76
|
+
}, this);
|
77
|
+
this.element
|
78
|
+
.on("ready.jstree", $.proxy(function (e, data) {
|
79
|
+
this.element.one("restore_state.jstree", bind);
|
80
|
+
if(!this.restore_state()) { bind(); }
|
81
|
+
}, this));
|
82
|
+
};
|
83
|
+
/**
|
84
|
+
* save the state
|
85
|
+
* @name save_state()
|
86
|
+
* @plugin state
|
87
|
+
*/
|
88
|
+
this.save_state = function () {
|
89
|
+
var tm = this.get_state();
|
90
|
+
if (!this.settings.state.preserve_loaded) {
|
91
|
+
delete tm.core.loaded;
|
92
|
+
}
|
93
|
+
var st = { 'state' : tm, 'ttl' : this.settings.state.ttl, 'sec' : +(new Date()) };
|
94
|
+
$.vakata.storage.set(this.settings.state.key, JSON.stringify(st));
|
95
|
+
};
|
96
|
+
/**
|
97
|
+
* restore the state from the user's computer
|
98
|
+
* @name restore_state()
|
99
|
+
* @plugin state
|
100
|
+
*/
|
101
|
+
this.restore_state = function () {
|
102
|
+
var k = $.vakata.storage.get(this.settings.state.key);
|
103
|
+
if(!!k) { try { k = JSON.parse(k); } catch(ex) { return false; } }
|
104
|
+
if(!!k && k.ttl && k.sec && +(new Date()) - k.sec > k.ttl) { return false; }
|
105
|
+
if(!!k && k.state) { k = k.state; }
|
106
|
+
if(!!k && $.isFunction(this.settings.state.filter)) { k = this.settings.state.filter.call(this, k); }
|
107
|
+
if(!!k) {
|
108
|
+
if (!this.settings.state.preserve_loaded) {
|
109
|
+
delete k.core.loaded;
|
110
|
+
}
|
111
|
+
this.element.one("set_state.jstree", function (e, data) { data.instance.trigger('restore_state', { 'state' : $.extend(true, {}, k) }); });
|
112
|
+
this.set_state(k);
|
113
|
+
return true;
|
114
|
+
}
|
115
|
+
return false;
|
116
|
+
};
|
117
|
+
/**
|
118
|
+
* clear the state on the user's computer
|
119
|
+
* @name clear_state()
|
120
|
+
* @plugin state
|
121
|
+
*/
|
122
|
+
this.clear_state = function () {
|
123
|
+
return $.vakata.storage.del(this.settings.state.key);
|
124
|
+
};
|
125
|
+
};
|
126
|
+
|
127
|
+
(function ($, undefined) {
|
128
|
+
$.vakata.storage = {
|
129
|
+
// simply specifying the functions in FF throws an error
|
130
|
+
set : function (key, val) { return window.localStorage.setItem(key, val); },
|
131
|
+
get : function (key) { return window.localStorage.getItem(key); },
|
132
|
+
del : function (key) { return window.localStorage.removeItem(key); }
|
133
|
+
};
|
134
|
+
}($));
|
135
|
+
|
136
|
+
// include the state plugin by default
|
137
|
+
// $.jstree.defaults.plugins.push("state");
|
138
|
+
}));
|
@@ -0,0 +1,372 @@
|
|
1
|
+
/**
|
2
|
+
* ### Types plugin
|
3
|
+
*
|
4
|
+
* Makes it possible to add predefined types for groups of nodes, which make it possible to easily control nesting rules and icon for each group.
|
5
|
+
*/
|
6
|
+
/*globals jQuery, define, exports, require */
|
7
|
+
(function (factory) {
|
8
|
+
"use strict";
|
9
|
+
if (typeof define === 'function' && define.amd) {
|
10
|
+
define('jstree.types', ['jquery','jstree'], factory);
|
11
|
+
}
|
12
|
+
else if(typeof exports === 'object') {
|
13
|
+
factory(require('jquery'), require('jstree'));
|
14
|
+
}
|
15
|
+
else {
|
16
|
+
factory(jQuery, jQuery.jstree);
|
17
|
+
}
|
18
|
+
}(function ($, jstree, undefined) {
|
19
|
+
"use strict";
|
20
|
+
|
21
|
+
if($.jstree.plugins.types) { return; }
|
22
|
+
|
23
|
+
/**
|
24
|
+
* An object storing all types as key value pairs, where the key is the type name and the value is an object that could contain following keys (all optional).
|
25
|
+
*
|
26
|
+
* * `max_children` the maximum number of immediate children this node type can have. Do not specify or set to `-1` for unlimited.
|
27
|
+
* * `max_depth` the maximum number of nesting this node type can have. A value of `1` would mean that the node can have children, but no grandchildren. Do not specify or set to `-1` for unlimited.
|
28
|
+
* * `valid_children` an array of node type strings, that nodes of this type can have as children. Do not specify or set to `-1` for no limits.
|
29
|
+
* * `icon` a string - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class. Omit to use the default icon from your theme.
|
30
|
+
* * `li_attr` an object of values which will be used to add HTML attributes on the resulting LI DOM node (merged with the node's own data)
|
31
|
+
* * `a_attr` an object of values which will be used to add HTML attributes on the resulting A DOM node (merged with the node's own data)
|
32
|
+
*
|
33
|
+
* There are two predefined types:
|
34
|
+
*
|
35
|
+
* * `#` represents the root of the tree, for example `max_children` would control the maximum number of root nodes.
|
36
|
+
* * `default` represents the default node - any settings here will be applied to all nodes that do not have a type specified.
|
37
|
+
*
|
38
|
+
* @name $.jstree.defaults.types
|
39
|
+
* @plugin types
|
40
|
+
*/
|
41
|
+
$.jstree.defaults.types = {
|
42
|
+
'default' : {}
|
43
|
+
};
|
44
|
+
$.jstree.defaults.types[$.jstree.root] = {};
|
45
|
+
|
46
|
+
$.jstree.plugins.types = function (options, parent) {
|
47
|
+
this.init = function (el, options) {
|
48
|
+
var i, j;
|
49
|
+
if(options && options.types && options.types['default']) {
|
50
|
+
for(i in options.types) {
|
51
|
+
if(i !== "default" && i !== $.jstree.root && options.types.hasOwnProperty(i)) {
|
52
|
+
for(j in options.types['default']) {
|
53
|
+
if(options.types['default'].hasOwnProperty(j) && options.types[i][j] === undefined) {
|
54
|
+
options.types[i][j] = options.types['default'][j];
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
60
|
+
parent.init.call(this, el, options);
|
61
|
+
this._model.data[$.jstree.root].type = $.jstree.root;
|
62
|
+
};
|
63
|
+
this.refresh = function (skip_loading, forget_state) {
|
64
|
+
parent.refresh.call(this, skip_loading, forget_state);
|
65
|
+
this._model.data[$.jstree.root].type = $.jstree.root;
|
66
|
+
};
|
67
|
+
this.bind = function () {
|
68
|
+
this.element
|
69
|
+
.on('model.jstree', $.proxy(function (e, data) {
|
70
|
+
var m = this._model.data,
|
71
|
+
dpc = data.nodes,
|
72
|
+
t = this.settings.types,
|
73
|
+
i, j, c = 'default', k;
|
74
|
+
for(i = 0, j = dpc.length; i < j; i++) {
|
75
|
+
c = 'default';
|
76
|
+
if(m[dpc[i]].original && m[dpc[i]].original.type && t[m[dpc[i]].original.type]) {
|
77
|
+
c = m[dpc[i]].original.type;
|
78
|
+
}
|
79
|
+
if(m[dpc[i]].data && m[dpc[i]].data.jstree && m[dpc[i]].data.jstree.type && t[m[dpc[i]].data.jstree.type]) {
|
80
|
+
c = m[dpc[i]].data.jstree.type;
|
81
|
+
}
|
82
|
+
m[dpc[i]].type = c;
|
83
|
+
if(m[dpc[i]].icon === true && t[c].icon !== undefined) {
|
84
|
+
m[dpc[i]].icon = t[c].icon;
|
85
|
+
}
|
86
|
+
if(t[c].li_attr !== undefined && typeof t[c].li_attr === 'object') {
|
87
|
+
for (k in t[c].li_attr) {
|
88
|
+
if (t[c].li_attr.hasOwnProperty(k)) {
|
89
|
+
if (k === 'id') {
|
90
|
+
continue;
|
91
|
+
}
|
92
|
+
else if (m[dpc[i]].li_attr[k] === undefined) {
|
93
|
+
m[dpc[i]].li_attr[k] = t[c].li_attr[k];
|
94
|
+
}
|
95
|
+
else if (k === 'class') {
|
96
|
+
m[dpc[i]].li_attr['class'] = t[c].li_attr['class'] + ' ' + m[dpc[i]].li_attr['class'];
|
97
|
+
}
|
98
|
+
}
|
99
|
+
}
|
100
|
+
}
|
101
|
+
if(t[c].a_attr !== undefined && typeof t[c].a_attr === 'object') {
|
102
|
+
for (k in t[c].a_attr) {
|
103
|
+
if (t[c].a_attr.hasOwnProperty(k)) {
|
104
|
+
if (k === 'id') {
|
105
|
+
continue;
|
106
|
+
}
|
107
|
+
else if (m[dpc[i]].a_attr[k] === undefined) {
|
108
|
+
m[dpc[i]].a_attr[k] = t[c].a_attr[k];
|
109
|
+
}
|
110
|
+
else if (k === 'href' && m[dpc[i]].a_attr[k] === '#') {
|
111
|
+
m[dpc[i]].a_attr['href'] = t[c].a_attr['href'];
|
112
|
+
}
|
113
|
+
else if (k === 'class') {
|
114
|
+
m[dpc[i]].a_attr['class'] = t[c].a_attr['class'] + ' ' + m[dpc[i]].a_attr['class'];
|
115
|
+
}
|
116
|
+
}
|
117
|
+
}
|
118
|
+
}
|
119
|
+
}
|
120
|
+
m[$.jstree.root].type = $.jstree.root;
|
121
|
+
}, this));
|
122
|
+
parent.bind.call(this);
|
123
|
+
};
|
124
|
+
this.get_json = function (obj, options, flat) {
|
125
|
+
var i, j,
|
126
|
+
m = this._model.data,
|
127
|
+
opt = options ? $.extend(true, {}, options, {no_id:false}) : {},
|
128
|
+
tmp = parent.get_json.call(this, obj, opt, flat);
|
129
|
+
if(tmp === false) { return false; }
|
130
|
+
if($.isArray(tmp)) {
|
131
|
+
for(i = 0, j = tmp.length; i < j; i++) {
|
132
|
+
tmp[i].type = tmp[i].id && m[tmp[i].id] && m[tmp[i].id].type ? m[tmp[i].id].type : "default";
|
133
|
+
if(options && options.no_id) {
|
134
|
+
delete tmp[i].id;
|
135
|
+
if(tmp[i].li_attr && tmp[i].li_attr.id) {
|
136
|
+
delete tmp[i].li_attr.id;
|
137
|
+
}
|
138
|
+
if(tmp[i].a_attr && tmp[i].a_attr.id) {
|
139
|
+
delete tmp[i].a_attr.id;
|
140
|
+
}
|
141
|
+
}
|
142
|
+
}
|
143
|
+
}
|
144
|
+
else {
|
145
|
+
tmp.type = tmp.id && m[tmp.id] && m[tmp.id].type ? m[tmp.id].type : "default";
|
146
|
+
if(options && options.no_id) {
|
147
|
+
tmp = this._delete_ids(tmp);
|
148
|
+
}
|
149
|
+
}
|
150
|
+
return tmp;
|
151
|
+
};
|
152
|
+
this._delete_ids = function (tmp) {
|
153
|
+
if($.isArray(tmp)) {
|
154
|
+
for(var i = 0, j = tmp.length; i < j; i++) {
|
155
|
+
tmp[i] = this._delete_ids(tmp[i]);
|
156
|
+
}
|
157
|
+
return tmp;
|
158
|
+
}
|
159
|
+
delete tmp.id;
|
160
|
+
if(tmp.li_attr && tmp.li_attr.id) {
|
161
|
+
delete tmp.li_attr.id;
|
162
|
+
}
|
163
|
+
if(tmp.a_attr && tmp.a_attr.id) {
|
164
|
+
delete tmp.a_attr.id;
|
165
|
+
}
|
166
|
+
if(tmp.children && $.isArray(tmp.children)) {
|
167
|
+
tmp.children = this._delete_ids(tmp.children);
|
168
|
+
}
|
169
|
+
return tmp;
|
170
|
+
};
|
171
|
+
this.check = function (chk, obj, par, pos, more) {
|
172
|
+
if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; }
|
173
|
+
obj = obj && obj.id ? obj : this.get_node(obj);
|
174
|
+
par = par && par.id ? par : this.get_node(par);
|
175
|
+
var m = obj && obj.id ? (more && more.origin ? more.origin : $.jstree.reference(obj.id)) : null, tmp, d, i, j;
|
176
|
+
m = m && m._model && m._model.data ? m._model.data : null;
|
177
|
+
switch(chk) {
|
178
|
+
case "create_node":
|
179
|
+
case "move_node":
|
180
|
+
case "copy_node":
|
181
|
+
if(chk !== 'move_node' || $.inArray(obj.id, par.children) === -1) {
|
182
|
+
tmp = this.get_rules(par);
|
183
|
+
if(tmp.max_children !== undefined && tmp.max_children !== -1 && tmp.max_children === par.children.length) {
|
184
|
+
this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_01', 'reason' : 'max_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
|
185
|
+
return false;
|
186
|
+
}
|
187
|
+
if(tmp.valid_children !== undefined && tmp.valid_children !== -1 && $.inArray((obj.type || 'default'), tmp.valid_children) === -1) {
|
188
|
+
this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_02', 'reason' : 'valid_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
|
189
|
+
return false;
|
190
|
+
}
|
191
|
+
if(m && obj.children_d && obj.parents) {
|
192
|
+
d = 0;
|
193
|
+
for(i = 0, j = obj.children_d.length; i < j; i++) {
|
194
|
+
d = Math.max(d, m[obj.children_d[i]].parents.length);
|
195
|
+
}
|
196
|
+
d = d - obj.parents.length + 1;
|
197
|
+
}
|
198
|
+
if(d <= 0 || d === undefined) { d = 1; }
|
199
|
+
do {
|
200
|
+
if(tmp.max_depth !== undefined && tmp.max_depth !== -1 && tmp.max_depth < d) {
|
201
|
+
this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_03', 'reason' : 'max_depth prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
|
202
|
+
return false;
|
203
|
+
}
|
204
|
+
par = this.get_node(par.parent);
|
205
|
+
tmp = this.get_rules(par);
|
206
|
+
d++;
|
207
|
+
} while(par);
|
208
|
+
}
|
209
|
+
break;
|
210
|
+
}
|
211
|
+
return true;
|
212
|
+
};
|
213
|
+
/**
|
214
|
+
* used to retrieve the type settings object for a node
|
215
|
+
* @name get_rules(obj)
|
216
|
+
* @param {mixed} obj the node to find the rules for
|
217
|
+
* @return {Object}
|
218
|
+
* @plugin types
|
219
|
+
*/
|
220
|
+
this.get_rules = function (obj) {
|
221
|
+
obj = this.get_node(obj);
|
222
|
+
if(!obj) { return false; }
|
223
|
+
var tmp = this.get_type(obj, true);
|
224
|
+
if(tmp.max_depth === undefined) { tmp.max_depth = -1; }
|
225
|
+
if(tmp.max_children === undefined) { tmp.max_children = -1; }
|
226
|
+
if(tmp.valid_children === undefined) { tmp.valid_children = -1; }
|
227
|
+
return tmp;
|
228
|
+
};
|
229
|
+
/**
|
230
|
+
* used to retrieve the type string or settings object for a node
|
231
|
+
* @name get_type(obj [, rules])
|
232
|
+
* @param {mixed} obj the node to find the rules for
|
233
|
+
* @param {Boolean} rules if set to `true` instead of a string the settings object will be returned
|
234
|
+
* @return {String|Object}
|
235
|
+
* @plugin types
|
236
|
+
*/
|
237
|
+
this.get_type = function (obj, rules) {
|
238
|
+
obj = this.get_node(obj);
|
239
|
+
return (!obj) ? false : ( rules ? $.extend({ 'type' : obj.type }, this.settings.types[obj.type]) : obj.type);
|
240
|
+
};
|
241
|
+
/**
|
242
|
+
* used to change a node's type
|
243
|
+
* @name set_type(obj, type)
|
244
|
+
* @param {mixed} obj the node to change
|
245
|
+
* @param {String} type the new type
|
246
|
+
* @plugin types
|
247
|
+
*/
|
248
|
+
this.set_type = function (obj, type) {
|
249
|
+
var m = this._model.data, t, t1, t2, old_type, old_icon, k, d, a;
|
250
|
+
if($.isArray(obj)) {
|
251
|
+
obj = obj.slice();
|
252
|
+
for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
|
253
|
+
this.set_type(obj[t1], type);
|
254
|
+
}
|
255
|
+
return true;
|
256
|
+
}
|
257
|
+
t = this.settings.types;
|
258
|
+
obj = this.get_node(obj);
|
259
|
+
if(!t[type] || !obj) { return false; }
|
260
|
+
d = this.get_node(obj, true);
|
261
|
+
if (d && d.length) {
|
262
|
+
a = d.children('.jstree-anchor');
|
263
|
+
}
|
264
|
+
old_type = obj.type;
|
265
|
+
old_icon = this.get_icon(obj);
|
266
|
+
obj.type = type;
|
267
|
+
if(old_icon === true || !t[old_type] || (t[old_type].icon !== undefined && old_icon === t[old_type].icon)) {
|
268
|
+
this.set_icon(obj, t[type].icon !== undefined ? t[type].icon : true);
|
269
|
+
}
|
270
|
+
|
271
|
+
// remove old type props
|
272
|
+
if(t[old_type] && t[old_type].li_attr !== undefined && typeof t[old_type].li_attr === 'object') {
|
273
|
+
for (k in t[old_type].li_attr) {
|
274
|
+
if (t[old_type].li_attr.hasOwnProperty(k)) {
|
275
|
+
if (k === 'id') {
|
276
|
+
continue;
|
277
|
+
}
|
278
|
+
else if (k === 'class') {
|
279
|
+
m[obj.id].li_attr['class'] = (m[obj.id].li_attr['class'] || '').replace(t[old_type].li_attr[k], '');
|
280
|
+
if (d) { d.removeClass(t[old_type].li_attr[k]); }
|
281
|
+
}
|
282
|
+
else if (m[obj.id].li_attr[k] === t[old_type].li_attr[k]) {
|
283
|
+
m[obj.id].li_attr[k] = null;
|
284
|
+
if (d) { d.removeAttr(k); }
|
285
|
+
}
|
286
|
+
}
|
287
|
+
}
|
288
|
+
}
|
289
|
+
if(t[old_type] && t[old_type].a_attr !== undefined && typeof t[old_type].a_attr === 'object') {
|
290
|
+
for (k in t[old_type].a_attr) {
|
291
|
+
if (t[old_type].a_attr.hasOwnProperty(k)) {
|
292
|
+
if (k === 'id') {
|
293
|
+
continue;
|
294
|
+
}
|
295
|
+
else if (k === 'class') {
|
296
|
+
m[obj.id].a_attr['class'] = (m[obj.id].a_attr['class'] || '').replace(t[old_type].a_attr[k], '');
|
297
|
+
if (a) { a.removeClass(t[old_type].a_attr[k]); }
|
298
|
+
}
|
299
|
+
else if (m[obj.id].a_attr[k] === t[old_type].a_attr[k]) {
|
300
|
+
if (k === 'href') {
|
301
|
+
m[obj.id].a_attr[k] = '#';
|
302
|
+
if (a) { a.attr('href', '#'); }
|
303
|
+
}
|
304
|
+
else {
|
305
|
+
delete m[obj.id].a_attr[k];
|
306
|
+
if (a) { a.removeAttr(k); }
|
307
|
+
}
|
308
|
+
}
|
309
|
+
}
|
310
|
+
}
|
311
|
+
}
|
312
|
+
|
313
|
+
// add new props
|
314
|
+
if(t[type].li_attr !== undefined && typeof t[type].li_attr === 'object') {
|
315
|
+
for (k in t[type].li_attr) {
|
316
|
+
if (t[type].li_attr.hasOwnProperty(k)) {
|
317
|
+
if (k === 'id') {
|
318
|
+
continue;
|
319
|
+
}
|
320
|
+
else if (m[obj.id].li_attr[k] === undefined) {
|
321
|
+
m[obj.id].li_attr[k] = t[type].li_attr[k];
|
322
|
+
if (d) {
|
323
|
+
if (k === 'class') {
|
324
|
+
d.addClass(t[type].li_attr[k]);
|
325
|
+
}
|
326
|
+
else {
|
327
|
+
d.attr(k, t[type].li_attr[k]);
|
328
|
+
}
|
329
|
+
}
|
330
|
+
}
|
331
|
+
else if (k === 'class') {
|
332
|
+
m[obj.id].li_attr['class'] = t[type].li_attr[k] + ' ' + m[obj.id].li_attr['class'];
|
333
|
+
if (d) { d.addClass(t[type].li_attr[k]); }
|
334
|
+
}
|
335
|
+
}
|
336
|
+
}
|
337
|
+
}
|
338
|
+
if(t[type].a_attr !== undefined && typeof t[type].a_attr === 'object') {
|
339
|
+
for (k in t[type].a_attr) {
|
340
|
+
if (t[type].a_attr.hasOwnProperty(k)) {
|
341
|
+
if (k === 'id') {
|
342
|
+
continue;
|
343
|
+
}
|
344
|
+
else if (m[obj.id].a_attr[k] === undefined) {
|
345
|
+
m[obj.id].a_attr[k] = t[type].a_attr[k];
|
346
|
+
if (a) {
|
347
|
+
if (k === 'class') {
|
348
|
+
a.addClass(t[type].a_attr[k]);
|
349
|
+
}
|
350
|
+
else {
|
351
|
+
a.attr(k, t[type].a_attr[k]);
|
352
|
+
}
|
353
|
+
}
|
354
|
+
}
|
355
|
+
else if (k === 'href' && m[obj.id].a_attr[k] === '#') {
|
356
|
+
m[obj.id].a_attr['href'] = t[type].a_attr['href'];
|
357
|
+
if (a) { a.attr('href', t[type].a_attr['href']); }
|
358
|
+
}
|
359
|
+
else if (k === 'class') {
|
360
|
+
m[obj.id].a_attr['class'] = t[type].a_attr['class'] + ' ' + m[obj.id].a_attr['class'];
|
361
|
+
if (a) { a.addClass(t[type].a_attr[k]); }
|
362
|
+
}
|
363
|
+
}
|
364
|
+
}
|
365
|
+
}
|
366
|
+
|
367
|
+
return true;
|
368
|
+
};
|
369
|
+
};
|
370
|
+
// include the types plugin by default
|
371
|
+
// $.jstree.defaults.plugins.push("types");
|
372
|
+
}));
|
@@ -0,0 +1,164 @@
|
|
1
|
+
/**
|
2
|
+
* ### Unique plugin
|
3
|
+
*
|
4
|
+
* Enforces that no nodes with the same name can coexist as siblings.
|
5
|
+
*/
|
6
|
+
/*globals jQuery, define, exports, require */
|
7
|
+
(function (factory) {
|
8
|
+
"use strict";
|
9
|
+
if (typeof define === 'function' && define.amd) {
|
10
|
+
define('jstree.unique', ['jquery','jstree'], factory);
|
11
|
+
}
|
12
|
+
else if(typeof exports === 'object') {
|
13
|
+
factory(require('jquery'), require('jstree'));
|
14
|
+
}
|
15
|
+
else {
|
16
|
+
factory(jQuery, jQuery.jstree);
|
17
|
+
}
|
18
|
+
}(function ($, jstree, undefined) {
|
19
|
+
"use strict";
|
20
|
+
|
21
|
+
if($.jstree.plugins.unique) { return; }
|
22
|
+
|
23
|
+
/**
|
24
|
+
* stores all defaults for the unique plugin
|
25
|
+
* @name $.jstree.defaults.unique
|
26
|
+
* @plugin unique
|
27
|
+
*/
|
28
|
+
$.jstree.defaults.unique = {
|
29
|
+
/**
|
30
|
+
* Indicates if the comparison should be case sensitive. Default is `false`.
|
31
|
+
* @name $.jstree.defaults.unique.case_sensitive
|
32
|
+
* @plugin unique
|
33
|
+
*/
|
34
|
+
case_sensitive : false,
|
35
|
+
/**
|
36
|
+
* Indicates if white space should be trimmed before the comparison. Default is `false`.
|
37
|
+
* @name $.jstree.defaults.unique.trim_whitespace
|
38
|
+
* @plugin unique
|
39
|
+
*/
|
40
|
+
trim_whitespace : false,
|
41
|
+
/**
|
42
|
+
* A callback executed in the instance's scope when a new node is created and the name is already taken, the two arguments are the conflicting name and the counter. The default will produce results like `New node (2)`.
|
43
|
+
* @name $.jstree.defaults.unique.duplicate
|
44
|
+
* @plugin unique
|
45
|
+
*/
|
46
|
+
duplicate : function (name, counter) {
|
47
|
+
return name + ' (' + counter + ')';
|
48
|
+
}
|
49
|
+
};
|
50
|
+
|
51
|
+
$.jstree.plugins.unique = function (options, parent) {
|
52
|
+
this.check = function (chk, obj, par, pos, more) {
|
53
|
+
if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; }
|
54
|
+
obj = obj && obj.id ? obj : this.get_node(obj);
|
55
|
+
par = par && par.id ? par : this.get_node(par);
|
56
|
+
if(!par || !par.children) { return true; }
|
57
|
+
var n = chk === "rename_node" ? pos : obj.text,
|
58
|
+
c = [],
|
59
|
+
s = this.settings.unique.case_sensitive,
|
60
|
+
w = this.settings.unique.trim_whitespace,
|
61
|
+
m = this._model.data, i, j, t;
|
62
|
+
for(i = 0, j = par.children.length; i < j; i++) {
|
63
|
+
t = m[par.children[i]].text;
|
64
|
+
if (!s) {
|
65
|
+
t = t.toLowerCase();
|
66
|
+
}
|
67
|
+
if (w) {
|
68
|
+
t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
69
|
+
}
|
70
|
+
c.push(t);
|
71
|
+
}
|
72
|
+
if(!s) { n = n.toLowerCase(); }
|
73
|
+
if (w) { n = n.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); }
|
74
|
+
switch(chk) {
|
75
|
+
case "delete_node":
|
76
|
+
return true;
|
77
|
+
case "rename_node":
|
78
|
+
t = obj.text || '';
|
79
|
+
if (!s) {
|
80
|
+
t = t.toLowerCase();
|
81
|
+
}
|
82
|
+
if (w) {
|
83
|
+
t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
84
|
+
}
|
85
|
+
i = ($.inArray(n, c) === -1 || (obj.text && t === n));
|
86
|
+
if(!i) {
|
87
|
+
this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_01', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
|
88
|
+
}
|
89
|
+
return i;
|
90
|
+
case "create_node":
|
91
|
+
i = ($.inArray(n, c) === -1);
|
92
|
+
if(!i) {
|
93
|
+
this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_04', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
|
94
|
+
}
|
95
|
+
return i;
|
96
|
+
case "copy_node":
|
97
|
+
i = ($.inArray(n, c) === -1);
|
98
|
+
if(!i) {
|
99
|
+
this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_02', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
|
100
|
+
}
|
101
|
+
return i;
|
102
|
+
case "move_node":
|
103
|
+
i = ( (obj.parent === par.id && (!more || !more.is_multi)) || $.inArray(n, c) === -1);
|
104
|
+
if(!i) {
|
105
|
+
this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_03', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
|
106
|
+
}
|
107
|
+
return i;
|
108
|
+
}
|
109
|
+
return true;
|
110
|
+
};
|
111
|
+
this.create_node = function (par, node, pos, callback, is_loaded) {
|
112
|
+
if(!node || node.text === undefined) {
|
113
|
+
if(par === null) {
|
114
|
+
par = $.jstree.root;
|
115
|
+
}
|
116
|
+
par = this.get_node(par);
|
117
|
+
if(!par) {
|
118
|
+
return parent.create_node.call(this, par, node, pos, callback, is_loaded);
|
119
|
+
}
|
120
|
+
pos = pos === undefined ? "last" : pos;
|
121
|
+
if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
|
122
|
+
return parent.create_node.call(this, par, node, pos, callback, is_loaded);
|
123
|
+
}
|
124
|
+
if(!node) { node = {}; }
|
125
|
+
var tmp, n, dpc, i, j, m = this._model.data, s = this.settings.unique.case_sensitive, w = this.settings.unique.trim_whitespace, cb = this.settings.unique.duplicate, t;
|
126
|
+
n = tmp = this.get_string('New node');
|
127
|
+
dpc = [];
|
128
|
+
for(i = 0, j = par.children.length; i < j; i++) {
|
129
|
+
t = m[par.children[i]].text;
|
130
|
+
if (!s) {
|
131
|
+
t = t.toLowerCase();
|
132
|
+
}
|
133
|
+
if (w) {
|
134
|
+
t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
135
|
+
}
|
136
|
+
dpc.push(t);
|
137
|
+
}
|
138
|
+
i = 1;
|
139
|
+
t = n;
|
140
|
+
if (!s) {
|
141
|
+
t = t.toLowerCase();
|
142
|
+
}
|
143
|
+
if (w) {
|
144
|
+
t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
145
|
+
}
|
146
|
+
while($.inArray(t, dpc) !== -1) {
|
147
|
+
n = cb.call(this, tmp, (++i)).toString();
|
148
|
+
t = n;
|
149
|
+
if (!s) {
|
150
|
+
t = t.toLowerCase();
|
151
|
+
}
|
152
|
+
if (w) {
|
153
|
+
t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
154
|
+
}
|
155
|
+
}
|
156
|
+
node.text = n;
|
157
|
+
}
|
158
|
+
return parent.create_node.call(this, par, node, pos, callback, is_loaded);
|
159
|
+
};
|
160
|
+
};
|
161
|
+
|
162
|
+
// include the unique plugin by default
|
163
|
+
// $.jstree.defaults.plugins.push("unique");
|
164
|
+
}));
|