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.

Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/bin/sequenceserver +22 -30
  3. data/lib/sequenceserver/api_errors.rb +5 -1
  4. data/lib/sequenceserver/blast/constants.rb +1 -1
  5. data/lib/sequenceserver/blast/hit.rb +5 -16
  6. data/lib/sequenceserver/blast/job.rb +9 -18
  7. data/lib/sequenceserver/blast/report.rb +5 -3
  8. data/lib/sequenceserver/config.rb +4 -1
  9. data/lib/sequenceserver/database.rb +69 -9
  10. data/lib/sequenceserver/job.rb +1 -1
  11. data/lib/sequenceserver/makeblastdb.rb +40 -45
  12. data/lib/sequenceserver/routes.rb +4 -0
  13. data/lib/sequenceserver/version.rb +1 -1
  14. data/lib/sequenceserver.rb +15 -11
  15. data/public/config.js +143 -142
  16. data/public/css/fonts.css +23 -22
  17. data/public/css/grapher.css +598 -594
  18. data/public/css/sequenceserver.css +86 -24
  19. data/public/css/sequenceserver.min.css +2 -2
  20. data/public/js/alignment_exporter.js +14 -14
  21. data/public/js/databases_tree.js +215 -0
  22. data/public/js/download_fasta.js +1 -1
  23. data/public/js/hit.js +6 -2
  24. data/public/js/hits_overview.js +1 -1
  25. data/public/js/length_distribution.js +5 -5
  26. data/public/js/query.js +4 -7
  27. data/public/js/report.js +12 -24
  28. data/public/js/search.js +21 -2
  29. data/public/js/sidebar.js +4 -4
  30. data/public/js/svgExporter.js +12 -12
  31. data/public/js/visualisation_helpers.js +4 -5
  32. data/public/sequenceserver-report.min.js +11 -11
  33. data/public/sequenceserver-search.min.js +15 -11
  34. data/public/vendor/github/vakata/jstree@3.3.8/LICENSE-MIT +22 -0
  35. data/public/vendor/github/vakata/jstree@3.3.8/README.md +663 -0
  36. data/public/vendor/github/vakata/jstree@3.3.8/bower.json +33 -0
  37. data/public/vendor/github/vakata/jstree@3.3.8/component.json +28 -0
  38. data/public/vendor/github/vakata/jstree@3.3.8/composer.json +46 -0
  39. data/public/vendor/github/vakata/jstree@3.3.8/demo/README.md +2 -0
  40. data/public/vendor/github/vakata/jstree@3.3.8/demo/basic/index.html +146 -0
  41. data/public/vendor/github/vakata/jstree@3.3.8/demo/basic/root.json +1 -0
  42. data/public/vendor/github/vakata/jstree@3.3.8/dist/jstree.js +8612 -0
  43. data/public/vendor/github/vakata/jstree@3.3.8/dist/jstree.min.js +6 -0
  44. data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default/32px.png +0 -0
  45. data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default/40px.png +0 -0
  46. data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default/style.css +1102 -0
  47. data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default/style.min.css +1 -0
  48. data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default/throbber.gif +0 -0
  49. data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default-dark/32px.png +0 -0
  50. data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default-dark/40px.png +0 -0
  51. data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default-dark/style.css +1146 -0
  52. data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default-dark/style.min.css +1 -0
  53. data/public/vendor/github/vakata/jstree@3.3.8/dist/themes/default-dark/throbber.gif +0 -0
  54. data/public/vendor/github/vakata/jstree@3.3.8/gruntfile.js +242 -0
  55. data/public/vendor/github/vakata/jstree@3.3.8/jstree.jquery.json +28 -0
  56. data/public/vendor/github/vakata/jstree@3.3.8/package.json +58 -0
  57. data/public/vendor/github/vakata/jstree@3.3.8/src/intro.js +14 -0
  58. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.changed.js +69 -0
  59. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.checkbox.js +976 -0
  60. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.conditionalselect.js +38 -0
  61. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.contextmenu.js +661 -0
  62. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.dnd.js +669 -0
  63. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.js +4931 -0
  64. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.massload.js +137 -0
  65. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.search.js +421 -0
  66. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.sort.js +74 -0
  67. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.state.js +138 -0
  68. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.types.js +372 -0
  69. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.unique.js +164 -0
  70. data/public/vendor/github/vakata/jstree@3.3.8/src/jstree.wholerow.js +122 -0
  71. data/public/vendor/github/vakata/jstree@3.3.8/src/misc.js +656 -0
  72. data/public/vendor/github/vakata/jstree@3.3.8/src/outro.js +1 -0
  73. data/public/vendor/github/vakata/jstree@3.3.8/src/sample.js +93 -0
  74. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/base.less +93 -0
  75. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default/32px.png +0 -0
  76. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default/40px.png +0 -0
  77. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default/style.css +1102 -0
  78. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default/style.less +22 -0
  79. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default/throbber.gif +0 -0
  80. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default-dark/32px.png +0 -0
  81. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default-dark/40px.png +0 -0
  82. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default-dark/style.css +1146 -0
  83. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default-dark/style.less +50 -0
  84. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/default-dark/throbber.gif +0 -0
  85. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/main.less +77 -0
  86. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/mixins.less +104 -0
  87. data/public/vendor/github/vakata/jstree@3.3.8/src/themes/responsive.less +67 -0
  88. data/public/vendor/github/vakata/jstree@3.3.8/src/vakata-jstree.js +38 -0
  89. data/public/vendor/github/vakata/jstree@3.3.8/test/unit/index.html +16 -0
  90. data/public/vendor/github/vakata/jstree@3.3.8/test/unit/libs/qunit.css +244 -0
  91. data/public/vendor/github/vakata/jstree@3.3.8/test/unit/libs/qunit.js +2212 -0
  92. data/public/vendor/github/vakata/jstree@3.3.8/test/unit/test.js +11 -0
  93. data/public/vendor/github/vakata/jstree@3.3.8/test/visual/desktop/index.html +44 -0
  94. data/public/vendor/github/vakata/jstree@3.3.8/test/visual/mobile/index.html +42 -0
  95. data/public/vendor/github/vakata/jstree@3.3.8/test/visual/screenshots/desktop/desktop.png +0 -0
  96. data/public/vendor/github/vakata/jstree@3.3.8/test/visual/screenshots/desktop/home.png +0 -0
  97. data/public/vendor/github/vakata/jstree@3.3.8/test/visual/screenshots/mobile/home.png +0 -0
  98. data/public/vendor/github/vakata/jstree@3.3.8/test/visual/screenshots/mobile/mobile.png +0 -0
  99. data/public/vendor/github/vakata/jstree@3.3.8.js +3 -0
  100. data/public/vendor/system-csp-production.js +3 -3
  101. data/public/vendor/system-csp-production.js.map +1 -1
  102. data/public/vendor/system-csp-production.src.js +146 -140
  103. data/public/vendor/system-polyfills.js.map +1 -1
  104. data/public/vendor/system-polyfills.src.js +1 -0
  105. data/public/vendor/system.js +3 -3
  106. data/public/vendor/system.js.map +1 -1
  107. data/public/vendor/system.src.js +4771 -2383
  108. data/views/_options.erb +21 -0
  109. data/views/layout.erb +17 -18
  110. metadata +102 -43
  111. data/bin/chromedriver +0 -0
  112. data/bin/geckodriver +0 -0
  113. data/public/shims/form-core.js +0 -3
  114. data/public/shims/form-validation.js +0 -3
  115. data/public/shims/plugins/jquery.ui.position.js +0 -13
  116. 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
+ }));