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.
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
+ }));