jqtree-rails 0.1.4.3 → 0.1.5.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.
data/build ADDED
@@ -0,0 +1,3 @@
1
+ cp jqTree/jqtree-circle.png vendor/assets/images
2
+ cp jqTree/tree.jquery.js vendor/assets/javascripts
3
+ cp jqTree/jqtree.css vendor/assets/stylesheets
@@ -1,6 +1,6 @@
1
1
  module JqTree
2
2
  module Rails
3
- VERSION = "0.1.4.3"
4
- JQTREE_VERSION = "0.14"
3
+ VERSION = "0.1.5.0"
4
+ JQTREE_VERSION = "0.15"
5
5
  end
6
6
  end
@@ -1,7 +1,7 @@
1
- // Generated by CoffeeScript 1.4.0
1
+ // Generated by CoffeeScript 1.6.1
2
2
 
3
3
  /*
4
- Copyright 2012 Marco Braak
4
+ Copyright 2013 Marco Braak
5
5
 
6
6
  Licensed under the Apache License, Version 2.0 (the "License");
7
7
  you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@ limitations under the License.
18
18
 
19
19
 
20
20
  (function() {
21
- var $, BorderDropHint, DragAndDropHandler, DragElement, FolderElement, GhostDropHint, JqTreeWidget, MouseWidget, Node, NodeElement, Position, SaveStateHandler, ScrollHandler, SelectNodeHandler, SimpleWidget, TRIANGLE_DOWN, TRIANGLE_RIGHT, Tree, html_escape, indexOf, json_escapable, json_meta, json_quote, json_str,
21
+ var $, BorderDropHint, DragAndDropHandler, DragElement, FolderElement, GhostDropHint, JqTreeWidget, MouseWidget, Node, NodeElement, Position, SaveStateHandler, ScrollHandler, SelectNodeHandler, SimpleWidget, TRIANGLE_DOWN, TRIANGLE_RIGHT, html_escape, indexOf, json_escapable, json_meta, json_quote, json_str, _indexOf,
22
22
  __slice = [].slice,
23
23
  __hasProp = {}.hasOwnProperty,
24
24
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
@@ -230,12 +230,16 @@ limitations under the License.
230
230
  return null;
231
231
  };
232
232
 
233
+ MouseWidget.prototype.setMouseDelay = function(mouse_delay) {
234
+ return this.mouse_delay = mouse_delay;
235
+ };
236
+
233
237
  return MouseWidget;
234
238
 
235
239
  })(SimpleWidget);
236
240
 
237
241
  /*
238
- Copyright 2012 Marco Braak
242
+ Copyright 2013 Marco Braak
239
243
 
240
244
  Licensed under the Apache License, Version 2.0 (the "License");
241
245
  you may not use this file except in compliance with the License.
@@ -255,23 +259,29 @@ limitations under the License.
255
259
 
256
260
  $ = this.jQuery;
257
261
 
258
- indexOf = function(array, item) {
262
+ _indexOf = function(array, item) {
259
263
  var i, value, _i, _len;
264
+ for (i = _i = 0, _len = array.length; _i < _len; i = ++_i) {
265
+ value = array[i];
266
+ if (value === item) {
267
+ return i;
268
+ }
269
+ }
270
+ return -1;
271
+ };
272
+
273
+ indexOf = function(array, item) {
260
274
  if (array.indexOf) {
261
275
  return array.indexOf(item);
262
276
  } else {
263
- for (i = _i = 0, _len = array.length; _i < _len; i = ++_i) {
264
- value = array[i];
265
- if (value === item) {
266
- return i;
267
- }
268
- }
269
- return -1;
277
+ return _indexOf(array, item);
270
278
  }
271
279
  };
272
280
 
273
281
  this.Tree.indexOf = indexOf;
274
282
 
283
+ this.Tree._indexOf = _indexOf;
284
+
275
285
  if (!((this.JSON != null) && (this.JSON.stringify != null) && typeof this.JSON.stringify === 'function')) {
276
286
  json_escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
277
287
  json_meta = {
@@ -333,7 +343,7 @@ limitations under the License.
333
343
  return (partial.length === 0 ? '{}' : '{' + partial.join(',') + '}');
334
344
  }
335
345
  };
336
- if (!(this.JSON != null)) {
346
+ if (this.JSON == null) {
337
347
  this.JSON = {};
338
348
  }
339
349
  this.JSON.stringify = function(value) {
@@ -376,10 +386,21 @@ limitations under the License.
376
386
 
377
387
  Node = (function() {
378
388
 
379
- function Node(o) {
389
+ function Node(o, is_root, node_class) {
390
+ if (is_root == null) {
391
+ is_root = false;
392
+ }
393
+ if (node_class == null) {
394
+ node_class = Node;
395
+ }
380
396
  this.setData(o);
381
397
  this.children = [];
382
398
  this.parent = null;
399
+ if (is_root) {
400
+ this.id_mapping = {};
401
+ this.tree = this;
402
+ this.node_class = node_class;
403
+ }
383
404
  }
384
405
 
385
406
  Node.prototype.setData = function(o) {
@@ -413,7 +434,7 @@ limitations under the License.
413
434
  var child, node, _i, _len;
414
435
  for (_i = 0, _len = children_data.length; _i < _len; _i++) {
415
436
  child = children_data[_i];
416
- node = new Node('');
437
+ node = new _this.tree.node_class('');
417
438
  node.initFromData(child);
418
439
  _this.addChild(node);
419
440
  }
@@ -424,30 +445,30 @@ limitations under the License.
424
445
  };
425
446
 
426
447
  /*
427
- Create tree from data.
448
+ Create tree from data.
428
449
 
429
- Structure of data is:
430
- [
431
- {
432
- label: 'node1',
433
- children: [
434
- { label: 'child1' },
435
- { label: 'child2' }
436
- ]
437
- },
438
- {
439
- label: 'node2'
440
- }
441
- ]
450
+ Structure of data is:
451
+ [
452
+ {
453
+ label: 'node1',
454
+ children: [
455
+ { label: 'child1' },
456
+ { label: 'child2' }
457
+ ]
458
+ },
459
+ {
460
+ label: 'node2'
461
+ }
462
+ ]
442
463
  */
443
464
 
444
465
 
445
466
  Node.prototype.loadFromData = function(data) {
446
467
  var node, o, _i, _len;
447
- this.children = [];
468
+ this.removeChildren();
448
469
  for (_i = 0, _len = data.length; _i < _len; _i++) {
449
470
  o = data[_i];
450
- node = new Node(o);
471
+ node = new this.tree.node_class(o);
451
472
  this.addChild(node);
452
473
  if (typeof o === 'object' && o.children) {
453
474
  node.loadFromData(o.children);
@@ -457,11 +478,11 @@ limitations under the License.
457
478
  };
458
479
 
459
480
  /*
460
- Add child.
481
+ Add child.
461
482
 
462
- tree.addChild(
463
- new Node('child1')
464
- );
483
+ tree.addChild(
484
+ new Node('child1')
485
+ );
465
486
  */
466
487
 
467
488
 
@@ -471,12 +492,12 @@ limitations under the License.
471
492
  };
472
493
 
473
494
  /*
474
- Add child at position. Index starts at 0.
495
+ Add child at position. Index starts at 0.
475
496
 
476
- tree.addChildAtPosition(
477
- new Node('abc'),
478
- 1
479
- );
497
+ tree.addChildAtPosition(
498
+ new Node('abc'),
499
+ 1
500
+ );
480
501
  */
481
502
 
482
503
 
@@ -492,26 +513,26 @@ limitations under the License.
492
513
  };
493
514
 
494
515
  /*
495
- Remove child.
516
+ Remove child. This also removes the children of the node.
496
517
 
497
- tree.removeChild(tree.children[0]);
518
+ tree.removeChild(tree.children[0]);
498
519
  */
499
520
 
500
521
 
501
522
  Node.prototype.removeChild = function(node) {
502
- var _this = this;
503
- node.iterate(function(child) {
504
- _this.tree.removeNodeFromIndex(child);
505
- return true;
506
- });
523
+ node.removeChildren();
524
+ return this._removeChild(node);
525
+ };
526
+
527
+ Node.prototype._removeChild = function(node) {
507
528
  this.children.splice(this.getChildIndex(node), 1);
508
529
  return this.tree.removeNodeFromIndex(node);
509
530
  };
510
531
 
511
532
  /*
512
- Get child index.
533
+ Get child index.
513
534
 
514
- var index = getChildIndex(node);
535
+ var index = getChildIndex(node);
515
536
  */
516
537
 
517
538
 
@@ -520,11 +541,11 @@ limitations under the License.
520
541
  };
521
542
 
522
543
  /*
523
- Does the tree have children?
544
+ Does the tree have children?
524
545
 
525
- if (tree.hasChildren()) {
526
- //
527
- }
546
+ if (tree.hasChildren()) {
547
+ //
548
+ }
528
549
  */
529
550
 
530
551
 
@@ -537,20 +558,20 @@ limitations under the License.
537
558
  };
538
559
 
539
560
  /*
540
- Iterate over all the nodes in the tree.
561
+ Iterate over all the nodes in the tree.
541
562
 
542
- Calls callback with (node, level).
563
+ Calls callback with (node, level).
543
564
 
544
- The callback must return true to continue the iteration on current node.
565
+ The callback must return true to continue the iteration on current node.
545
566
 
546
- tree.iterate(
547
- function(node, level) {
548
- console.log(node.name);
567
+ tree.iterate(
568
+ function(node, level) {
569
+ console.log(node.name);
549
570
 
550
- // stop iteration after level 2
551
- return (level <= 2);
552
- }
553
- );
571
+ // stop iteration after level 2
572
+ return (level <= 2);
573
+ }
574
+ );
554
575
  */
555
576
 
556
577
 
@@ -576,12 +597,12 @@ limitations under the License.
576
597
  };
577
598
 
578
599
  /*
579
- Move node relative to another node.
600
+ Move node relative to another node.
580
601
 
581
- Argument position: Position.BEFORE, Position.AFTER or Position.Inside
602
+ Argument position: Position.BEFORE, Position.AFTER or Position.Inside
582
603
 
583
- // move node1 after node2
584
- tree.moveNode(node1, node2, Position.AFTER);
604
+ // move node1 after node2
605
+ tree.moveNode(node1, node2, Position.AFTER);
585
606
  */
586
607
 
587
608
 
@@ -589,7 +610,7 @@ limitations under the License.
589
610
  if (moved_node.isParentOf(target_node)) {
590
611
  return;
591
612
  }
592
- moved_node.parent.removeChild(moved_node);
613
+ moved_node.parent._removeChild(moved_node);
593
614
  if (position === Position.AFTER) {
594
615
  return target_node.parent.addChildAtPosition(moved_node, target_node.parent.getChildIndex(target_node) + 1);
595
616
  } else if (position === Position.BEFORE) {
@@ -600,7 +621,7 @@ limitations under the License.
600
621
  };
601
622
 
602
623
  /*
603
- Get the tree as data.
624
+ Get the tree as data.
604
625
  */
605
626
 
606
627
 
@@ -648,7 +669,7 @@ limitations under the License.
648
669
  if (!this.parent) {
649
670
  return null;
650
671
  } else {
651
- node = new Node(node_info);
672
+ node = new this.tree.node_class(node_info);
652
673
  child_index = this.parent.getChildIndex(this);
653
674
  this.parent.addChildAtPosition(node, child_index + 1);
654
675
  return node;
@@ -660,9 +681,10 @@ limitations under the License.
660
681
  if (!this.parent) {
661
682
  return null;
662
683
  } else {
663
- node = new Node(node_info);
684
+ node = new this.tree.node_class(node_info);
664
685
  child_index = this.parent.getChildIndex(this);
665
- return this.parent.addChildAtPosition(node, child_index);
686
+ this.parent.addChildAtPosition(node, child_index);
687
+ return node;
666
688
  }
667
689
  };
668
690
 
@@ -671,7 +693,7 @@ limitations under the License.
671
693
  if (!this.parent) {
672
694
  return null;
673
695
  } else {
674
- new_parent = new Node(node_info);
696
+ new_parent = new this.tree.node_class(node_info);
675
697
  new_parent._setParent(this.tree);
676
698
  original_parent = this.parent;
677
699
  _ref = original_parent.children;
@@ -694,14 +716,14 @@ limitations under the License.
694
716
 
695
717
  Node.prototype.append = function(node_info) {
696
718
  var node;
697
- node = new Node(node_info);
719
+ node = new this.tree.node_class(node_info);
698
720
  this.addChild(node);
699
721
  return node;
700
722
  };
701
723
 
702
724
  Node.prototype.prepend = function(node_info) {
703
725
  var node;
704
- node = new Node(node_info);
726
+ node = new this.tree.node_class(node_info);
705
727
  this.addChildAtPosition(node, 0);
706
728
  return node;
707
729
  };
@@ -718,41 +740,45 @@ limitations under the License.
718
740
  return false;
719
741
  };
720
742
 
721
- return Node;
722
-
723
- })();
724
-
725
- Tree = (function(_super) {
726
-
727
- __extends(Tree, _super);
728
-
729
- function Tree(o) {
730
- Tree.__super__.constructor.call(this, o, null, true);
731
- this.id_mapping = {};
732
- this.tree = this;
733
- }
743
+ Node.prototype.getLevel = function() {
744
+ var level, node;
745
+ level = 0;
746
+ node = this;
747
+ while (node.parent) {
748
+ level += 1;
749
+ node = node.parent;
750
+ }
751
+ return level;
752
+ };
734
753
 
735
- Tree.prototype.getNodeById = function(node_id) {
754
+ Node.prototype.getNodeById = function(node_id) {
736
755
  return this.id_mapping[node_id];
737
756
  };
738
757
 
739
- Tree.prototype.addNodeToIndex = function(node) {
758
+ Node.prototype.addNodeToIndex = function(node) {
740
759
  if (node.id) {
741
760
  return this.id_mapping[node.id] = node;
742
761
  }
743
762
  };
744
763
 
745
- Tree.prototype.removeNodeFromIndex = function(node) {
764
+ Node.prototype.removeNodeFromIndex = function(node) {
746
765
  if (node.id) {
747
766
  return delete this.id_mapping[node.id];
748
767
  }
749
768
  };
750
769
 
751
- return Tree;
770
+ Node.prototype.removeChildren = function() {
771
+ var _this = this;
772
+ this.iterate(function(child) {
773
+ _this.tree.removeNodeFromIndex(child);
774
+ return true;
775
+ });
776
+ return this.children = [];
777
+ };
752
778
 
753
- })(Node);
779
+ return Node;
754
780
 
755
- this.Tree.Tree = Tree;
781
+ })();
756
782
 
757
783
  this.Tree.Node = Node;
758
784
 
@@ -780,9 +806,11 @@ limitations under the License.
780
806
  onIsMoveHandle: null,
781
807
  onCanMove: null,
782
808
  onCanMoveTo: null,
809
+ onLoadFailed: null,
783
810
  autoEscape: true,
784
811
  dataUrl: null,
785
- slide: true
812
+ slide: true,
813
+ nodeClass: Node
786
814
  };
787
815
 
788
816
  JqTreeWidget.prototype.toggle = function(node, slide) {
@@ -813,24 +841,42 @@ limitations under the License.
813
841
  };
814
842
 
815
843
  JqTreeWidget.prototype.loadData = function(data, parent_node) {
816
- return this._loadData(data, parent_node);
844
+ this._loadData(data, parent_node);
845
+ if (!parent_node) {
846
+ return this.selected_node = null;
847
+ }
848
+ };
849
+
850
+ JqTreeWidget.prototype.loadDataFromUrl = function(url, parent_node, on_finished) {
851
+ if ($.type(url) !== 'string') {
852
+ parent_node = url;
853
+ on_finished = parent_node;
854
+ url = null;
855
+ on_finished = null;
856
+ }
857
+ this._loadDataFromUrl(url, parent_node, on_finished);
858
+ if (!parent_node) {
859
+ return this.selected_node = null;
860
+ }
817
861
  };
818
862
 
819
- JqTreeWidget.prototype.loadDataFromUrl = function(url_info, parent_node, on_finished) {
820
- var $li, addLoadingClass, parseUrlInfo, removeLoadingClass,
863
+ JqTreeWidget.prototype._loadDataFromUrl = function(url_info, parent_node, on_finished) {
864
+ var $el, addLoadingClass, parseUrlInfo, removeLoadingClass,
821
865
  _this = this;
822
- $li = null;
866
+ $el = null;
823
867
  addLoadingClass = function() {
824
868
  var folder_element;
825
- if (parent_node) {
869
+ if (!parent_node) {
870
+ $el = _this.element;
871
+ } else {
826
872
  folder_element = new FolderElement(parent_node, _this);
827
- $li = folder_element.getLi();
828
- return $li.addClass('jqtree-loading');
873
+ $el = folder_element.getLi();
829
874
  }
875
+ return $el.addClass('jqtree-loading');
830
876
  };
831
877
  removeLoadingClass = function() {
832
- if ($li) {
833
- return $li.removeClass('loading');
878
+ if ($el) {
879
+ return $el.removeClass('jqtree-loading');
834
880
  }
835
881
  };
836
882
  parseUrlInfo = function() {
@@ -844,6 +890,9 @@ limitations under the License.
844
890
  }
845
891
  };
846
892
  addLoadingClass();
893
+ if (!url_info) {
894
+ url_info = this._getDataUrlInfo(parent_node);
895
+ }
847
896
  parseUrlInfo();
848
897
  return $.ajax({
849
898
  url: url_info.url,
@@ -860,29 +909,31 @@ limitations under the License.
860
909
  }
861
910
  removeLoadingClass();
862
911
  _this._loadData(data, parent_node);
863
- if (on_finished) {
912
+ if (on_finished && $.isFunction(on_finished)) {
864
913
  return on_finished();
865
914
  }
915
+ },
916
+ error: function(response) {
917
+ removeLoadingClass();
918
+ if (_this.options.onLoadFailed) {
919
+ return _this.options.onLoadFailed(response);
920
+ }
866
921
  }
867
922
  });
868
923
  };
869
924
 
870
925
  JqTreeWidget.prototype._loadData = function(data, parent_node) {
871
- var child, subtree, _i, _len, _ref;
872
926
  this._triggerEvent('tree.load_data', {
873
927
  tree_data: data
874
928
  });
875
929
  if (!parent_node) {
876
- this._initTree(data);
930
+ this._initTree(data, false, this.options.nodeClass);
877
931
  } else {
878
- subtree = new Node('');
879
- subtree._setParent(parent_node.tree);
880
- subtree.loadFromData(data);
881
- _ref = subtree.children;
882
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
883
- child = _ref[_i];
884
- parent_node.addChild(child);
932
+ if (this.selected_node && parent_node.isParentOf(this.selected_node)) {
933
+ this.selected_node = null;
885
934
  }
935
+ parent_node.loadFromData(data);
936
+ parent_node.load_on_demand = false;
886
937
  this._refreshElements(parent_node.parent);
887
938
  }
888
939
  if (this.is_dragging) {
@@ -938,8 +989,7 @@ limitations under the License.
938
989
  if (slide == null) {
939
990
  slide = true;
940
991
  }
941
- node.load_on_demand = false;
942
- return this.loadDataFromUrl(this._getDataUrlInfo(node), node, function() {
992
+ return this._loadDataFromUrl(null, node, function() {
943
993
  return _this._openNode(node, slide, on_finished);
944
994
  });
945
995
  };
@@ -994,7 +1044,7 @@ limitations under the License.
994
1044
  return true;
995
1045
  } else {
996
1046
  result = true;
997
- iterate(function(child) {
1047
+ _this.tree.iterate(function(child) {
998
1048
  if (node === child) {
999
1049
  result = true;
1000
1050
  return false;
@@ -1080,9 +1130,9 @@ limitations under the License.
1080
1130
 
1081
1131
  JqTreeWidget.prototype._initData = function() {
1082
1132
  if (this.options.data) {
1083
- return this.loadData(this.options.data);
1133
+ return this._loadData(this.options.data);
1084
1134
  } else {
1085
- return this.loadDataFromUrl(this._getDataUrlInfo());
1135
+ return this._loadDataFromUrl(this._getDataUrlInfo());
1086
1136
  }
1087
1137
  };
1088
1138
 
@@ -1108,11 +1158,10 @@ limitations under the License.
1108
1158
  };
1109
1159
 
1110
1160
  JqTreeWidget.prototype._initTree = function(data) {
1111
- this.tree = new Tree();
1161
+ this.tree = new this.options.nodeClass(null, true, this.options.nodeClass);
1112
1162
  this.tree.loadFromData(data);
1113
1163
  this._openNodes();
1114
1164
  this._refreshElements();
1115
- this.select_node_handler.selectCurrentNode();
1116
1165
  return this._triggerEvent('tree.init');
1117
1166
  };
1118
1167
 
@@ -1131,7 +1180,9 @@ limitations under the License.
1131
1180
  max_level = parseInt(this.options.autoOpen);
1132
1181
  }
1133
1182
  return this.tree.iterate(function(node, level) {
1134
- node.is_open = true;
1183
+ if (node.hasChildren()) {
1184
+ node.is_open = true;
1185
+ }
1135
1186
  return level !== max_level;
1136
1187
  });
1137
1188
  };
@@ -1171,9 +1222,14 @@ limitations under the License.
1171
1222
  return $li;
1172
1223
  };
1173
1224
  createNodeLi = function(node) {
1174
- var escaped_name;
1225
+ var class_string, escaped_name, li_classes;
1226
+ li_classes = ['jqtree_common'];
1227
+ if (node === _this.selected_node) {
1228
+ li_classes.push('jqtree-selected');
1229
+ }
1230
+ class_string = li_classes.join(' ');
1175
1231
  escaped_name = escapeIfNecessary(node.name);
1176
- return $("<li class=\"jqtree_common\"><div><span class=\"jqtree-title jqtree_common\">" + escaped_name + "</span></div></li>");
1232
+ return $("<li class=\"" + class_string + "\"><div class=\"jqtree-element jqtree_common\"><span class=\"jqtree-title jqtree_common\">" + escaped_name + "</span></div></li>");
1177
1233
  };
1178
1234
  createFolderLi = function(node) {
1179
1235
  var button_char, button_classes, escaped_name, folder_classes, getButtonClasses, getFolderClasses;
@@ -1191,6 +1247,9 @@ limitations under the License.
1191
1247
  if (!node.is_open) {
1192
1248
  classes.push('jqtree-closed');
1193
1249
  }
1250
+ if (node === _this.selected_node) {
1251
+ classes.push('jqtree-selected');
1252
+ }
1194
1253
  return classes.join(' ');
1195
1254
  };
1196
1255
  button_classes = getButtonClasses();
@@ -1201,7 +1260,7 @@ limitations under the License.
1201
1260
  } else {
1202
1261
  button_char = TRIANGLE_RIGHT;
1203
1262
  }
1204
- return $("<li class=\"jqtree_common " + folder_classes + "\"><div><a class=\"jqtree_common " + button_classes + "\">" + button_char + "</a><span class=\"jqtree_common jqtree-title\">" + escaped_name + "</span></div></li>");
1263
+ return $("<li class=\"jqtree_common " + folder_classes + "\"><div class=\"jqtree-element jqtree_common\"><a class=\"jqtree_common " + button_classes + "\">" + button_char + "</a><span class=\"jqtree_common jqtree-title\">" + escaped_name + "</span></div></li>");
1205
1264
  };
1206
1265
  doCreateDomElements = function($element, children, is_root_node, is_open) {
1207
1266
  var $li, $ul, child, _i, _len;
@@ -1235,28 +1294,28 @@ limitations under the License.
1235
1294
  };
1236
1295
 
1237
1296
  JqTreeWidget.prototype._click = function(e) {
1238
- var $button, $target, $title, node;
1297
+ var $button, $el, $target, node;
1239
1298
  if (e.ctrlKey) {
1240
1299
  return;
1241
1300
  }
1242
1301
  $target = $(e.target);
1243
- $title = $target.closest('.jqtree-title');
1244
- if ($title.length) {
1245
- node = this._getNode($title);
1302
+ $button = $target.closest('.jqtree-toggler');
1303
+ if ($button.length) {
1304
+ node = this._getNode($button);
1246
1305
  if (node) {
1247
- this._triggerEvent('tree.click', {
1248
- node: node
1249
- });
1250
- return this.selectNode(node);
1306
+ this.toggle(node, this.options.slide);
1307
+ e.preventDefault();
1308
+ return e.stopPropagation();
1251
1309
  }
1252
1310
  } else {
1253
- $button = $target.closest('.jqtree-toggler');
1254
- if ($button.length) {
1255
- node = this._getNode($button);
1311
+ $el = $target.closest('.jqtree-element');
1312
+ if ($el.length) {
1313
+ node = this._getNode($el);
1256
1314
  if (node) {
1257
- this.toggle(node, this.options.slide);
1258
- e.preventDefault();
1259
- return e.stopPropagation();
1315
+ this._triggerEvent('tree.click', {
1316
+ node: node
1317
+ });
1318
+ return this.select_node_handler.selectNode(node, true);
1260
1319
  }
1261
1320
  }
1262
1321
  }
@@ -1292,7 +1351,7 @@ limitations under the License.
1292
1351
 
1293
1352
  JqTreeWidget.prototype._contextmenu = function(e) {
1294
1353
  var $div, node;
1295
- $div = $(e.target).closest('ul.jqtree-tree div');
1354
+ $div = $(e.target).closest('ul.jqtree-tree .jqtree-element');
1296
1355
  if ($div.length) {
1297
1356
  node = this._getNode($div);
1298
1357
  if (node) {
@@ -1340,9 +1399,9 @@ limitations under the License.
1340
1399
  }
1341
1400
  };
1342
1401
 
1343
- JqTreeWidget.prototype._mouseStop = function() {
1402
+ JqTreeWidget.prototype._mouseStop = function(e) {
1344
1403
  if (this.options.dragAndDrop) {
1345
- return this.dnd_handler.mouseStop();
1404
+ return this.dnd_handler.mouseStop(e);
1346
1405
  } else {
1347
1406
  return false;
1348
1407
  }
@@ -1416,7 +1475,7 @@ limitations under the License.
1416
1475
 
1417
1476
  function BorderDropHint($element) {
1418
1477
  var $div, width;
1419
- $div = $element.children('div');
1478
+ $div = $element.children('.jqtree-element');
1420
1479
  width = $element.width() - 4;
1421
1480
  this.$hint = $('<span class="jqtree-border"></span>');
1422
1481
  $div.append(this.$hint);
@@ -1451,7 +1510,7 @@ limitations under the License.
1451
1510
  };
1452
1511
 
1453
1512
  NodeElement.prototype.getSpan = function() {
1454
- return this.$element.children('div').find('span.jqtree-title');
1513
+ return this.$element.children('.jqtree-element').find('span.jqtree-title');
1455
1514
  };
1456
1515
 
1457
1516
  NodeElement.prototype.getLi = function() {
@@ -1542,7 +1601,7 @@ limitations under the License.
1542
1601
  };
1543
1602
 
1544
1603
  FolderElement.prototype.getButton = function() {
1545
- return this.$element.children('div').find('a.jqtree-toggler');
1604
+ return this.$element.children('.jqtree-element').find('a.jqtree-toggler');
1546
1605
  };
1547
1606
 
1548
1607
  FolderElement.prototype.addDropHint = function(position) {
@@ -1594,6 +1653,7 @@ limitations under the License.
1594
1653
  } else if (typeof localStorage !== "undefined" && localStorage !== null) {
1595
1654
  return localStorage.setItem(this.getCookieName(), this.getState());
1596
1655
  } else if ($.cookie) {
1656
+ $.cookie.raw = true;
1597
1657
  return $.cookie(this.getCookieName(), this.getState(), {
1598
1658
  path: '/'
1599
1659
  });
@@ -1617,9 +1677,8 @@ limitations under the License.
1617
1677
  } else if (typeof localStorage !== "undefined" && localStorage !== null) {
1618
1678
  return localStorage.getItem(this.getCookieName());
1619
1679
  } else if ($.cookie) {
1620
- return $.cookie(this.getCookieName(), {
1621
- path: '/'
1622
- });
1680
+ $.cookie.raw = true;
1681
+ return $.cookie(this.getCookieName());
1623
1682
  } else {
1624
1683
  return null;
1625
1684
  }
@@ -1682,29 +1741,54 @@ limitations under the License.
1682
1741
  this.tree_widget = tree_widget;
1683
1742
  }
1684
1743
 
1685
- SelectNodeHandler.prototype.selectNode = function(node) {
1686
- var canSelect, parent,
1744
+ SelectNodeHandler.prototype.selectNode = function(node, must_toggle) {
1745
+ var canSelect, mustToggle, node_element, parent, previous_node,
1687
1746
  _this = this;
1747
+ if (must_toggle == null) {
1748
+ must_toggle = false;
1749
+ }
1688
1750
  canSelect = function() {
1689
1751
  if (!_this.tree_widget.options.onCanSelectNode) {
1690
1752
  return true;
1691
1753
  }
1692
1754
  return _this.tree_widget.options.onCanSelectNode(node);
1693
1755
  };
1756
+ mustToggle = function(previous_node, node) {
1757
+ if (must_toggle && previous_node && node) {
1758
+ if (node.id) {
1759
+ return node.id === previous_node.id;
1760
+ } else {
1761
+ return node.element === previous_node.element;
1762
+ }
1763
+ } else {
1764
+ return false;
1765
+ }
1766
+ };
1694
1767
  if (canSelect()) {
1695
1768
  if (this.tree_widget.selected_node) {
1696
- this.tree_widget._getNodeElementForNode(this.tree_widget.selected_node).deselect();
1769
+ previous_node = this.tree_widget.selected_node;
1770
+ this.tree_widget._getNodeElementForNode(previous_node).deselect();
1697
1771
  this.tree_widget.selected_node = null;
1772
+ } else {
1773
+ previous_node = null;
1698
1774
  }
1699
1775
  if (node) {
1700
- this.tree_widget._getNodeElementForNode(node).select();
1701
- this.tree_widget.selected_node = node;
1702
- this.tree_widget._triggerEvent('tree.select', {
1703
- node: node
1704
- });
1705
- parent = this.tree_widget.selected_node.parent;
1706
- if (!parent.is_open) {
1707
- this.tree_widget.openNode(parent, false);
1776
+ node_element = this.tree_widget._getNodeElementForNode(node);
1777
+ if (mustToggle(previous_node, node)) {
1778
+ node_element.deselect();
1779
+ this.tree_widget._triggerEvent('tree.select', {
1780
+ node: null
1781
+ });
1782
+ } else {
1783
+ node_element.select();
1784
+ this.tree_widget.selected_node = node;
1785
+ this.tree_widget._triggerEvent('tree.select', {
1786
+ node: node
1787
+ });
1788
+ parent = this.tree_widget.selected_node.parent;
1789
+ if (!parent.is_open) {
1790
+ this.tree_widget.openNode(parent, false);
1791
+ }
1708
1792
  }
1709
1793
  }
1710
1794
  if (this.tree_widget.options.saveState) {
@@ -1777,17 +1861,15 @@ limitations under the License.
1777
1861
  this.removeDropHint();
1778
1862
  this.removeHover();
1779
1863
  this.stopOpenFolderTimer();
1780
- } else {
1781
- if (this.hovered_area !== area) {
1782
- this.hovered_area = area;
1783
- this.updateDropHint();
1784
- }
1864
+ } else if (this.hovered_area !== area) {
1865
+ this.hovered_area = area;
1866
+ this.updateDropHint();
1785
1867
  }
1786
1868
  return true;
1787
1869
  };
1788
1870
 
1789
- DragAndDropHandler.prototype.mouseStop = function() {
1790
- this.moveItem();
1871
+ DragAndDropHandler.prototype.mouseStop = function(e) {
1872
+ this.moveItem(e);
1791
1873
  this.clear();
1792
1874
  this.removeHover();
1793
1875
  this.removeDropHint();
@@ -2029,7 +2111,7 @@ limitations under the License.
2029
2111
  }
2030
2112
  };
2031
2113
 
2032
- DragAndDropHandler.prototype.moveItem = function() {
2114
+ DragAndDropHandler.prototype.moveItem = function(original_event) {
2033
2115
  var doMove, event, moved_node, position, previous_parent, target_node,
2034
2116
  _this = this;
2035
2117
  if (this.hovered_area && this.hovered_area.position !== Position.NONE) {
@@ -2051,7 +2133,8 @@ limitations under the License.
2051
2133
  target_node: target_node,
2052
2134
  position: Position.getName(position),
2053
2135
  previous_parent: previous_parent,
2054
- do_move: doMove
2136
+ do_move: doMove,
2137
+ original_event: original_event
2055
2138
  }
2056
2139
  });
2057
2140
  if (!event.isDefaultPrevented()) {
@@ -20,6 +20,7 @@ ul.jqtree-tree li.jqtree-closed > ul.jqtree_common {
20
20
 
21
21
  ul.jqtree-tree li.jqtree_common {
22
22
  clear: both;
23
+ list-style-type: none;
23
24
  }
24
25
  ul.jqtree-tree .jqtree-toggler {
25
26
  display: block;
@@ -38,7 +39,7 @@ ul.jqtree-tree .jqtree-toggler:hover {
38
39
  color: #000;
39
40
  }
40
41
 
41
- ul.jqtree-tree div {
42
+ ul.jqtree-tree .jqtree-element {
42
43
  cursor: pointer;
43
44
  }
44
45
 
@@ -117,14 +118,14 @@ ul.jqtree-tree span.jqtree-border {
117
118
  margin: 0;
118
119
  }
119
120
 
120
- ul.jqtree-tree div {
121
+ ul.jqtree-tree .jqtree-element {
121
122
  width: 100%; /* todo: why is this in here? */
122
123
  *width: auto; /* ie7 fix; issue 41 */
123
124
  position: relative;
124
125
  }
125
126
 
126
- ul.jqtree-tree li.jqtree-selected > div,
127
- ul.jqtree-tree li.jqtree-selected > div:hover {
127
+ ul.jqtree-tree li.jqtree-selected > .jqtree-element,
128
+ ul.jqtree-tree li.jqtree-selected > .jqtree-element:hover {
128
129
  background-color: #97BDD6;
129
130
  background: -webkit-gradient(linear, left top, left bottom, from(#BEE0F5), to(#89AFCA));
130
131
  background: -moz-linear-gradient(top, #BEE0F5, #89AFCA);
@@ -133,6 +134,6 @@ ul.jqtree-tree li.jqtree-selected > div:hover {
133
134
  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7);
134
135
  }
135
136
 
136
- ul.jqtree-tree .jqtree-moving > div .jqtree-title {
137
+ ul.jqtree-tree .jqtree-moving > .jqtree-element .jqtree-title {
137
138
  outline: dashed 1px #0000ff;
138
139
  }
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: jqtree-rails
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.4.3
5
+ version: 0.1.5.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ryan Scott Lewis
@@ -10,9 +10,10 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-12-21 00:00:00.000000000 Z
13
+ date: 2013-03-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
+ prerelease: false
16
17
  version_requirements: !ruby/object:Gem::Requirement
17
18
  requirements:
18
19
  - - ! '>='
@@ -22,9 +23,8 @@ dependencies:
22
23
  - !ruby/object:Gem::Version
23
24
  version: '5.0'
24
25
  none: false
25
- name: railties
26
26
  type: :runtime
27
- prerelease: false
27
+ name: railties
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - ! '>='
@@ -35,15 +35,15 @@ dependencies:
35
35
  version: '5.0'
36
36
  none: false
37
37
  - !ruby/object:Gem::Dependency
38
+ prerelease: false
38
39
  version_requirements: !ruby/object:Gem::Requirement
39
40
  requirements:
40
41
  - - ~>
41
42
  - !ruby/object:Gem::Version
42
43
  version: '0.14'
43
44
  none: false
44
- name: thor
45
45
  type: :runtime
46
- prerelease: false
46
+ name: thor
47
47
  requirement: !ruby/object:Gem::Requirement
48
48
  requirements:
49
49
  - - ~>
@@ -65,6 +65,7 @@ files:
65
65
  - LICENSE
66
66
  - README.md
67
67
  - Rakefile
68
+ - build
68
69
  - jqtree-rails.gemspec
69
70
  - lib/generators/jqtree/install/install_generator.rb
70
71
  - lib/jqtree-rails.rb
@@ -94,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
95
  none: false
95
96
  requirements: []
96
97
  rubyforge_project:
97
- rubygems_version: 1.8.23
98
+ rubygems_version: 1.8.25
98
99
  signing_key:
99
100
  specification_version: 3
100
101
  summary: Use jqTree with Rails 3