sequenceserver 2.0.0.rc8 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sequenceserver might be problematic. Click here for more details.
- 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
|
+
}));
|