fancytree-rails 2.0.0.pre.6.pre.1 → 2.0.0.pre.11.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/Rakefile +6 -7
- data/lib/fancytree/rails/version.rb +2 -2
- data/vendor/assets/images/fancytree/skin-win8-xxl/icons.gif +0 -0
- data/vendor/assets/images/fancytree/skin-win8-xxl/loading.gif +0 -0
- data/vendor/assets/javascripts/fancytree.js +1 -1
- data/vendor/assets/javascripts/fancytree/MIT-LICENSE.txt +21 -0
- data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.js +1267 -475
- data/vendor/assets/javascripts/fancytree/jquery.fancytree-custom.min.js +41 -0
- data/vendor/assets/javascripts/fancytree/jquery.fancytree.js +582 -310
- data/vendor/assets/javascripts/fancytree/jquery.fancytree.min.js +14 -7
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.childcounter.js +185 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.clones.js +417 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.columnview.js +149 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.debug.js +142 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.dnd.js +539 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.edit.js +318 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.filter.js +173 -0
- data/vendor/assets/javascripts/fancytree/{jquery.fancytree.awesome.js → src/jquery.fancytree.glyph.js} +28 -26
- data/vendor/assets/javascripts/fancytree/{jquery.fancytree.gridnav.js → src/jquery.fancytree.gridnav.js} +77 -41
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.js +4027 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.menu.js +155 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.persist.js +345 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.table.js +345 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.themeroller.js +82 -0
- data/vendor/assets/stylesheets/fancytree/skin-awesome/ui.fancytree.css +29 -15
- data/vendor/assets/stylesheets/fancytree/skin-awesome/ui.fancytree.min.css +1 -1
- data/vendor/assets/stylesheets/fancytree/skin-bootstrap/ui.fancytree.css +366 -0
- data/vendor/assets/stylesheets/fancytree/skin-bootstrap/ui.fancytree.min.css +6 -0
- data/vendor/assets/stylesheets/fancytree/skin-lion/ui.fancytree.css +34 -7
- data/vendor/assets/stylesheets/fancytree/skin-lion/ui.fancytree.min.css +1 -1
- data/vendor/assets/stylesheets/fancytree/skin-vista/ui.fancytree.css +34 -7
- data/vendor/assets/stylesheets/fancytree/skin-vista/ui.fancytree.min.css +1 -1
- data/vendor/assets/stylesheets/fancytree/skin-win7/ui.fancytree.css +34 -7
- data/vendor/assets/stylesheets/fancytree/skin-win7/ui.fancytree.min.css +1 -1
- data/vendor/assets/stylesheets/fancytree/skin-win8-xxl/ui.fancytree.css +507 -0
- data/vendor/assets/stylesheets/fancytree/skin-win8-xxl/ui.fancytree.min.css +11 -0
- data/vendor/assets/stylesheets/fancytree/skin-win8/ui.fancytree.css +34 -7
- data/vendor/assets/stylesheets/fancytree/skin-win8/ui.fancytree.min.css +1 -1
- data/vendor/assets/stylesheets/fancytree/skin-xp/ui.fancytree.css +34 -7
- data/vendor/assets/stylesheets/fancytree/skin-xp/ui.fancytree.min.css +1 -1
- metadata +24 -13
- data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.min.js +0 -7
- data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.min.js.map +0 -1
- data/vendor/assets/javascripts/fancytree/jquery.fancytree.min.js.map +0 -1
- data/vendor/assets/stylesheets/fancytree/skin-lion/ui.fancytree-org.css +0 -460
- data/vendor/assets/stylesheets/fancytree/skin-themeroller/ui.fancytree-org.css +0 -505
- data/vendor/assets/stylesheets/fancytree/skin-vista/ui.fancytree-org.css +0 -610
- data/vendor/assets/stylesheets/fancytree/skin-win7/ui.fancytree-org.css +0 -592
- data/vendor/assets/stylesheets/fancytree/skin-win8/ui.fancytree-org.css +0 -602
- data/vendor/assets/stylesheets/fancytree/skin-xp/ui.fancytree-org.css +0 -578
@@ -0,0 +1,41 @@
|
|
1
|
+
/*! jQuery Fancytree Plugin - 2.0.0-11 - 2014-04-27T22:28
|
2
|
+
* https://github.com/mar10/fancytree
|
3
|
+
* Copyright (c) 2014 Martin Wendt; Licensed MIT */
|
4
|
+
(function( factory ) {
|
5
|
+
if ( typeof define === "function" && define.amd ) {
|
6
|
+
define( [ "jquery" ], factory );
|
7
|
+
} else {
|
8
|
+
factory( jQuery );
|
9
|
+
}
|
10
|
+
}(function( $ ) {
|
11
|
+
|
12
|
+
!function(a,b,c,d){"use strict";function e(b){b=b||"",a.error("Not implemented: "+b)}function f(b,c){b||(c=c?": "+c:"",a.error("Assertion failed"+c))}function g(a,c){var d,e,f=b.console?b.console[a]:null;if(f)if(f.apply)f.apply(b.console,c);else{for(e="",d=0;d<c.length;d++)e+=c[d];f(e)}}function h(b){var c,d,e,f=a.map(a.trim(b).split("."),function(a){return parseInt(a,10)}),g=a.map(Array.prototype.slice.call(arguments,1),function(a){return parseInt(a,10)});for(c=0;c<g.length;c++)if(d=f[c]||0,e=g[c]||0,d!==e)return d>e;return!0}function i(a,b,c,d,e){var f=function(){var c=b[a],f=d[a],g=b.ext[e],h=function(){return c.apply(b,arguments)};return function(){var a=b._local,c=b._super;try{return b._local=g,b._super=h,f.apply(b,arguments)}finally{b._local=a,b._super=c}}}();return f}function j(b,c,d,e){for(var f in d)"function"==typeof d[f]?"function"==typeof b[f]?b[f]=i(f,b,c,d,e):"_"===f.charAt(0)?b.ext[e][f]=i(f,b,c,d,e):a.error("Could not override tree."+f+". Use prefix '_' to create tree."+e+"._"+f):"options"!==f&&(b.ext[e][f]=d[f])}function k(b,c){return b===d?a.Deferred(function(){this.resolve()}).promise():a.Deferred(function(){this.resolveWith(b,c)}).promise()}function l(b,c){return b===d?a.Deferred(function(){this.reject()}).promise():a.Deferred(function(){this.rejectWith(b,c)}).promise()}function m(a,b){return function(){a.resolveWith(b)}}function n(b){var c=a.extend({},b.data()),d=c.json;return delete c.fancytree,d&&(delete c.json,c=a.extend(c,d)),c}function o(a){return a=a.toLowerCase(),function(b){return b.title.toLowerCase().indexOf(a)>=0}}function p(b,c){var d,e,g,h;for(this.parent=b,this.tree=b.tree,this.ul=null,this.li=null,this.statusNodeType=null,this._isLoading=!1,this._error=null,this.data={},d=0,e=w.length;e>d;d++)g=w[d],this[g]=c[g];c.data&&a.extend(this.data,c.data);for(g in c)x[g]||a.isFunction(c[g])||y[g]||(this.data[g]=c[g]);null==this.key&&(this.tree.options.defaultKey?(this.key=this.tree.options.defaultKey(this),f(this.key,"defaultKey() must return a unique key")):this.key="_"+s._nextNodeKey++),c.active&&(f(null===this.tree.activeNode,"only one active node allowed"),this.tree.activeNode=this),c.selected&&(this.tree.lastSelectedNode=this),this.children=null,h=c.children,h&&h.length&&this._setChildren(h),this.tree._callHook("treeRegisterNode",this.tree,!0,this)}function q(b){this.widget=b,this.$div=b.element,this.options=b.options,this.options&&a.isFunction(this.options.lazyload)&&(a.isFunction(this.options.lazyLoad)||(this.options.lazyLoad=function(){s.warn("The 'lazyload' event is deprecated since 2014-02-25. Use 'lazyLoad' (with uppercase L) instead."),b.options.lazyload.apply(this,arguments)})),this.ext={},this.data=n(this.$div),this._id=a.ui.fancytree._nextId++,this._ns=".fancytree-"+this._id,this.activeNode=null,this.focusNode=null,this._hasFocus=null,this.lastSelectedNode=null,this.systemFocusElement=null,this.statusClassPropName="span",this.ariaPropName="li",this.nodeContainerAttrName="li",this.$div.find(">ul.fancytree-container").remove();var c,d={tree:this};this.rootNode=new p(d,{title:"root",key:"root_"+this._id,children:null,expanded:!0}),this.rootNode.parent=null,c=a("<ul>",{"class":"ui-fancytree fancytree-container"}).appendTo(this.$div),this.$container=c,this.rootNode.ul=c[0],null==this.options.debugLevel&&(this.options.debugLevel=s.debugLevel),this.$container.attr("tabindex",this.options.tabbable?"0":"-1"),this.options.aria&&this.$container.attr("role","tree").attr("aria-multiselectable",!0)}if(a.ui.fancytree&&a.ui.fancytree.version)return void a.ui.fancytree.warn("Fancytree: ignored duplicate include");var r,s=null,t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},u="active expanded focus folder hideCheckbox lazy selected unselectable".split(" "),v={},w="expanded extraClasses folder hideCheckbox key lazy refKey selected title tooltip unselectable".split(" "),x={},y={active:!0,children:!0,data:!0,focus:!0};for(r=0;r<u.length;r++)v[u[r]]=!0;for(r=0;r<w.length;r++)x[w[r]]=!0;p.prototype={_findDirectChild:function(a){var b,c,d=this.children;if(d)if("string"==typeof a){for(b=0,c=d.length;c>b;b++)if(d[b].key===a)return d[b]}else{if("number"==typeof a)return this.children[a];if(a.parent===this)return a}return null},_setChildren:function(a){f(a&&(!this.children||0===this.children.length),"only init supported"),this.children=[];for(var b=0,c=a.length;c>b;b++)this.children.push(new p(this,a[b]))},addChildren:function(b,c){var d,e,g,h=null,i=[];for(a.isPlainObject(b)&&(b=[b]),this.children||(this.children=[]),d=0,e=b.length;e>d;d++)i.push(new p(this,b[d]));return h=i[0],null==c?this.children=this.children.concat(i):(c=this._findDirectChild(c),g=a.inArray(c,this.children),f(g>=0,"insertBefore must be an existing child"),this.children.splice.apply(this.children,[g,0].concat(i))),(!this.parent||this.parent.ul||this.tr)&&this.render(),3===this.tree.options.selectMode&&this.fixSelection3FromEndNodes(),h},addNode:function(a,b){switch((b===d||"over"===b)&&(b="child"),b){case"after":return this.getParent().addChildren(a,this.getNextSibling());case"before":return this.getParent().addChildren(a,this);case"child":case"over":return this.addChildren(a)}f(!1,"Invalid mode: "+b)},appendSibling:function(a){return this.addNode(a,"after")},applyPatch:function(b){if(null===b)return this.remove(),k(this);var c,d,e,f={children:!0,expanded:!0,parent:!0};for(c in b)e=b[c],f[c]||a.isFunction(e)||(x[c]?this[c]=e:this.data[c]=e);return b.hasOwnProperty("children")&&(this.removeChildren(),b.children&&this._setChildren(b.children)),this.isVisible()&&(this.renderTitle(),this.renderStatus()),d=b.hasOwnProperty("expanded")?this.setExpanded(b.expanded):k(this)},collapseSiblings:function(){return this.tree._callHook("nodeCollapseSiblings",this)},copyTo:function(a,b,c){return a.addNode(this.toDict(!0,c),b)},countChildren:function(a){var b,c,d,e=this.children;if(!e)return 0;if(d=e.length,a!==!1)for(b=0,c=d;c>b;b++)d+=e[b].countChildren();return d},debug:function(){this.tree.options.debugLevel>=2&&(Array.prototype.unshift.call(arguments,this.toString()),g("debug",arguments))},discard:function(){return this.warn("FancytreeNode.discard() is deprecated since 2014-02-16. Use .resetLazy() instead."),this.resetLazy()},findAll:function(b){b=a.isFunction(b)?b:o(b);var c=[];return this.visit(function(a){b(a)&&c.push(a)}),c},findFirst:function(b){b=a.isFunction(b)?b:o(b);var c=null;return this.visit(function(a){return b(a)?(c=a,!1):void 0}),c},_changeSelectStatusAttrs:function(a){var b=!1;switch(a){case!1:b=this.selected||this.partsel,this.selected=!1,this.partsel=!1;break;case!0:b=!this.selected||!this.partsel,this.selected=!0,this.partsel=!0;break;case d:b=this.selected||!this.partsel,this.selected=!1,this.partsel=!0;break;default:f(!1,"invalid state: "+a)}return b&&this.renderStatus(),b},fixSelection3AfterClick:function(){var a=this.isSelected();this.visit(function(b){b._changeSelectStatusAttrs(a)}),this.fixSelection3FromEndNodes()},fixSelection3FromEndNodes:function(){function a(b){var c,e,f,g,h,i,j,k=b.children;if(k){for(i=!0,j=!1,c=0,e=k.length;e>c;c++)f=k[c],g=a(f),g!==!1&&(j=!0),g!==!0&&(i=!1);h=i?!0:j?d:!1}else h=!!b.selected;return b._changeSelectStatusAttrs(h),h}f(3===this.tree.options.selectMode,"expected selectMode 3"),a(this),this.visitParents(function(a){var b,c,e,f,g=a.children,h=!0,i=!1;for(b=0,c=g.length;c>b;b++)e=g[b],(e.selected||e.partsel)&&(i=!0),e.unselectable||e.selected||(h=!1);f=h?!0:i?d:!1,a._changeSelectStatusAttrs(f)})},fromDict:function(b){for(var c in b)x[c]?this[c]=b[c]:"data"===c?a.extend(this.data,b.data):a.isFunction(b[c])||y[c]||(this.data[c]=b[c]);b.children?(this.removeChildren(),this.addChildren(b.children)):this.renderTitle()},getChildren:function(){return this.hasChildren()===d?d:this.children},getFirstChild:function(){return this.children?this.children[0]:null},getIndex:function(){return a.inArray(this,this.parent.children)},getIndexHier:function(b){b=b||".";var c=[];return a.each(this.getParentList(!1,!0),function(a,b){c.push(b.getIndex()+1)}),c.join(b)},getKeyPath:function(a){var b=[],c=this.tree.options.keyPathSeparator;return this.visitParents(function(a){a.parent&&b.unshift(a.key)},!a),c+b.join(c)},getLastChild:function(){return this.children?this.children[this.children.length-1]:null},getLevel:function(){for(var a=0,b=this.parent;b;)a++,b=b.parent;return a},getNextSibling:function(){if(this.parent){var a,b,c=this.parent.children;for(a=0,b=c.length-1;b>a;a++)if(c[a]===this)return c[a+1]}return null},getParent:function(){return this.parent},getParentList:function(a,b){for(var c=[],d=b?this:this.parent;d;)(a||d.parent)&&c.unshift(d),d=d.parent;return c},getPrevSibling:function(){if(this.parent){var a,b,c=this.parent.children;for(a=1,b=c.length;b>a;a++)if(c[a]===this)return c[a-1]}return null},hasChildren:function(){return this.lazy?null==this.children?d:0===this.children.length?!1:1===this.children.length&&this.children[0].isStatusNode()?d:!0:!!this.children},hasFocus:function(){return this.tree.hasFocus()&&this.tree.focusNode===this},isActive:function(){return this.tree.activeNode===this},isChildOf:function(a){return this.parent&&this.parent===a},isDescendantOf:function(a){if(!a||a.tree!==this.tree)return!1;for(var b=this.parent;b;){if(b===a)return!0;b=b.parent}return!1},isExpanded:function(){return!!this.expanded},isFirstSibling:function(){var a=this.parent;return!a||a.children[0]===this},isFolder:function(){return!!this.folder},isLastSibling:function(){var a=this.parent;return!a||a.children[a.children.length-1]===this},isLazy:function(){return!!this.lazy},isLoaded:function(){return!this.lazy||this.hasChildren()!==d},isLoading:function(){return!!this._isLoading},isRoot:function(){return this.tree.rootNode===this},isSelected:function(){return!!this.selected},isStatusNode:function(){return!!this.statusNodeType},isUndefined:function(){return this.hasChildren()===d},isVisible:function(){var a,b,c=this.getParentList(!1,!1);for(a=0,b=c.length;b>a;a++)if(!c[a].expanded)return!1;return!0},lazyLoad:function(a){return this.warn("FancytreeNode.lazyLoad() is deprecated since 2014-02-16. Use .load() instead."),this.load(a)},load:function(a){var b,c,d=this;return f(this.isLazy(),"load() requires a lazy node"),f(a||this.isUndefined(),"Pass forceReload=true to re-load a lazy node"),this.isLoaded()&&this.resetLazy(),c=this.tree._triggerNodeEvent("lazyLoad",this),c===!1?k(this):(f("boolean"!=typeof c,"lazyLoad event must return source in data.result"),b=this.tree._callHook("nodeLoadChildren",this,c),this.expanded&&b.always(function(){d.render()}),b)},makeVisible:function(b){var c,d=this,e=[],f=new a.Deferred,g=this.getParentList(!1,!1),h=g.length,i=!(b&&b.noAnimation===!0),j=!(b&&b.scrollIntoView===!1);for(c=h-1;c>=0;c--)e.push(g[c].setExpanded(!0,b));return a.when.apply(a,e).done(function(){j?d.scrollIntoView(i).done(function(){f.resolve()}):f.resolve()}),f.promise()},moveTo:function(b,c,e){(c===d||"over"===c)&&(c="child");var g,h=this.parent,i="child"===c?b:b.parent;if(this!==b){if(!this.parent)throw"Cannot move system root";if(i.isDescendantOf(this))throw"Cannot move a node to its own descendant";if(1===this.parent.children.length?(this.parent.children=this.parent.lazy?[]:null,this.parent.expanded=!1):(g=a.inArray(this,this.parent.children),f(g>=0),this.parent.children.splice(g,1)),this.parent=i,i.hasChildren())switch(c){case"child":i.children.push(this);break;case"before":g=a.inArray(b,i.children),f(g>=0),i.children.splice(g,0,this);break;case"after":g=a.inArray(b,i.children),f(g>=0),i.children.splice(g+1,0,this);break;default:throw"Invalid mode "+c}else i.children=[this];e&&b.visit(e,!0),this.tree!==b.tree&&(this.warn("Cross-tree moveTo is experimantal!"),this.visit(function(a){a.tree=b.tree},!0)),h.isDescendantOf(i)||h.render(),i.isDescendantOf(h)||i===h||i.render()}},navigate:function(b,c){function d(d){return d?(d.makeVisible(),a(d.span).is(":visible")?c===!1?d.setFocus():d.setActive():(d.debug("Navigate: skipping hidden node"),void d.navigate(b,c))):void 0}var e,f,g=!0,h=a.ui.keyCode,i=null;switch(b){case h.BACKSPACE:this.parent&&this.parent.parent&&d(this.parent);break;case h.LEFT:this.expanded?(this.setExpanded(!1),d(this)):this.parent&&this.parent.parent&&d(this.parent);break;case h.RIGHT:this.expanded||!this.children&&!this.lazy?this.children&&this.children.length&&d(this.children[0]):(this.setExpanded(),d(this));break;case h.UP:for(i=this.getPrevSibling();i&&i.expanded&&i.children&&i.children.length;)i=i.children[i.children.length-1];!i&&this.parent&&this.parent.parent&&(i=this.parent),d(i);break;case h.DOWN:if(this.expanded&&this.children&&this.children.length)i=this.children[0];else for(f=this.getParentList(!1,!0),e=f.length-1;e>=0&&!(i=f[e].getNextSibling());e--);d(i);break;default:g=!1}},remove:function(){return this.parent.removeChild(this)},removeChild:function(a){return this.tree._callHook("nodeRemoveChild",this,a)},removeChildren:function(){return this.tree._callHook("nodeRemoveChildren",this)},render:function(a,b){return this.tree._callHook("nodeRender",this,a,b)},renderTitle:function(){return this.tree._callHook("nodeRenderTitle",this)},renderStatus:function(){return this.tree._callHook("nodeRenderStatus",this)},resetLazy:function(){this.removeChildren(),this.expanded=!1,this.lazy=!0,this.children=d,this.renderStatus()},scheduleAction:function(a,b){this.tree.timer&&clearTimeout(this.tree.timer),this.tree.timer=null;var c=this;switch(a){case"cancel":break;case"expand":this.tree.timer=setTimeout(function(){c.tree.debug("setTimeout: trigger expand"),c.setExpanded(!0)},b);break;case"activate":this.tree.timer=setTimeout(function(){c.tree.debug("setTimeout: trigger activate"),c.setActive(!0)},b);break;default:throw"Invalid mode "+a}},scrollIntoView:function(b,c){b=b===!0?{duration:200,queue:!1}:b;var d,e=new a.Deferred,f=this,g=a(this.span).position().top,h=a(this.span).height(),i=this.tree.$container,j=i[0].scrollTop,k=Math.max(0,i.innerHeight()-i[0].clientHeight),l=i.height()-k,m=null;return 0>g?m=j+g:g+h>l&&(m=j+g-l+h,c&&(d=c?a(c.span).position().top:0,g-d>l&&(m=j+d))),null!==m?b?(b.complete=function(){e.resolveWith(f)},i.animate({scrollTop:m},b)):(i[0].scrollTop=m,e.resolveWith(this)):e.resolveWith(this),e.promise()},setActive:function(a,b){return this.tree._callHook("nodeSetActive",this,a,b)},setExpanded:function(a,b){return this.tree._callHook("nodeSetExpanded",this,a,b)},setFocus:function(a){return this.tree._callHook("nodeSetFocus",this,a)},setSelected:function(a){return this.tree._callHook("nodeSetSelected",this,a)},setTitle:function(a){this.title=a,this.renderTitle()},sortChildren:function(a,b){var c,d,e=this.children;if(e){if(a=a||function(a,b){var c=a.title.toLowerCase(),d=b.title.toLowerCase();return c===d?0:c>d?1:-1},e.sort(a),b)for(c=0,d=e.length;d>c;c++)e[c].children&&e[c].sortChildren(a,"$norender$");"$norender$"!==b&&this.render()}},toDict:function(b,c){var d,e,f,g={},h=this;if(a.each(w,function(a,b){(h[b]||h[b]===!1)&&(g[b]=h[b])}),a.isEmptyObject(this.data)||(g.data=a.extend({},this.data),a.isEmptyObject(g.data)&&delete g.data),c&&c(g),b&&this.hasChildren())for(g.children=[],d=0,e=this.children.length;e>d;d++)f=this.children[d],f.isStatusNode()||g.children.push(f.toDict(!0,c));return g},toggleExpanded:function(){return this.tree._callHook("nodeToggleExpanded",this)},toggleSelected:function(){return this.tree._callHook("nodeToggleSelected",this)},toString:function(){return"<FancytreeNode(#"+this.key+", '"+this.title+"')>"},visit:function(a,b){var c,d,e=!0,f=this.children;if(b===!0&&(e=a(this),e===!1||"skip"===e))return e;if(f)for(c=0,d=f.length;d>c&&(e=f[c].visit(a,!0),e!==!1);c++);return e},visitParents:function(a,b){if(b&&a(this)===!1)return!1;for(var c=this.parent;c;){if(a(c)===!1)return!1;c=c.parent}return!0},warn:function(){Array.prototype.unshift.call(arguments,this.toString()),g("warn",arguments)}},q.prototype={_makeHookContext:function(b,c,e){var f,g;return b.node!==d?(c&&b.originalEvent!==c&&a.error("invalid args"),f=b):b.tree?(g=b.tree,f={node:b,tree:g,widget:g.widget,options:g.widget.options,originalEvent:c}):b.widget?f={node:null,tree:b,widget:b.widget,options:b.widget.options,originalEvent:c}:a.error("invalid args"),e&&a.extend(f,e),f},_callHook:function(b,c){var d=this._makeHookContext(c),e=this[b],f=Array.prototype.slice.call(arguments,2);return a.isFunction(e)||a.error("_callHook('"+b+"') is not a function"),f.unshift(d),e.apply(this,f)},_requireExtension:function(b,c,d,e){d=!!d;var g=this._local.name,h=this.options.extensions,i=a.inArray(b,h)<a.inArray(g,h),j=c&&null==this.ext[b],k=!j&&null!=d&&d!==i;return f(g&&g!==b),j||k?(e||(j||c?(e="'"+g+"' extension requires '"+b+"'",k&&(e+=" to be registered "+(d?"before":"after")+" itself")):e="If used together, `"+b+"` must be registered "+(d?"before":"after")+" `"+g+"`"),a.error(e),!1):!0},activateKey:function(a){var b=this.getNodeByKey(a);return b?b.setActive():this.activeNode&&this.activeNode.setActive(!1),b},applyPatch:function(b){var c,d,e,g,h,i,j=b.length,k=[];for(d=0;j>d;d++)e=b[d],f(2===e.length,"patchList must be an array of length-2-arrays"),g=e[0],h=e[1],i=null===g?this.rootNode:this.getNodeByKey(g),i?(c=new a.Deferred,k.push(c),i.applyPatch(h).always(m(c,i))):this.warn("could not find node with key '"+g+"'");return a.when.apply(a,k).promise()},count:function(){return this.rootNode.countChildren()},debug:function(){this.options.debugLevel>=2&&(Array.prototype.unshift.call(arguments,this.toString()),g("debug",arguments))},generateFormElements:function(b,c){var d,e=b!==!1?"ft_"+this._id:b,f=c!==!1?"ft_"+this._id+"_active":c,g="fancytree_result_"+this._id,h=this.$container.find("div#"+g);h.length?h.empty():h=a("<div>",{id:g}).hide().appendTo(this.$container),e&&(d=this.getSelectedNodes(3===this.options.selectMode),a.each(d,function(b,c){h.append(a("<input>",{type:"checkbox",name:e,value:c.key,checked:!0}))})),f&&this.activeNode&&h.append(a("<input>",{type:"radio",name:f,value:this.activeNode.key,checked:!0}))},getActiveNode:function(){return this.activeNode},getFirstChild:function(){return this.rootNode.getFirstChild()},getFocusNode:function(){return this.focusNode},getNodeByKey:function(a,b){var d,e;return!b&&(d=c.getElementById(this.options.idPrefix+a))?d.ftnode?d.ftnode:null:(b=b||this.rootNode,e=null,b.visit(function(b){return b.key===a?(e=b,!1):void 0},!0),e)},getSelectedNodes:function(a){var b=[];return this.rootNode.visit(function(c){return c.selected&&(b.push(c),a===!0)?"skip":void 0}),b},hasFocus:function(){return!!this._hasFocus},info:function(){this.options.debugLevel>=1&&(Array.prototype.unshift.call(arguments,this.toString()),g("info",arguments))},loadKeyPath:function(b,c,e){function f(a,b,d){c.call(r,b,"loading"),b.load().done(function(){r.loadKeyPath.call(r,l[a],c,b).always(m(d,r))}).fail(function(){r.warn("loadKeyPath: error loading: "+a+" (parent: "+p+")"),c.call(r,b,"error"),d.reject()})}var g,h,i,j,k,l,n,o,p=e||this.rootNode,q=this.options.keyPathSeparator,r=this;for(a.isArray(b)||(b=[b]),l={},i=0;i<b.length;i++)for(j=b[i],j.charAt(0)===q&&(j=j.substr(1)),o=j.split(q);o.length;){if(k=o.shift(),n=p._findDirectChild(k),!n){this.warn("loadKeyPath: key not found: "+k+" (parent: "+p+")"),c.call(this,k,"error");break}if(0===o.length){c.call(this,n,"ok");break}if(n.lazy&&n.hasChildren()===d){c.call(this,n,"loaded"),l[k]?l[k].push(o.join(q)):l[k]=[o.join(q)];break}c.call(this,n,"loaded"),p=n}g=[];for(k in l)n=p._findDirectChild(k),h=new a.Deferred,g.push(h),f(k,n,h);return a.when.apply(a,g).promise()},reactivate:function(a){var b=this.activeNode;b&&(this.activeNode=null,b.setActive(),a&&b.setFocus())},reload:function(a){return this._callHook("treeClear",this),this._callHook("treeLoad",this,a)},render:function(a,b){return this.rootNode.render(a,b)},setFocus:function(a){return this._callHook("treeSetFocus",this,a)},toDict:function(a,b){var c=this.rootNode.toDict(!0,b);return a?c:c.children},toString:function(){return"<Fancytree(#"+this._id+")>"},_triggerNodeEvent:function(a,b,c,e){var f=this._makeHookContext(b,c,e),g=this.widget._trigger(a,c,f);return g!==!1&&f.result!==d?f.result:g},_triggerTreeEvent:function(a,b){var c=this._makeHookContext(this,b),e=this.widget._trigger(a,b,c);return e!==!1&&c.result!==d?c.result:e},visit:function(a){return this.rootNode.visit(a,!1)},warn:function(){Array.prototype.unshift.call(arguments,this.toString()),g("warn",arguments)}},a.extend(q.prototype,{nodeClick:function(a){var b,c,d=a.originalEvent,e=a.targetType,f=a.node;if("expander"===e)this._callHook("nodeToggleExpanded",a);else if("checkbox"===e)this._callHook("nodeToggleSelected",a),this._callHook("nodeSetFocus",a,!0);else{if(c=!1,b=!0,f.folder)switch(a.options.clickFolderMode){case 2:c=!0,b=!1;break;case 3:b=!0,c=!0}b&&(this.nodeSetFocus(a),this._callHook("nodeSetActive",a,!0)),c&&this._callHook("nodeToggleExpanded",a)}"a"===d.target.localName&&"fancytree-title"===d.target.className&&d.preventDefault()},nodeCollapseSiblings:function(a,b){var c,d,e,f=a.node;if(f.parent)for(c=f.parent.children,d=0,e=c.length;e>d;d++)c[d]!==f&&c[d].expanded&&this._callHook("nodeSetExpanded",c[d],!1,b)},nodeDblclick:function(a){"title"===a.targetType&&4===a.options.clickFolderMode&&this._callHook("nodeToggleExpanded",a),"title"===a.targetType&&a.originalEvent.preventDefault()},nodeKeydown:function(b){var c,d=b.originalEvent,e=b.node,f=b.tree,g=b.options,h=!0,i=!(d.ctrlKey||!g.autoActivate),j=a.ui.keyCode;switch(e||(this.rootNode.getFirstChild().setFocus(),e=b.node=this.focusNode,e.debug("Keydown force focus on first node")),d.which){case j.NUMPAD_ADD:case 187:f.nodeSetExpanded(b,!0);break;case j.NUMPAD_SUBTRACT:case 189:f.nodeSetExpanded(b,!1);break;case j.SPACE:g.checkbox?f.nodeToggleSelected(b):f.nodeSetActive(b,!0);break;case j.ENTER:f.nodeSetActive(b,!0);break;case j.BACKSPACE:case j.LEFT:case j.RIGHT:case j.UP:case j.DOWN:c=e.navigate(d.which,i);break;default:h=!1}h&&d.preventDefault()},nodeLoadChildren:function(b,c){var d,e,g=b.tree,h=b.node;return a.isFunction(c)&&(c=c()),c.url&&(d=a.extend({},b.options.ajax,c),d.debugDelay?(e=d.debugDelay,a.isArray(e)&&(e=e[0]+Math.random()*(e[1]-e[0])),h.debug("nodeLoadChildren waiting debug delay "+Math.round(e)+"ms"),d.debugDelay=!1,c=a.Deferred(function(b){setTimeout(function(){a.ajax(d).done(function(){b.resolveWith(this,arguments)}).fail(function(){b.rejectWith(this,arguments)})},e)})):c=a.ajax(d),c=c.pipe(function(c){var d;return"string"==typeof c&&a.error("Ajax request returned a string (did you get the JSON dataType wrong?)."),b.options.postProcess?(d=g._triggerNodeEvent("postProcess",b,b.originalEvent,{response:c,dataType:this.dataType}),c=a.isArray(d)?d:c):c&&c.hasOwnProperty("d")&&b.options.enableAspx&&(c="string"==typeof c.d?a.parseJSON(c.d):c.d),c},function(a,b,c){return g._makeHookContext(h,null,{error:a,args:Array.prototype.slice.call(arguments),message:c,details:a.status+": "+c})})),a.isFunction(c.promise)&&(f(!h.isLoading()),g.nodeSetStatus(b,"loading"),c.done(function(){g.nodeSetStatus(b,"ok")}).fail(function(a){var c;c=a.node&&a.error&&a.message?a:g._makeHookContext(h,null,{error:a,args:Array.prototype.slice.call(arguments),message:a?a.message||a.toString():""}),g._triggerNodeEvent("loaderror",c,null),g.nodeSetStatus(b,"error",c.message,c.details)})),a.when(c).done(function(b){var c;a.isPlainObject(b)&&(f(a.isArray(b.children),"source must contain (or be) an array of children"),f(h.isRoot(),"source may only be an object for root nodes"),c=b,b=b.children,delete c.children,a.extend(g.data,c)),f(a.isArray(b),"expected array of children"),h._setChildren(b),g._triggerNodeEvent("loadChildren",h)})},nodeLoadKeyPath:function(){},nodeRemoveChild:function(b,c){var d,e=b.node,g=b.options,h=a.extend({},b,{node:c}),i=e.children;return 1===i.length?(f(c===i[0]),this.nodeRemoveChildren(b)):(this.activeNode&&(c===this.activeNode||this.activeNode.isDescendantOf(c))&&this.activeNode.setActive(!1),this.focusNode&&(c===this.focusNode||this.focusNode.isDescendantOf(c))&&(this.focusNode=null),this.nodeRemoveMarkup(h),this.nodeRemoveChildren(h),d=a.inArray(c,i),f(d>=0),c.visit(function(a){a.parent=null},!0),this._callHook("treeRegisterNode",this,!1,c),g.removeNode&&g.removeNode.call(b.tree,{type:"removeNode"},h),void i.splice(d,1))},nodeRemoveChildMarkup:function(b){var c=b.node;c.ul&&(c.isRoot()?a(c.ul).empty():(a(c.ul).remove(),c.ul=null),c.visit(function(a){a.li=a.ul=null}))},nodeRemoveChildren:function(b){var c,d=b.tree,e=b.node,f=e.children,g=b.options;f&&(this.activeNode&&this.activeNode.isDescendantOf(e)&&this.activeNode.setActive(!1),this.focusNode&&this.focusNode.isDescendantOf(e)&&(this.focusNode=null),this.nodeRemoveChildMarkup(b),c=a.extend({},b),e.visit(function(a){a.parent=null,d._callHook("treeRegisterNode",d,!1,a),g.removeNode&&(c.node=a,g.removeNode.call(b.tree,{type:"removeNode"},c))}),e.children=e.lazy?[]:null,this.nodeRenderStatus(b))},nodeRemoveMarkup:function(b){var c=b.node;c.li&&(a(c.li).remove(),c.li=null),this.nodeRemoveChildMarkup(b)},nodeRender:function(b,d,e,g,h){var i,j,k,l,m,n,o,p=b.node,q=b.tree,r=b.options,s=r.aria,t=!1,u=p.parent,v=!u,w=p.children;if(v||u.ul){if(f(v||u.ul,"parent UL must exist"),v||(p.li&&(d||p.li.parentNode!==p.parent.ul)&&(p.li.parentNode!==p.parent.ul&&this.warn("unlink "+p+" (must be child of "+p.parent+")"),this.nodeRemoveMarkup(b)),p.li?this.nodeRenderStatus(b):(t=!0,p.li=c.createElement("li"),p.li.ftnode=p,p.key&&r.generateIds&&(p.li.id=r.idPrefix+p.key),p.span=c.createElement("span"),p.span.className="fancytree-node",s&&a(p.span).attr("aria-labelledby","ftal_"+p.key),p.li.appendChild(p.span),this.nodeRenderTitle(b),r.createNode&&r.createNode.call(q,{type:"createNode"},b)),r.renderNode&&r.renderNode.call(q,{type:"renderNode"},b)),w){if(v||p.expanded||e===!0){for(p.ul||(p.ul=c.createElement("ul"),(g===!0&&!h||!p.expanded)&&(p.ul.style.display="none"),s&&a(p.ul).attr("role","group"),p.li?p.li.appendChild(p.ul):p.tree.$div.append(p.ul)),l=0,m=w.length;m>l;l++)o=a.extend({},b,{node:w[l]}),this.nodeRender(o,d,e,!1,!0);for(i=p.ul.firstChild;i;)k=i.ftnode,k&&k.parent!==p?(p.debug("_fixParent: remove missing "+k,i),n=i.nextSibling,i.parentNode.removeChild(i),i=n):i=i.nextSibling;for(i=p.ul.firstChild,l=0,m=w.length-1;m>l;l++)j=w[l],k=i.ftnode,j!==k?p.ul.insertBefore(j.li,k.li):i=i.nextSibling}}else p.ul&&(this.warn("remove child markup for "+p),this.nodeRemoveChildMarkup(b));v||t&&u.ul.appendChild(p.li)}},nodeRenderTitle:function(a,b){var c,e,f,g,h,i,j=a.node,k=a.tree,l=a.options,m=l.aria,n=j.getLevel(),o=[],p=j.data.icon;b!==d&&(j.title=b),j.span&&(n<l.minExpandLevel?n>1&&o.push(m?"<span role='button' class='fancytree-expander'></span>":"<span class='fancytree-expander'></span>"):o.push(m?"<span role='button' class='fancytree-expander'></span>":"<span class='fancytree-expander'></span>"),l.checkbox&&j.hideCheckbox!==!0&&!j.isStatusNode()&&o.push(m?"<span role='checkbox' class='fancytree-checkbox'></span>":"<span class='fancytree-checkbox'></span>"),g=m?" role='img'":"",p&&"string"==typeof p?(e="/"===p.charAt(0)?p:l.imagePath+p,o.push("<img src='"+e+"' alt='' />")):j.data.iconclass?o.push("<span "+g+" class='fancytree-custom-icon "+j.data.iconclass+"'></span>"):(p===!0||p!==!1&&l.icons!==!1)&&o.push("<span "+g+" class='fancytree-icon'></span>"),f="",l.renderTitle&&(f=l.renderTitle.call(k,{type:"renderTitle"},a)||""),f||(i=j.tooltip?" title='"+s.escapeHtml(j.tooltip)+"'":"",c=m?" id='ftal_"+j.key+"'":"",g=m?" role='treeitem'":"",h=l.titlesTabbable?" tabindex='0'":"",f="<span "+g+" class='fancytree-title'"+c+i+h+">"+j.title+"</span>"),o.push(f),j.span.innerHTML=o.join(""),this.nodeRenderStatus(a))},nodeRenderStatus:function(b){var c=b.node,d=b.tree,e=b.options,f=c.hasChildren(),g=c.isLastSibling(),h=e.aria,i=a(c.span).find(".fancytree-title"),j=e._classNames,k=[],l=c[d.statusClassPropName];l&&(k.push(j.node),d.activeNode===c&&k.push(j.active),d.focusNode===c?(k.push(j.focused),h&&i.attr("aria-activedescendant",!0)):h&&i.removeAttr("aria-activedescendant"),c.expanded?(k.push(j.expanded),h&&i.attr("aria-expanded",!0)):h&&i.removeAttr("aria-expanded"),c.folder&&k.push(j.folder),f!==!1&&k.push(j.hasChildren),g&&k.push(j.lastsib),c.lazy&&null==c.children&&k.push(j.lazy),c.partsel&&k.push(j.partsel),c._isLoading&&k.push(j.loading),c._error&&k.push(j.error),c.selected?(k.push(j.selected),h&&i.attr("aria-selected",!0)):h&&i.attr("aria-selected",!1),c.extraClasses&&k.push(c.extraClasses),k.push(f===!1?j.combinedExpanderPrefix+"n"+(g?"l":""):j.combinedExpanderPrefix+(c.expanded?"e":"c")+(c.lazy&&null==c.children?"d":"")+(g?"l":"")),k.push(j.combinedIconPrefix+(c.expanded?"e":"c")+(c.folder?"f":"")),l.className=k.join(" "),c.li&&(c.li.className=g?j.lastsib:""))},nodeSetActive:function(b,c,d){d=d||{};var e,g=b.node,h=b.tree,i=b.options,j=d.noEvents===!0,m=g===h.activeNode;return c=c!==!1,m===c?k(g):c&&!j&&this._triggerNodeEvent("beforeActivate",g,b.originalEvent)===!1?l(g,["rejected"]):void(c?(h.activeNode&&(f(h.activeNode!==g,"node was active (inconsistency)"),e=a.extend({},b,{node:h.activeNode}),h.nodeSetActive(e,!1),f(null===h.activeNode,"deactivate was out of sync?")),i.activeVisible&&g.makeVisible(),h.activeNode=g,h.nodeRenderStatus(b),h.nodeSetFocus(b),j||h._triggerNodeEvent("activate",g,b.originalEvent)):(f(h.activeNode===g,"node was not active (inconsistency)"),h.activeNode=null,this.nodeRenderStatus(b),j||b.tree._triggerNodeEvent("deactivate",g,b.originalEvent)))},nodeSetExpanded:function(b,c,e){e=e||{};var f,g,h,i,j,m,n=b.node,o=b.tree,p=b.options,q=e.noAnimation===!0,r=e.noEvents===!0;if(c=c!==!1,n.expanded&&c||!n.expanded&&!c)return k(n);if(c&&!n.lazy&&!n.hasChildren())return k(n);if(!c&&n.getLevel()<p.minExpandLevel)return l(n,["locked"]);if(!r&&this._triggerNodeEvent("beforeExpand",n,b.originalEvent)===!1)return l(n,["rejected"]);if(q||n.isVisible()||(q=e.noAnimation=!0),g=new a.Deferred,c&&!n.expanded&&p.autoCollapse){j=n.getParentList(!1,!0),m=p.autoCollapse;try{for(p.autoCollapse=!1,h=0,i=j.length;i>h;h++)this._callHook("nodeCollapseSiblings",j[h],e)}finally{p.autoCollapse=m}}return g.done(function(){p.autoScroll&&!q?n.getLastChild().scrollIntoView(!0,n).always(function(){r||b.tree._triggerNodeEvent(c?"expand":"collapse",b)}):r||b.tree._triggerNodeEvent(c?"expand":"collapse",b)}),f=function(d){var e,f,g,h;if(n.expanded=c,o._callHook("nodeRender",b,!1,!1,!0),n.ul)if(g="none"!==n.ul.style.display,h=!!n.expanded,g===h)n.warn("nodeSetExpanded: UL.style.display already set");else{if(p.fx&&!q)return e=p.fx.duration||200,f=p.fx.easing,void a(n.ul).animate(p.fx,e,f,function(){d()});n.ul.style.display=n.expanded||!parent?"":"none"}d()},c&&n.lazy&&n.hasChildren()===d?n.load().done(function(){g.notifyWith&&g.notifyWith(n,["loaded"]),f(function(){g.resolveWith(n)})}).fail(function(a){f(function(){g.rejectWith(n,["load failed ("+a+")"])})}):f(function(){g.resolveWith(n)}),g.promise()},nodeSetFocus:function(b,c){var d,e=b.tree,f=b.node;if(c=c!==!1,e.focusNode){if(e.focusNode===f&&c)return;d=a.extend({},b,{node:e.focusNode}),e.focusNode=null,this._triggerNodeEvent("blur",d),this._callHook("nodeRenderStatus",d)}c&&(this.hasFocus()||(f.debug("nodeSetFocus: forcing container focus"),this._callHook("treeSetFocus",b,!0,!0)),f.makeVisible(),e.focusNode=f,this._triggerNodeEvent("focus",b),b.options.autoScroll&&f.scrollIntoView(),this._callHook("nodeRenderStatus",b))},nodeSetSelected:function(a,b){var c=a.node,d=a.tree,e=a.options;if(b=b!==!1,c.debug("nodeSetSelected("+b+")",a),!c.unselectable){if(c.selected&&b||!c.selected&&!b)return!!c.selected;if(this._triggerNodeEvent("beforeSelect",c,a.originalEvent)===!1)return!!c.selected;b&&1===e.selectMode?d.lastSelectedNode&&d.lastSelectedNode.setSelected(!1):3===e.selectMode&&(c.selected=b,c.fixSelection3AfterClick()),c.selected=b,this.nodeRenderStatus(a),d.lastSelectedNode=b?c:null,d._triggerNodeEvent("select",a)}},nodeSetStatus:function(b,c,d,e){function f(){var a=h.children?h.children[0]:null;if(a&&a.isStatusNode()){try{h.ul&&(h.ul.removeChild(a.li),a.li=null)
|
13
|
+
}catch(b){}1===h.children.length?h.children=[]:h.children.shift()}}function g(b,c){var d=h.children?h.children[0]:null;return d&&d.isStatusNode()?(a.extend(d,b),i._callHook("nodeRender",d)):(b.key="_statusNode",h._setChildren([b]),h.children[0].statusNodeType=c,i.render()),h.children[0]}var h=b.node,i=b.tree;switch(c){case"ok":f(),h._isLoading=!1,h._error=null,h.renderStatus();break;case"loading":h.parent||g({title:i.options.strings.loading+(d?" ("+d+") ":""),tooltip:e,extraClasses:"fancytree-statusnode-wait"},c),h._isLoading=!0,h._error=null,h.renderStatus();break;case"error":g({title:i.options.strings.loadError+(d?" ("+d+") ":""),tooltip:e,extraClasses:"fancytree-statusnode-error"},c),h._isLoading=!1,h._error={message:d,details:e},h.renderStatus();break;default:a.error("invalid node status "+c)}},nodeToggleExpanded:function(a){return this.nodeSetExpanded(a,!a.node.expanded)},nodeToggleSelected:function(a){return this.nodeSetSelected(a,!a.node.selected)},treeClear:function(a){var b=a.tree;b.activeNode=null,b.focusNode=null,b.$div.find(">ul.fancytree-container").empty(),b.rootNode.children=null},treeCreate:function(){},treeDestroy:function(){},treeInit:function(a){this.treeLoad(a)},treeLoad:function(b,c){var d,f,g,h=b.tree,i=b.widget.element,j=a.extend({},b,{node:this.rootNode});if(h.rootNode.children&&this.treeClear(b),c=c||this.options.source)"string"==typeof c&&e();else switch(d=i.data("type")||"html"){case"html":f=i.find(">ul:first"),f.addClass("ui-fancytree-source ui-helper-hidden"),c=a.ui.fancytree.parseHtml(f),this.data=a.extend(this.data,n(f));break;case"json":c=a.parseJSON(i.text()),c.children&&(c.title&&(h.title=c.title),c=c.children);break;default:a.error("Invalid data-type: "+d)}return g=this.nodeLoadChildren(j,c).done(function(){h.render(),3===b.options.selectMode&&h.rootNode.fixSelection3FromEndNodes(),h._triggerTreeEvent("init",!0)}).fail(function(){h.render(),h._triggerTreeEvent("init",!1)})},treeRegisterNode:function(){},treeSetFocus:function(a,b){b=b!==!1,b!==this.hasFocus()&&(this._hasFocus=b,this.$container.toggleClass("fancytree-treefocus",b),this._triggerTreeEvent(b?"focusTree":"blurTree"))}}),a.widget("ui.fancytree",{options:{activeVisible:!0,ajax:{type:"GET",cache:!1,dataType:"json"},aria:!1,autoActivate:!0,autoCollapse:!1,autoScroll:!1,checkbox:!1,clickFolderMode:4,debugLevel:null,disabled:!1,enableAspx:!0,extensions:[],fx:{height:"toggle",duration:200},generateIds:!1,icons:!0,idPrefix:"ft_",keyboard:!0,keyPathSeparator:"/",minExpandLevel:1,selectMode:2,strings:{loading:"Loading…",loadError:"Load error!"},tabbable:!0,titlesTabbable:!1,_classNames:{node:"fancytree-node",folder:"fancytree-folder",combinedExpanderPrefix:"fancytree-exp-",combinedIconPrefix:"fancytree-ico-",hasChildren:"fancytree-has-children",active:"fancytree-active",selected:"fancytree-selected",expanded:"fancytree-expanded",lazy:"fancytree-lazy",focused:"fancytree-focused",partsel:"fancytree-partsel",lastsib:"fancytree-lastsib",loading:"fancytree-loading",error:"fancytree-error"},lazyLoad:null,postProcess:null},_create:function(){this.tree=new q(this),this.$source=this.source||"json"===this.element.data("type")?this.element:this.element.find(">ul:first");var b,c,e,g=this.options.extensions,h=this.tree;for(e=0;e<g.length;e++)c=g[e],b=a.ui.fancytree._extensions[c],b||a.error("Could not apply extension '"+c+"' (it is not registered, did you forget to include it?)"),this.tree.options[c]=a.extend(!0,{},b.options,this.tree.options[c]),f(this.tree.ext[c]===d,"Extension name must not exist as Fancytree.ext attribute: '"+c+"'"),this.tree.ext[c]={},j(this.tree,h,b,c),h=b;this.tree._callHook("treeCreate",this.tree)},_init:function(){this.tree._callHook("treeInit",this.tree),this._bind()},_setOption:function(b,c){var d=!0,e=!1;switch(b){case"aria":case"checkbox":case"icons":case"minExpandLevel":case"tabbable":this.tree._callHook("treeCreate",this.tree),e=!0;break;case"source":d=!1,this.tree._callHook("treeLoad",this.tree,c)}this.tree.debug("set option "+b+"="+c+" <"+typeof c+">"),d&&a.Widget.prototype._setOption.apply(this,arguments),e&&this.tree.render(!0,!1)},destroy:function(){this._unbind(),this.tree._callHook("treeDestroy",this.tree),this.tree.$div.find(">ul.fancytree-container").remove(),this.$source&&this.$source.removeClass("ui-helper-hidden"),a.Widget.prototype.destroy.call(this)},_unbind:function(){var b=this.tree._ns;this.element.unbind(b),this.tree.$container.unbind(b),a(c).unbind(b)},_bind:function(){var a=this,b=this.options,c=this.tree,d=c._ns;this._unbind(),c.$container.on("focusin"+d+" focusout"+d,function(a){var b=s.getNode(a),d="focusin"===a.type;b?c._callHook("nodeSetFocus",b,d):c._callHook("treeSetFocus",c,d)}).on("selectstart"+d,"span.fancytree-title",function(a){a.preventDefault()}).on("keydown"+d,function(a){if(b.disabled||b.keyboard===!1)return!0;var d,e=c.focusNode,f=c._makeHookContext(e||c,a),g=c.phase;try{return c.phase="userEvent",d=e?c._triggerNodeEvent("keydown",e,a):c._triggerTreeEvent("keydown",a),"preventNav"===d?d=!0:d!==!1&&(d=c._callHook("nodeKeydown",f)),d}finally{c.phase=g}}).on("click"+d+" dblclick"+d,function(c){if(b.disabled)return!0;var d,e=s.getEventTarget(c),f=e.node,g=a.tree,h=g.phase;if(!f)return!0;d=g._makeHookContext(f,c);try{switch(g.phase="userEvent",c.type){case"click":return d.targetType=e.type,g._triggerNodeEvent("click",d,c)===!1?!1:g._callHook("nodeClick",d);case"dblclick":return d.targetType=e.type,g._triggerNodeEvent("dblclick",d,c)===!1?!1:g._callHook("nodeDblclick",d)}}finally{g.phase=h}})},getActiveNode:function(){return this.tree.activeNode},getNodeByKey:function(a){return this.tree.getNodeByKey(a)},getRootNode:function(){return this.tree.rootNode},getTree:function(){return this.tree}}),s=a.ui.fancytree,a.extend(a.ui.fancytree,{version:"2.0.0-11",buildType: "production",debugLevel: 1,_nextId:1,_nextNodeKey:1,_extensions:{},_FancytreeClass:q,_FancytreeNodeClass:p,jquerySupports:{positionMyOfs:h(a.ui.version,1,9)},assert:function(a,b){return f(a,b)},debug:function(){a.ui.fancytree.debugLevel>=2&&g("log",arguments)},error:function(){g("error",arguments)},escapeHtml:function(a){return(""+a).replace(/[&<>"'\/]/g,function(a){return t[a]})},unescapeHtml:function(a){var b=c.createElement("div");return b.innerHTML=a,0===b.childNodes.length?"":b.childNodes[0].nodeValue},getEventTargetType:function(a){return this.getEventTarget(a).type},getEventTarget:function(a){var b=a&&a.target?a.target.className:"",c={node:this.getNode(a.target),type:d};return/\bfancytree-title\b/.test(b)?c.type="title":/\bfancytree-expander\b/.test(b)?c.type=c.node.hasChildren()===!1?"prefix":"expander":/\bfancytree-checkbox\b/.test(b)||/\bfancytree-radio\b/.test(b)?c.type="checkbox":/\bfancytree-icon\b/.test(b)?c.type="icon":/\bfancytree-node\b/.test(b)&&(c.type="title"),c},getNode:function(a){if(a instanceof p)return a;for(a.selector!==d?a=a[0]:a.originalEvent!==d&&(a=a.target);a;){if(a.ftnode)return a.ftnode;a=a.parentNode}return null},info:function(){a.ui.fancytree.debugLevel>=1&&g("info",arguments)},parseHtml:function(b){var c,e,f,g,h,i,j,k,l=b.find(">li"),m=[];return l.each(function(){var l,o=a(this),p=o.find(">span:first",this),q=p.length?null:o.find(">a:first"),r={tooltip:null,data:{}};for(p.length?r.title=p.html():q&&q.length?(r.title=q.html(),r.data.href=q.attr("href"),r.data.target=q.attr("target"),r.tooltip=q.attr("title")):(r.title=o.html(),g=r.title.search(/<ul/i),g>=0&&(r.title=r.title.substring(0,g))),r.title=a.trim(r.title),e=0,f=u.length;f>e;e++)r[u[e]]=d;for(j=this.className.split(" "),c=[],e=0,f=j.length;f>e;e++)k=j[e],v[k]?r[k]=!0:c.push(k);if(r.extraClasses=c.join(" "),h=o.attr("title"),h&&(r.tooltip=h),h=o.attr("id"),h&&(r.key=h),l=n(o),l&&!a.isEmptyObject(l)){for(e=0,f=w.length;f>e;e++)h=w[e],i=l[h],null!=i&&(delete l[h],r[h]=i);a.extend(r.data,l)}b=o.find(">ul:first"),r.children=b.length?a.ui.fancytree.parseHtml(b):r.lazy?d:null,m.push(r)}),m},registerExtension:function(b){f(null!=b.name,"extensions must have a `name` property."),f(null!=b.version,"extensions must have a `version` property."),a.ui.fancytree._extensions[b.name]=b},warn:function(){g("warn",arguments)}})}(jQuery,window,document);
|
14
|
+
|
15
|
+
/*! Extension 'jquery.fancytree.childcounter.min.js' */
|
16
|
+
!function(a){"use strict";a.ui.fancytree._FancytreeClass.prototype.countSelected=function(a){{var b=this;b.options}return b.getSelectedNodes(a).length},a.ui.fancytree._FancytreeNodeClass.prototype.toUpper=function(){var a=this;return a.setTitle(a.title.toUpperCase())},a.ui.fancytree.prototype.widgetMethod1=function(a){this.tree;return a},a.ui.fancytree.registerExtension({name:"childcounter",version:"1.0.0",options:{deep:!0,hideZeros:!0,hideExpanded:!1},foo:42,_appendCounter:function(){},treeInit:function(a){a.options,a.options.childcounter;this._super(a),this.$container.addClass("fancytree-ext-childcounter")},treeDestroy:function(a){this._super(a)},nodeRenderTitle:function(b,c){var d=b.node,e=b.options.childcounter,f=null==d.data.childCounter?d.countChildren(e.deep):+d.data.childCounter;this._super(b,c),!f&&e.hideZeros||d.isExpanded()&&e.hideExpanded||a("span.fancytree-icon",d.span).append(a("<span class='fancytree-childcounter'/>").text(f))},nodeSetExpanded:function(a,b,c){{var d=a.tree;a.node}return this._super(a,b,c).always(function(){d.nodeRenderTitle(a)})}})}(jQuery);
|
17
|
+
|
18
|
+
/*! Extension 'jquery.fancytree.dnd.min.js' */
|
19
|
+
!function(a,b,c,d){"use strict";function e(a){return 0===a?"":a>0?"+"+a:""+a}function f(b){var c=b.options.dnd||null;c&&g(),c&&c.dragStart&&b.widget.element.draggable(a.extend({addClasses:!1,appendTo:"body",containment:!1,delay:0,distance:4,revert:!1,scroll:!0,scrollSpeed:7,scrollSensitivity:10,connectToFancytree:!0,helper:function(b){var c=a.ui.fancytree.getNode(b.target);return c?c.tree.ext.dnd._onDragEvent("helper",c,null,b,null,null):"<div>ERROR?: helper requested but sourceNode not found</div>"},start:function(a,b){var c=b.helper.data("ftSourceNode");return!!c}},b.options.dnd.draggable)),c&&c.dragDrop&&b.widget.element.droppable(a.extend({addClasses:!1,tolerance:"intersect",greedy:!1},b.options.dnd.droppable))}function g(){i||(a.ui.plugin.add("draggable","connectToFancytree",{start:function(b,c){var d=a(this).data("ui-draggable")||a(this).data("draggable"),e=c.helper.data("ftSourceNode")||null;return e?(d.offset.click.top=-2,d.offset.click.left=16,e.tree.ext.dnd._onDragEvent("start",e,null,b,c,d)):void 0},drag:function(b,c){var d,e=a(this).data("ui-draggable")||a(this).data("draggable"),f=c.helper.data("ftSourceNode")||null,g=c.helper.data("ftTargetNode")||null,i=a.ui.fancytree.getNode(b.target);return b.target&&!i&&(d=a(b.target).closest("div.fancytree-drag-helper,#fancytree-drop-marker").length>0)?void h("Drag event over helper: ignored."):(c.helper.data("ftTargetNode",i),g&&g!==i&&g.tree.ext.dnd._onDragEvent("leave",g,f,b,c,e),void(i&&i.tree.options.dnd.dragDrop&&(i===g?i.tree.ext.dnd._onDragEvent("over",i,f,b,c,e):i.tree.ext.dnd._onDragEvent("enter",i,f,b,c,e))))},stop:function(b,c){var d=a(this).data("ui-draggable")||a(this).data("draggable"),e=c.helper.data("ftSourceNode")||null,f=c.helper.data("ftTargetNode")||null,g=b.type,i="mouseup"===g&&1===b.which;i||h("Drag was cancelled"),f&&(i&&f.tree.ext.dnd._onDragEvent("drop",f,e,b,c,d),f.tree.ext.dnd._onDragEvent("leave",f,e,b,c,d)),e&&e.tree.ext.dnd._onDragEvent("stop",e,null,b,c,d)}}),i=!0)}var h=a.ui.fancytree.debug,i=!1;a.ui.fancytree.registerExtension({name:"dnd",version:"0.1.0",options:{dragStart:null,dragStop:null,autoExpandMS:1e3,preventVoidMoves:!0,preventRecursiveMoves:!0,dragEnter:null,dragOver:null,dragDrop:null,dragLeave:null,draggable:null,droppable:null},treeInit:function(a){var b=a.tree;this._super(a),f(b)},nodeKeydown:function(b){var c=b.originalEvent;return c.which===a.ui.keyCode.ESCAPE&&this._local._cancelDrag(),this._super(b)},_setDndStatus:function(b,c,d,f,g){var h,i=0,j="center",k=this._local,l=b?a(b.span):null,m=a(c.span);if(k.$dropMarker||(k.$dropMarker=a("<div id='fancytree-drop-marker'></div>").hide().css({"z-index":1e3}).prependTo(a(this.$div).parent())),"after"===f||"before"===f||"over"===f){switch(f){case"before":k.$dropMarker.removeClass("fancytree-drop-after fancytree-drop-over"),k.$dropMarker.addClass("fancytree-drop-before"),j="top";break;case"after":k.$dropMarker.removeClass("fancytree-drop-before fancytree-drop-over"),k.$dropMarker.addClass("fancytree-drop-after"),j="bottom";break;default:k.$dropMarker.removeClass("fancytree-drop-after fancytree-drop-before"),k.$dropMarker.addClass("fancytree-drop-over"),m.addClass("fancytree-drop-target"),i=8}h=a.ui.fancytree.jquerySupports.positionMyOfs?{my:"left"+e(i)+" center",at:"left "+j,of:m}:{my:"left center",at:"left "+j,of:m,offset:""+i+" 0"},k.$dropMarker.show().position(h)}else m.removeClass("fancytree-drop-target"),k.$dropMarker.hide();"after"===f?m.addClass("fancytree-drop-after"):m.removeClass("fancytree-drop-after"),"before"===f?m.addClass("fancytree-drop-before"):m.removeClass("fancytree-drop-before"),g===!0?(l&&l.addClass("fancytree-drop-accept"),m.addClass("fancytree-drop-accept"),d.addClass("fancytree-drop-accept")):(l&&l.removeClass("fancytree-drop-accept"),m.removeClass("fancytree-drop-accept"),d.removeClass("fancytree-drop-accept")),g===!1?(l&&l.addClass("fancytree-drop-reject"),m.addClass("fancytree-drop-reject"),d.addClass("fancytree-drop-reject")):(l&&l.removeClass("fancytree-drop-reject"),m.removeClass("fancytree-drop-reject"),d.removeClass("fancytree-drop-reject"))},_onDragEvent:function(b,c,e,f,g,i){"over"!==b&&h("tree.ext.dnd._onDragEvent(%s, %o, %o) - %o",b,c,e,this);var j,k,l,m,n,o,p,q=this.options,r=q.dnd,s=this._makeHookContext(c,f,{otherNode:e,ui:g,draggable:i}),t=null,u=a(c.span);switch(b){case"helper":j=a("<div class='fancytree-drag-helper'><span class='fancytree-drag-helper-img' /></div>").append(u.find("span.fancytree-title").clone()),a("ul.fancytree-container",c.tree.$div).append(j),j.data("ftSourceNode",c),t=j;break;case"start":c.isStatusNode()?t=!1:r.dragStart&&(t=r.dragStart(c,s)),t===!1?(this.debug("tree.dragStart() cancelled"),g.helper.trigger("mouseup"),g.helper.hide()):u.addClass("fancytree-drag-source");break;case"enter":p=r.preventRecursiveMoves&&c.isDescendantOf(e)?!1:r.dragEnter?r.dragEnter(c,s):null,t=p?a.isArray(p)?{over:a.inArray("over",p)>=0,before:a.inArray("before",p)>=0,after:a.inArray("after",p)>=0}:{over:p===!0||"over"===p,before:p===!0||"before"===p,after:p===!0||"after"===p}:!1,g.helper.data("enterResponse",t),h("helper.enterResponse: %o",t);break;case"over":n=g.helper.data("enterResponse"),o=null,n===!1||("string"==typeof n?o=n:(k=u.offset(),l={x:f.pageX-k.left,y:f.pageY-k.top},m={x:l.x/u.width(),y:l.y/u.height()},n.after&&m.y>.75?o="after":!n.over&&n.after&&m.y>.5?o="after":n.before&&m.y<=.25?o="before":!n.over&&n.before&&m.y<=.5?o="before":n.over&&(o="over"),r.preventVoidMoves&&(c===e?(h(" drop over source node prevented"),o=null):"before"===o&&e&&c===e.getNextSibling()?(h(" drop after source node prevented"),o=null):"after"===o&&e&&c===e.getPrevSibling()?(h(" drop before source node prevented"),o=null):"over"===o&&e&&e.parent===c&&e.isLastSibling()&&(h(" drop last child over own parent prevented"),o=null)),g.helper.data("hitMode",o))),"over"===o&&r.autoExpandMS&&c.hasChildren()!==!1&&!c.expanded&&c.scheduleAction("expand",r.autoExpandMS),o&&r.dragOver&&(s.hitMode=o,t=r.dragOver(c,s)),this._local._setDndStatus(e,c,g.helper,o,t!==!1&&null!==o);break;case"drop":o=g.helper.data("hitMode"),o&&r.dragDrop&&(s.hitMode=o,r.dragDrop(c,s));break;case"leave":c.scheduleAction("cancel"),g.helper.data("enterResponse",null),g.helper.data("hitMode",null),this._local._setDndStatus(e,c,g.helper,"out",d),r.dragLeave&&r.dragLeave(c,s);break;case"stop":u.removeClass("fancytree-drag-source"),r.dragStop&&r.dragStop(c,s);break;default:throw"Unsupported drag event: "+b}return t},_cancelDrag:function(){var b=a.ui.ddmanager.current;b&&b.cancel()}})}(jQuery,window,document);
|
20
|
+
|
21
|
+
/*! Extension 'jquery.fancytree.edit.min.js' */
|
22
|
+
!function(a,b,c){"use strict";var d=/Mac/.test(navigator.platform),e=a.ui.fancytree.escapeHtml,f=a.ui.fancytree.unescapeHtml;a.ui.fancytree._FancytreeNodeClass.prototype.editStart=function(){var b,d=this,e=this.tree,g=e.ext.edit,h=d.title,i=e.options.edit,j=a(".fancytree-title",d.span),k={node:d,tree:e,options:e.options};return i.beforeEdit.call(d,{type:"beforeEdit"},k)===!1?!1:(h=d.title,d.debug("editStart"),e.widget._unbind(),a(c).on("mousedown.fancytree-edit",function(b){a(b.target).hasClass("fancytree-edit-input")||d.editEnd(!0,b)}),b=a("<input />",{"class":"fancytree-edit-input",value:f(h)}),null!=i.adjustWidthOfs&&b.width(j.width()+i.adjustWidthOfs),null!=i.inputCss&&b.css(i.inputCss),k.input=b,j.html(b),a.ui.fancytree.assert(!g.currentNode,"recursive edit"),g.currentNode=this,b.focus().change(function(){b.addClass("fancytree-edit-dirty")}).keydown(function(b){switch(b.which){case a.ui.keyCode.ESCAPE:d.editEnd(!1,b);break;case a.ui.keyCode.ENTER:return d.editEnd(!0,b),!1}}).blur(function(a){return d.editEnd(!0,a)}),void i.edit.call(d,{type:"edit"},k))},a.ui.fancytree._FancytreeNodeClass.prototype.editEnd=function(b,d){var f=this,g=this.tree,h=g.ext.edit,i=g.options.edit,j=a(".fancytree-title",f.span),k=j.find("input.fancytree-edit-input"),l=k.val(),m=k.hasClass("fancytree-edit-dirty"),n=(b||m&&b!==!1)&&l!==f.title,o={node:f,tree:g,options:g.options,originalEvent:d,dirty:m,save:n,input:k,value:l};return i.beforeClose.call(f,{type:"beforeClose"},o)===!1?!1:n&&i.save.call(f,{type:"save"},o)===!1?!1:(k.removeClass("fancytree-edit-dirty").unbind(),a(c).off(".fancytree-edit"),n?f.setTitle(e(l)):f.renderTitle(),g.widget._bind(),h.currentNode=null,f.setFocus(),a(g.$container).focus(),o.input=null,i.close.call(f,{type:"close"},o),!0)},a.ui.fancytree._FancytreeNodeClass.prototype.startEdit=function(){return this.warn("FancytreeNode.startEdit() is deprecated since 2014-01-04. Use .editStart() instead."),this.editStart.apply(this,arguments)},a.ui.fancytree._FancytreeNodeClass.prototype.endEdit=function(){return this.warn("FancytreeNode.endEdit() is deprecated since 2014-01-04. Use .editEnd() instead."),this.editEnd.apply(this,arguments)},a.ui.fancytree._FancytreeClass.prototype.isEditing=function(){return this.ext.edit.currentNode},a.ui.fancytree._FancytreeNodeClass.prototype.isEditing=function(){return this.tree.ext.edit.currentNode===this},a.ui.fancytree.registerExtension({name:"edit",version:"0.1.0",options:{adjustWidthOfs:4,inputCss:{minWidth:"3em"},triggerCancel:["esc","tab","click"],triggerStart:["f2","shift+click","mac+enter"],beforeClose:a.noop,beforeEdit:a.noop,close:a.noop,edit:a.noop,save:a.noop},currentNode:null,treeInit:function(a){this._super(a),this.$container.addClass("fancytree-ext-edit")},nodeClick:function(b){return a.inArray("shift+click",b.options.edit.triggerStart)>=0&&b.originalEvent.shiftKey?(b.node.editStart(),!1):void this._super(b)},nodeDblclick:function(b){return a.inArray("dblclick",b.options.edit.triggerStart)>=0?(b.node.editStart(),!1):this._super(b)},nodeKeydown:function(b){switch(b.originalEvent.which){case 113:if(a.inArray("f2",b.options.edit.triggerStart)>=0)return b.node.editStart(),!1;break;case a.ui.keyCode.ENTER:if(a.inArray("mac+enter",b.options.edit.triggerStart)>=0&&d)return b.node.editStart(),!1}return this._super(b)}})}(jQuery,window,document);
|
23
|
+
|
24
|
+
/*! Extension 'jquery.fancytree.filter.min.js' */
|
25
|
+
!function(a){"use strict";function b(a){return(a+"").replace(/([.?*+\^\$\[\]\\(){}|-])/g,"\\$1")}a.ui.fancytree._FancytreeClass.prototype.applyFilter=function(a){var c,d,e=0,f="hide"===this.options.filter.mode,g=this.options.filter.leavesOnly;return"string"==typeof a&&(c=b(a),d=new RegExp(".*"+c+".*","i"),a=function(a){return!!d.exec(a.title)}),this.enableFilter=!0,this.$div.addClass("fancytree-ext-filter"),this.$div.addClass(f?"fancytree-ext-filter-hide":"fancytree-ext-filter-dimm"),this.visit(function(a){delete a.match,delete a.subMatch}),this.visit(function(b){g&&null!=b.children||!a(b)||(e++,b.match=!0,b.visitParents(function(a){a.subMatch=!0}))}),this.render(),e},a.ui.fancytree._FancytreeClass.prototype.clearFilter=function(){this.visit(function(a){delete a.match,delete a.subMatch}),this.enableFilter=!1,this.$div.removeClass("fancytree-ext-filter fancytree-ext-filter-dimm fancytree-ext-filter-hide"),this.render()},a.ui.fancytree.registerExtension({name:"filter",version:"0.0.2",options:{mode:"dimm",leavesOnly:!1},treeInit:function(a){this._super(a)},treeDestroy:function(a){this._super(a)},nodeRenderStatus:function(b){var c,d=b.node,e=b.tree,f=a(d[e.statusClassPropName]);return c=this._super(b),f.length&&e.enableFilter?(f.toggleClass("fancytree-match",!!d.match),f.toggleClass("fancytree-submatch",!!d.subMatch),f.toggleClass("fancytree-hide",!(d.match||d.subMatch)),c):c}})}(jQuery,window,document);
|
26
|
+
|
27
|
+
/*! Extension 'jquery.fancytree.glyph.min.js' */
|
28
|
+
!function(a){"use strict";function b(a,b){return a.map[b]}a.ui.fancytree.registerExtension({name:"glyph",version:"0.0.2",options:{prefix:"icon-",extra:null,map:{doc:"icon-file-alt",docOpen:"icon-file-alt",checkbox:"icon-check-empty",checkboxSelected:"icon-check",checkboxUnknown:"icon-check icon-muted",error:"icon-exclamation-sign",expanderClosed:"icon-caret-right",expanderLazy:"icon-angle-right",expanderOpen:"icon-caret-down",folder:"icon-folder-close-alt",folderOpen:"icon-folder-open-alt",loading:"icon-refresh icon-spin",noExpander:""},icon:null},treeInit:function(a){var b=a.tree;this._super(a),b.$container.addClass("fancytree-ext-glyph")},nodeRenderStatus:function(c){var d,e,f=c.node,g=c.options.glyph,h=g.map;this._super(c),f.isRoot()||(e=a("span.fancytree-expander",f.span).get(0),e&&(d=f.isLoading()?"loading":f.expanded?"expanderOpen":f.isUndefined()?"expanderLazy":f.hasChildren()?"expanderClosed":"noExpander",e.className="fancytree-expander "+h[d]),e=a("span.fancytree-checkbox",f.tr||f.span).get(0),e&&(d=f.selected?"checkboxSelected":f.partsel?"checkboxUnknown":"checkbox",e.className="fancytree-checkbox "+h[d]),e=a("span.fancytree-icon",f.span).get(0),e&&(d=f.folder?f.expanded?b(g,"folderOpen"):b(g,"folder"):f.expanded?b(g,"docOpen"):b(g,"doc"),e.className="fancytree-icon "+d))},nodeSetStatus:function(c,d,e,f){var g,h=c.options.glyph,i=c.node;this._super(c,d,e,f),g=i.parent?a("span.fancytree-expander",i.span).get(0):a(".fancytree-statusnode-wait, .fancytree-statusnode-error",i[this.nodeContainerAttrName]).find("span.fancytree-expander").get(0),"loading"===d?g.className="fancytree-expander "+b(h,"loading"):"error"===d&&(g.className="fancytree-expander "+b(h,"error"))}})}(jQuery,window,document);
|
29
|
+
|
30
|
+
/*! Extension 'jquery.fancytree.gridnav.min.js' */
|
31
|
+
!function(a){"use strict";function b(b,c){var d,e=c.get(0),f=0;return b.children().each(function(){return this===e?!1:(d=a(this).prop("colspan"),void(f+=d?d:1))}),f}function c(b,c){var d,e=null,f=0;return b.children().each(function(){return f>=c?(e=a(this),!1):(d=a(this).prop("colspan"),void(f+=d?d:1))}),e}function d(a,d){var f,g,h=a.closest("td"),i=null;switch(d){case e.LEFT:i=h.prev();break;case e.RIGHT:i=h.next();break;case e.UP:case e.DOWN:for(f=h.parent(),g=b(f,h);;){if(f=d===e.UP?f.prev():f.next(),!f.length)break;if(!f.is(":hidden")&&(i=c(f,g),i&&i.find(":input").length))break}}return i}var e=a.ui.keyCode,f={text:[e.UP,e.DOWN],checkbox:[e.UP,e.DOWN,e.LEFT,e.RIGHT],radiobutton:[e.UP,e.DOWN,e.LEFT,e.RIGHT],"select-one":[e.LEFT,e.RIGHT],"select-multiple":[e.LEFT,e.RIGHT]};a.ui.fancytree.registerExtension({name:"gridnav",version:"0.0.1",options:{autofocusInput:!1,handleCursorKeys:!0},treeInit:function(b){this._requireExtension("table",!0,!0),this._super(b),this.$container.addClass("fancytree-ext-gridnav"),this.$container.on("focusin",function(c){var d,e=a.ui.fancytree.getNode(c.target);e&&!e.isActive()&&(d=b.tree._makeHookContext(e,c),b.tree._callHook("nodeSetActive",d,!0))})},nodeSetActive:function(b,c){var d,e=b.options.gridnav,f=b.node,g=b.originalEvent||{},h=a(g.target).is(":input");c=c!==!1,this._super(b,c),c&&(b.options.titlesTabbable?(h||(a(f.span).find("span.fancytree-title").focus(),f.setFocus()),b.tree.$container.attr("tabindex","-1")):e.autofocusInput&&!h&&(d=a(f.tr||f.span),d.find(":input:enabled:first").focus()))},nodeKeydown:function(b){var c,e,g,h=b.options.gridnav,i=b.originalEvent,j=a(i.target);return c=j.is(":input:enabled")?j.prop("type"):null,c&&h.handleCursorKeys?(e=f[c],e&&a.inArray(i.which,e)>=0&&(g=d(j,i.which),g&&g.length)?(g.find(":input:enabled").focus(),!1):!0):(b.tree.debug("ext-gridnav NOT HANDLED",i,c),this._super(b))}})}(jQuery,window,document);
|
32
|
+
|
33
|
+
/*! Extension 'jquery.fancytree.persist.min.js' */
|
34
|
+
!function(a,b,c,d){"use strict";function e(b,c){c=c||"",b||a.error("Assertion failed "+c)}function f(b,c,d,e,g){var i,j,k,l,m=!1,n=[],o=[];for(d=d||[],g=g||a.Deferred(),i=0,k=d.length;k>i;i++)j=d[i],l=b.getNodeByKey(j),l?e&&l.isUndefined()?(m=!0,b.debug("_loadLazyNodes: "+l+" is lazy: loading..."),n.push("expand"===e?l.setExpanded():l.load())):(b.debug("_loadLazyNodes: "+l+" already loaded."),l.setExpanded()):(o.push(j),b.debug("_loadLazyNodes: "+l+" was not yet found."));return a.when.apply(a,n).always(function(){if(m&&o.length>0)f(b,c,o,e,g);else{if(o.length)for(b.warn("_loadLazyNodes: could not load those keys: ",o),i=0,k=o.length;k>i;i++)j=d[i],c._setKey(h,d[i],!1);g.resolve()}}),g}var g="active",h="expanded",i="focus",j="selected";a.ui.fancytree._FancytreeClass.prototype.clearCookies=function(b){var c=this.ext.persist,d=c.cookiePrefix;b=b||"active expanded focus selected",b.indexOf(g)>=0&&a.removeCookie(d+g),b.indexOf(h)>=0&&a.removeCookie(d+h),b.indexOf(i)>=0&&a.removeCookie(d+i),b.indexOf(j)>=0&&a.removeCookie(d+j)},a.ui.fancytree._FancytreeClass.prototype.getPersistData=function(){var b=this.ext.persist,c=this.options.persist,d=c.cookieDelimiter,e={};return e[g]=a.cookie(b.cookiePrefix+g),e[h]=(a.cookie(b.cookiePrefix+h)||"").split(d),e[j]=(a.cookie(b.cookiePrefix+j)||"").split(d),e[i]=a.cookie(b.cookiePrefix+i),e},a.ui.fancytree.registerExtension({name:"persist",version:"0.2.0",options:{cookieDelimiter:"~",cookiePrefix:d,cookie:{raw:!1,expires:"",path:"",domain:"",secure:!1},expandLazy:!1,overrideSource:!1,types:"active expanded focus selected"},_setKey:function(b,c,d){c=""+c;var e=this._local,f=this.options.persist,g=e.cookiePrefix+b,h=a.cookie(g),i=h?h.split(f.cookieDelimiter):[],j=a.inArray(c,i);j>=0&&i.splice(j,1),d&&i.push(c),a.cookie(g,i.join(f.cookieDelimiter),f.cookie)},treeInit:function(b){var k=b.tree,l=b.options,m=this._local,n=this.options.persist;e(a.cookie,"Missing required plugin for 'persist' extension: jquery.cookie.js"),m.cookiePrefix=n.cookiePrefix||"fancytree-"+k._id+"-",m.storeActive=n.types.indexOf(g)>=0,m.storeExpanded=n.types.indexOf(h)>=0,m.storeSelected=n.types.indexOf(j)>=0,m.storeFocus=n.types.indexOf(i)>=0,k.$div.bind("fancytreeinit",function(){var b,e,o,p,q,r=a.cookie(m.cookiePrefix+i);k.debug("COOKIE "+c.cookie),b=a.cookie(m.cookiePrefix+h),p=b&&b.split(n.cookieDelimiter),e=m.storeExpanded?f(k,m,p,n.expandLazy?"expand":!1,null):(new a.Deferred).resolve(),e.done(function(){if(m.storeSelected&&(b=a.cookie(m.cookiePrefix+j)))for(p=b.split(n.cookieDelimiter),o=0;o<p.length;o++)q=k.getNodeByKey(p[o]),q?(q.selected===d||n.overrideSource&&q.selected===!1)&&(q.selected=!0,q.renderStatus()):m._setKey(j,p[o],!1);m.storeActive&&(b=a.cookie(m.cookiePrefix+g),!b||!l.persist.overrideSource&&k.activeNode||(q=k.getNodeByKey(b),q&&q.setActive())),m.storeFocus&&r&&(q=k.getNodeByKey(r),q&&q.setFocus())})}),this._super(b)},nodeSetActive:function(b,c,d){var e=this._local,f=this.options.persist;c=c!==!1,this._super(b,c,d),e.storeActive&&a.cookie(e.cookiePrefix+g,this.activeNode?this.activeNode.key:null,f.cookie)},nodeSetExpanded:function(a,b,c){var d,e=a.node,f=this._local;return b=b!==!1,d=this._super(a,b,c),f.storeExpanded&&f._setKey(h,e.key,b),d},nodeSetFocus:function(b){var c=this._local,d=this.options.persist;this._super(b),c.storeFocus&&a.cookie(c.cookiePrefix+i,this.focusNode?this.focusNode.key:null,d.cookie)},nodeSetSelected:function(a,b){var c=a.node,d=this._local;b=b!==!1,this._super(a,b),d.storeSelected&&d._setKey(j,c.key,b)}})}(jQuery,window,document);
|
35
|
+
|
36
|
+
/*! Extension 'jquery.fancytree.table.min.js' */
|
37
|
+
!function(a,b,c){"use strict";function d(b,c){c=c||"",b||a.error("Assertion failed "+c)}function e(a,b){a.parentNode.insertBefore(b,a.nextSibling)}function f(a,b){a.visit(function(a){var c=a.tr;return c&&(c.style.display=a.hide||!b?"none":""),a.expanded?void 0:"skip"})}function g(b){var c,e,f,g=b.parent,h=g?g.children:null;if(h&&h.length>1&&h[0]!==b)for(c=a.inArray(b,h),f=h[c-1],d(f.tr);f.children&&(e=f.children[f.children.length-1],e.tr);)f=e;else f=g;return f}a.ui.fancytree.registerExtension({name:"table",version:"0.2.0",options:{checkboxColumnIdx:null,customStatus:!1,indentation:16,nodeColumnIdx:0},treeInit:function(b){var d,e,f,g=b.tree,h=g.widget.element;for(h.addClass("fancytree-container fancytree-ext-table"),g.tbody=h.find("> tbody")[0],g.columnCount=a("thead >tr >th",h).length,a(g.tbody).empty(),g.rowFragment=c.createDocumentFragment(),e=a("<tr />"),f="",b.options.aria&&(e.attr("role","row"),f=" role='gridcell'"),d=0;d<g.columnCount;d++)e.append(b.options.table.nodeColumnIdx===d?"<td"+f+"><span class='fancytree-node' /></td>":"<td"+f+" />");g.rowFragment.appendChild(e.get(0)),g.statusClassPropName="tr",g.ariaPropName="tr",this.nodeContainerAttrName="tr",this._super(b),a(g.rootNode.ul).remove(),g.rootNode.ul=null,g.$container=h,this.$container.attr("tabindex",this.options.tabbable?"0":"-1"),this.options.aria&&g.$container.attr("role","treegrid").attr("aria-readonly",!0)},nodeRemoveChildMarkup:function(b){var c=b.node;c.visit(function(b){b.tr&&(a(b.tr).remove(),b.tr=null)})},nodeRemoveMarkup:function(b){var c=b.node;c.tr&&(a(c.tr).remove(),c.tr=null),this.nodeRemoveChildMarkup(b)},nodeRender:function(b,c,h,i,j){var k,l,m,n,o,p,q,r,s=b.tree,t=b.node,u=b.options,v=!t.parent;if(j||(b.hasCollapsedParents=t.parent&&!t.parent.expanded),!v)if(t.tr)c?this.nodeRenderTitle(b):this.nodeRenderStatus(b);else{if(b.hasCollapsedParents)return void t.debug("nodeRender ignored due to unrendered parent");o=s.rowFragment.firstChild.cloneNode(!0),p=g(t),d(p),i===!0&&j?o.style.display="none":h&&b.hasCollapsedParents&&(o.style.display="none"),p.tr?e(p.tr,o):(d(!p.parent,"prev. row must have a tr, or is system root"),s.tbody.appendChild(o)),t.tr=o,t.key&&u.generateIds&&(t.tr.id=u.idPrefix+t.key),t.tr.ftnode=t,u.aria&&a(t.tr).attr("aria-labelledby","ftal_"+t.key),t.span=a("span.fancytree-node",t.tr).get(0),this.nodeRenderTitle(b),u.createNode&&u.createNode.call(s,{type:"createNode"},b)}if(u.renderNode&&u.renderNode.call(s,{type:"renderNode"},b),k=t.children,k&&(v||h||t.expanded))for(m=0,n=k.length;n>m;m++)r=a.extend({},b,{node:k[m]}),r.hasCollapsedParents=r.hasCollapsedParents||!t.expanded,this.nodeRender(r,c,h,i,!0);k&&!j&&(q=t.tr||null,l=s.tbody.firstChild,t.visit(function(a){if(a.tr){if(a.parent.expanded||"none"===a.tr.style.display||(a.tr.style.display="none",f(a,!1)),a.tr.previousSibling!==q){t.debug("_fixOrder: mismatch at node: "+a);var b=q?q.nextSibling:l;s.tbody.insertBefore(a.tr,b)}q=a.tr}}))},nodeRenderTitle:function(b){var c,d=b.node,e=b.options;this._super(b),e.checkbox&&null!=e.table.checkboxColumnIdx&&(c=a("span.fancytree-checkbox",d.span).detach(),a(d.tr).find("td:first").html(c)),d.isRoot()||this.nodeRenderStatus(b),!e.table.customStatus&&d.isStatusNode()||e.renderColumns&&e.renderColumns.call(b.tree,{type:"renderColumns"},b)},nodeRenderStatus:function(b){var c,d=b.node,e=b.options;this._super(b),a(d.tr).removeClass("fancytree-node"),c=(d.getLevel()-1)*e.table.indentation,a(d.span).css({marginLeft:c+"px"})},nodeSetExpanded:function(b,c,d){function e(a){c=c!==!1,f(b.node,c),h.noEvents||b.tree._triggerNodeEvent(c?"expand":"collapse",b),a?g.resolveWith(b.node):g.rejectWith(b.node)}var g=new a.Deferred,h=d||{};return d=a.extend({},d,{noEvents:!0,noAnimation:!0}),this._super(b,c,d).done(function(){e(!0)}).fail(function(){e(!1)}),g.promise()},nodeSetStatus:function(b,c,d,e){if("ok"===c){var f=b.node,g=f.children?f.children[0]:null;g&&g.isStatusNode()&&a(g.tr).remove()}this._super(b,c,d,e)},treeClear:function(a){return this.nodeRemoveChildMarkup(this._makeHookContext(this.rootNode)),this._super(a)}})}(jQuery,window,document);
|
38
|
+
|
39
|
+
/*! Extension 'jquery.fancytree.themeroller.min.js' */
|
40
|
+
!function(a){"use strict";a.ui.fancytree.registerExtension({name:"themeroller",version:"0.0.1",options:{activeClass:"ui-state-active",foccusClass:"ui-state-focus",hoverClass:"ui-state-hover",selectedClass:"ui-state-highlight"},treeInit:function(b){this._super(b);var c=b.widget.element;"TABLE"===c[0].nodeName?(c.addClass("ui-widget ui-corner-all"),c.find(">thead tr").addClass("ui-widget-header"),c.find(">tbody").addClass("ui-widget-conent")):c.addClass("ui-widget ui-widget-content ui-corner-all"),c.delegate(".fancytree-node","mouseenter mouseleave",function(b){var c=a.ui.fancytree.getNode(b.target),d="mouseenter"===b.type;c.debug("hover: "+d),a(c.span).toggleClass("ui-state-hover ui-corner-all",d)})},treeDestroy:function(a){this._super(a),a.widget.element.removeClass("ui-widget ui-widget-content ui-corner-all")},nodeRenderStatus:function(b){var c=b.node,d=a(c.span);this._super(b),d.toggleClass("ui-state-active",c.isActive()),d.toggleClass("ui-state-focus",c.hasFocus()),d.toggleClass("ui-state-highlight",c.isSelected())}})}(jQuery,window,document);
|
41
|
+
}));
|
@@ -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.0.0-
|
11
|
-
* @date 2014-
|
10
|
+
* @version 2.0.0-11
|
11
|
+
* @date 2014-04-27T22:28
|
12
12
|
*/
|
13
13
|
|
14
14
|
/** Core Fancytree module.
|
@@ -168,6 +168,20 @@ function _makeResolveFunc(deferred, context){
|
|
168
168
|
}
|
169
169
|
|
170
170
|
|
171
|
+
function _getElementDataAsDict($el){
|
172
|
+
// Evaluate 'data-NAME' attributes with special treatment for 'data-json'.
|
173
|
+
var d = $.extend({}, $el.data()),
|
174
|
+
json = d.json;
|
175
|
+
delete d.fancytree; // added to container by widget factory
|
176
|
+
if( json ) {
|
177
|
+
delete d.json;
|
178
|
+
// <li data-json='...'> is already returned as object (http://api.jquery.com/data/#data-html5)
|
179
|
+
d = $.extend(d, json);
|
180
|
+
}
|
181
|
+
return d;
|
182
|
+
}
|
183
|
+
|
184
|
+
|
171
185
|
// TODO: use currying
|
172
186
|
function _makeNodeTitleMatcher(s){
|
173
187
|
s = s.toLowerCase();
|
@@ -178,11 +192,12 @@ function _makeNodeTitleMatcher(s){
|
|
178
192
|
|
179
193
|
var i,
|
180
194
|
FT = null, // initialized below
|
195
|
+
ENTITY_MAP = {"&": "&", "<": "<", ">": ">", "\"": """, "'": "'", "/": "/"},
|
181
196
|
//boolean attributes that can be set with equivalent class names in the LI tags
|
182
|
-
CLASS_ATTRS = "active expanded focus folder lazy selected unselectable".split(" "),
|
197
|
+
CLASS_ATTRS = "active expanded focus folder hideCheckbox lazy selected unselectable".split(" "),
|
183
198
|
CLASS_ATTR_MAP = {},
|
184
199
|
// Top-level Fancytree node attributes, that can be set by dict
|
185
|
-
NODE_ATTRS = "expanded extraClasses folder hideCheckbox key lazy selected title tooltip unselectable".split(" "),
|
200
|
+
NODE_ATTRS = "expanded extraClasses folder hideCheckbox key lazy refKey selected title tooltip unselectable".split(" "),
|
186
201
|
NODE_ATTR_MAP = {},
|
187
202
|
// Attribute names that should NOT be added to node.data
|
188
203
|
NONE_NODE_DATA_MAP = {"active": true, "children": true, "data": true, "focus": true};
|
@@ -205,21 +220,22 @@ for(i=0; i<NODE_ATTRS.length; i++){ NODE_ATTR_MAP[NODE_ATTRS[i]] = true; }
|
|
205
220
|
* @param {FancytreeNode} parent
|
206
221
|
* @param {NodeData} obj
|
207
222
|
*
|
208
|
-
* @property {Fancytree} tree
|
209
|
-
* @property {FancytreeNode} parent
|
210
|
-
* @property {string} key
|
211
|
-
* @property {string} title
|
223
|
+
* @property {Fancytree} tree The tree instance
|
224
|
+
* @property {FancytreeNode} parent The parent node
|
225
|
+
* @property {string} key Node id (must be unique inside the tree)
|
226
|
+
* @property {string} title Display name (may contain HTML)
|
212
227
|
* @property {object} data Contains all extra data that was passed on node creation
|
213
|
-
* @property {FancytreeNode[] | null | undefined} children
|
214
|
-
*
|
215
|
-
*
|
216
|
-
* @property {boolean}
|
217
|
-
* @property {string} extraClasses
|
218
|
-
* @property {boolean}
|
219
|
-
*
|
220
|
-
* @property {string}
|
221
|
-
* @property {
|
222
|
-
* @property {
|
228
|
+
* @property {FancytreeNode[] | null | undefined} children Array of child nodes.<br>
|
229
|
+
* For lazy nodes, null or undefined means 'not yet loaded'. Use an empty array
|
230
|
+
* to define a node that has no children.
|
231
|
+
* @property {boolean} expanded Use isExpanded(), setExpanded() to access this property.
|
232
|
+
* @property {string} extraClasses Addtional CSS classes, added to the node's `<span>`
|
233
|
+
* @property {boolean} folder Folder nodes have different default icons and click behavior.<br>
|
234
|
+
* Note: Also non-folders may have children.
|
235
|
+
* @property {string} statusNodeType null or type of temporarily generated system node like 'loading', or 'error'.
|
236
|
+
* @property {boolean} lazy True if this node is loaded on demand, i.e. on first expansion.
|
237
|
+
* @property {boolean} selected Use isSelected(), setSelected() to access this property.
|
238
|
+
* @property {string} tooltip Alternative description used as hover banner
|
223
239
|
*/
|
224
240
|
function FancytreeNode(parent, obj){
|
225
241
|
var i, l, name, cl;
|
@@ -228,7 +244,9 @@ function FancytreeNode(parent, obj){
|
|
228
244
|
this.tree = parent.tree;
|
229
245
|
this.ul = null;
|
230
246
|
this.li = null; // <li id='key' ftnode=this> tag
|
231
|
-
this.
|
247
|
+
this.statusNodeType = null; // if this is a temp. node to display the status of its parent
|
248
|
+
this._isLoading = false; // if this node itself is loading
|
249
|
+
this._error = null; // {message: '...'} if a load error occured
|
232
250
|
this.data = {};
|
233
251
|
|
234
252
|
// TODO: merge this code with node.toDict()
|
@@ -251,8 +269,14 @@ function FancytreeNode(parent, obj){
|
|
251
269
|
|
252
270
|
// Fix missing key
|
253
271
|
if( this.key == null ){ // test for null OR undefined
|
254
|
-
this.
|
272
|
+
if( this.tree.options.defaultKey ) {
|
273
|
+
this.key = this.tree.options.defaultKey(this);
|
274
|
+
_assert(this.key, "defaultKey() must return a unique key");
|
275
|
+
} else {
|
276
|
+
this.key = "_" + (FT._nextNodeKey++);
|
277
|
+
}
|
255
278
|
}
|
279
|
+
|
256
280
|
// Fix tree.activeNode
|
257
281
|
// TODO: not elegant: we use obj.active as marker to set tree.activeNode
|
258
282
|
// when loading from a dictionary.
|
@@ -260,6 +284,9 @@ function FancytreeNode(parent, obj){
|
|
260
284
|
_assert(this.tree.activeNode === null, "only one active node allowed");
|
261
285
|
this.tree.activeNode = this;
|
262
286
|
}
|
287
|
+
if( obj.selected ){ // #186
|
288
|
+
this.tree.lastSelectedNode = this;
|
289
|
+
}
|
263
290
|
// TODO: handle obj.focus = true
|
264
291
|
// Create child nodes
|
265
292
|
this.children = null;
|
@@ -267,6 +294,10 @@ function FancytreeNode(parent, obj){
|
|
267
294
|
if(cl && cl.length){
|
268
295
|
this._setChildren(cl);
|
269
296
|
}
|
297
|
+
// Add to key/ref map (except for root node)
|
298
|
+
// if( parent ) {
|
299
|
+
this.tree._callHook("treeRegisterNode", this.tree, true, this);
|
300
|
+
// }
|
270
301
|
}
|
271
302
|
|
272
303
|
|
@@ -368,6 +399,17 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
368
399
|
}
|
369
400
|
_assert(false, "Invalid mode: " + mode);
|
370
401
|
},
|
402
|
+
/**
|
403
|
+
* Append new node after this.
|
404
|
+
*
|
405
|
+
* This a convenience function that calls addNode(node, 'after')
|
406
|
+
*
|
407
|
+
* @param {NodeData} node node definition
|
408
|
+
* @returns {FancytreeNode} new node
|
409
|
+
*/
|
410
|
+
appendSibling: function(node){
|
411
|
+
return this.addNode(node, "after");
|
412
|
+
},
|
371
413
|
/**
|
372
414
|
* Modify existing child nodes.
|
373
415
|
*
|
@@ -417,7 +459,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
417
459
|
}
|
418
460
|
return promise;
|
419
461
|
},
|
420
|
-
/**
|
462
|
+
/** Collapse all sibling nodes.
|
421
463
|
* @returns {$.Promise}
|
422
464
|
*/
|
423
465
|
collapseSiblings: function() {
|
@@ -462,12 +504,12 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
462
504
|
consoleApply("debug", arguments);
|
463
505
|
}
|
464
506
|
},
|
465
|
-
/**
|
507
|
+
/** Deprecated.
|
508
|
+
* @deprecated since 2014-02-16. Use resetLazy() instead.
|
509
|
+
*/
|
466
510
|
discard: function(){
|
467
|
-
|
468
|
-
|
469
|
-
return this.setExpanded(false);
|
470
|
-
}
|
511
|
+
this.warn("FancytreeNode.discard() is deprecated since 2014-02-16. Use .resetLazy() instead.");
|
512
|
+
return this.resetLazy();
|
471
513
|
},
|
472
514
|
// TODO: expand(flag)
|
473
515
|
/**Find all nodes that contain `match` in the title.
|
@@ -529,7 +571,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
529
571
|
default:
|
530
572
|
_assert(false, "invalid state: " + state);
|
531
573
|
}
|
532
|
-
this.debug("fixSelection3AfterLoad() _changeSelectStatusAttrs()", state, changed);
|
574
|
+
// this.debug("fixSelection3AfterLoad() _changeSelectStatusAttrs()", state, changed);
|
533
575
|
if( changed ){
|
534
576
|
this.renderStatus();
|
535
577
|
}
|
@@ -658,23 +700,31 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
658
700
|
this.addChild(children);
|
659
701
|
*/
|
660
702
|
},
|
661
|
-
/**
|
703
|
+
/** Return the list of child nodes (undefined for unexpanded lazy nodes).
|
704
|
+
* @returns {FancytreeNode[] | undefined}
|
705
|
+
*/
|
662
706
|
getChildren: function() {
|
663
707
|
if(this.hasChildren() === undefined){ // TODO: only required for lazy nodes?
|
664
708
|
return undefined; // Lazy node: unloaded, currently loading, or load error
|
665
709
|
}
|
666
710
|
return this.children;
|
667
711
|
},
|
668
|
-
/**
|
712
|
+
/** Return the first child node or null.
|
713
|
+
* @returns {FancytreeNode | null}
|
714
|
+
*/
|
669
715
|
getFirstChild: function() {
|
670
716
|
return this.children ? this.children[0] : null;
|
671
717
|
},
|
672
|
-
/**
|
718
|
+
/** Return the 0-based child index.
|
719
|
+
* @returns {int}
|
720
|
+
*/
|
673
721
|
getIndex: function() {
|
674
722
|
// return this.parent.children.indexOf(this);
|
675
723
|
return $.inArray(this, this.parent.children); // indexOf doesn't work in IE7
|
676
724
|
},
|
677
|
-
|
725
|
+
/** Return the hierarchical child index (1-based, e.g. '3.2.4').
|
726
|
+
* @returns {string}
|
727
|
+
*/
|
678
728
|
getIndexHier: function(separator) {
|
679
729
|
separator = separator || ".";
|
680
730
|
var res = [];
|
@@ -683,9 +733,9 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
683
733
|
});
|
684
734
|
return res.join(separator);
|
685
735
|
},
|
686
|
-
/**
|
736
|
+
/** Return the parent keys separated by options.keyPathSeparator, e.g. "id_1/id_17/id_32".
|
687
737
|
* @param {boolean} [excludeSelf=false]
|
688
|
-
* @returns {string}
|
738
|
+
* @returns {string}
|
689
739
|
*/
|
690
740
|
getKeyPath: function(excludeSelf) {
|
691
741
|
var path = [],
|
@@ -697,11 +747,15 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
697
747
|
}, !excludeSelf);
|
698
748
|
return sep + path.join(sep);
|
699
749
|
},
|
700
|
-
|
750
|
+
/** Return the last child of this node or null.
|
751
|
+
* @returns {FancytreeNode | null}
|
752
|
+
*/
|
701
753
|
getLastChild: function() {
|
702
754
|
return this.children ? this.children[this.children.length - 1] : null;
|
703
755
|
},
|
704
|
-
/**
|
756
|
+
/** Return node depth. 0: System root node, 1: visible top-level node, 2: first sub-level, ... .
|
757
|
+
* @returns {int}
|
758
|
+
*/
|
705
759
|
getLevel: function() {
|
706
760
|
var level = 0,
|
707
761
|
dtn = this.parent;
|
@@ -711,7 +765,9 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
711
765
|
}
|
712
766
|
return level;
|
713
767
|
},
|
714
|
-
/**
|
768
|
+
/** Return the successor node (under the same parent) or null.
|
769
|
+
* @returns {FancytreeNode | null}
|
770
|
+
*/
|
715
771
|
getNextSibling: function() {
|
716
772
|
// TODO: use indexOf, if available: (not in IE6)
|
717
773
|
if( this.parent ){
|
@@ -726,14 +782,16 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
726
782
|
}
|
727
783
|
return null;
|
728
784
|
},
|
729
|
-
/**
|
785
|
+
/** Return the parent node (null for the system root node).
|
786
|
+
* @returns {FancytreeNode | null}
|
787
|
+
*/
|
730
788
|
getParent: function() {
|
731
789
|
// TODO: return null for top-level nodes?
|
732
790
|
return this.parent;
|
733
791
|
},
|
734
|
-
/**
|
735
|
-
* @param {boolean} [includeRoot=false]
|
736
|
-
* @param {boolean} [includeSelf=false]
|
792
|
+
/** Return an array of all parent nodes (top-down).
|
793
|
+
* @param {boolean} [includeRoot=false] Include the invisible system root node.
|
794
|
+
* @param {boolean} [includeSelf=false] Include the node itself.
|
737
795
|
* @returns {FancytreeNode[]}
|
738
796
|
*/
|
739
797
|
getParentList: function(includeRoot, includeSelf) {
|
@@ -747,7 +805,9 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
747
805
|
}
|
748
806
|
return l;
|
749
807
|
},
|
750
|
-
/**
|
808
|
+
/** Return the predecessor node (under the same parent) or null.
|
809
|
+
* @returns {FancytreeNode | null}
|
810
|
+
*/
|
751
811
|
getPrevSibling: function() {
|
752
812
|
if( this.parent ){
|
753
813
|
var i, l,
|
@@ -761,7 +821,9 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
761
821
|
}
|
762
822
|
return null;
|
763
823
|
},
|
764
|
-
/**
|
824
|
+
/** Return true if node has children. Return undefined if not sure, i.e. the node is lazy and not yet loaded).
|
825
|
+
* @returns {boolean | undefined}
|
826
|
+
*/
|
765
827
|
hasChildren: function() {
|
766
828
|
if(this.lazy){
|
767
829
|
if(this.children == null ){
|
@@ -770,7 +832,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
770
832
|
}else if(this.children.length === 0){
|
771
833
|
// Loaded, but response was empty
|
772
834
|
return false;
|
773
|
-
}else if(this.children.length === 1 && this.children[0].isStatusNode ){
|
835
|
+
}else if(this.children.length === 1 && this.children[0].isStatusNode() ){
|
774
836
|
// Currently loading or load error
|
775
837
|
return undefined;
|
776
838
|
}
|
@@ -778,24 +840,28 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
778
840
|
}
|
779
841
|
return !!this.children;
|
780
842
|
},
|
781
|
-
|
843
|
+
/** Return true if node has keyboard focus.
|
844
|
+
* @returns {boolean}
|
845
|
+
*/
|
782
846
|
hasFocus: function() {
|
783
847
|
return (this.tree.hasFocus() && this.tree.focusNode === this);
|
784
848
|
},
|
785
|
-
|
849
|
+
/** Return true if node is active (see also FancytreeNode#isSelected).
|
850
|
+
* @returns {boolean}
|
851
|
+
*/
|
786
852
|
isActive: function() {
|
787
853
|
return (this.tree.activeNode === this);
|
788
854
|
},
|
789
|
-
/**
|
855
|
+
/** Return true if node is a direct child of otherNode.
|
790
856
|
* @param {FancytreeNode} otherNode
|
791
|
-
* @returns {boolean}
|
857
|
+
* @returns {boolean}
|
792
858
|
*/
|
793
859
|
isChildOf: function(otherNode) {
|
794
860
|
return (this.parent && this.parent === otherNode);
|
795
861
|
},
|
796
|
-
/**
|
862
|
+
/** Return true, if node is a direct or indirect sub node of otherNode.
|
797
863
|
* @param {FancytreeNode} otherNode
|
798
|
-
* @returns {boolean}
|
864
|
+
* @returns {boolean}
|
799
865
|
*/
|
800
866
|
isDescendantOf: function(otherNode) {
|
801
867
|
if(!otherNode || otherNode.tree !== this.tree){
|
@@ -810,45 +876,79 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
810
876
|
}
|
811
877
|
return false;
|
812
878
|
},
|
813
|
-
/**
|
879
|
+
/** Return true if node is expanded.
|
880
|
+
* @returns {boolean}
|
881
|
+
*/
|
814
882
|
isExpanded: function() {
|
815
883
|
return !!this.expanded;
|
816
884
|
},
|
817
|
-
/**
|
885
|
+
/** Return true if node is the first node of its parent's children.
|
886
|
+
* @returns {boolean}
|
887
|
+
*/
|
818
888
|
isFirstSibling: function() {
|
819
889
|
var p = this.parent;
|
820
890
|
return !p || p.children[0] === this;
|
821
891
|
},
|
822
|
-
/**
|
892
|
+
/** Return true if node is a folder, i.e. has the node.folder attribute set.
|
893
|
+
* @returns {boolean}
|
894
|
+
*/
|
823
895
|
isFolder: function() {
|
824
896
|
return !!this.folder;
|
825
897
|
},
|
826
|
-
/**
|
898
|
+
/** Return true if node is the last node of its parent's children.
|
899
|
+
* @returns {boolean}
|
900
|
+
*/
|
827
901
|
isLastSibling: function() {
|
828
902
|
var p = this.parent;
|
829
903
|
return !p || p.children[p.children.length-1] === this;
|
830
904
|
},
|
831
|
-
/**
|
905
|
+
/** Return true if node is lazy (even if data was already loaded)
|
906
|
+
* @returns {boolean}
|
907
|
+
*/
|
832
908
|
isLazy: function() {
|
833
909
|
return !!this.lazy;
|
834
910
|
},
|
835
|
-
/**
|
911
|
+
/** Return true if node is lazy and loaded. For non-lazy nodes always return true.
|
912
|
+
* @returns {boolean}
|
913
|
+
*/
|
914
|
+
isLoaded: function() {
|
915
|
+
return !this.lazy || this.hasChildren() !== undefined; // Also checks if the only child is a status node
|
916
|
+
},
|
917
|
+
/** Return true if children are currently beeing loaded, i.e. a Ajax request is pending.
|
918
|
+
* @returns {boolean}
|
919
|
+
*/
|
836
920
|
isLoading: function() {
|
837
|
-
|
921
|
+
return !!this._isLoading;
|
838
922
|
},
|
839
|
-
|
923
|
+
/** Return true if this is the (invisible) system root node.
|
924
|
+
* @returns {boolean}
|
925
|
+
*/
|
840
926
|
isRoot: function() {
|
841
927
|
return (this.tree.rootNode === this);
|
842
928
|
},
|
843
|
-
/**
|
929
|
+
/** Return true if node is selected, i.e. has a checkmark set (see also FancytreeNode#isActive).
|
930
|
+
* @returns {boolean}
|
931
|
+
*/
|
844
932
|
isSelected: function() {
|
845
933
|
return !!this.selected;
|
846
934
|
},
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
935
|
+
/** Return true if this node is a temporarily generated system node like
|
936
|
+
* 'loading', or 'error' (node.statusNodeType contains the type).
|
937
|
+
* @returns {boolean}
|
938
|
+
*/
|
939
|
+
isStatusNode: function() {
|
940
|
+
return !!this.statusNodeType;
|
941
|
+
},
|
942
|
+
/** Return true if node is lazy and not yet loaded. For non-lazy nodes always return false.
|
943
|
+
* @returns {boolean}
|
944
|
+
*/
|
945
|
+
isUndefined: function() {
|
946
|
+
return this.hasChildren() === undefined; // also checks if the only child is a status node
|
947
|
+
},
|
948
|
+
/** Return true if all parent nodes are expanded. Note: this does not check
|
949
|
+
* whether the node is scrolled into the visible part of the screen.
|
950
|
+
* @returns {boolean}
|
951
|
+
*/
|
852
952
|
isVisible: function() {
|
853
953
|
var i, l,
|
854
954
|
parents = this.getParentList(false, false);
|
@@ -858,28 +958,87 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
858
958
|
}
|
859
959
|
return true;
|
860
960
|
},
|
861
|
-
/**
|
862
|
-
*
|
961
|
+
/** Deprecated.
|
962
|
+
* @deprecated since 2014-02-16: use load() instead.
|
863
963
|
*/
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
964
|
+
lazyLoad: function(discard) {
|
965
|
+
this.warn("FancytreeNode.lazyLoad() is deprecated since 2014-02-16. Use .load() instead.");
|
966
|
+
return this.load(discard);
|
967
|
+
},
|
968
|
+
/**
|
969
|
+
* Load all children of a lazy node.
|
970
|
+
* @param {boolean} [forceReload=false] Pass true to discard any existing nodes before.
|
971
|
+
* @returns {$.Promise}
|
972
|
+
*/
|
973
|
+
load: function(forceReload) {
|
974
|
+
var res, source,
|
975
|
+
that = this;
|
869
976
|
|
870
|
-
|
871
|
-
|
977
|
+
_assert( this.isLazy(), "load() requires a lazy node" );
|
978
|
+
_assert( forceReload || this.isUndefined(), "Pass forceReload=true to re-load a lazy node" );
|
979
|
+
|
980
|
+
if( this.isLoaded() ){
|
981
|
+
this.resetLazy(); // also collapses
|
872
982
|
}
|
983
|
+
// This method is also called by setExpanded() and loadKeyPath(), so we
|
984
|
+
// have to avoid recursion.
|
985
|
+
source = this.tree._triggerNodeEvent("lazyLoad", this);
|
986
|
+
if( source === false ) { // #69
|
987
|
+
return _getResolvedPromise(this);
|
988
|
+
}
|
989
|
+
_assert(typeof source !== "boolean", "lazyLoad event must return source in data.result");
|
990
|
+
res = this.tree._callHook("nodeLoadChildren", this, source);
|
991
|
+
if( this.expanded ) {
|
992
|
+
res.always(function(){
|
993
|
+
that.render();
|
994
|
+
});
|
995
|
+
}
|
996
|
+
return res;
|
997
|
+
},
|
998
|
+
/** Expand all parents and optionally scroll into visible area as neccessary.
|
999
|
+
* Promise is resolved, when lazy loading and animations are done.
|
1000
|
+
* @param {object} [opts] passed to `setExpanded()`.
|
1001
|
+
* Defaults to {noAnimation: false, noEvents: false, scrollIntoView: true}
|
1002
|
+
* @returns {$.Promise}
|
1003
|
+
*/
|
1004
|
+
makeVisible: function(opts) {
|
1005
|
+
var i,
|
1006
|
+
that = this,
|
1007
|
+
deferreds = [],
|
1008
|
+
dfd = new $.Deferred(),
|
1009
|
+
parents = this.getParentList(false, false),
|
1010
|
+
len = parents.length,
|
1011
|
+
effects = !(opts && opts.noAnimation === true),
|
1012
|
+
scroll = !(opts && opts.scrollIntoView === false);
|
1013
|
+
|
1014
|
+
// Expand bottom-up, so only the top node is animated
|
1015
|
+
for(i = len - 1; i >= 0; i--){
|
1016
|
+
// that.debug("pushexpand" + parents[i]);
|
1017
|
+
deferreds.push(parents[i].setExpanded(true, opts));
|
1018
|
+
}
|
1019
|
+
$.when.apply($, deferreds).done(function(){
|
1020
|
+
// All expands have finished
|
1021
|
+
// that.debug("expand DONE", scroll);
|
1022
|
+
if( scroll ){
|
1023
|
+
that.scrollIntoView(effects).done(function(){
|
1024
|
+
// that.debug("scroll DONE");
|
1025
|
+
dfd.resolve();
|
1026
|
+
});
|
1027
|
+
} else {
|
1028
|
+
dfd.resolve();
|
1029
|
+
}
|
1030
|
+
});
|
1031
|
+
return dfd.promise();
|
873
1032
|
},
|
874
1033
|
/** Move this node to targetNode.
|
875
1034
|
* @param {FancytreeNode} targetNode
|
876
|
-
* @param {string} mode
|
1035
|
+
* @param {string} mode <pre>
|
877
1036
|
* 'child': append this node as last child of targetNode.
|
878
1037
|
* This is the default. To be compatble with the D'n'd
|
879
1038
|
* hitMode, we also accept 'over'.
|
880
1039
|
* 'before': add this node as sibling before targetNode.
|
881
|
-
* 'after': add this node as sibling after targetNode
|
882
|
-
* @param
|
1040
|
+
* 'after': add this node as sibling after targetNode.</pre>
|
1041
|
+
* @param {function} [map] optional callback(FancytreeNode) to allow modifcations
|
883
1042
|
*/
|
884
1043
|
moveTo: function(targetNode, mode, map) {
|
885
1044
|
if(mode === undefined || mode === "over"){
|
@@ -993,8 +1152,8 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
993
1152
|
}
|
994
1153
|
|
995
1154
|
// In multi-hier mode, update the parents selection state
|
996
|
-
// issue #82: only if not initializing, because the children may not exist yet
|
997
|
-
// if( !ftnode.data.isStatusNode && opts.selectMode==3 && !isInitializing )
|
1155
|
+
// DT issue #82: only if not initializing, because the children may not exist yet
|
1156
|
+
// if( !ftnode.data.isStatusNode() && opts.selectMode==3 && !isInitializing )
|
998
1157
|
// ftnode._fixSelectionState();
|
999
1158
|
|
1000
1159
|
// In multi-hier mode, update the parents selection state
|
@@ -1091,52 +1250,74 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1091
1250
|
}
|
1092
1251
|
},
|
1093
1252
|
/**
|
1094
|
-
*
|
1095
|
-
* @param {boolean} [discard=false]
|
1096
|
-
* @returns $.Promise
|
1253
|
+
* Remove this node (not allowed for system root).
|
1097
1254
|
*/
|
1098
|
-
|
1099
|
-
|
1100
|
-
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1255
|
+
remove: function() {
|
1256
|
+
return this.parent.removeChild(this);
|
1257
|
+
},
|
1258
|
+
/**
|
1259
|
+
* Remove childNode from list of direct children.
|
1260
|
+
* @param {FancytreeNode} childNode
|
1261
|
+
*/
|
1262
|
+
removeChild: function(childNode) {
|
1263
|
+
return this.tree._callHook("nodeRemoveChild", this, childNode);
|
1106
1264
|
},
|
1107
1265
|
/**
|
1108
|
-
*
|
1266
|
+
* Remove all child nodes and descendents. This converts the node into a leaf.<br>
|
1267
|
+
* If this was a lazy node, it is still considered 'loaded'; call node.resetLazy()
|
1268
|
+
* in order to trigger lazyLoad on next expand.
|
1269
|
+
*/
|
1270
|
+
removeChildren: function() {
|
1271
|
+
return this.tree._callHook("nodeRemoveChildren", this);
|
1272
|
+
},
|
1273
|
+
/**
|
1274
|
+
* This method renders and updates all HTML markup that is required
|
1275
|
+
* to display this node in its current state.<br>
|
1276
|
+
* Note:
|
1277
|
+
* <ul>
|
1278
|
+
* <li>It should only be neccessary to call this method after the node object
|
1279
|
+
* was modified by direct access to its properties, because the common
|
1280
|
+
* API methods (node.setTitle(), moveTo(), addChildren(), remove(), ...)
|
1281
|
+
* already handle this.
|
1282
|
+
* <li> {@link FancytreeNode#renderTitle} and {@link FancytreeNode#renderStatus}
|
1283
|
+
* are implied. If changes are more local, calling only renderTitle() or
|
1284
|
+
* renderStatus() may be sufficient and faster.
|
1285
|
+
* <li>If a node was created/removed, node.render() must be called <i>on the parent</i>.
|
1286
|
+
* </ul>
|
1287
|
+
*
|
1288
|
+
* @param {boolean} [force=false] re-render, even if html markup was already created
|
1289
|
+
* @param {boolean} [deep=false] also render all descendants, even if parent is collapsed
|
1109
1290
|
*/
|
1110
1291
|
render: function(force, deep) {
|
1111
1292
|
return this.tree._callHook("nodeRender", this, force, deep);
|
1112
1293
|
},
|
1113
|
-
/**
|
1294
|
+
/** Create HTML markup for the node's outer <span> (expander, checkbox, icon, and title).
|
1114
1295
|
* @see Fancytree_Hooks#nodeRenderTitle
|
1115
1296
|
*/
|
1116
1297
|
renderTitle: function() {
|
1117
1298
|
return this.tree._callHook("nodeRenderTitle", this);
|
1118
1299
|
},
|
1119
|
-
/**
|
1300
|
+
/** Update element's CSS classes according to node state.
|
1120
1301
|
* @see Fancytree_Hooks#nodeRenderStatus
|
1121
1302
|
*/
|
1122
1303
|
renderStatus: function() {
|
1123
1304
|
return this.tree._callHook("nodeRenderStatus", this);
|
1124
1305
|
},
|
1125
|
-
/**
|
1126
|
-
|
1127
|
-
|
1128
|
-
|
1129
|
-
|
1130
|
-
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
return this.tree._callHook("nodeRemoveChildren", this);
|
1306
|
+
/**
|
1307
|
+
* Remove all children, collapse, and set the lazy-flag, so that the lazyLoad
|
1308
|
+
* event is triggered on next expand.
|
1309
|
+
*/
|
1310
|
+
resetLazy: function() {
|
1311
|
+
this.removeChildren();
|
1312
|
+
this.expanded = false;
|
1313
|
+
this.lazy = true;
|
1314
|
+
this.children = undefined;
|
1315
|
+
this.renderStatus();
|
1136
1316
|
},
|
1137
|
-
// TODO: resetLazy()
|
1138
1317
|
/** Schedule activity for delayed execution (cancel any pending request).
|
1139
1318
|
* scheduleAction('cancel') will only cancel a pending request (if any).
|
1319
|
+
* @param {string} mode
|
1320
|
+
* @param {number} ms
|
1140
1321
|
*/
|
1141
1322
|
scheduleAction: function(mode, ms) {
|
1142
1323
|
if( this.tree.timer ) {
|
@@ -1171,12 +1352,13 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1171
1352
|
* @param {boolean | PlainObject} [effects=false] animation options.
|
1172
1353
|
* @param {FancytreeNode} [topNode=null] this node will remain visible in
|
1173
1354
|
* any case, even if `this` is outside the scroll pane.
|
1174
|
-
* @returns $.Promise
|
1355
|
+
* @returns {$.Promise}
|
1175
1356
|
*/
|
1176
1357
|
scrollIntoView: function(effects, topNode) {
|
1177
1358
|
effects = (effects === true) ? {duration: 200, queue: false} : effects;
|
1178
1359
|
var topNodeY,
|
1179
1360
|
dfd = new $.Deferred(),
|
1361
|
+
that = this,
|
1180
1362
|
nodeY = $(this.span).position().top,
|
1181
1363
|
nodeHeight = $(this.span).height(),
|
1182
1364
|
$container = this.tree.$container,
|
@@ -1210,7 +1392,12 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1210
1392
|
if(effects){
|
1211
1393
|
// TODO: resolve dfd after animation
|
1212
1394
|
// var that = this;
|
1213
|
-
|
1395
|
+
effects.complete = function(){
|
1396
|
+
dfd.resolveWith(that);
|
1397
|
+
};
|
1398
|
+
$container.animate({
|
1399
|
+
scrollTop: newScrollTop
|
1400
|
+
}, effects);
|
1214
1401
|
}else{
|
1215
1402
|
$container[0].scrollTop = newScrollTop;
|
1216
1403
|
dfd.resolveWith(this);
|
@@ -1245,10 +1432,10 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1245
1432
|
setActive: function(flag, opts){
|
1246
1433
|
return this.tree._callHook("nodeSetActive", this, flag, opts);
|
1247
1434
|
},
|
1248
|
-
/**Expand or collapse this node.
|
1435
|
+
/**Expand or collapse this node. Promise is resolved, when lazy loading and animations are done.
|
1249
1436
|
* @param {boolean} [flag=true] pass false to collapse
|
1250
1437
|
* @param {object} [opts] additional options. Defaults to {noAnimation: false, noEvents: false}
|
1251
|
-
* @returns {$.Promise}
|
1438
|
+
* @returns {$.Promise}
|
1252
1439
|
*/
|
1253
1440
|
setExpanded: function(flag, opts){
|
1254
1441
|
return this.tree._callHook("nodeSetExpanded", this, flag, opts);
|
@@ -1261,7 +1448,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1261
1448
|
return this.tree._callHook("nodeSetFocus", this, flag);
|
1262
1449
|
},
|
1263
1450
|
// TODO: setLazyNodeStatus
|
1264
|
-
/**Select this node.
|
1451
|
+
/**Select this node, i.e. check the checkbox.
|
1265
1452
|
* @param {boolean} [flag=true] pass false to deselect
|
1266
1453
|
*/
|
1267
1454
|
setSelected: function(flag){
|
@@ -1334,7 +1521,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1334
1521
|
dict.children = [];
|
1335
1522
|
for(i=0, l=this.children.length; i<l; i++ ){
|
1336
1523
|
node = this.children[i];
|
1337
|
-
if( !node.isStatusNode ){
|
1524
|
+
if( !node.isStatusNode() ){
|
1338
1525
|
dict.children.push(node.toDict(true, callback));
|
1339
1526
|
}
|
1340
1527
|
}
|
@@ -1355,12 +1542,14 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1355
1542
|
toString: function() {
|
1356
1543
|
return "<FancytreeNode(#" + this.key + ", '" + this.title + "')>";
|
1357
1544
|
},
|
1358
|
-
/** Call fn(node) for all child nodes
|
1359
|
-
* Skip current branch, if fn() returns
|
1545
|
+
/** Call fn(node) for all child nodes.<br>
|
1546
|
+
* Stop iteration, if fn() returns false. Skip current branch, if fn() returns "skip".<br>
|
1547
|
+
* Return false if iteration was stopped.
|
1548
|
+
*
|
1360
1549
|
* @param {function} fn the callback function.
|
1361
1550
|
* Return false to stop iteration, return "skip" to skip this node and children only.
|
1362
1551
|
* @param {boolean} [includeSelf=false]
|
1363
|
-
* @returns {boolean}
|
1552
|
+
* @returns {boolean}
|
1364
1553
|
*/
|
1365
1554
|
visit: function(fn, includeSelf) {
|
1366
1555
|
var i, l,
|
@@ -1383,10 +1572,13 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1383
1572
|
}
|
1384
1573
|
return res;
|
1385
1574
|
},
|
1386
|
-
/**
|
1575
|
+
/** Call fn(node) for all parent nodes, bottom-up, including invisible system root.<br>
|
1576
|
+
* Stop iteration, if fn() returns false.<br>
|
1577
|
+
* Return false if iteration was stopped.
|
1387
1578
|
*
|
1388
|
-
* @param fn
|
1389
|
-
*
|
1579
|
+
* @param {function} fn the callback function.
|
1580
|
+
* Return false to stop iteration, return "skip" to skip this node and children only.
|
1581
|
+
* @param {boolean} [includeSelf=false]
|
1390
1582
|
* @returns {boolean}
|
1391
1583
|
*/
|
1392
1584
|
visitParents: function(fn, includeSelf) {
|
@@ -1421,7 +1613,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1421
1613
|
* Construct a new tree object.
|
1422
1614
|
*
|
1423
1615
|
* @class Fancytree
|
1424
|
-
* @classdesc
|
1616
|
+
* @classdesc The controller behind a fancytree.
|
1425
1617
|
* This class also contains 'hook methods': see {@link Fancytree_Hooks}.
|
1426
1618
|
*
|
1427
1619
|
* @param {Widget} widget
|
@@ -1446,15 +1638,24 @@ function Fancytree(widget) {
|
|
1446
1638
|
this.widget = widget;
|
1447
1639
|
this.$div = widget.element;
|
1448
1640
|
this.options = widget.options;
|
1641
|
+
if( this.options && $.isFunction(this.options.lazyload) ) {
|
1642
|
+
if( ! $.isFunction(this.options.lazyLoad ) ) {
|
1643
|
+
this.options.lazyLoad = function() {
|
1644
|
+
FT.warn("The 'lazyload' event is deprecated since 2014-02-25. Use 'lazyLoad' (with uppercase L) instead.");
|
1645
|
+
widget.options.lazyload.apply(this, arguments);
|
1646
|
+
};
|
1647
|
+
}
|
1648
|
+
}
|
1449
1649
|
this.ext = {}; // Active extension instances
|
1450
|
-
|
1650
|
+
// allow to init tree.data.foo from <div data-foo=''>
|
1651
|
+
this.data = _getElementDataAsDict(this.$div);
|
1451
1652
|
this._id = $.ui.fancytree._nextId++;
|
1452
1653
|
this._ns = ".fancytree-" + this._id; // append for namespaced events
|
1453
1654
|
this.activeNode = null;
|
1454
1655
|
this.focusNode = null;
|
1455
1656
|
this._hasFocus = null;
|
1456
1657
|
this.lastSelectedNode = null;
|
1457
|
-
this.systemFocusElement = null
|
1658
|
+
this.systemFocusElement = null;
|
1458
1659
|
|
1459
1660
|
this.statusClassPropName = "span";
|
1460
1661
|
this.ariaPropName = "li";
|
@@ -1695,7 +1896,7 @@ Fancytree.prototype = /** @lends Fancytree# */{
|
|
1695
1896
|
}
|
1696
1897
|
},
|
1697
1898
|
/**
|
1698
|
-
* Return the currently active
|
1899
|
+
* Return the currently active node or null.
|
1699
1900
|
* @returns {FancytreeNode}
|
1700
1901
|
*/
|
1701
1902
|
getActiveNode: function() {
|
@@ -1862,13 +2063,13 @@ Fancytree.prototype = /** @lends Fancytree# */{
|
|
1862
2063
|
// Avoid jshint warning 'Don't make functions within a loop.':
|
1863
2064
|
function __lazyload(key, node, dfd){
|
1864
2065
|
callback.call(self, node, "loading");
|
1865
|
-
node.
|
1866
|
-
|
1867
|
-
|
1868
|
-
|
1869
|
-
|
1870
|
-
|
1871
|
-
|
2066
|
+
node.load().done(function(){
|
2067
|
+
self.loadKeyPath.call(self, loadMap[key], callback, node).always(_makeResolveFunc(dfd, self));
|
2068
|
+
}).fail(function(errMsg){
|
2069
|
+
self.warn("loadKeyPath: error loading: " + key + " (parent: " + root + ")");
|
2070
|
+
callback.call(self, node, "error");
|
2071
|
+
dfd.reject();
|
2072
|
+
});
|
1872
2073
|
}
|
1873
2074
|
for(key in loadMap){
|
1874
2075
|
node = root._findDirectChild(key);
|
@@ -1983,8 +2184,10 @@ Fancytree.prototype = /** @lends Fancytree# */{
|
|
1983
2184
|
$.extend(Fancytree.prototype,
|
1984
2185
|
/** @lends Fancytree_Hooks# */
|
1985
2186
|
{
|
1986
|
-
|
1987
|
-
|
2187
|
+
/** Default handling for mouse click events.
|
2188
|
+
*
|
2189
|
+
* @param {EventData} ctx
|
2190
|
+
*/
|
1988
2191
|
nodeClick: function(ctx) {
|
1989
2192
|
// this.tree.logDebug("ftnode.onClick(" + event.type + "): ftnode:" + this + ", button:" + event.button + ", which: " + event.which);
|
1990
2193
|
var activate, expand,
|
@@ -1997,11 +2200,11 @@ $.extend(Fancytree.prototype,
|
|
1997
2200
|
if( targetType === "expander" ) {
|
1998
2201
|
// Clicking the expander icon always expands/collapses
|
1999
2202
|
this._callHook("nodeToggleExpanded", ctx);
|
2000
|
-
// this._callHook("nodeSetFocus", ctx, true); // issue 95
|
2203
|
+
// this._callHook("nodeSetFocus", ctx, true); // DT issue 95
|
2001
2204
|
} else if( targetType === "checkbox" ) {
|
2002
2205
|
// Clicking the checkbox always (de)selects
|
2003
2206
|
this._callHook("nodeToggleSelected", ctx);
|
2004
|
-
this._callHook("nodeSetFocus", ctx, true); // issue 95
|
2207
|
+
this._callHook("nodeSetFocus", ctx, true); // DT issue 95
|
2005
2208
|
} else {
|
2006
2209
|
// Honor `clickFolderMode` for
|
2007
2210
|
expand = false;
|
@@ -2037,6 +2240,11 @@ $.extend(Fancytree.prototype,
|
|
2037
2240
|
}
|
2038
2241
|
// TODO: return promise?
|
2039
2242
|
},
|
2243
|
+
/** Collapse all other children of same parent.
|
2244
|
+
*
|
2245
|
+
* @param {EventData} ctx
|
2246
|
+
* @param {object} callOpts
|
2247
|
+
*/
|
2040
2248
|
nodeCollapseSiblings: function(ctx, callOpts) {
|
2041
2249
|
// TODO: return promise?
|
2042
2250
|
var ac, i, l,
|
@@ -2051,6 +2259,9 @@ $.extend(Fancytree.prototype,
|
|
2051
2259
|
}
|
2052
2260
|
}
|
2053
2261
|
},
|
2262
|
+
/** Default handling for mouse douleclick events.
|
2263
|
+
* @param {EventData} ctx
|
2264
|
+
*/
|
2054
2265
|
nodeDblclick: function(ctx) {
|
2055
2266
|
// TODO: return promise?
|
2056
2267
|
if( ctx.targetType === "title" && ctx.options.clickFolderMode === 4) {
|
@@ -2066,6 +2277,7 @@ $.extend(Fancytree.prototype,
|
|
2066
2277
|
/** Default handling for mouse keydown events.
|
2067
2278
|
*
|
2068
2279
|
* NOTE: this may be called with node == null if tree (but no node) has focus.
|
2280
|
+
* @param {EventData} ctx
|
2069
2281
|
*/
|
2070
2282
|
nodeKeydown: function(ctx) {
|
2071
2283
|
// TODO: return promise?
|
@@ -2128,17 +2340,12 @@ $.extend(Fancytree.prototype,
|
|
2128
2340
|
// var event = ctx.originalEvent;
|
2129
2341
|
// },
|
2130
2342
|
|
2131
|
-
// /** Trigger
|
2343
|
+
// /** Trigger lazyLoad event (async). */
|
2132
2344
|
// nodeLazyLoad: function(ctx) {
|
2133
2345
|
// var node = ctx.node;
|
2134
2346
|
// if(this._triggerNodeEvent())
|
2135
2347
|
// },
|
2136
|
-
/** Load
|
2137
|
-
* source may be
|
2138
|
-
* - an array of children
|
2139
|
-
* - a node object
|
2140
|
-
* - an Ajax options object
|
2141
|
-
* - an Ajax.promise
|
2348
|
+
/** Load child nodes (async).
|
2142
2349
|
*
|
2143
2350
|
* @param {EventData} ctx
|
2144
2351
|
* @param {object[]|object|string|$.Promise|function} source
|
@@ -2178,9 +2385,12 @@ $.extend(Fancytree.prototype,
|
|
2178
2385
|
}
|
2179
2386
|
|
2180
2387
|
// TODO: change 'pipe' to 'then' for jQuery 1.8
|
2388
|
+
// $.pipe returns a new Promise with filtered results
|
2181
2389
|
source = source.pipe(function (data, textStatus, jqXHR) {
|
2182
2390
|
var res;
|
2183
|
-
if(typeof data === "string"){
|
2391
|
+
if(typeof data === "string"){
|
2392
|
+
$.error("Ajax request returned a string (did you get the JSON dataType wrong?).");
|
2393
|
+
}
|
2184
2394
|
// postProcess is similar to the standard dataFilter hook,
|
2185
2395
|
// but it is also called for JSONP
|
2186
2396
|
if( ctx.options.postProcess ){
|
@@ -2202,8 +2412,11 @@ $.extend(Fancytree.prototype,
|
|
2202
2412
|
}
|
2203
2413
|
|
2204
2414
|
if($.isFunction(source.promise)){
|
2205
|
-
// `source` is a
|
2415
|
+
// `source` is a deferred, i.e. ajax request
|
2416
|
+
_assert(!node.isLoading());
|
2417
|
+
// node._isLoading = true;
|
2206
2418
|
tree.nodeSetStatus(ctx, "loading");
|
2419
|
+
|
2207
2420
|
source.done(function () {
|
2208
2421
|
tree.nodeSetStatus(ctx, "ok");
|
2209
2422
|
}).fail(function(error){
|
@@ -2222,13 +2435,13 @@ $.extend(Fancytree.prototype,
|
|
2222
2435
|
tree.nodeSetStatus(ctx, "error", ctxErr.message, ctxErr.details);
|
2223
2436
|
});
|
2224
2437
|
}
|
2225
|
-
|
2438
|
+
// $.when(source) resolves also for non-deferreds
|
2226
2439
|
return $.when(source).done(function(children){
|
2227
2440
|
var metaData;
|
2228
2441
|
|
2229
2442
|
if( $.isPlainObject(children) ){
|
2230
2443
|
// We got {foo: 'abc', children: [...]}
|
2231
|
-
// Copy extra properties to tree.data.
|
2444
|
+
// Copy extra properties to tree.data.foo
|
2232
2445
|
_assert($.isArray(children.children), "source must contain (or be) an array of children");
|
2233
2446
|
_assert(node.isRoot(), "source may only be an object for root nodes");
|
2234
2447
|
metaData = children;
|
@@ -2238,34 +2451,18 @@ $.extend(Fancytree.prototype,
|
|
2238
2451
|
}
|
2239
2452
|
_assert($.isArray(children), "expected array of children");
|
2240
2453
|
node._setChildren(children);
|
2241
|
-
|
2242
|
-
|
2243
|
-
|
2244
|
-
}
|
2454
|
+
// trigger fancytreeloadchildren
|
2455
|
+
// if( node.parent ) {
|
2456
|
+
tree._triggerNodeEvent("loadChildren", node);
|
2457
|
+
// }
|
2458
|
+
// }).always(function(){
|
2459
|
+
// node._isLoading = false;
|
2245
2460
|
});
|
2246
2461
|
},
|
2247
|
-
|
2248
|
-
// // Return true, if all parents are expanded.
|
2249
|
-
// var parents = ctx.node.getParentList(false, false);
|
2250
|
-
// for(var i=0, l=parents.length; i<l; i++){
|
2251
|
-
// if( ! parents[i].expanded ){ return false; }
|
2252
|
-
// }
|
2253
|
-
// return true;
|
2254
|
-
// },
|
2255
|
-
/** Expand all keys that */
|
2462
|
+
/** [Not Implemented] */
|
2256
2463
|
nodeLoadKeyPath: function(ctx, keyPathList) {
|
2257
2464
|
// TODO: implement and improve
|
2258
|
-
// http://code.google.com/p/
|
2259
|
-
},
|
2260
|
-
/** Expand all parents.*/
|
2261
|
-
nodeMakeVisible: function(ctx) {
|
2262
|
-
// TODO: also scroll as neccessary: http://stackoverflow.com/questions/8938352/fancytree-how-to-scroll-to-active-node
|
2263
|
-
// Do we need an extra parameter?
|
2264
|
-
var i, l,
|
2265
|
-
parents = ctx.node.getParentList(false, false);
|
2266
|
-
for(i=0, l=parents.length; i<l; i++){
|
2267
|
-
parents[i].setExpanded(true);
|
2268
|
-
}
|
2465
|
+
// http://code.google.com/p/dynatree/issues/detail?id=222
|
2269
2466
|
},
|
2270
2467
|
/**
|
2271
2468
|
* Remove a single direct child of ctx.node.
|
@@ -2279,7 +2476,7 @@ $.extend(Fancytree.prototype,
|
|
2279
2476
|
subCtx = $.extend({}, ctx, {node: childNode}),
|
2280
2477
|
children = node.children;
|
2281
2478
|
|
2282
|
-
FT.debug("nodeRemoveChild()", node.toString(), childNode.toString());
|
2479
|
+
// FT.debug("nodeRemoveChild()", node.toString(), childNode.toString());
|
2283
2480
|
|
2284
2481
|
if( children.length === 1 ) {
|
2285
2482
|
_assert(childNode === children[0]);
|
@@ -2300,6 +2497,7 @@ $.extend(Fancytree.prototype,
|
|
2300
2497
|
childNode.visit(function(n){
|
2301
2498
|
n.parent = null;
|
2302
2499
|
}, true);
|
2500
|
+
this._callHook("treeRegisterNode", this, false, childNode);
|
2303
2501
|
if ( opts.removeNode ){
|
2304
2502
|
opts.removeNode.call(ctx.tree, {type: "removeNode"}, subCtx);
|
2305
2503
|
}
|
@@ -2312,7 +2510,7 @@ $.extend(Fancytree.prototype,
|
|
2312
2510
|
nodeRemoveChildMarkup: function(ctx) {
|
2313
2511
|
var node = ctx.node;
|
2314
2512
|
|
2315
|
-
FT.debug("nodeRemoveChildMarkup()", node.toString());
|
2513
|
+
// FT.debug("nodeRemoveChildMarkup()", node.toString());
|
2316
2514
|
// TODO: Unlink attr.ftnode to support GC
|
2317
2515
|
if(node.ul){
|
2318
2516
|
if( node.isRoot() ) {
|
@@ -2331,11 +2529,12 @@ $.extend(Fancytree.prototype,
|
|
2331
2529
|
*/
|
2332
2530
|
nodeRemoveChildren: function(ctx) {
|
2333
2531
|
var subCtx,
|
2532
|
+
tree = ctx.tree,
|
2334
2533
|
node = ctx.node,
|
2335
2534
|
children = node.children,
|
2336
2535
|
opts = ctx.options;
|
2337
2536
|
|
2338
|
-
FT.debug("nodeRemoveChildren()", node.toString());
|
2537
|
+
// FT.debug("nodeRemoveChildren()", node.toString());
|
2339
2538
|
if(!children){
|
2340
2539
|
return;
|
2341
2540
|
}
|
@@ -2352,14 +2551,18 @@ $.extend(Fancytree.prototype,
|
|
2352
2551
|
subCtx = $.extend({}, ctx);
|
2353
2552
|
node.visit(function(n){
|
2354
2553
|
n.parent = null;
|
2554
|
+
tree._callHook("treeRegisterNode", tree, false, n);
|
2355
2555
|
if ( opts.removeNode ){
|
2356
2556
|
subCtx.node = n;
|
2357
2557
|
opts.removeNode.call(ctx.tree, {type: "removeNode"}, subCtx);
|
2358
2558
|
}
|
2359
2559
|
});
|
2360
|
-
|
2361
|
-
|
2362
|
-
|
2560
|
+
if( node.lazy ){
|
2561
|
+
// 'undefined' would be interpreted as 'not yet loaded' for lazy nodes
|
2562
|
+
node.children = [];
|
2563
|
+
} else{
|
2564
|
+
node.children = null;
|
2565
|
+
}
|
2363
2566
|
this.nodeRenderStatus(ctx);
|
2364
2567
|
},
|
2365
2568
|
/**Remove HTML markup for ctx.node and all its descendents.
|
@@ -2367,7 +2570,7 @@ $.extend(Fancytree.prototype,
|
|
2367
2570
|
*/
|
2368
2571
|
nodeRemoveMarkup: function(ctx) {
|
2369
2572
|
var node = ctx.node;
|
2370
|
-
FT.debug("nodeRemoveMarkup()", node.toString());
|
2573
|
+
// FT.debug("nodeRemoveMarkup()", node.toString());
|
2371
2574
|
// TODO: Unlink attr.ftnode to support GC
|
2372
2575
|
if(node.li){
|
2373
2576
|
$(node.li).remove();
|
@@ -2376,7 +2579,7 @@ $.extend(Fancytree.prototype,
|
|
2376
2579
|
this.nodeRemoveChildMarkup(ctx);
|
2377
2580
|
},
|
2378
2581
|
/**
|
2379
|
-
* Create
|
2582
|
+
* Create `<li><span>..</span> .. </li>` tags for this node.
|
2380
2583
|
*
|
2381
2584
|
* This method takes care that all HTML markup is created that is required
|
2382
2585
|
* to display this node in it's current state.
|
@@ -2386,7 +2589,7 @@ $.extend(Fancytree.prototype,
|
|
2386
2589
|
* nodeRenderTitle() and nodeRenderStatus() are implied.
|
2387
2590
|
*
|
2388
2591
|
* Note: if a node was created/removed, nodeRender() must be called for the
|
2389
|
-
* parent
|
2592
|
+
* parent.
|
2390
2593
|
* <code>
|
2391
2594
|
* <li id='KEY' ftnode=NODE>
|
2392
2595
|
* <span class='fancytree-node fancytree-expanded fancytree-has-children fancytree-lastsib fancytree-exp-el fancytree-ico-e'>
|
@@ -2402,10 +2605,10 @@ $.extend(Fancytree.prototype,
|
|
2402
2605
|
* </li>
|
2403
2606
|
* </code>
|
2404
2607
|
*
|
2405
|
-
* @param
|
2406
|
-
* @param
|
2407
|
-
* @param
|
2408
|
-
* @param
|
2608
|
+
* @param {EventData} ctx
|
2609
|
+
* @param {boolean} [force=false] re-render, even if html markup was already created
|
2610
|
+
* @param {boolean} [deep=false] also render all descendants, even if parent is collapsed
|
2611
|
+
* @param {boolean} [collapsed=false] force root node to be collapsed, so we can apply animated expand later
|
2409
2612
|
*/
|
2410
2613
|
nodeRender: function(ctx, force, deep, collapsed, _recursive) {
|
2411
2614
|
/* This method must take care of all cases where the current data mode
|
@@ -2426,10 +2629,10 @@ $.extend(Fancytree.prototype,
|
|
2426
2629
|
parent = node.parent,
|
2427
2630
|
isRootNode = !parent,
|
2428
2631
|
children = node.children;
|
2429
|
-
FT.debug("nodeRender(" + !!force + ", " + !!deep + ")", node.toString());
|
2632
|
+
// FT.debug("nodeRender(" + !!force + ", " + !!deep + ")", node.toString());
|
2430
2633
|
|
2431
2634
|
if( ! isRootNode && ! parent.ul ) {
|
2432
|
-
//
|
2635
|
+
// Calling node.collapse on a deep, unrendered node
|
2433
2636
|
return;
|
2434
2637
|
}
|
2435
2638
|
_assert(isRootNode || parent.ul, "parent UL must exist");
|
@@ -2485,6 +2688,7 @@ $.extend(Fancytree.prototype,
|
|
2485
2688
|
}
|
2486
2689
|
}else{
|
2487
2690
|
// this.nodeRenderTitle(ctx);
|
2691
|
+
this.nodeRenderStatus(ctx);
|
2488
2692
|
}
|
2489
2693
|
// Allow tweaking after node state was rendered
|
2490
2694
|
if ( opts.renderNode ){
|
@@ -2535,7 +2739,7 @@ $.extend(Fancytree.prototype,
|
|
2535
2739
|
childNode1 = children[i];
|
2536
2740
|
childNode2 = childLI.ftnode;
|
2537
2741
|
if( childNode1 !== childNode2 ) {
|
2538
|
-
node.debug("_fixOrder: mismatch at index " + i + ": " + childNode1 + " != " + childNode2);
|
2742
|
+
// node.debug("_fixOrder: mismatch at index " + i + ": " + childNode1 + " != " + childNode2);
|
2539
2743
|
node.ul.insertBefore(childNode1.li, childNode2.li);
|
2540
2744
|
} else {
|
2541
2745
|
childLI = childLI.nextSibling;
|
@@ -2552,7 +2756,7 @@ $.extend(Fancytree.prototype,
|
|
2552
2756
|
}
|
2553
2757
|
if( !isRootNode ){
|
2554
2758
|
// Update element classes according to node state
|
2555
|
-
this.nodeRenderStatus(ctx);
|
2759
|
+
// this.nodeRenderStatus(ctx);
|
2556
2760
|
// Finally add the whole structure to the DOM, so the browser can render
|
2557
2761
|
if(firstTime){
|
2558
2762
|
parent.ul.appendChild(node.li);
|
@@ -2560,7 +2764,10 @@ $.extend(Fancytree.prototype,
|
|
2560
2764
|
}
|
2561
2765
|
},
|
2562
2766
|
/** Create HTML for the node's outer <span> (expander, checkbox, icon, and title).
|
2767
|
+
*
|
2768
|
+
* nodeRenderStatus() is implied.
|
2563
2769
|
* @param {EventData} ctx
|
2770
|
+
* @param {string} [title] optinal new title
|
2564
2771
|
*/
|
2565
2772
|
nodeRenderTitle: function(ctx, title) {
|
2566
2773
|
// set node connector images, links and text
|
@@ -2600,7 +2807,7 @@ $.extend(Fancytree.prototype,
|
|
2600
2807
|
}
|
2601
2808
|
}
|
2602
2809
|
// Checkbox mode
|
2603
|
-
if( opts.checkbox && node.hideCheckbox !== true && !node.isStatusNode ) {
|
2810
|
+
if( opts.checkbox && node.hideCheckbox !== true && !node.isStatusNode() ) {
|
2604
2811
|
if(aria){
|
2605
2812
|
ares.push("<span role='checkbox' class='fancytree-checkbox'></span>");
|
2606
2813
|
}else{
|
@@ -2628,7 +2835,7 @@ $.extend(Fancytree.prototype,
|
|
2628
2835
|
}
|
2629
2836
|
if(!nodeTitle){
|
2630
2837
|
// TODO: escape tooltip string
|
2631
|
-
tooltip = node.tooltip ? " title='" + node.tooltip
|
2838
|
+
tooltip = node.tooltip ? " title='" + FT.escapeHtml(node.tooltip) + "'" : "";
|
2632
2839
|
id = aria ? " id='ftal_" + node.key + "'" : "";
|
2633
2840
|
role = aria ? " role='treeitem'" : "";
|
2634
2841
|
tabindex = opts.titlesTabbable ? " tabindex='0'" : "";
|
@@ -2639,6 +2846,8 @@ $.extend(Fancytree.prototype,
|
|
2639
2846
|
// Note: this will trigger focusout, if node had the focus
|
2640
2847
|
//$(node.span).html(ares.join("")); // it will cleanup the jQuery data currently associated with SPAN (if any), but it executes more slowly
|
2641
2848
|
node.span.innerHTML = ares.join("");
|
2849
|
+
// Update CSS classes
|
2850
|
+
this.nodeRenderStatus(ctx);
|
2642
2851
|
},
|
2643
2852
|
/** Update element classes according to node state.
|
2644
2853
|
* @param {EventData} ctx
|
@@ -2668,7 +2877,7 @@ $.extend(Fancytree.prototype,
|
|
2668
2877
|
cnList.push(cn.active);
|
2669
2878
|
// $(">span.fancytree-title", statusElem).attr("tabindex", "0");
|
2670
2879
|
// tree.$container.removeAttr("tabindex");
|
2671
|
-
}else{
|
2880
|
+
// }else{
|
2672
2881
|
// $(">span.fancytree-title", statusElem).removeAttr("tabindex");
|
2673
2882
|
// tree.$container.attr("tabindex", "0");
|
2674
2883
|
}
|
@@ -2712,6 +2921,12 @@ $.extend(Fancytree.prototype,
|
|
2712
2921
|
if( node.partsel ){
|
2713
2922
|
cnList.push(cn.partsel);
|
2714
2923
|
}
|
2924
|
+
if( node._isLoading ){
|
2925
|
+
cnList.push(cn.loading);
|
2926
|
+
}
|
2927
|
+
if( node._error ){
|
2928
|
+
cnList.push(cn.error);
|
2929
|
+
}
|
2715
2930
|
if( node.selected ){
|
2716
2931
|
cnList.push(cn.selected);
|
2717
2932
|
if(aria){
|
@@ -2755,7 +2970,7 @@ $.extend(Fancytree.prototype,
|
|
2755
2970
|
* If flag is false, the node is deactivated (must be a synchronous operation)
|
2756
2971
|
* @param {EventData} ctx
|
2757
2972
|
* @param {boolean} [flag=true]
|
2758
|
-
* @param {object} [opts] additional options. Defaults to {}
|
2973
|
+
* @param {object} [opts] additional options. Defaults to {noEvents: false}
|
2759
2974
|
*/
|
2760
2975
|
nodeSetActive: function(ctx, flag, callOpts) {
|
2761
2976
|
// Handle user click / [space] / [enter], according to clickFolderMode.
|
@@ -2765,16 +2980,17 @@ $.extend(Fancytree.prototype,
|
|
2765
2980
|
tree = ctx.tree,
|
2766
2981
|
opts = ctx.options,
|
2767
2982
|
// userEvent = !!ctx.originalEvent,
|
2983
|
+
noEvents = (callOpts.noEvents === true),
|
2768
2984
|
isActive = (node === tree.activeNode);
|
2769
2985
|
|
2770
2986
|
// flag defaults to true
|
2771
2987
|
flag = (flag !== false);
|
2772
|
-
node.debug("nodeSetActive", flag);
|
2988
|
+
// node.debug("nodeSetActive", flag);
|
2773
2989
|
|
2774
2990
|
if(isActive === flag){
|
2775
2991
|
// Nothing to do
|
2776
2992
|
return _getResolvedPromise(node);
|
2777
|
-
}else if(flag && this._triggerNodeEvent("beforeActivate", node, ctx.originalEvent) === false ){
|
2993
|
+
}else if(flag && !noEvents && this._triggerNodeEvent("beforeActivate", node, ctx.originalEvent) === false ){
|
2778
2994
|
// Callback returned false
|
2779
2995
|
return _getRejectedPromise(node, ["rejected"]);
|
2780
2996
|
}
|
@@ -2786,24 +3002,29 @@ $.extend(Fancytree.prototype,
|
|
2786
3002
|
_assert(tree.activeNode === null, "deactivate was out of sync?");
|
2787
3003
|
}
|
2788
3004
|
if(opts.activeVisible){
|
2789
|
-
tree.nodeMakeVisible(ctx);
|
3005
|
+
// tree.nodeMakeVisible(ctx);
|
3006
|
+
node.makeVisible();
|
2790
3007
|
}
|
2791
3008
|
tree.activeNode = node;
|
2792
3009
|
tree.nodeRenderStatus(ctx);
|
2793
3010
|
tree.nodeSetFocus(ctx);
|
2794
|
-
|
3011
|
+
if( !noEvents ) {
|
3012
|
+
tree._triggerNodeEvent("activate", node, ctx.originalEvent);
|
3013
|
+
}
|
2795
3014
|
}else{
|
2796
3015
|
_assert(tree.activeNode === node, "node was not active (inconsistency)");
|
2797
3016
|
tree.activeNode = null;
|
2798
3017
|
this.nodeRenderStatus(ctx);
|
2799
|
-
|
3018
|
+
if( !noEvents ) {
|
3019
|
+
ctx.tree._triggerNodeEvent("deactivate", node, ctx.originalEvent);
|
3020
|
+
}
|
2800
3021
|
}
|
2801
3022
|
},
|
2802
3023
|
/** Expand or collapse node, return Deferred.promise.
|
2803
3024
|
*
|
2804
3025
|
* @param {EventData} ctx
|
2805
3026
|
* @param {boolean} [flag=true]
|
2806
|
-
* @param {object} [opts] additional options. Defaults to {noAnimation: false}
|
3027
|
+
* @param {object} [opts] additional options. Defaults to {noAnimation: false, noEvents: false}
|
2807
3028
|
* @returns {$.Promise} The deferred will be resolved as soon as the (lazy)
|
2808
3029
|
* data was retrieved, rendered, and the expand animation finshed.
|
2809
3030
|
*/
|
@@ -2813,24 +3034,26 @@ $.extend(Fancytree.prototype,
|
|
2813
3034
|
node = ctx.node,
|
2814
3035
|
tree = ctx.tree,
|
2815
3036
|
opts = ctx.options,
|
2816
|
-
noAnimation = callOpts.noAnimation === true
|
3037
|
+
noAnimation = (callOpts.noAnimation === true),
|
3038
|
+
noEvents = (callOpts.noEvents === true);
|
2817
3039
|
|
2818
3040
|
// flag defaults to true
|
2819
3041
|
flag = (flag !== false);
|
2820
3042
|
|
2821
|
-
node.debug("nodeSetExpanded(" + flag + ")");
|
3043
|
+
// node.debug("nodeSetExpanded(" + flag + ")");
|
2822
3044
|
|
2823
3045
|
if((node.expanded && flag) || (!node.expanded && !flag)){
|
2824
3046
|
// Nothing to do
|
2825
|
-
node.debug("nodeSetExpanded(" + flag + "): nothing to do");
|
3047
|
+
// node.debug("nodeSetExpanded(" + flag + "): nothing to do");
|
2826
3048
|
return _getResolvedPromise(node);
|
2827
3049
|
}else if(flag && !node.lazy && !node.hasChildren() ){
|
2828
3050
|
// Prevent expanding of empty nodes
|
2829
|
-
return _getRejectedPromise(node, ["empty"]);
|
3051
|
+
// return _getRejectedPromise(node, ["empty"]);
|
3052
|
+
return _getResolvedPromise(node);
|
2830
3053
|
}else if( !flag && node.getLevel() < opts.minExpandLevel ) {
|
2831
3054
|
// Prevent collapsing locked levels
|
2832
3055
|
return _getRejectedPromise(node, ["locked"]);
|
2833
|
-
}else if ( this._triggerNodeEvent("beforeExpand", node, ctx.originalEvent) === false ){
|
3056
|
+
}else if ( !noEvents && this._triggerNodeEvent("beforeExpand", node, ctx.originalEvent) === false ){
|
2834
3057
|
// Callback returned false
|
2835
3058
|
return _getRejectedPromise(node, ["rejected"]);
|
2836
3059
|
}
|
@@ -2857,10 +3080,17 @@ $.extend(Fancytree.prototype,
|
|
2857
3080
|
}
|
2858
3081
|
// Trigger expand/collapse after expanding
|
2859
3082
|
dfd.done(function(){
|
2860
|
-
ctx.tree._triggerNodeEvent(flag ? "expand" : "collapse", ctx);
|
2861
3083
|
if( opts.autoScroll && !noAnimation ) {
|
2862
3084
|
// Scroll down to last child, but keep current node visible
|
2863
|
-
node.getLastChild().scrollIntoView(true, node)
|
3085
|
+
node.getLastChild().scrollIntoView(true, node).always(function(){
|
3086
|
+
if( !noEvents ) {
|
3087
|
+
ctx.tree._triggerNodeEvent(flag ? "expand" : "collapse", ctx);
|
3088
|
+
}
|
3089
|
+
});
|
3090
|
+
} else {
|
3091
|
+
if( !noEvents ) {
|
3092
|
+
ctx.tree._triggerNodeEvent(flag ? "expand" : "collapse", ctx);
|
3093
|
+
}
|
2864
3094
|
}
|
2865
3095
|
});
|
2866
3096
|
|
@@ -2896,9 +3126,9 @@ $.extend(Fancytree.prototype,
|
|
2896
3126
|
} else {
|
2897
3127
|
duration = opts.fx.duration || 200;
|
2898
3128
|
easing = opts.fx.easing;
|
2899
|
-
node.debug("nodeSetExpanded: animate start...");
|
3129
|
+
// node.debug("nodeSetExpanded: animate start...");
|
2900
3130
|
$(node.ul).animate(opts.fx, duration, easing, function(){
|
2901
|
-
node.debug("nodeSetExpanded: animate done");
|
3131
|
+
// node.debug("nodeSetExpanded: animate done");
|
2902
3132
|
callback();
|
2903
3133
|
});
|
2904
3134
|
return;
|
@@ -2910,9 +3140,9 @@ $.extend(Fancytree.prototype,
|
|
2910
3140
|
|
2911
3141
|
// Load lazy nodes, if any. Then continue with _afterLoad()
|
2912
3142
|
if(flag && node.lazy && node.hasChildren() === undefined){
|
2913
|
-
node.debug("nodeSetExpanded: load start...");
|
2914
|
-
node.
|
2915
|
-
node.debug("nodeSetExpanded: load done");
|
3143
|
+
// node.debug("nodeSetExpanded: load start...");
|
3144
|
+
node.load().done(function(){
|
3145
|
+
// node.debug("nodeSetExpanded: load done");
|
2916
3146
|
if(dfd.notifyWith){ // requires jQuery 1.6+
|
2917
3147
|
dfd.notifyWith(node, ["loaded"]);
|
2918
3148
|
}
|
@@ -2921,8 +3151,8 @@ $.extend(Fancytree.prototype,
|
|
2921
3151
|
_afterLoad(function () { dfd.rejectWith(node, ["load failed (" + errMsg + ")"]); });
|
2922
3152
|
});
|
2923
3153
|
/*
|
2924
|
-
var source = tree._triggerNodeEvent("
|
2925
|
-
_assert(typeof source !== "boolean", "
|
3154
|
+
var source = tree._triggerNodeEvent("lazyLoad", node, ctx.originalEvent);
|
3155
|
+
_assert(typeof source !== "boolean", "lazyLoad event must return source in data.result");
|
2926
3156
|
node.debug("nodeSetExpanded: load start...");
|
2927
3157
|
this._callHook("nodeLoadChildren", ctx, source).done(function(){
|
2928
3158
|
node.debug("nodeSetExpanded: load done");
|
@@ -2937,15 +3167,15 @@ $.extend(Fancytree.prototype,
|
|
2937
3167
|
}else{
|
2938
3168
|
_afterLoad(function () { dfd.resolveWith(node); });
|
2939
3169
|
}
|
2940
|
-
node.debug("nodeSetExpanded: returns");
|
3170
|
+
// node.debug("nodeSetExpanded: returns");
|
2941
3171
|
return dfd.promise();
|
2942
3172
|
},
|
2943
|
-
/**
|
3173
|
+
/** Focus ot blur this node.
|
2944
3174
|
* @param {EventData} ctx
|
2945
3175
|
* @param {boolean} [flag=true]
|
2946
3176
|
*/
|
2947
3177
|
nodeSetFocus: function(ctx, flag) {
|
2948
|
-
ctx.node.debug("nodeSetFocus(" + flag + ")");
|
3178
|
+
// ctx.node.debug("nodeSetFocus(" + flag + ")");
|
2949
3179
|
var ctx2,
|
2950
3180
|
tree = ctx.tree,
|
2951
3181
|
node = ctx.node;
|
@@ -2955,7 +3185,7 @@ $.extend(Fancytree.prototype,
|
|
2955
3185
|
// Blur previous node if any
|
2956
3186
|
if(tree.focusNode){
|
2957
3187
|
if(tree.focusNode === node && flag){
|
2958
|
-
node.debug("nodeSetFocus(" + flag + "): nothing to do");
|
3188
|
+
// node.debug("nodeSetFocus(" + flag + "): nothing to do");
|
2959
3189
|
return;
|
2960
3190
|
}
|
2961
3191
|
ctx2 = $.extend({}, ctx, {node: tree.focusNode});
|
@@ -2970,7 +3200,8 @@ $.extend(Fancytree.prototype,
|
|
2970
3200
|
// Note: we pass _calledByNodeSetFocus=true
|
2971
3201
|
this._callHook("treeSetFocus", ctx, true, true);
|
2972
3202
|
}
|
2973
|
-
this.nodeMakeVisible(ctx);
|
3203
|
+
// this.nodeMakeVisible(ctx);
|
3204
|
+
node.makeVisible();
|
2974
3205
|
tree.focusNode = node;
|
2975
3206
|
// node.debug("FOCUS...");
|
2976
3207
|
// $(node.span).find(".fancytree-title").focus();
|
@@ -3032,19 +3263,19 @@ $.extend(Fancytree.prototype,
|
|
3032
3263
|
* @param details
|
3033
3264
|
*/
|
3034
3265
|
nodeSetStatus: function(ctx, status, message, details) {
|
3035
|
-
var
|
3036
|
-
|
3037
|
-
|
3038
|
-
cn = ctx.options._classNames;
|
3266
|
+
var node = ctx.node,
|
3267
|
+
tree = ctx.tree;
|
3268
|
+
// cn = ctx.options._classNames;
|
3039
3269
|
|
3040
|
-
_clearStatusNode
|
3270
|
+
function _clearStatusNode() {
|
3271
|
+
// Remove dedicated dummy node, if any
|
3041
3272
|
var firstChild = ( node.children ? node.children[0] : null );
|
3042
|
-
if ( firstChild && firstChild.isStatusNode ) {
|
3273
|
+
if ( firstChild && firstChild.isStatusNode() ) {
|
3043
3274
|
try{
|
3044
3275
|
// I've seen exceptions here with loadKeyPath...
|
3045
3276
|
if(node.ul){
|
3046
3277
|
node.ul.removeChild(firstChild.li);
|
3047
|
-
firstChild.li = null; // avoid leaks (issue 215)
|
3278
|
+
firstChild.li = null; // avoid leaks (DT issue 215)
|
3048
3279
|
}
|
3049
3280
|
}catch(e){}
|
3050
3281
|
if( node.children.length === 1 ){
|
@@ -3053,48 +3284,58 @@ $.extend(Fancytree.prototype,
|
|
3053
3284
|
node.children.shift();
|
3054
3285
|
}
|
3055
3286
|
}
|
3056
|
-
}
|
3057
|
-
_setStatusNode
|
3287
|
+
}
|
3288
|
+
function _setStatusNode(data, type) {
|
3289
|
+
// Create/modify the dedicated dummy node for 'loading...' or
|
3290
|
+
// 'error!' status. (only called for direct child of the invisible
|
3291
|
+
// system root)
|
3058
3292
|
var firstChild = ( node.children ? node.children[0] : null );
|
3059
|
-
if ( firstChild && firstChild.isStatusNode ) {
|
3293
|
+
if ( firstChild && firstChild.isStatusNode() ) {
|
3060
3294
|
$.extend(firstChild, data);
|
3061
3295
|
tree._callHook("nodeRender", firstChild);
|
3062
3296
|
} else {
|
3063
3297
|
data.key = "_statusNode";
|
3064
3298
|
node._setChildren([data]);
|
3065
|
-
node.children[0].
|
3299
|
+
node.children[0].statusNodeType = type;
|
3066
3300
|
tree.render();
|
3067
3301
|
}
|
3068
3302
|
return node.children[0];
|
3069
|
-
}
|
3070
|
-
|
3303
|
+
}
|
3304
|
+
|
3305
|
+
switch( status ){
|
3071
3306
|
case "ok":
|
3072
3307
|
_clearStatusNode();
|
3073
|
-
$(node.span).removeClass(cn.loading);
|
3074
|
-
|
3308
|
+
// $(node.span).removeClass(cn.loading).removeClass(cn.error);
|
3309
|
+
node._isLoading = false;
|
3310
|
+
node._error = null;
|
3311
|
+
node.renderStatus();
|
3075
3312
|
break;
|
3076
3313
|
case "loading":
|
3077
|
-
$(node.span).removeClass(cn.error);
|
3078
|
-
|
3079
|
-
if(!node.parent){
|
3314
|
+
// $(node.span).removeClass(cn.error).addClass(cn.loading);
|
3315
|
+
if( !node.parent ) {
|
3080
3316
|
_setStatusNode({
|
3081
3317
|
title: tree.options.strings.loading + (message ? " (" + message + ") " : ""),
|
3082
3318
|
tooltip: details,
|
3083
3319
|
extraClasses: "fancytree-statusnode-wait"
|
3084
|
-
});
|
3320
|
+
}, status);
|
3085
3321
|
}
|
3322
|
+
node._isLoading = true;
|
3323
|
+
node._error = null;
|
3324
|
+
node.renderStatus();
|
3086
3325
|
break;
|
3087
3326
|
case "error":
|
3088
|
-
$(node.span).removeClass(cn.loading);
|
3089
|
-
$(node.span).addClass(cn.error);
|
3327
|
+
// $(node.span).removeClass(cn.loading).addClass(cn.error);
|
3090
3328
|
_setStatusNode({
|
3091
3329
|
title: tree.options.strings.loadError + (message ? " (" + message + ") " : ""),
|
3092
3330
|
tooltip: details,
|
3093
3331
|
extraClasses: "fancytree-statusnode-error"
|
3094
|
-
});
|
3332
|
+
}, status);
|
3333
|
+
node._isLoading = false;
|
3334
|
+
node._error = { message: message, details: details };
|
3335
|
+
node.renderStatus();
|
3095
3336
|
break;
|
3096
3337
|
default:
|
3097
|
-
$.error("invalid status " + status);
|
3338
|
+
$.error("invalid node status " + status);
|
3098
3339
|
}
|
3099
3340
|
},
|
3100
3341
|
/**
|
@@ -3140,7 +3381,7 @@ $.extend(Fancytree.prototype,
|
|
3140
3381
|
},
|
3141
3382
|
/** Parse Fancytree from source, as configured in the options.
|
3142
3383
|
* @param {EventData} ctx
|
3143
|
-
* @param {object} [source] new source
|
3384
|
+
* @param {object} [source] optional new source (use last data otherwise)
|
3144
3385
|
*/
|
3145
3386
|
treeLoad: function(ctx, source) {
|
3146
3387
|
var type, $ul,
|
@@ -3162,6 +3403,8 @@ $.extend(Fancytree.prototype,
|
|
3162
3403
|
$ul = $container.find(">ul:first");
|
3163
3404
|
$ul.addClass("ui-fancytree-source ui-helper-hidden");
|
3164
3405
|
source = $.ui.fancytree.parseHtml($ul);
|
3406
|
+
// allow to init tree.data.foo from <ul data-foo=''>
|
3407
|
+
this.data = $.extend(this.data, _getElementDataAsDict($ul));
|
3165
3408
|
break;
|
3166
3409
|
case "json":
|
3167
3410
|
// $().addClass("ui-helper-hidden");
|
@@ -3193,12 +3436,23 @@ $.extend(Fancytree.prototype,
|
|
3193
3436
|
});
|
3194
3437
|
return dfd;
|
3195
3438
|
},
|
3439
|
+
/** Node was inserted into or removed from the tree.
|
3440
|
+
* @param {EventData} ctx
|
3441
|
+
* @param {boolean} add
|
3442
|
+
* @param {FancytreeNode} node
|
3443
|
+
*/
|
3444
|
+
treeRegisterNode: function(ctx, add, node) {
|
3445
|
+
},
|
3446
|
+
/** Widget got focus.
|
3447
|
+
* @param {EventData} ctx
|
3448
|
+
* @param {boolean} [flag=true]
|
3449
|
+
*/
|
3196
3450
|
treeSetFocus: function(ctx, flag, _calledByNodeSetFocus) {
|
3197
3451
|
flag = (flag !== false);
|
3198
3452
|
|
3199
|
-
this.debug("treeSetFocus(" + flag + "), _calledByNodeSetFocus: " + _calledByNodeSetFocus);
|
3200
|
-
this.debug(" focusNode: " + this.focusNode);
|
3201
|
-
this.debug(" activeNode: " + this.activeNode);
|
3453
|
+
// this.debug("treeSetFocus(" + flag + "), _calledByNodeSetFocus: " + _calledByNodeSetFocus);
|
3454
|
+
// this.debug(" focusNode: " + this.focusNode);
|
3455
|
+
// this.debug(" activeNode: " + this.activeNode);
|
3202
3456
|
if( flag !== this.hasFocus() ){
|
3203
3457
|
this._hasFocus = flag;
|
3204
3458
|
this.$container.toggleClass("fancytree-treefocus", flag);
|
@@ -3211,20 +3465,21 @@ $.extend(Fancytree.prototype,
|
|
3211
3465
|
/* ******************************************************************************
|
3212
3466
|
* jQuery UI widget boilerplate
|
3213
3467
|
*/
|
3468
|
+
|
3214
3469
|
/**
|
3215
|
-
*
|
3216
|
-
*
|
3217
|
-
*
|
3218
|
-
*
|
3219
|
-
*
|
3220
|
-
*
|
3221
|
-
* var tree = $(selector).fancytree("getTree");
|
3222
|
-
* // Access static members:
|
3223
|
-
* alert($.ui.fancytree.version);
|
3470
|
+
* The plugin (derrived from <a href=" http://api.jqueryui.com/jQuery.widget/">jQuery.Widget</a>).<br>
|
3471
|
+
* This constructor is not called directly. Use `$(selector).fancytree({})`
|
3472
|
+
* to initialize the plugin instead.<br>
|
3473
|
+
* <pre class="sh_javascript sunlight-highlight-javascript">// Access widget methods and members:
|
3474
|
+
* var tree = $("#tree").fancytree("getTree");
|
3475
|
+
* var node = $("#tree").fancytree("getActiveNode", "1234");
|
3224
3476
|
* </pre>
|
3477
|
+
*
|
3478
|
+
* @mixin Fancytree_Widget
|
3225
3479
|
*/
|
3480
|
+
|
3226
3481
|
$.widget("ui.fancytree",
|
3227
|
-
/** @lends
|
3482
|
+
/** @lends Fancytree_Widget# */
|
3228
3483
|
{
|
3229
3484
|
/**These options will be used as defaults
|
3230
3485
|
* @type {FancytreeOptions}
|
@@ -3281,7 +3536,7 @@ $.widget("ui.fancytree",
|
|
3281
3536
|
error: "fancytree-error"
|
3282
3537
|
},
|
3283
3538
|
// events
|
3284
|
-
|
3539
|
+
lazyLoad: null,
|
3285
3540
|
postProcess: null
|
3286
3541
|
},
|
3287
3542
|
/* Set up the widget, Called on first $().fancytree() */
|
@@ -3466,29 +3721,35 @@ $.widget("ui.fancytree",
|
|
3466
3721
|
return ( tree._triggerNodeEvent("dblclick", ctx, event) === false ) ? false : tree._callHook("nodeDblclick", ctx);
|
3467
3722
|
}
|
3468
3723
|
// } catch(e) {
|
3469
|
-
// // var _ = null; // issue 117 // TODO
|
3724
|
+
// // var _ = null; // DT issue 117 // TODO
|
3470
3725
|
// $.error(e);
|
3471
3726
|
} finally {
|
3472
3727
|
tree.phase = prevPhase;
|
3473
3728
|
}
|
3474
3729
|
});
|
3475
3730
|
},
|
3476
|
-
/**
|
3731
|
+
/** Return the active node or null.
|
3732
|
+
* @returns {FancytreeNode}
|
3733
|
+
*/
|
3477
3734
|
getActiveNode: function() {
|
3478
3735
|
return this.tree.activeNode;
|
3479
3736
|
},
|
3480
|
-
/**
|
3737
|
+
/** Return the matching node or null.
|
3481
3738
|
* @param {string} key
|
3482
|
-
* @returns {FancytreeNode}
|
3739
|
+
* @returns {FancytreeNode}
|
3483
3740
|
*/
|
3484
3741
|
getNodeByKey: function(key) {
|
3485
3742
|
return this.tree.getNodeByKey(key);
|
3486
3743
|
},
|
3487
|
-
/**
|
3744
|
+
/** Return the invisible system root node.
|
3745
|
+
* @returns {FancytreeNode}
|
3746
|
+
*/
|
3488
3747
|
getRootNode: function() {
|
3489
3748
|
return this.tree.rootNode;
|
3490
3749
|
},
|
3491
|
-
/**
|
3750
|
+
/** Return the current tree instance.
|
3751
|
+
* @returns {Fancytree}
|
3752
|
+
*/
|
3492
3753
|
getTree: function() {
|
3493
3754
|
return this.tree;
|
3494
3755
|
}
|
@@ -3497,22 +3758,26 @@ $.widget("ui.fancytree",
|
|
3497
3758
|
// $.ui.fancytree was created by the widget factory. Create a local shortcut:
|
3498
3759
|
FT = $.ui.fancytree;
|
3499
3760
|
|
3500
|
-
|
3501
|
-
* Static members in the `$.ui.fancytree` namespace
|
3502
|
-
*
|
3503
|
-
*
|
3504
|
-
* alert(""version: " + $.ui.fancytree.version);
|
3761
|
+
/**
|
3762
|
+
* Static members in the `$.ui.fancytree` namespace.<br>
|
3763
|
+
* <br>
|
3764
|
+
* <pre class="sh_javascript sunlight-highlight-javascript">// Access static members:
|
3505
3765
|
* var node = $.ui.fancytree.getNode(element);
|
3766
|
+
* alert($.ui.fancytree.version);
|
3767
|
+
* </pre>
|
3768
|
+
*
|
3769
|
+
* @mixin Fancytree_Static
|
3506
3770
|
*/
|
3507
3771
|
$.extend($.ui.fancytree,
|
3508
|
-
/** @lends
|
3772
|
+
/** @lends Fancytree_Static# */
|
3509
3773
|
{
|
3510
3774
|
/** @type {string} */
|
3511
|
-
version: "2.0.0-
|
3775
|
+
version: "2.0.0-11", // Set to semver by 'grunt release'
|
3512
3776
|
/** @type {string} */
|
3513
|
-
buildType: "
|
3777
|
+
buildType: "production", // Set to 'production' by 'grunt build'
|
3514
3778
|
/** @type {int} */
|
3515
|
-
debugLevel: 1,
|
3779
|
+
debugLevel: 1, // Set to 1 by 'grunt build'
|
3780
|
+
// Used by $.ui.fancytree.debug() and as default for tree.options.debugLevel
|
3516
3781
|
|
3517
3782
|
_nextId: 1,
|
3518
3783
|
_nextNodeKey: 1,
|
@@ -3528,19 +3793,48 @@ $.extend($.ui.fancytree,
|
|
3528
3793
|
// http://jqueryui.com/upgrade-guide/1.9/#deprecated-offset-option-merged-into-my-and-at
|
3529
3794
|
positionMyOfs: isVersionAtLeast($.ui.version, 1, 9)
|
3530
3795
|
},
|
3796
|
+
/** Throw an error if condition fails (debug method).
|
3797
|
+
* @param {boolean} cond
|
3798
|
+
* @param {string} msg
|
3799
|
+
*/
|
3531
3800
|
assert: function(cond, msg){
|
3532
3801
|
return _assert(cond, msg);
|
3533
3802
|
},
|
3803
|
+
/** Write message to console if debugLevel >= 2
|
3804
|
+
* @param {string} msg
|
3805
|
+
*/
|
3534
3806
|
debug: function(msg){
|
3535
3807
|
/*jshint expr:true */
|
3536
3808
|
($.ui.fancytree.debugLevel >= 2) && consoleApply("log", arguments);
|
3537
3809
|
},
|
3810
|
+
/** Write error message to console.
|
3811
|
+
* @param {string} msg
|
3812
|
+
*/
|
3538
3813
|
error: function(msg){
|
3539
3814
|
consoleApply("error", arguments);
|
3540
3815
|
},
|
3816
|
+
/** Convert <, >, &, ", ', / to the equivalent entitites.
|
3817
|
+
*
|
3818
|
+
* @param {string} s
|
3819
|
+
* @returns {string}
|
3820
|
+
*/
|
3821
|
+
escapeHtml: function(s){
|
3822
|
+
return ("" + s).replace(/[&<>"'\/]/g, function (s) {
|
3823
|
+
return ENTITY_MAP[s];
|
3824
|
+
});
|
3825
|
+
},
|
3826
|
+
/** Inverse of escapeHtml().
|
3827
|
+
*
|
3828
|
+
* @param {string} s
|
3829
|
+
* @returns {string}
|
3830
|
+
*/
|
3831
|
+
unescapeHtml: function(s){
|
3832
|
+
var e = document.createElement("div");
|
3833
|
+
e.innerHTML = s;
|
3834
|
+
return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
|
3835
|
+
},
|
3541
3836
|
/** Return a {node: FancytreeNode, type: TYPE} object for a mouse event.
|
3542
3837
|
*
|
3543
|
-
* @static
|
3544
3838
|
* @param {Event} event Mouse event, e.g. click, ...
|
3545
3839
|
* @returns {string} 'title' | 'prefix' | 'expander' | 'checkbox' | 'icon' | undefined
|
3546
3840
|
*/
|
@@ -3563,12 +3857,12 @@ $.extend($.ui.fancytree,
|
|
3563
3857
|
res.type = "title";
|
3564
3858
|
}else if( /\bfancytree-expander\b/.test(tcn) ){
|
3565
3859
|
res.type = (res.node.hasChildren() === false ? "prefix" : "expander");
|
3566
|
-
}else if( /\bfancytree-checkbox\b/.test(tcn) ){
|
3860
|
+
}else if( /\bfancytree-checkbox\b/.test(tcn) || /\bfancytree-radio\b/.test(tcn) ){
|
3567
3861
|
res.type = "checkbox";
|
3568
3862
|
}else if( /\bfancytree-icon\b/.test(tcn) ){
|
3569
3863
|
res.type = "icon";
|
3570
3864
|
}else if( /\bfancytree-node\b/.test(tcn) ){
|
3571
|
-
// TODO:
|
3865
|
+
// TODO: (http://code.google.com/p/dynatree/issues/detail?id=93)
|
3572
3866
|
// res.type = this._getTypeForOuterNodeEvent(event);
|
3573
3867
|
res.type = "title";
|
3574
3868
|
}
|
@@ -3612,6 +3906,9 @@ $.extend($.ui.fancytree,
|
|
3612
3906
|
return null;
|
3613
3907
|
},
|
3614
3908
|
*/
|
3909
|
+
/** Write message to console if debugLevel >= 1
|
3910
|
+
* @param {string} msg
|
3911
|
+
*/
|
3615
3912
|
info: function(msg){
|
3616
3913
|
/*jshint expr:true */
|
3617
3914
|
($.ui.fancytree.debugLevel >= 1) && consoleApply("info", arguments);
|
@@ -3625,13 +3922,12 @@ $.extend($.ui.fancytree,
|
|
3625
3922
|
parseHtml: function($ul) {
|
3626
3923
|
// TODO: understand this:
|
3627
3924
|
/*jshint validthis:true */
|
3628
|
-
var
|
3629
|
-
|
3925
|
+
var extraClasses, i, l, iPos, tmp, tmp2, classes, className,
|
3926
|
+
$children = $ul.find(">li"),
|
3630
3927
|
children = [];
|
3631
|
-
// that = this;
|
3632
3928
|
|
3633
3929
|
$children.each(function() {
|
3634
|
-
var allData,
|
3930
|
+
var allData,
|
3635
3931
|
$li = $(this),
|
3636
3932
|
$liSpan = $li.find(">span:first", this),
|
3637
3933
|
$liA = $liSpan.length ? null : $li.find(">a:first"),
|
@@ -3685,24 +3981,20 @@ $.extend($.ui.fancytree,
|
|
3685
3981
|
d.key = tmp;
|
3686
3982
|
}
|
3687
3983
|
// Add <li data-NAME='...'> as node.data.NAME
|
3688
|
-
|
3689
|
-
allData = $li.data();
|
3690
|
-
// alert("d: " + JSON.stringify(allData));
|
3984
|
+
allData = _getElementDataAsDict($li);
|
3691
3985
|
if(allData && !$.isEmptyObject(allData)) {
|
3692
|
-
//
|
3693
|
-
|
3694
|
-
|
3695
|
-
|
3696
|
-
|
3697
|
-
|
3698
|
-
|
3699
|
-
|
3700
|
-
// see http://api.jquery.com/data/#data-html5
|
3701
|
-
$.extend(d.data, jsonData);
|
3986
|
+
// #56: Allow to set special node.attributes from data-...
|
3987
|
+
for(i=0, l=NODE_ATTRS.length; i<l; i++){
|
3988
|
+
tmp = NODE_ATTRS[i];
|
3989
|
+
tmp2 = allData[tmp];
|
3990
|
+
if( tmp2 != null ) {
|
3991
|
+
delete allData[tmp];
|
3992
|
+
d[tmp] = tmp2;
|
3993
|
+
}
|
3702
3994
|
}
|
3995
|
+
// All other data-... goes to node.data...
|
3996
|
+
$.extend(d.data, allData);
|
3703
3997
|
}
|
3704
|
-
// that.debug("parse ", d);
|
3705
|
-
// var childNode = parentTreeNode.addChild(data);
|
3706
3998
|
// Recursive reading of child nodes, if LI tag contains an UL tag
|
3707
3999
|
$ul = $li.find(">ul:first");
|
3708
4000
|
if( $ul.length ) {
|
@@ -3717,39 +4009,19 @@ $.extend($.ui.fancytree,
|
|
3717
4009
|
},
|
3718
4010
|
/** Add Fancytree extension definition to the list of globally available extensions.
|
3719
4011
|
*
|
3720
|
-
* @param {
|
4012
|
+
* @param {object} definition
|
3721
4013
|
*/
|
3722
4014
|
registerExtension: function(definition){
|
3723
4015
|
_assert(definition.name != null, "extensions must have a `name` property.");
|
3724
4016
|
_assert(definition.version != null, "extensions must have a `version` property.");
|
3725
4017
|
$.ui.fancytree._extensions[definition.name] = definition;
|
3726
4018
|
},
|
4019
|
+
/** Write warning message to console.
|
4020
|
+
* @param {string} msg
|
4021
|
+
*/
|
3727
4022
|
warn: function(msg){
|
3728
4023
|
consoleApply("warn", arguments);
|
3729
4024
|
}
|
3730
4025
|
});
|
3731
4026
|
|
3732
|
-
// Use $.ui.fancytree.debugLevel as default for tree.options.debugLevel
|
3733
|
-
//$.ui.fancytree.debug($.ui.fancytree.prototype);
|
3734
|
-
//$.ui.fancytree.prototype.options.debugLevel = $.ui.fancytree.debugLevel;
|
3735
|
-
|
3736
|
-
|
3737
|
-
/* *****************************************************************************
|
3738
|
-
* Register AMD
|
3739
|
-
*/
|
3740
|
-
// http://stackoverflow.com/questions/10918063/how-to-make-a-jquery-plugin-loadable-with-requirejs
|
3741
|
-
|
3742
|
-
// if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
|
3743
|
-
// define( "jquery", [], function () { return jQuery; } );
|
3744
|
-
// }
|
3745
|
-
|
3746
|
-
// TODO: maybe like so:?
|
3747
|
-
// https://raw.github.com/malsup/blockui/master/jquery.blockUI.js
|
3748
|
-
/*
|
3749
|
-
if( typeof define === "function" && define.amd ) {
|
3750
|
-
define( ["jquery"], function () {
|
3751
|
-
return jQuery.ui.fancytree;
|
3752
|
-
});
|
3753
|
-
}
|
3754
|
-
*/
|
3755
4027
|
}(jQuery, window, document));
|