fancytree-rails 2.1.0.pre.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
  *