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,669 @@
1
+ /**
2
+ * ### Drag'n'drop plugin
3
+ *
4
+ * Enables dragging and dropping of nodes in the tree, resulting in a move or copy operations.
5
+ */
6
+ /*globals jQuery, define, exports, require, document */
7
+ (function (factory) {
8
+ "use strict";
9
+ if (typeof define === 'function' && define.amd) {
10
+ define('jstree.dnd', ['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.dnd) { return; }
22
+
23
+ /**
24
+ * stores all defaults for the drag'n'drop plugin
25
+ * @name $.jstree.defaults.dnd
26
+ * @plugin dnd
27
+ */
28
+ $.jstree.defaults.dnd = {
29
+ /**
30
+ * a boolean indicating if a copy should be possible while dragging (by pressint the meta key or Ctrl). Defaults to `true`.
31
+ * @name $.jstree.defaults.dnd.copy
32
+ * @plugin dnd
33
+ */
34
+ copy : true,
35
+ /**
36
+ * a number indicating how long a node should remain hovered while dragging to be opened. Defaults to `500`.
37
+ * @name $.jstree.defaults.dnd.open_timeout
38
+ * @plugin dnd
39
+ */
40
+ open_timeout : 500,
41
+ /**
42
+ * a function invoked each time a node is about to be dragged, invoked in the tree's scope and receives the nodes about to be dragged as an argument (array) and the event that started the drag - return `false` to prevent dragging
43
+ * @name $.jstree.defaults.dnd.is_draggable
44
+ * @plugin dnd
45
+ */
46
+ is_draggable : true,
47
+ /**
48
+ * a boolean indicating if checks should constantly be made while the user is dragging the node (as opposed to checking only on drop), default is `true`
49
+ * @name $.jstree.defaults.dnd.check_while_dragging
50
+ * @plugin dnd
51
+ */
52
+ check_while_dragging : true,
53
+ /**
54
+ * a boolean indicating if nodes from this tree should only be copied with dnd (as opposed to moved), default is `false`
55
+ * @name $.jstree.defaults.dnd.always_copy
56
+ * @plugin dnd
57
+ */
58
+ always_copy : false,
59
+ /**
60
+ * when dropping a node "inside", this setting indicates the position the node should go to - it can be an integer or a string: "first" (same as 0) or "last", default is `0`
61
+ * @name $.jstree.defaults.dnd.inside_pos
62
+ * @plugin dnd
63
+ */
64
+ inside_pos : 0,
65
+ /**
66
+ * when starting the drag on a node that is selected this setting controls if all selected nodes are dragged or only the single node, default is `true`, which means all selected nodes are dragged when the drag is started on a selected node
67
+ * @name $.jstree.defaults.dnd.drag_selection
68
+ * @plugin dnd
69
+ */
70
+ drag_selection : true,
71
+ /**
72
+ * controls whether dnd works on touch devices. If left as boolean true dnd will work the same as in desktop browsers, which in some cases may impair scrolling. If set to boolean false dnd will not work on touch devices. There is a special third option - string "selected" which means only selected nodes can be dragged on touch devices.
73
+ * @name $.jstree.defaults.dnd.touch
74
+ * @plugin dnd
75
+ */
76
+ touch : true,
77
+ /**
78
+ * controls whether items can be dropped anywhere on the node, not just on the anchor, by default only the node anchor is a valid drop target. Works best with the wholerow plugin. If enabled on mobile depending on the interface it might be hard for the user to cancel the drop, since the whole tree container will be a valid drop target.
79
+ * @name $.jstree.defaults.dnd.large_drop_target
80
+ * @plugin dnd
81
+ */
82
+ large_drop_target : false,
83
+ /**
84
+ * controls whether a drag can be initiated from any part of the node and not just the text/icon part, works best with the wholerow plugin. Keep in mind it can cause problems with tree scrolling on mobile depending on the interface - in that case set the touch option to "selected".
85
+ * @name $.jstree.defaults.dnd.large_drag_target
86
+ * @plugin dnd
87
+ */
88
+ large_drag_target : false,
89
+ /**
90
+ * controls whether use HTML5 dnd api instead of classical. That will allow better integration of dnd events with other HTML5 controls.
91
+ * @reference http://caniuse.com/#feat=dragndrop
92
+ * @name $.jstree.defaults.dnd.use_html5
93
+ * @plugin dnd
94
+ */
95
+ use_html5: false
96
+ };
97
+ var drg, elm;
98
+ // TODO: now check works by checking for each node individually, how about max_children, unique, etc?
99
+ $.jstree.plugins.dnd = function (options, parent) {
100
+ this.init = function (el, options) {
101
+ parent.init.call(this, el, options);
102
+ this.settings.dnd.use_html5 = this.settings.dnd.use_html5 && ('draggable' in document.createElement('span'));
103
+ };
104
+ this.bind = function () {
105
+ parent.bind.call(this);
106
+
107
+ this.element
108
+ .on(this.settings.dnd.use_html5 ? 'dragstart.jstree' : 'mousedown.jstree touchstart.jstree', this.settings.dnd.large_drag_target ? '.jstree-node' : '.jstree-anchor', $.proxy(function (e) {
109
+ if(this.settings.dnd.large_drag_target && $(e.target).closest('.jstree-node')[0] !== e.currentTarget) {
110
+ return true;
111
+ }
112
+ if(e.type === "touchstart" && (!this.settings.dnd.touch || (this.settings.dnd.touch === 'selected' && !$(e.currentTarget).closest('.jstree-node').children('.jstree-anchor').hasClass('jstree-clicked')))) {
113
+ return true;
114
+ }
115
+ var obj = this.get_node(e.target),
116
+ mlt = this.is_selected(obj) && this.settings.dnd.drag_selection ? this.get_top_selected().length : 1,
117
+ txt = (mlt > 1 ? mlt + ' ' + this.get_string('nodes') : this.get_text(e.currentTarget));
118
+ if(this.settings.core.force_text) {
119
+ txt = $.vakata.html.escape(txt);
120
+ }
121
+ if(obj && obj.id && obj.id !== $.jstree.root && (e.which === 1 || e.type === "touchstart" || e.type === "dragstart") &&
122
+ (this.settings.dnd.is_draggable === true || ($.isFunction(this.settings.dnd.is_draggable) && this.settings.dnd.is_draggable.call(this, (mlt > 1 ? this.get_top_selected(true) : [obj]), e)))
123
+ ) {
124
+ drg = { 'jstree' : true, 'origin' : this, 'obj' : this.get_node(obj,true), 'nodes' : mlt > 1 ? this.get_top_selected() : [obj.id] };
125
+ elm = e.currentTarget;
126
+ if (this.settings.dnd.use_html5) {
127
+ $.vakata.dnd._trigger('start', e, { 'helper': $(), 'element': elm, 'data': drg });
128
+ } else {
129
+ this.element.trigger('mousedown.jstree');
130
+ return $.vakata.dnd.start(e, drg, '<div id="jstree-dnd" class="jstree-' + this.get_theme() + ' jstree-' + this.get_theme() + '-' + this.get_theme_variant() + ' ' + ( this.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ) + '"><i class="jstree-icon jstree-er"></i>' + txt + '<ins class="jstree-copy" style="display:none;">+</ins></div>');
131
+ }
132
+ }
133
+ }, this));
134
+ if (this.settings.dnd.use_html5) {
135
+ this.element
136
+ .on('dragover.jstree', function (e) {
137
+ e.preventDefault();
138
+ $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });
139
+ return false;
140
+ })
141
+ //.on('dragenter.jstree', this.settings.dnd.large_drop_target ? '.jstree-node' : '.jstree-anchor', $.proxy(function (e) {
142
+ // e.preventDefault();
143
+ // $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });
144
+ // return false;
145
+ // }, this))
146
+ .on('drop.jstree', $.proxy(function (e) {
147
+ e.preventDefault();
148
+ $.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg });
149
+ return false;
150
+ }, this));
151
+ }
152
+ };
153
+ this.redraw_node = function(obj, deep, callback, force_render) {
154
+ obj = parent.redraw_node.apply(this, arguments);
155
+ if (obj && this.settings.dnd.use_html5) {
156
+ if (this.settings.dnd.large_drag_target) {
157
+ obj.setAttribute('draggable', true);
158
+ } else {
159
+ var i, j, tmp = null;
160
+ for(i = 0, j = obj.childNodes.length; i < j; i++) {
161
+ if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
162
+ tmp = obj.childNodes[i];
163
+ break;
164
+ }
165
+ }
166
+ if(tmp) {
167
+ tmp.setAttribute('draggable', true);
168
+ }
169
+ }
170
+ }
171
+ return obj;
172
+ };
173
+ };
174
+
175
+ $(function() {
176
+ // bind only once for all instances
177
+ var lastmv = false,
178
+ laster = false,
179
+ lastev = false,
180
+ opento = false,
181
+ marker = $('<div id="jstree-marker">&#160;</div>').hide(); //.appendTo('body');
182
+
183
+ $(document)
184
+ .on('dragover.vakata.jstree', function (e) {
185
+ if (elm) {
186
+ $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });
187
+ }
188
+ })
189
+ .on('drop.vakata.jstree', function (e) {
190
+ if (elm) {
191
+ $.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg });
192
+ elm = null;
193
+ drg = null;
194
+ }
195
+ })
196
+ .on('dnd_start.vakata.jstree', function (e, data) {
197
+ lastmv = false;
198
+ lastev = false;
199
+ if(!data || !data.data || !data.data.jstree) { return; }
200
+ marker.appendTo(document.body); //.show();
201
+ })
202
+ .on('dnd_move.vakata.jstree', function (e, data) {
203
+ var isDifferentNode = data.event.target !== lastev.target;
204
+ if(opento) {
205
+ if (!data.event || data.event.type !== 'dragover' || isDifferentNode) {
206
+ clearTimeout(opento);
207
+ }
208
+ }
209
+ if(!data || !data.data || !data.data.jstree) { return; }
210
+
211
+ // if we are hovering the marker image do nothing (can happen on "inside" drags)
212
+ if(data.event.target.id && data.event.target.id === 'jstree-marker') {
213
+ return;
214
+ }
215
+ lastev = data.event;
216
+
217
+ var ins = $.jstree.reference(data.event.target),
218
+ ref = false,
219
+ off = false,
220
+ rel = false,
221
+ tmp, l, t, h, p, i, o, ok, t1, t2, op, ps, pr, ip, tm, is_copy, pn;
222
+ // if we are over an instance
223
+ if(ins && ins._data && ins._data.dnd) {
224
+ marker.attr('class', 'jstree-' + ins.get_theme() + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ));
225
+ is_copy = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)));
226
+ data.helper
227
+ .children().attr('class', 'jstree-' + ins.get_theme() + ' jstree-' + ins.get_theme() + '-' + ins.get_theme_variant() + ' ' + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ))
228
+ .find('.jstree-copy').first()[ is_copy ? 'show' : 'hide' ]();
229
+
230
+ // if are hovering the container itself add a new root node
231
+ //console.log(data.event);
232
+ if( (data.event.target === ins.element[0] || data.event.target === ins.get_container_ul()[0]) && ins.get_container_ul().children().length === 0) {
233
+ ok = true;
234
+ for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
235
+ ok = ok && ins.check( (data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)) ) ? "copy_node" : "move_node"), (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), $.jstree.root, 'last', { 'dnd' : true, 'ref' : ins.get_node($.jstree.root), 'pos' : 'i', 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) });
236
+ if(!ok) { break; }
237
+ }
238
+ if(ok) {
239
+ lastmv = { 'ins' : ins, 'par' : $.jstree.root, 'pos' : 'last' };
240
+ marker.hide();
241
+ data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');
242
+ if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
243
+ data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move';
244
+ }
245
+ return;
246
+ }
247
+ }
248
+ else {
249
+ // if we are hovering a tree node
250
+ ref = ins.settings.dnd.large_drop_target ? $(data.event.target).closest('.jstree-node').children('.jstree-anchor') : $(data.event.target).closest('.jstree-anchor');
251
+ if(ref && ref.length && ref.parent().is('.jstree-closed, .jstree-open, .jstree-leaf')) {
252
+ off = ref.offset();
253
+ rel = (data.event.pageY !== undefined ? data.event.pageY : data.event.originalEvent.pageY) - off.top;
254
+ h = ref.outerHeight();
255
+ if(rel < h / 3) {
256
+ o = ['b', 'i', 'a'];
257
+ }
258
+ else if(rel > h - h / 3) {
259
+ o = ['a', 'i', 'b'];
260
+ }
261
+ else {
262
+ o = rel > h / 2 ? ['i', 'a', 'b'] : ['i', 'b', 'a'];
263
+ }
264
+ $.each(o, function (j, v) {
265
+ switch(v) {
266
+ case 'b':
267
+ l = off.left - 6;
268
+ t = off.top;
269
+ p = ins.get_parent(ref);
270
+ i = ref.parent().index();
271
+ break;
272
+ case 'i':
273
+ ip = ins.settings.dnd.inside_pos;
274
+ tm = ins.get_node(ref.parent());
275
+ l = off.left - 2;
276
+ t = off.top + h / 2 + 1;
277
+ p = tm.id;
278
+ i = ip === 'first' ? 0 : (ip === 'last' ? tm.children.length : Math.min(ip, tm.children.length));
279
+ break;
280
+ case 'a':
281
+ l = off.left - 6;
282
+ t = off.top + h;
283
+ p = ins.get_parent(ref);
284
+ i = ref.parent().index() + 1;
285
+ break;
286
+ }
287
+ ok = true;
288
+ for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
289
+ op = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? "copy_node" : "move_node";
290
+ ps = i;
291
+ if(op === "move_node" && v === 'a' && (data.data.origin && data.data.origin === ins) && p === ins.get_parent(data.data.nodes[t1])) {
292
+ pr = ins.get_node(p);
293
+ if(ps > $.inArray(data.data.nodes[t1], pr.children)) {
294
+ ps -= 1;
295
+ }
296
+ }
297
+ ok = ok && ( (ins && ins.settings && ins.settings.dnd && ins.settings.dnd.check_while_dragging === false) || ins.check(op, (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), p, ps, { 'dnd' : true, 'ref' : ins.get_node(ref.parent()), 'pos' : v, 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) }) );
298
+ if(!ok) {
299
+ if(ins && ins.last_error) { laster = ins.last_error(); }
300
+ break;
301
+ }
302
+ }
303
+ if(v === 'i' && ref.parent().is('.jstree-closed') && ins.settings.dnd.open_timeout) {
304
+ if (!data.event || data.event.type !== 'dragover' || isDifferentNode) {
305
+ if (opento) { clearTimeout(opento); }
306
+ opento = setTimeout((function (x, z) { return function () { x.open_node(z); }; }(ins, ref)), ins.settings.dnd.open_timeout);
307
+ }
308
+ }
309
+ if(ok) {
310
+ pn = ins.get_node(p, true);
311
+ if (!pn.hasClass('.jstree-dnd-parent')) {
312
+ $('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
313
+ pn.addClass('jstree-dnd-parent');
314
+ }
315
+ lastmv = { 'ins' : ins, 'par' : p, 'pos' : v === 'i' && ip === 'last' && i === 0 && !ins.is_loaded(tm) ? 'last' : i };
316
+ marker.css({ 'left' : l + 'px', 'top' : t + 'px' }).show();
317
+ data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');
318
+ if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
319
+ data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move';
320
+ }
321
+ laster = {};
322
+ o = true;
323
+ return false;
324
+ }
325
+ });
326
+ if(o === true) { return; }
327
+ }
328
+ }
329
+ }
330
+ $('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
331
+ lastmv = false;
332
+ data.helper.find('.jstree-icon').removeClass('jstree-ok').addClass('jstree-er');
333
+ if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
334
+ //data.event.originalEvent.dataTransfer.dropEffect = 'none';
335
+ }
336
+ marker.hide();
337
+ })
338
+ .on('dnd_scroll.vakata.jstree', function (e, data) {
339
+ if(!data || !data.data || !data.data.jstree) { return; }
340
+ marker.hide();
341
+ lastmv = false;
342
+ lastev = false;
343
+ data.helper.find('.jstree-icon').first().removeClass('jstree-ok').addClass('jstree-er');
344
+ })
345
+ .on('dnd_stop.vakata.jstree', function (e, data) {
346
+ $('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
347
+ if(opento) { clearTimeout(opento); }
348
+ if(!data || !data.data || !data.data.jstree) { return; }
349
+ marker.hide().detach();
350
+ var i, j, nodes = [];
351
+ if(lastmv) {
352
+ for(i = 0, j = data.data.nodes.length; i < j; i++) {
353
+ nodes[i] = data.data.origin ? data.data.origin.get_node(data.data.nodes[i]) : data.data.nodes[i];
354
+ }
355
+ lastmv.ins[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? 'copy_node' : 'move_node' ](nodes, lastmv.par, lastmv.pos, false, false, false, data.data.origin);
356
+ }
357
+ else {
358
+ i = $(data.event.target).closest('.jstree');
359
+ if(i.length && laster && laster.error && laster.error === 'check') {
360
+ i = i.jstree(true);
361
+ if(i) {
362
+ i.settings.core.error.call(this, laster);
363
+ }
364
+ }
365
+ }
366
+ lastev = false;
367
+ lastmv = false;
368
+ })
369
+ .on('keyup.jstree keydown.jstree', function (e, data) {
370
+ data = $.vakata.dnd._get();
371
+ if(data && data.data && data.data.jstree) {
372
+ if (e.type === "keyup" && e.which === 27) {
373
+ if (opento) { clearTimeout(opento); }
374
+ lastmv = false;
375
+ laster = false;
376
+ lastev = false;
377
+ opento = false;
378
+ marker.hide().detach();
379
+ $.vakata.dnd._clean();
380
+ } else {
381
+ data.helper.find('.jstree-copy').first()[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (e.metaKey || e.ctrlKey))) ? 'show' : 'hide' ]();
382
+ if(lastev) {
383
+ lastev.metaKey = e.metaKey;
384
+ lastev.ctrlKey = e.ctrlKey;
385
+ $.vakata.dnd._trigger('move', lastev);
386
+ }
387
+ }
388
+ }
389
+ });
390
+ });
391
+
392
+ // helpers
393
+ (function ($) {
394
+ $.vakata.html = {
395
+ div : $('<div />'),
396
+ escape : function (str) {
397
+ return $.vakata.html.div.text(str).html();
398
+ },
399
+ strip : function (str) {
400
+ return $.vakata.html.div.empty().append($.parseHTML(str)).text();
401
+ }
402
+ };
403
+ // private variable
404
+ var vakata_dnd = {
405
+ element : false,
406
+ target : false,
407
+ is_down : false,
408
+ is_drag : false,
409
+ helper : false,
410
+ helper_w: 0,
411
+ data : false,
412
+ init_x : 0,
413
+ init_y : 0,
414
+ scroll_l: 0,
415
+ scroll_t: 0,
416
+ scroll_e: false,
417
+ scroll_i: false,
418
+ is_touch: false
419
+ };
420
+ $.vakata.dnd = {
421
+ settings : {
422
+ scroll_speed : 10,
423
+ scroll_proximity : 20,
424
+ helper_left : 5,
425
+ helper_top : 10,
426
+ threshold : 5,
427
+ threshold_touch : 10
428
+ },
429
+ _trigger : function (event_name, e, data) {
430
+ if (data === undefined) {
431
+ data = $.vakata.dnd._get();
432
+ }
433
+ data.event = e;
434
+ $(document).triggerHandler("dnd_" + event_name + ".vakata", data);
435
+ },
436
+ _get : function () {
437
+ return {
438
+ "data" : vakata_dnd.data,
439
+ "element" : vakata_dnd.element,
440
+ "helper" : vakata_dnd.helper
441
+ };
442
+ },
443
+ _clean : function () {
444
+ if(vakata_dnd.helper) { vakata_dnd.helper.remove(); }
445
+ if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
446
+ vakata_dnd = {
447
+ element : false,
448
+ target : false,
449
+ is_down : false,
450
+ is_drag : false,
451
+ helper : false,
452
+ helper_w: 0,
453
+ data : false,
454
+ init_x : 0,
455
+ init_y : 0,
456
+ scroll_l: 0,
457
+ scroll_t: 0,
458
+ scroll_e: false,
459
+ scroll_i: false,
460
+ is_touch: false
461
+ };
462
+ $(document).off("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag);
463
+ $(document).off("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop);
464
+ },
465
+ _scroll : function (init_only) {
466
+ if(!vakata_dnd.scroll_e || (!vakata_dnd.scroll_l && !vakata_dnd.scroll_t)) {
467
+ if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
468
+ return false;
469
+ }
470
+ if(!vakata_dnd.scroll_i) {
471
+ vakata_dnd.scroll_i = setInterval($.vakata.dnd._scroll, 100);
472
+ return false;
473
+ }
474
+ if(init_only === true) { return false; }
475
+
476
+ var i = vakata_dnd.scroll_e.scrollTop(),
477
+ j = vakata_dnd.scroll_e.scrollLeft();
478
+ vakata_dnd.scroll_e.scrollTop(i + vakata_dnd.scroll_t * $.vakata.dnd.settings.scroll_speed);
479
+ vakata_dnd.scroll_e.scrollLeft(j + vakata_dnd.scroll_l * $.vakata.dnd.settings.scroll_speed);
480
+ if(i !== vakata_dnd.scroll_e.scrollTop() || j !== vakata_dnd.scroll_e.scrollLeft()) {
481
+ /**
482
+ * triggered on the document when a drag causes an element to scroll
483
+ * @event
484
+ * @plugin dnd
485
+ * @name dnd_scroll.vakata
486
+ * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
487
+ * @param {DOM} element the DOM element being dragged
488
+ * @param {jQuery} helper the helper shown next to the mouse
489
+ * @param {jQuery} event the element that is scrolling
490
+ */
491
+ $.vakata.dnd._trigger("scroll", vakata_dnd.scroll_e);
492
+ }
493
+ },
494
+ start : function (e, data, html) {
495
+ if(e.type === "touchstart" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
496
+ e.pageX = e.originalEvent.changedTouches[0].pageX;
497
+ e.pageY = e.originalEvent.changedTouches[0].pageY;
498
+ e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
499
+ }
500
+ if(vakata_dnd.is_drag) { $.vakata.dnd.stop({}); }
501
+ try {
502
+ e.currentTarget.unselectable = "on";
503
+ e.currentTarget.onselectstart = function() { return false; };
504
+ if(e.currentTarget.style) {
505
+ e.currentTarget.style.touchAction = "none";
506
+ e.currentTarget.style.msTouchAction = "none";
507
+ e.currentTarget.style.MozUserSelect = "none";
508
+ }
509
+ } catch(ignore) { }
510
+ vakata_dnd.init_x = e.pageX;
511
+ vakata_dnd.init_y = e.pageY;
512
+ vakata_dnd.data = data;
513
+ vakata_dnd.is_down = true;
514
+ vakata_dnd.element = e.currentTarget;
515
+ vakata_dnd.target = e.target;
516
+ vakata_dnd.is_touch = e.type === "touchstart";
517
+ if(html !== false) {
518
+ vakata_dnd.helper = $("<div id='vakata-dnd'></div>").html(html).css({
519
+ "display" : "block",
520
+ "margin" : "0",
521
+ "padding" : "0",
522
+ "position" : "absolute",
523
+ "top" : "-2000px",
524
+ "lineHeight" : "16px",
525
+ "zIndex" : "10000"
526
+ });
527
+ }
528
+ $(document).on("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag);
529
+ $(document).on("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop);
530
+ return false;
531
+ },
532
+ drag : function (e) {
533
+ if(e.type === "touchmove" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
534
+ e.pageX = e.originalEvent.changedTouches[0].pageX;
535
+ e.pageY = e.originalEvent.changedTouches[0].pageY;
536
+ e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
537
+ }
538
+ if(!vakata_dnd.is_down) { return; }
539
+ if(!vakata_dnd.is_drag) {
540
+ if(
541
+ Math.abs(e.pageX - vakata_dnd.init_x) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) ||
542
+ Math.abs(e.pageY - vakata_dnd.init_y) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold)
543
+ ) {
544
+ if(vakata_dnd.helper) {
545
+ vakata_dnd.helper.appendTo(document.body);
546
+ vakata_dnd.helper_w = vakata_dnd.helper.outerWidth();
547
+ }
548
+ vakata_dnd.is_drag = true;
549
+ $(vakata_dnd.target).one('click.vakata', false);
550
+ /**
551
+ * triggered on the document when a drag starts
552
+ * @event
553
+ * @plugin dnd
554
+ * @name dnd_start.vakata
555
+ * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
556
+ * @param {DOM} element the DOM element being dragged
557
+ * @param {jQuery} helper the helper shown next to the mouse
558
+ * @param {Object} event the event that caused the start (probably mousemove)
559
+ */
560
+ $.vakata.dnd._trigger("start", e);
561
+ }
562
+ else { return; }
563
+ }
564
+
565
+ var d = false, w = false,
566
+ dh = false, wh = false,
567
+ dw = false, ww = false,
568
+ dt = false, dl = false,
569
+ ht = false, hl = false;
570
+
571
+ vakata_dnd.scroll_t = 0;
572
+ vakata_dnd.scroll_l = 0;
573
+ vakata_dnd.scroll_e = false;
574
+ $($(e.target).parentsUntil("body").addBack().get().reverse())
575
+ .filter(function () {
576
+ return (/^auto|scroll$/).test($(this).css("overflow")) &&
577
+ (this.scrollHeight > this.offsetHeight || this.scrollWidth > this.offsetWidth);
578
+ })
579
+ .each(function () {
580
+ var t = $(this), o = t.offset();
581
+ if(this.scrollHeight > this.offsetHeight) {
582
+ if(o.top + t.height() - e.pageY < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; }
583
+ if(e.pageY - o.top < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; }
584
+ }
585
+ if(this.scrollWidth > this.offsetWidth) {
586
+ if(o.left + t.width() - e.pageX < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; }
587
+ if(e.pageX - o.left < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; }
588
+ }
589
+ if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
590
+ vakata_dnd.scroll_e = $(this);
591
+ return false;
592
+ }
593
+ });
594
+
595
+ if(!vakata_dnd.scroll_e) {
596
+ d = $(document); w = $(window);
597
+ dh = d.height(); wh = w.height();
598
+ dw = d.width(); ww = w.width();
599
+ dt = d.scrollTop(); dl = d.scrollLeft();
600
+ if(dh > wh && e.pageY - dt < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; }
601
+ if(dh > wh && wh - (e.pageY - dt) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; }
602
+ if(dw > ww && e.pageX - dl < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; }
603
+ if(dw > ww && ww - (e.pageX - dl) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; }
604
+ if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
605
+ vakata_dnd.scroll_e = d;
606
+ }
607
+ }
608
+ if(vakata_dnd.scroll_e) { $.vakata.dnd._scroll(true); }
609
+
610
+ if(vakata_dnd.helper) {
611
+ ht = parseInt(e.pageY + $.vakata.dnd.settings.helper_top, 10);
612
+ hl = parseInt(e.pageX + $.vakata.dnd.settings.helper_left, 10);
613
+ if(dh && ht + 25 > dh) { ht = dh - 50; }
614
+ if(dw && hl + vakata_dnd.helper_w > dw) { hl = dw - (vakata_dnd.helper_w + 2); }
615
+ vakata_dnd.helper.css({
616
+ left : hl + "px",
617
+ top : ht + "px"
618
+ });
619
+ }
620
+ /**
621
+ * triggered on the document when a drag is in progress
622
+ * @event
623
+ * @plugin dnd
624
+ * @name dnd_move.vakata
625
+ * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
626
+ * @param {DOM} element the DOM element being dragged
627
+ * @param {jQuery} helper the helper shown next to the mouse
628
+ * @param {Object} event the event that caused this to trigger (most likely mousemove)
629
+ */
630
+ $.vakata.dnd._trigger("move", e);
631
+ return false;
632
+ },
633
+ stop : function (e) {
634
+ if(e.type === "touchend" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
635
+ e.pageX = e.originalEvent.changedTouches[0].pageX;
636
+ e.pageY = e.originalEvent.changedTouches[0].pageY;
637
+ e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
638
+ }
639
+ if(vakata_dnd.is_drag) {
640
+ /**
641
+ * triggered on the document when a drag stops (the dragged element is dropped)
642
+ * @event
643
+ * @plugin dnd
644
+ * @name dnd_stop.vakata
645
+ * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
646
+ * @param {DOM} element the DOM element being dragged
647
+ * @param {jQuery} helper the helper shown next to the mouse
648
+ * @param {Object} event the event that caused the stop
649
+ */
650
+ if (e.target !== vakata_dnd.target) {
651
+ $(vakata_dnd.target).off('click.vakata');
652
+ }
653
+ $.vakata.dnd._trigger("stop", e);
654
+ }
655
+ else {
656
+ if(e.type === "touchend" && e.target === vakata_dnd.target) {
657
+ var to = setTimeout(function () { $(e.target).click(); }, 100);
658
+ $(e.target).one('click', function() { if(to) { clearTimeout(to); } });
659
+ }
660
+ }
661
+ $.vakata.dnd._clean();
662
+ return false;
663
+ }
664
+ };
665
+ }($));
666
+
667
+ // include the dnd plugin by default
668
+ // $.jstree.defaults.plugins.push("dnd");
669
+ }));