fancytree-rails 2.1.0.pre.0 → 2.3.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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/README.md +1 -1
  4. data/Rakefile +3 -4
  5. data/app/assets/javascripts/fancytree/jquery.fancytree-all.js +568 -51
  6. data/app/assets/javascripts/fancytree/jquery.fancytree-custom.min.js +9 -6
  7. data/app/assets/javascripts/fancytree/jquery.fancytree.js +63 -27
  8. data/app/assets/javascripts/fancytree/jquery.fancytree.min.js +4 -4
  9. data/app/assets/javascripts/fancytree/src/jquery.fancytree.childcounter.js +2 -2
  10. data/app/assets/javascripts/fancytree/src/jquery.fancytree.clones.js +7 -3
  11. data/app/assets/javascripts/fancytree/src/jquery.fancytree.columnview.js +2 -2
  12. data/app/assets/javascripts/fancytree/src/jquery.fancytree.debug.js +2 -2
  13. data/app/assets/javascripts/fancytree/src/jquery.fancytree.dnd.js +24 -4
  14. data/app/assets/javascripts/fancytree/src/jquery.fancytree.edit.js +3 -2
  15. data/app/assets/javascripts/fancytree/src/jquery.fancytree.filter.js +2 -2
  16. data/app/assets/javascripts/fancytree/src/jquery.fancytree.glyph.js +14 -6
  17. data/app/assets/javascripts/fancytree/src/jquery.fancytree.gridnav.js +2 -2
  18. data/app/assets/javascripts/fancytree/src/jquery.fancytree.js +63 -27
  19. data/app/assets/javascripts/fancytree/src/jquery.fancytree.menu.js +2 -2
  20. data/app/assets/javascripts/fancytree/src/jquery.fancytree.persist.js +2 -2
  21. data/app/assets/javascripts/fancytree/src/jquery.fancytree.table.js +2 -2
  22. data/app/assets/javascripts/fancytree/src/jquery.fancytree.themeroller.js +2 -2
  23. data/app/assets/javascripts/fancytree/src/jquery.fancytree.wide.js +124 -0
  24. data/app/assets/stylesheets/fancytree/skin-lion/ui.fancytree.css.erb +5 -0
  25. data/app/assets/stylesheets/fancytree/skin-vista/ui.fancytree.css.erb +5 -0
  26. data/app/assets/stylesheets/fancytree/skin-win7/ui.fancytree.css.erb +5 -0
  27. data/app/assets/stylesheets/fancytree/skin-win8-xxl/ui.fancytree.css.erb +5 -0
  28. data/app/assets/stylesheets/fancytree/skin-win8/ui.fancytree.css.erb +5 -0
  29. data/app/assets/stylesheets/fancytree/skin-xp/ui.fancytree.css.erb +5 -0
  30. data/lib/fancytree/rails/version.rb +2 -2
  31. metadata +5 -4
@@ -9,8 +9,8 @@
9
9
  * Released under the MIT license
10
10
  * https://github.com/mar10/fancytree/wiki/LicenseInfo
11
11
  *
12
- * @version 2.1.0
13
- * @date 2014-05-29T16:44
12
+ * @version 2.3.0
13
+ * @date 2014-08-17T10:39
14
14
  */
15
15
 
16
16
  ;(function($, window, document, undefined) {
@@ -7,8 +7,8 @@
7
7
  * Released under the MIT license
8
8
  * https://github.com/mar10/fancytree/wiki/LicenseInfo
9
9
  *
10
- * @version 2.1.0
11
- * @date 2014-05-29T16:44
10
+ * @version 2.3.0
11
+ * @date 2014-08-17T10:39
12
12
  */
13
13
 
14
14
  /** Core Fancytree module.
@@ -614,7 +614,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
614
614
  var i, l, child, s, state, allSelected,someSelected,
615
615
  children = node.children;
616
616
 
617
- if( children ){
617
+ if( children && children.length ){
618
618
  // check all children recursively
619
619
  allSelected = true;
620
620
  someSelected = false;
@@ -852,6 +852,16 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
852
852
  hasFocus: function() {
853
853
  return (this.tree.hasFocus() && this.tree.focusNode === this);
854
854
  },
855
+ /** Write to browser console if debugLevel >= 1 (prepending node info)
856
+ *
857
+ * @param {*} msg string or object or array of such
858
+ */
859
+ info: function(msg){
860
+ if( this.tree.options.debugLevel >= 1 ) {
861
+ Array.prototype.unshift.call(arguments, this.toString());
862
+ consoleApply("info", arguments);
863
+ }
864
+ },
855
865
  /** Return true if node is active (see also FancytreeNode#isSelected).
856
866
  * @returns {boolean}
857
867
  */
@@ -1063,6 +1073,9 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
1063
1073
  }
1064
1074
  // Unlink this node from current parent
1065
1075
  if( this.parent.children.length === 1 ) {
1076
+ if( this.parent === targetParent ){
1077
+ return; // #258
1078
+ }
1066
1079
  this.parent.children = this.parent.lazy ? [] : null;
1067
1080
  this.parent.expanded = false;
1068
1081
  } else {
@@ -1196,7 +1209,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
1196
1209
  // Navigate to node
1197
1210
  function _goto(n){
1198
1211
  if( n ){
1199
- n.makeVisible();
1212
+ try { n.makeVisible(); } catch(e) {} // #272
1200
1213
  // Node may still be hidden by a filter
1201
1214
  if( ! $(n.span).is(":visible") ) {
1202
1215
  n.debug("Navigate: skipping hidden node");
@@ -1467,13 +1480,20 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
1467
1480
  setFocus: function(flag){
1468
1481
  return this.tree._callHook("nodeSetFocus", this, flag);
1469
1482
  },
1470
- // TODO: setLazyNodeStatus
1471
1483
  /**Select this node, i.e. check the checkbox.
1472
1484
  * @param {boolean} [flag=true] pass false to deselect
1473
1485
  */
1474
1486
  setSelected: function(flag){
1475
1487
  return this.tree._callHook("nodeSetSelected", this, flag);
1476
1488
  },
1489
+ /**Mark a lazy node as 'error', 'loading', or 'ok'.
1490
+ * @param {string} status 'error', 'ok'
1491
+ * @param {string} [message]
1492
+ * @param {string} [details]
1493
+ */
1494
+ setStatus: function(status, message, details){
1495
+ return this.tree._callHook("nodeSetStatus", this, status, message, details);
1496
+ },
1477
1497
  /**Rename this node.
1478
1498
  * @param {string} title
1479
1499
  */
@@ -1666,6 +1686,9 @@ function Fancytree(widget) {
1666
1686
  };
1667
1687
  }
1668
1688
  }
1689
+ if( this.options && $.isFunction(this.options.loaderror) ) {
1690
+ $.error("The 'loaderror' event was renamed since 2014-07-03. Use 'loadError' (with uppercase E) instead.");
1691
+ }
1669
1692
  this.ext = {}; // Active extension instances
1670
1693
  // allow to init tree.data.foo from <div data-foo=''>
1671
1694
  this.data = _getElementDataAsDict(this.$div);
@@ -1883,17 +1906,17 @@ Fancytree.prototype = /** @lends Fancytree# */{
1883
1906
  generateFormElements: function(selected, active) {
1884
1907
  // TODO: test case
1885
1908
  var nodeList,
1886
- selectedName = (selected !== false) ? "ft_" + this._id : selected,
1909
+ selectedName = (selected !== false) ? "ft_" + this._id + "[]" : selected,
1887
1910
  activeName = (active !== false) ? "ft_" + this._id + "_active" : active,
1888
1911
  id = "fancytree_result_" + this._id,
1889
- $result = this.$container.find("div#" + id);
1912
+ $result = $("#" + id);
1890
1913
 
1891
1914
  if($result.length){
1892
1915
  $result.empty();
1893
1916
  }else{
1894
1917
  $result = $("<div>", {
1895
1918
  id: id
1896
- }).hide().appendTo(this.$container);
1919
+ }).hide().insertAfter(this.$container);
1897
1920
  }
1898
1921
  if(selectedName){
1899
1922
  nodeList = this.getSelectedNodes( this.options.selectMode === 3 );
@@ -1967,7 +1990,12 @@ Fancytree.prototype = /** @lends Fancytree# */{
1967
1990
  }, true);
1968
1991
  return match;
1969
1992
  },
1970
- // TODO: getRoot()
1993
+ /** Return the invisible system root node.
1994
+ * @returns {FancytreeNode}
1995
+ */
1996
+ getRootNode: function() {
1997
+ return this.rootNode;
1998
+ },
1971
1999
  /**
1972
2000
  * Return an array of selected nodes.
1973
2001
  * @param {boolean} [stopOnParents=false] only return the topmost selected
@@ -2373,7 +2401,7 @@ $.extend(Fancytree.prototype,
2373
2401
  * data was rendered.
2374
2402
  */
2375
2403
  nodeLoadChildren: function(ctx, source) {
2376
- var ajax, delay,
2404
+ var ajax, delay, dfd,
2377
2405
  tree = ctx.tree,
2378
2406
  node = ctx.node;
2379
2407
 
@@ -2393,7 +2421,7 @@ $.extend(Fancytree.prototype,
2393
2421
 
2394
2422
  node.debug("nodeLoadChildren waiting debug delay " + Math.round(delay) + "ms");
2395
2423
  ajax.debugDelay = false;
2396
- source = $.Deferred(function (dfd) {
2424
+ dfd = $.Deferred(function (dfd) {
2397
2425
  setTimeout(function () {
2398
2426
  $.ajax(ajax)
2399
2427
  .done(function () { dfd.resolveWith(this, arguments); })
@@ -2401,33 +2429,42 @@ $.extend(Fancytree.prototype,
2401
2429
  }, delay);
2402
2430
  });
2403
2431
  }else{
2404
- source = $.ajax(ajax);
2432
+ dfd = $.ajax(ajax);
2405
2433
  }
2406
2434
 
2407
- // TODO: change 'pipe' to 'then' for jQuery 1.8
2408
- // $.pipe returns a new Promise with filtered results
2409
- source = source.pipe(function (data, textStatus, jqXHR) {
2410
- var res;
2435
+ // Defer the deferred: we want to be able to reject, even if ajax
2436
+ // resolved ok.
2437
+ source = new $.Deferred();
2438
+ dfd.done(function (data, textStatus, jqXHR) {
2439
+ var errorObj, res;
2411
2440
  if(typeof data === "string"){
2412
2441
  $.error("Ajax request returned a string (did you get the JSON dataType wrong?).");
2413
2442
  }
2414
- // postProcess is similar to the standard dataFilter hook,
2443
+ // postProcess is similar to the standard ajax dataFilter hook,
2415
2444
  // but it is also called for JSONP
2416
2445
  if( ctx.options.postProcess ){
2417
- res = tree._triggerNodeEvent("postProcess", ctx, ctx.originalEvent, {response: data, dataType: this.dataType});
2446
+ res = tree._triggerNodeEvent("postProcess", ctx, ctx.originalEvent, {response: data, error: null, dataType: this.dataType});
2447
+ if( res.error ) {
2448
+ errorObj = $.isPlainObject(res.error) ? res.error : {message: res.error};
2449
+ errorObj = tree._makeHookContext(node, null, errorObj);
2450
+ source.rejectWith(this, [errorObj]);
2451
+ return;
2452
+ }
2418
2453
  data = $.isArray(res) ? res : data;
2454
+
2419
2455
  } else if (data && data.hasOwnProperty("d") && ctx.options.enableAspx ) {
2420
2456
  // Process ASPX WebMethod JSON object inside "d" property
2421
2457
  data = (typeof data.d === "string") ? $.parseJSON(data.d) : data.d;
2422
2458
  }
2423
- return data;
2424
- }, function (jqXHR, textStatus, errorThrown) {
2425
- return tree._makeHookContext(node, null, {
2459
+ source.resolveWith(this, [data]);
2460
+ }).fail(function (jqXHR, textStatus, errorThrown) {
2461
+ var errorObj = tree._makeHookContext(node, null, {
2426
2462
  error: jqXHR,
2427
2463
  args: Array.prototype.slice.call(arguments),
2428
2464
  message: errorThrown,
2429
2465
  details: jqXHR.status + ": " + errorThrown
2430
2466
  });
2467
+ source.rejectWith(this, [errorObj]);
2431
2468
  });
2432
2469
  }
2433
2470
 
@@ -2437,7 +2474,7 @@ $.extend(Fancytree.prototype,
2437
2474
  // node._isLoading = true;
2438
2475
  tree.nodeSetStatus(ctx, "loading");
2439
2476
 
2440
- source.done(function () {
2477
+ source.done(function (children) {
2441
2478
  tree.nodeSetStatus(ctx, "ok");
2442
2479
  }).fail(function(error){
2443
2480
  var ctxErr;
@@ -2451,8 +2488,9 @@ $.extend(Fancytree.prototype,
2451
2488
  message: error ? (error.message || error.toString()) : ""
2452
2489
  });
2453
2490
  }
2454
- tree._triggerNodeEvent("loaderror", ctxErr, null);
2455
- tree.nodeSetStatus(ctx, "error", ctxErr.message, ctxErr.details);
2491
+ if( tree._triggerNodeEvent("loadError", ctxErr, null) !== false ) {
2492
+ tree.nodeSetStatus(ctx, "error", ctxErr.message, ctxErr.details);
2493
+ }
2456
2494
  });
2457
2495
  }
2458
2496
  // $.when(source) resolves also for non-deferreds
@@ -2472,9 +2510,7 @@ $.extend(Fancytree.prototype,
2472
2510
  _assert($.isArray(children), "expected array of children");
2473
2511
  node._setChildren(children);
2474
2512
  // trigger fancytreeloadchildren
2475
- // if( node.parent ) {
2476
2513
  tree._triggerNodeEvent("loadChildren", node);
2477
- // }
2478
2514
  // }).always(function(){
2479
2515
  // node._isLoading = false;
2480
2516
  });
@@ -3791,7 +3827,7 @@ $.extend($.ui.fancytree,
3791
3827
  /** @lends Fancytree_Static# */
3792
3828
  {
3793
3829
  /** @type {string} */
3794
- version: "2.1.0", // Set to semver by 'grunt release'
3830
+ version: "2.3.0", // Set to semver by 'grunt release'
3795
3831
  /** @type {string} */
3796
3832
  buildType: "production", // Set to 'production' by 'grunt build'
3797
3833
  /** @type {int} */
@@ -11,8 +11,8 @@
11
11
  * Released under the MIT license
12
12
  * https://github.com/mar10/fancytree/wiki/LicenseInfo
13
13
  *
14
- * @version 2.1.0
15
- * @date 2014-05-29T16:44
14
+ * @version 2.3.0
15
+ * @date 2014-08-17T10:39
16
16
  */
17
17
 
18
18
  ;(function($, window, document, undefined) {
@@ -11,8 +11,8 @@
11
11
  * Released under the MIT license
12
12
  * https://github.com/mar10/fancytree/wiki/LicenseInfo
13
13
  *
14
- * @version 2.1.0
15
- * @date 2014-05-29T16:44
14
+ * @version 2.3.0
15
+ * @date 2014-08-17T10:39
16
16
  */
17
17
 
18
18
  ;(function($, window, document, undefined) {
@@ -9,8 +9,8 @@
9
9
  * Released under the MIT license
10
10
  * https://github.com/mar10/fancytree/wiki/LicenseInfo
11
11
  *
12
- * @version 2.1.0
13
- * @date 2014-05-29T16:44
12
+ * @version 2.3.0
13
+ * @date 2014-08-17T10:39
14
14
  */
15
15
 
16
16
  ;(function($, window, document, undefined) {
@@ -11,8 +11,8 @@
11
11
  * Released under the MIT license
12
12
  * https://github.com/mar10/fancytree/wiki/LicenseInfo
13
13
  *
14
- * @version 2.1.0
15
- * @date 2014-05-29T16:44
14
+ * @version 2.3.0
15
+ * @date 2014-08-17T10:39
16
16
  */
17
17
 
18
18
  ;(function($, window, document, undefined) {
@@ -0,0 +1,124 @@
1
+ /*!
2
+ *
3
+ * jquery.fancytree.wide.js
4
+ * Support for 100% wide selection bars.
5
+ * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)
6
+ *
7
+ * Copyright (c) 2014, Martin Wendt (http://wwWendt.de)
8
+ *
9
+ * Released under the MIT license
10
+ * https://github.com/mar10/fancytree/wiki/LicenseInfo
11
+ *
12
+ * @version 2.3.0
13
+ * @date 2014-08-17T10:39
14
+ */
15
+
16
+ ;(function($, window, document, undefined) {
17
+
18
+ "use strict";
19
+
20
+ /*******************************************************************************
21
+ * Private functions and variables
22
+ */
23
+ // function _assert(cond, msg){
24
+ // // TODO: see qunit.js extractStacktrace()
25
+ // if(!cond){
26
+ // msg = msg ? ": " + msg : "";
27
+ // $.error("Assertion failed" + msg);
28
+ // }
29
+ // }
30
+
31
+ /* Calculate inner width without scrollbar */
32
+ function realInnerWidth($el) {
33
+ // http://blog.jquery.com/2012/08/16/jquery-1-8-box-sizing-width-csswidth-and-outerwidth/
34
+ // inst.contWidth = parseFloat(this.$container.css("width"), 10);
35
+ // 'Client width without scrollbar' - 'padding'
36
+ return $el[0].clientWidth - ($el.innerWidth() - parseFloat($el.css("width"), 10));
37
+ }
38
+
39
+
40
+ /**
41
+ * [ext-wide] Recalculate the width of the selection bar after the tree container
42
+ * was resized.<br>
43
+ * May be called explicitly on container resize, since there is no resize event
44
+ * for DIV tags.
45
+ *
46
+ * @alias Fancytree#wideUpdate
47
+ * @requires jquery.fancytree.wide.js
48
+ */
49
+ $.ui.fancytree._FancytreeClass.prototype.wideUpdate = function(){
50
+ var inst = this.ext.wide,
51
+ prevCw = inst.contWidth,
52
+ prevLo = inst.lineOfs;
53
+ // http://blog.jquery.com/2012/08/16/jquery-1-8-box-sizing-width-csswidth-and-outerwidth/
54
+ // inst.contWidth = parseFloat(this.$container.css("width"), 10);
55
+ inst.contWidth = realInnerWidth(this.$container);
56
+ // Each title is precceeded by 2 or 3 icons (16px + 3 margin)
57
+ // + 1px title border and 3px title padding
58
+ inst.lineOfs = (this.options.checkbox ? 3 : 2) * 19;
59
+ if( prevCw !== inst.contWidth || prevLo !== inst.lineOfs ) {
60
+ this.debug("wideUpdate: " + inst.contWidth);
61
+ this.visit(function(node){
62
+ node.tree._callHook("nodeRenderTitle", node);
63
+ });
64
+ }
65
+ };
66
+
67
+ /*******************************************************************************
68
+ * Extension code
69
+ */
70
+ $.ui.fancytree.registerExtension({
71
+ name: "wide",
72
+ version: "0.0.2",
73
+ // Default options for this extension.
74
+ options: {
75
+ autoResize: true, // call wideUpdate() on window.resize events
76
+ cheap: false, // true: use static css only
77
+ margin: {left: 3, right: 3} // free margins near the selection bar
78
+ },
79
+
80
+ treeCreate: function(ctx){
81
+ this.$container.addClass("fancytree-ext-wide");
82
+ this._super(ctx);
83
+ // http://blog.jquery.com/2012/08/16/jquery-1-8-box-sizing-width-csswidth-and-outerwidth/
84
+ // this._local.contWidth = parseFloat(ctx.tree.$container.css("width"), 10);
85
+ this._local.contWidth = realInnerWidth(ctx.tree.$container);
86
+ // Every nested UL is indented by 16px
87
+ // Each title is precceeded by 2 or 3 icons (16px + 3 margin)
88
+ // + 1px title border and 3px title padding
89
+ this._local.lineOfs = (ctx.options.checkbox ? 3 : 2) * 19;
90
+ this._local.levelOfs = 16;
91
+ this._local.titlePadding = 3;
92
+ $(window).on("resize" + ctx.widget.eventNamespace, $.ui.fancytree.debounce(200, function(event){
93
+ if( ctx.options.wide.autoResize && !ctx.options.wide.cheap ) {
94
+ ctx.tree.wideUpdate();
95
+ }
96
+ }));
97
+ },
98
+ treeDestroy: function(ctx){
99
+ $(window).off("resize" + ctx.widget.eventNamespace);
100
+ this._super(ctx);
101
+ },
102
+ nodeRenderTitle: function(ctx) {
103
+ var ofs, res, margin,
104
+ instOpts = ctx.options.wide,
105
+ inst = this._local,
106
+ cw = inst.contWidth,
107
+ node = ctx.node;
108
+
109
+ res = this._super(ctx);
110
+
111
+ if( !instOpts.cheap ) {
112
+ margin = instOpts.margin;
113
+ ofs = (node.getLevel() - 1) * inst.levelOfs + inst.lineOfs;
114
+ $(node.span).find(".fancytree-title").css({
115
+ width: cw - margin.left - margin.right - ofs,
116
+ marginLeft: -ofs + margin.left,
117
+ paddingLeft: +ofs - margin.left + inst.titlePadding,
118
+ paddingRight: inst.titlePadding
119
+ });
120
+ }
121
+ return res;
122
+ }
123
+ });
124
+ }(jQuery, window, document));
@@ -4,6 +4,11 @@
4
4
  * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
5
5
  * the LESS templates.
6
6
  */
7
+
8
+ /*
9
+ *= depend_on_asset "fancytree/icons.gif"
10
+ */
11
+
7
12
  /*
8
13
  Lion colors:
9
14
  gray highlight bar: #D4D4D4
@@ -4,6 +4,11 @@
4
4
  * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
5
5
  * the LESS templates.
6
6
  */
7
+
8
+ /*
9
+ *= depend_on_asset "fancytree/icons.gif"
10
+ */
11
+
7
12
  /*
8
13
  both:
9
14
  unselected background: #FCFCFC 'nearly white'
@@ -4,6 +4,11 @@
4
4
  * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
5
5
  * the LESS templates.
6
6
  */
7
+
8
+ /*
9
+ *= depend_on_asset "fancytree/icons.gif"
10
+ */
11
+
7
12
  /*******************************************************************************
8
13
  * Common Styles for Fancytree Skins.
9
14
  *
@@ -4,6 +4,11 @@
4
4
  * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
5
5
  * the LESS templates.
6
6
  */
7
+
8
+ /*
9
+ *= depend_on_asset "fancytree/icons.gif"
10
+ */
11
+
7
12
  /*******************************************************************************
8
13
  * Common Styles for Fancytree Skins.
9
14
  *