fancytree-rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +50 -0
- data/Rakefile +1 -0
- data/fancytree-rails.gemspec +27 -0
- data/lib/fancytree-rails.rb +1 -0
- data/lib/fancytree/rails.rb +7 -0
- data/lib/fancytree/rails/engine.rb +4 -0
- data/lib/fancytree/rails/version.rb +6 -0
- data/vendor/assets/javascripts/fancytree.js +2 -0
- data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.js +5366 -0
- data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.min.js +6 -0
- data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.min.js.map +1 -0
- data/vendor/assets/javascripts/fancytree/jquery.fancytree.js +3715 -0
- data/vendor/assets/javascripts/fancytree/jquery.fancytree.min.js +6 -0
- data/vendor/assets/javascripts/fancytree/jquery.fancytree.min.js.map +1 -0
- data/vendor/assets/stylesheets/skin-awesome/ui.fancytree.css +272 -0
- data/vendor/assets/stylesheets/skin-lion/icons.gif +0 -0
- data/vendor/assets/stylesheets/skin-lion/loading.gif +0 -0
- data/vendor/assets/stylesheets/skin-lion/ui.fancytree-org.css +460 -0
- data/vendor/assets/stylesheets/skin-lion/ui.fancytree.css +453 -0
- data/vendor/assets/stylesheets/skin-themeroller/icons.gif +0 -0
- data/vendor/assets/stylesheets/skin-themeroller/loading.gif +0 -0
- data/vendor/assets/stylesheets/skin-themeroller/ui.fancytree-org.css +505 -0
- data/vendor/assets/stylesheets/skin-themeroller/ui.fancytree.css +505 -0
- data/vendor/assets/stylesheets/skin-vista/icons.gif +0 -0
- data/vendor/assets/stylesheets/skin-vista/loading.gif +0 -0
- data/vendor/assets/stylesheets/skin-vista/ui.fancytree-org.css +610 -0
- data/vendor/assets/stylesheets/skin-vista/ui.fancytree.css +459 -0
- data/vendor/assets/stylesheets/skin-win7/icons.gif +0 -0
- data/vendor/assets/stylesheets/skin-win7/loading.gif +0 -0
- data/vendor/assets/stylesheets/skin-win7/ui.fancytree-org.css +592 -0
- data/vendor/assets/stylesheets/skin-win7/ui.fancytree.css +523 -0
- data/vendor/assets/stylesheets/skin-win8/icons.gif +0 -0
- data/vendor/assets/stylesheets/skin-win8/loading.gif +0 -0
- data/vendor/assets/stylesheets/skin-win8/ui.fancytree-org.css +602 -0
- data/vendor/assets/stylesheets/skin-win8/ui.fancytree.css +470 -0
- data/vendor/assets/stylesheets/skin-xp/icons-rtl.gif +0 -0
- data/vendor/assets/stylesheets/skin-xp/icons.gif +0 -0
- data/vendor/assets/stylesheets/skin-xp/loading.gif +0 -0
- data/vendor/assets/stylesheets/skin-xp/ui.fancytree-org.css +578 -0
- data/vendor/assets/stylesheets/skin-xp/ui.fancytree.css +450 -0
- data/vendor/assets/stylesheets/skin-xp/vline-rtl.gif +0 -0
- data/vendor/assets/stylesheets/skin-xp/vline.gif +0 -0
- data/vendor/assets/stylesheets/ui.fancytree.css +3 -0
- metadata +166 -0
@@ -0,0 +1,6 @@
|
|
1
|
+
/*! jQuery Fancytree Plugin - v2.0.0-5 - 2013-12-23 10:12
|
2
|
+
* https://github.com/mar10/fancytree
|
3
|
+
* Copyright (c) 2013 Martin Wendt; Licensed MIT */
|
4
|
+
!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(a){return a=a.toLowerCase(),function(b){return b.title.toLowerCase().indexOf(a)>=0}}function o(b,c){var d,e,g,h;for(this.parent=b,this.tree=b.tree,this.ul=null,this.li=null,this.isStatusNode=!1,this.data={},d=0,e=u.length;e>d;d++)g=u[d],this[g]=c[g];c.data&&a.extend(this.data,c.data);for(g in c)v[g]||a.isFunction(c[g])||w[g]||(this.data[g]=c[g]);null==this.key&&(this.key="_"+r._nextNodeKey++),c.active&&(f(null===this.tree.activeNode,"only one active node allowed"),this.tree.activeNode=this),this.children=null,h=c.children,h&&h.length&&this._setChildren(h)}function p(b){this.widget=b,this.$div=b.element,this.options=b.options,this.ext={},this.data={},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 o(d,{title:"root",key:"root_"+this._id,children:null}),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=r.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 a.ui.fancytree.warn("Fancytree: ignored duplicate include"),void 0;var q,r=null,s="active expanded focus folder lazy selected unselectable".split(" "),t={},u="expanded extraClasses folder hideCheckbox key lazy selected title tooltip unselectable".split(" "),v={},w={active:!0,children:!0,data:!0,focus:!0};for(q=0;q<s.length;q++)t[s[q]]=!0;for(q=0;q<u.length;q++)v[u[q]]=!0;o.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 o(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 o(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)},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)||(v[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.lazy&&a.isArray(this.children)?(this.removeChildren(),this.setExpanded(!1)):void 0},findAll:function(b){b=a.isFunction(b)?b:n(b);var c=[];return this.visit(function(a){b(a)&&c.push(a)}),c},findFirst:function(b){b=a.isFunction(b)?b:n(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 this.debug("fixSelection3AfterLoad() _changeSelectStatusAttrs()",a,b),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)v[c]?this[c]=b[c]:"data"===c?a.extend(this.data,b.data):a.isFunction(b[c])||w[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},isLoading:function(){e()},isRoot:function(){return this.tree.rootNode===this},isSelected:function(){return!!this.selected},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},makeVisible:function(){var a,b,c=this.getParentList(!1,!1);for(a=0,b=c.length;b>a;a++)c[a].setExpanded(!0)},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 it's 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)),i.expanded||h.ul.removeChild(this.li),h.isDescendantOf(i)||h.render(),i.isDescendantOf(h)||i===h||i.render()}},navigate:function(b,c){function d(a){return a?(a.makeVisible(),c===!1?a.setFocus():a.setActive()):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}},lazyLoad:function(b){(b||this.hasChildren()===d)&&this.discard(),f(!a.isArray(this.children));var c=this.tree._triggerNodeEvent("lazyload",this);return f("boolean"!=typeof c,"lazyload event must return source in data.result"),this.tree._callHook("nodeLoadChildren",this,c)},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)},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)},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=a(this.span).position().top,g=a(this.span).height(),h=this.tree.$container,i=h[0].scrollTop,j=Math.max(0,h.innerHeight()-h[0].clientHeight),k=h.height()-j,l=null;return 0>f?l=i+f:f+g>k&&(l=i+f-k+g,c&&(d=c?a(c.span).position().top:0,f-d>k&&(l=i+f))),null!==l?b?h.animate({scrollTop:l},b):(h[0].scrollTop=l,e.resolveWith(this)):e.resolveWith(this),e.promise()},setActive:function(a){return this.tree._callHook("nodeSetActive",this,a)},setExpanded:function(a){return this.tree._callHook("nodeSetExpanded",this,a)},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(u,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)}},p.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)},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.lazyLoad().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()},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){var b,c,d,e=a.node;if(e.parent)for(b=e.parent.children,c=0,d=b.length;d>c;c++)b[c]!==e&&b[c].expanded&&this._callHook("nodeSetExpanded",b[c],!1)},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)&&(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),h.parent&&g._triggerNodeEvent("loadChildren",h)})},nodeLoadKeyPath:function(){},nodeMakeVisible:function(a){var b,c,d=a.node.getParentList(!1,!1);for(b=0,c=d.length;c>b;b++)d[b].setExpanded(!0)},nodeRemoveChild:function(b,c){var d,e=b.node,g=b.options,h=a.extend({},b,{node:c}),i=e.children;return r.debug("nodeRemoveChild()",e.toString(),c.toString()),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),g.removeNode&&g.removeNode.call(b.tree,{type:"removeNode"},h),i.splice(d,1),void 0)},nodeRemoveChildMarkup:function(b){var c=b.node;r.debug("nodeRemoveChildMarkup()",c.toString()),c.ul&&(a(c.ul).remove(),c.visit(function(a){a.li=a.ul=null}),c.ul=null)},nodeRemoveChildren:function(b){var c,e=b.node,f=e.children,g=b.options;r.debug("nodeRemoveChildren()",e.toString()),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,g.removeNode&&(c.node=a,g.removeNode.call(b.tree,{type:"removeNode"},c))}),e.children=d,this.nodeRenderStatus(b))},nodeRemoveMarkup:function(b){var c=b.node;r.debug("nodeRemoveMarkup()",c.toString()),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=b.node,p=b.tree,q=b.options,r=q.aria,s=!1,t=o.parent,u=!t,v=o.children;if(u||t.ul){if(f(u||t.ul,"parent UL must exist"),u||(o.li&&(d||o.li.parentNode!==o.parent.ul)&&(o.li.parentNode!==o.parent.ul&&this.warn("unlink "+o+" (must be child of "+o.parent+")"),this.nodeRemoveMarkup(b)),o.li||(s=!0,o.li=c.createElement("li"),o.li.ftnode=o,o.key&&q.generateIds&&(o.li.id=q.idPrefix+o.key),o.span=c.createElement("span"),o.span.className="fancytree-node",r&&a(o.span).attr("aria-labelledby","ftal_"+o.key),o.li.appendChild(o.span),this.nodeRenderTitle(b),q.createNode&&q.createNode.call(p,{type:"createNode"},b)),q.renderNode&&q.renderNode.call(p,{type:"renderNode"},b)),v){if(u||o.expanded||e===!0){for(o.ul||(o.ul=c.createElement("ul"),(g===!0&&!h||!o.expanded)&&(o.ul.style.display="none"),r&&a(o.ul).attr("role","group"),o.li?o.li.appendChild(o.ul):o.tree.$div.append(o.ul)),l=0,m=v.length;m>l;l++)n=a.extend({},b,{node:v[l]}),this.nodeRender(n,d,e,!1,!0);for(i=o.ul.firstChild,l=0,m=v.length-1;m>l;l++)j=v[l],k=i.ftnode,j!==k?(o.debug("_fixOrder: mismatch at index "+l+": "+j+" != "+k),o.ul.insertBefore(j.li,k.li)):i=i.nextSibling}}else o.ul&&(this.warn("remove child markup for "+o),this.nodeRemoveChildMarkup(b));u||(this.nodeRenderStatus(b),s&&t.ul.appendChild(o.li))}},nodeRenderTitle:function(a,b){var c,e,f,g,h,i=a.node,j=a.tree,k=a.options,l=k.aria,m=i.getLevel(),n=[],o=i.data.icon;b!==d&&(i.title=b),i.span&&(m<k.minExpandLevel?m>1&&(l?n.push("<span role='button' class='fancytree-expander'></span>"):n.push("<span class='fancytree-expander'></span>")):l?n.push("<span role='button' class='fancytree-expander'></span>"):n.push("<span class='fancytree-expander'></span>"),k.checkbox&&i.hideCheckbox!==!0&&!i.isStatusNode&&(l?n.push("<span role='checkbox' class='fancytree-checkbox'></span>"):n.push("<span class='fancytree-checkbox'></span>")),g=l?" role='img'":"",o&&"string"==typeof o?(e="/"===o.charAt(0)?o:k.imagePath+o,n.push("<img src='"+e+"' alt='' />")):i.data.iconclass?n.push("<span "+g+" class='fancytree-custom-icon"+" "+i.data.iconclass+"'></span>"):(o===!0||o!==!1&&k.icons!==!1)&&n.push("<span "+g+" class='fancytree-icon'></span>"),f="",k.renderTitle&&(f=k.renderTitle.call(j,{type:"renderTitle"},a)||""),f||(h=i.tooltip?" title='"+i.tooltip.replace(/\"/g,""")+"'":"",c=l?" id='ftal_"+i.key+"'":"",g=l?" role='treeitem'":"",f="<span "+g+" class='fancytree-title'"+c+h+">"+i.title+"</span>"),n.push(f),i.span.innerHTML=n.join(""))},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.selected?(k.push(j.selected),h&&i.attr("aria-selected",!0)):h&&i.attr("aria-selected",!1),c.extraClasses&&k.push(c.extraClasses),f===!1?k.push(j.combinedExpanderPrefix+"n"+(g?"l":"")):k.push(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){var d,e=b.node,g=b.tree,h=b.options,i=e===g.activeNode;return c=c!==!1,e.debug("nodeSetActive",c),i===c?k(e):c&&this._triggerNodeEvent("beforeActivate",e,b.originalEvent)===!1?l(e,["rejected"]):(c?(g.activeNode&&(f(g.activeNode!==e,"node was active (inconsistency)"),d=a.extend({},b,{node:g.activeNode}),g.nodeSetActive(d,!1),f(null===g.activeNode,"deactivate was out of sync?")),h.activeVisible&&g.nodeMakeVisible(b),g.activeNode=e,g.nodeRenderStatus(b),g.nodeSetFocus(b),g._triggerNodeEvent("activate",e)):(f(g.activeNode===e,"node was not active (inconsistency)"),g.activeNode=null,this.nodeRenderStatus(b),b.tree._triggerNodeEvent("deactivate",e)),void 0)},nodeSetExpanded:function(b,c){var e,f,g,h,i,j,m=b.node,n=b.tree,o=b.options;if(c=c!==!1,m.debug("nodeSetExpanded("+c+")"),m.expanded&&c||!m.expanded&&!c)return m.debug("nodeSetExpanded("+c+"): nothing to do"),k(m);if(c&&!m.lazy&&!m.hasChildren())return l(m,["empty"]);if(!c&&m.getLevel()<o.minExpandLevel)return l(m,["locked"]);if(this._triggerNodeEvent("beforeExpand",m,b.originalEvent)===!1)return l(m,["rejected"]);if(f=new a.Deferred,c&&!m.expanded&&o.autoCollapse){i=m.getParentList(!1,!0),j=o.autoCollapse;try{for(o.autoCollapse=!1,g=0,h=i.length;h>g;g++)this._callHook("nodeCollapseSiblings",i[g])}finally{o.autoCollapse=j}}return f.done(function(){b.tree._triggerNodeEvent(c?"expand":"collapse",b),o.autoScroll&&m.getLastChild().scrollIntoView(!0,m)}),e=function(d){var e,f,g,h;if(m.expanded=c,n._callHook("nodeRender",b,!1,!1,!0),m.ul)if(g="none"!==m.ul.style.display,h=!!m.expanded,g===h)m.warn("nodeSetExpanded: UL.style.display already set");else{if(o.fx)return e=o.fx.duration||200,f=o.fx.easing,m.debug("nodeSetExpanded: animate start..."),a(m.ul).animate(o.fx,e,f,function(){m.debug("nodeSetExpanded: animate done"),d()}),void 0;m.ul.style.display=m.expanded||!parent?"":"none"}d()},c&&m.lazy&&m.hasChildren()===d?(m.debug("nodeSetExpanded: load start..."),m.lazyLoad().done(function(){m.debug("nodeSetExpanded: load done"),f.notifyWith&&f.notifyWith(m,["loaded"]),e(function(){f.resolveWith(m)})}).fail(function(a){e(function(){f.rejectWith(m,["load failed ("+a+")"])})})):e(function(){f.resolveWith(m)}),m.debug("nodeSetExpanded: returns"),f.promise()},nodeSetFocus:function(b,c){b.node.debug("nodeSetFocus("+c+")");var d,e=b.tree,f=b.node;if(c=c!==!1,e.focusNode){if(e.focusNode===f&&c)return f.debug("nodeSetFocus("+c+"): nothing to do"),void 0;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)),this.nodeMakeVisible(b),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){var f,g,h=b.node,i=b.tree,j=b.options._classNames;switch(f=function(){var a=h.children?h.children[0]:null;if(a&&a.isStatusNode){try{h.ul&&(h.ul.removeChild(a.li),a.li=null)}catch(b){}1===h.children.length?h.children=[]:h.children.shift()}},g=function(b){var c=h.children?h.children[0]:null;return c&&c.isStatusNode?(a.extend(c,b),i._callHook("nodeRender",c)):(b.key="_statusNode",h._setChildren([b]),h.children[0].isStatusNode=!0,i.render()),h.children[0]},c){case"ok":f(),a(h.span).removeClass(j.loading),a(h.span).removeClass(j.error);break;case"loading":a(h.span).removeClass(j.error),a(h.span).addClass(j.loading),h.parent||g({title:i.options.strings.loading+(d?" ("+d+") ":""),tooltip:e,extraClasses:"fancytree-statusnode-wait"});break;case"error":a(h.span).removeClass(j.loading),a(h.span).addClass(j.error),g({title:i.options.strings.loadError+(d?" ("+d+") ":""),tooltip:e,extraClasses:"fancytree-statusnode-error"});break;default:a.error("invalid 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);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)})},treeSetFocus:function(a,b,c){b=b!==!1,this.debug("treeSetFocus("+b+"), _calledByNodeSetFocus: "+c),this.debug(" focusNode: "+this.focusNode),this.debug(" activeNode: "+this.activeNode),b!==this.hasFocus()&&(this._hasFocus=b,this.$container.toggleClass("fancytree-treefocus",b),this._triggerTreeEvent(b?"focusTree":"blurTree"))},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);
|
5
|
+
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.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,_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 p(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=r.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=r.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}}),r=a.ui.fancytree,a.extend(a.ui.fancytree,{version:"2.0.0-5",buildType:"release",debugLevel:1,_nextId:1,_nextNodeKey:1,_extensions:{},_FancytreeClass:p,_FancytreeNodeClass:o,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)},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)?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 o)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=b.find(">li"),l=[];return k.each(function(){var k,m,n=a(this),o=n.find(">span:first",this),p=o.length?null:n.find(">a:first"),q={tooltip:null,data:{}};for(o.length?q.title=o.html():p&&p.length?(q.title=p.html(),q.data.href=p.attr("href"),q.data.target=p.attr("target"),q.tooltip=p.attr("title")):(q.title=n.html(),g=q.title.search(/<ul/i),g>=0&&(q.title=q.title.substring(0,g))),q.title=a.trim(q.title),e=0,f=s.length;f>e;e++)q[s[e]]=d;for(i=this.className.split(" "),c=[],e=0,f=i.length;f>e;e++)j=i[e],t[j]?q[j]=!0:c.push(j);q.extraClasses=c.join(" "),h=n.attr("title"),h&&(q.tooltip=h),h=n.attr("id"),h&&(q.key=h),k=n.data(),k&&!a.isEmptyObject(k)&&(m=k.json,delete k.json,a.extend(q.data,k),m&&a.extend(q.data,m)),b=n.find(">ul:first"),q.children=b.length?a.ui.fancytree.parseHtml(b):q.lazy?d:null,l.push(q)}),l},registerExtension:function(b,c){a.ui.fancytree._extensions[b]=c},warn:function(){g("warn",arguments)}})}(jQuery,window,document),function(a){"use strict";a.ui.fancytree.registerExtension("columnview",{version:"0.0.1",options:{},treeInit:function(b){var c,d,e=b.tree,f=e.widget.element;e.tr=a("tbody tr",f)[0],e.columnCount=a(">td",e.tr).length,this._super(b),d=a(e.rootNode.ul),c=a(">td",e.tr).eq(0),d.removeClass("fancytree-container"),d.removeAttr("tabindex"),e.$container=f,f.addClass("fancytree-container fancytree-ext-columnview"),f.attr("tabindex","0"),c.empty(),d.detach().appendTo(c),e.widget.options.autoCollapse=!0,e.widget.options.fx=!1,e.widget.options.clickFolderMode=1,f.bind("fancytreeactivate",function(b,c){var d,e,f=c.node,g=c.tree,h=f.getLevel();if(g._callHook("nodeCollapseSiblings",f),h<=g.columnCount)for(e=a(">td",g.tr),d=h;d<g.columnCount;d++)e.eq(d).empty();f.expanded||!f.children&&!f.lazy||f.setExpanded()}).bind("fancytreekeydown",function(b,c){var d=null;switch(b.which){case a.ui.keyCode.DOWN:return d=c.node.getNextSibling(),d&&d.setFocus(),!1;case a.ui.keyCode.LEFT:return d=c.node.getParent(),d&&d.setFocus(),!1;case a.ui.keyCode.UP:return d=c.node.getPrevSibling(),d&&d.setFocus(),!1}})},nodeRender:function(b,c,d,e,f){this._super(b,c,d,e,f);var g,h,i,j=b.tree,k=b.node,l=a(k.span);l.find("span.fancytree-expander").remove(),k.hasChildren()===!1||l.find("span.fancytree-cv-right").length||l.append(a("<span class='fancytree-icon fancytree-cv-right'>")),k.ul&&(k.ul.style.display="",g=k.getLevel(),g<j.columnCount&&(h=a(">td",j.tr).eq(g),i=a(k.ul).detach(),h.empty().append(i)))}})}(jQuery,window,document),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({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(){}}),c&&c.dragDrop&&b.widget.element.droppable({addClasses:!1,tolerance:"intersect",greedy:!1})}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)?(h("Drag event over helper: ignored."),void 0):(c.helper.data("ftTargetNode",i),g&&g!==i&&g.tree.ext.dnd._onDragEvent("leave",g,f,b,c,e),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)),void 0)},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("dnd",{version:"0.0.1",options:{dragStart:null,dragStop:null,autoExpandMS:1e3,preventVoidMoves:!0,preventRecursiveMoves:!0,dragEnter:null,dragOver:null,dragDrop:null,dragLeave:null},treeInit:function(a){var b=a.tree;this._super(a),f(b)},nodeKeydown:function(b){var c=b.originalEvent;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),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=this.options.filter.leavesOnly;return this.visit(function(a){delete a.match,delete a.subMatch}),"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"),"hide"===this.options.filter.mode&&this.$div.addClass("fancytree-ext-filter-hide"),this.visit(function(b){f&&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(b){delete b.match,delete b.subMatch,a(b.li).show()}),this.enableFilter=!1,this.render(),this.$div.removeClass("fancytree-ext-filter fancytree-ext-filter-hide")},a.ui.fancytree.registerExtension("filter",{version:"0.0.1",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.options,f=b.tree,g=a(d[f.statusClassPropName]);g.length&&(this._super(b),f.enableFilter&&(d.match?g.addClass("fancytree-match"):g.removeClass("fancytree-match"),d.subMatch?g.addClass("fancytree-submatch"):g.removeClass("fancytree-submatch"),"hide"===e.filter.mode&&(c=!(!d.match&&!d.subMatch),d.debug(d.title+": visible="+c),a(d.li).toggle(c))))}})}(jQuery,window,document),function(a,b,c){"use strict";a.ui.fancytree.registerExtension("menu",{version:"0.0.1",options:{enable:!0,selector:null,position:{},create:a.noop,beforeOpen:a.noop,open:a.noop,focus:a.noop,select:a.noop,close:a.noop},treeInit:function(b){var c=b.options,d=b.tree;this._super(b),d.ext.menu.data={tree:d,node:null,$menu:null,menuId:null},d.$container.delegate("span.fancytree-node","contextmenu",function(b){var c=a.ui.fancytree.getNode(b),e={node:c,tree:c.tree,originalEvent:b,options:d.options};return d.ext.menu._openMenu(e),!1}),a(c.menu.selector).menu({create:function(b){d.ext.menu.data.$menu=a(this).menu("widget");var e=a.extend({},d.ext.menu.data);c.menu.create.call(d,b,e)},focus:function(b,e){var f=a.extend({},d.ext.menu.data,{menuItem:e.item,menuId:e.item.find(">a").attr("href")});c.menu.focus.call(d,b,f)},select:function(e,f){var g=a.extend({},d.ext.menu.data,{menuItem:f.item,menuId:f.item.find(">a").attr("href")});c.menu.select.call(d,e,g)!==!1&&d.ext.menu._closeMenu(b)}}).hide()},treeDestroy:function(a){this._super(a)},_openMenu:function(b){var d,e=b.tree,f=b.options,g=a(f.menu.selector);e.ext.menu.data.node=b.node,d=a.extend({},e.ext.menu.data),f.menu.beforeOpen.call(e,b.originalEvent,d)!==!1&&(a(c).bind("keydown.fancytree",function(c){c.which===a.ui.keyCode.ESCAPE&&e.ext.menu._closeMenu(b)}).bind("mousedown.fancytree",function(c){0===a(c.target).closest(".ui-menu-item").length&&e.ext.menu._closeMenu(b)}),g.css("position","absolute").show().position({my:"left top",at:"right top",of:b.originalEvent,collision:"fit"}).focus(),f.menu.open.call(e,b.originalEvent,d))},_closeMenu:function(b){var d,e=b.tree,f=b.options,g=a.extend({},e.ext.menu.data);f.menu.close.call(e,b.originalEvent,g)!==!1&&(d=a(f.menu.selector),a(c).unbind("keydown.fancytree, mousedown.fancytree"),d.hide(),e.ext.menu.data.node=null)}})}(jQuery,window,document),function(a,b,c,d){"use strict";function e(b,c){c=c||"",b||a.error("Assertion failed "+c)}var f="active",g="expanded",h="focus",i="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(f)>=0&&a.cookie(d+f,null),b.indexOf(g)>=0&&a.cookie(d+g,null),b.indexOf(h)>=0&&a.cookie(d+h,null),b.indexOf(i)>=0&&a.cookie(d+i,null)},a.ui.fancytree._FancytreeClass.prototype.getPersistData=function(){var b=this.ext.persist,c=this.options.persist,d=c.cookieDelimiter,e={};e[f]=a.cookie(b.cookiePrefix+f),e[g]=(a.cookie(b.cookiePrefix+g)||"").split(d),e[i]=(a.cookie(b.cookiePrefix+i)||"").split(d),e[h]=a.cookie(b.cookiePrefix+h)},a.ui.fancytree.registerExtension("persist",{version:"0.0.1",options:{cookieDelimiter:"~",cookiePrefix:d,cookie:{raw:!1,expires:"",path:"",domain:"",secure:!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 j=b.tree,k=b.options,l=this._local,m=this.options.persist;e(a.cookie,"Missing required plugin for 'persist' extension: jquery.cookie.js"),l.cookiePrefix=m.cookiePrefix||"fancytree-"+j._id+"-",l.storeActive=m.types.indexOf(f)>=0,l.storeExpanded=m.types.indexOf(g)>=0,l.storeSelected=m.types.indexOf(i)>=0,l.storeFocus=m.types.indexOf(h)>=0,j.$div.bind("fancytreeinit",function(){var b,e,n,o,p=a.cookie(l.cookiePrefix+h);if(j.debug("COOKIE "+c.cookie),l.storeExpanded&&(b=a.cookie(l.cookiePrefix+g)))for(e=b.split(m.cookieDelimiter),n=0;n<e.length;n++)o=j.getNodeByKey(e[n]),o?(o.expanded===d||m.overrideSource&&o.expanded===!1)&&(o.expanded=!0,o.render()):l._setKey(g,e[n],!1);if(l.storeSelected&&(b=a.cookie(l.cookiePrefix+i)))for(e=b.split(m.cookieDelimiter),n=0;n<e.length;n++)o=j.getNodeByKey(e[n]),o?(o.selected===d||m.overrideSource&&o.selected===!1)&&(o.selected=!0,o.renderStatus()):l._setKey(i,e[n],!1);l.storeActive&&(b=a.cookie(l.cookiePrefix+f),!b||!k.persist.overrideSource&&j.activeNode||(o=j.getNodeByKey(b),o&&o.setActive())),l.storeFocus&&p&&(o=j.getNodeByKey(p),o&&o.setFocus())}),this._super(b)},nodeSetActive:function(b,c){var d=this._local,e=this.options.persist;this._super(b,c),d.storeActive&&a.cookie(d.cookiePrefix+f,this.activeNode?this.activeNode.key:null,e.cookie)},nodeSetExpanded:function(a,b){var c=a.node,d=this._local;this._super(a,b),d.storeExpanded&&d._setKey(g,c.key,b)},nodeSetFocus:function(b){var c=this._local,d=this.options.persist;this._super(b),c.storeFocus&&a.cookie(this.cookiePrefix+h,this.focusNode?this.focusNode.key:null,d.cookie)},nodeSetSelected:function(a,b){var c=a.node,d=this._local;this._super(a,b),d.storeSelected&&d._setKey(i,c.key,b)}})}(jQuery,window,document),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=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("table",{version:"0.0.1",options:{indentation:16,nodeColumnIdx:0,checkboxColumnIdx:null},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++)b.options.table.nodeColumnIdx===d?e.append("<td"+f+"><span class='fancytree-node'></span></td>"):e.append("<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,f,h,i){var j,k,l,m,n,o,p,q,r=b.tree,s=b.node,t=b.options,u=!s.parent;if(i||(b.hasCollapsedParents=s.parent&&!s.parent.expanded),u||(s.tr?this.nodeRenderTitle(b):(n=r.rowFragment.firstChild.cloneNode(!0),o=g(s),d(o),h===!0&&i?n.style.display="none":f&&b.hasCollapsedParents&&(n.style.display="none"),o.tr?e(o.tr,n):(d(!o.parent,"prev. row must have a tr, or is system root"),r.tbody.appendChild(n)),s.tr=n,s.key&&t.generateIds&&(s.tr.id=t.idPrefix+s.key),s.tr.ftnode=s,t.aria&&a(s.tr).attr("aria-labelledby","ftal_"+s.key),s.span=a("span.fancytree-node",s.tr).get(0),this.nodeRenderTitle(b),t.createNode&&t.createNode.call(r,{type:"createNode"},b))),t.renderNode&&t.renderNode.call(r,{type:"renderNode"},b),j=s.children,j&&(u||f||s.expanded))for(l=0,m=j.length;m>l;l++)q=a.extend({},b,{node:j[l]}),q.hasCollapsedParents=q.hasCollapsedParents||!s.expanded,this.nodeRender(q,c,f,h,!0);j&&!i&&(p=s.tr||null,k=r.tbody.firstChild,s.visit(function(a){if(a.tr){if(s.expanded||u||"none"===a.tr.style.display||(a.tr.style.display="none"),a.tr.previousSibling!==p){s.debug("_fixOrder: mismatch at node: "+a);var b=p?p.nextSibling:k;r.tbody.insertBefore(a.tr,b)}p=a.tr}})),u||this.nodeRenderStatus(b)},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)),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,c&&a(d.span).css({marginLeft:c+"px"})},nodeSetExpanded:function(a,b){return this._super(a,b).always(function(){b=b!==!1,f(a.node,b)})},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)}})}(jQuery,window,document),function(a){"use strict";a.ui.fancytree.registerExtension("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);
|
6
|
+
//# sourceMappingURL=jquery.fancytree-all.min.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"build/jquery.fancytree-all.min.js","sources":["jquery.fancytree-all.js"],"names":["$","window","document","undefined","_raiseNotImplemented","msg","error","_assert","cond","consoleApply","method","args","i","s","fn","console","apply","length","isVersionAtLeast","dottedVersion","v","t","verParts","map","trim","split","e","parseInt","testParts","Array","prototype","slice","call","arguments","_makeVirtualFunction","methodName","tree","base","extension","extName","proxy","prevFunc","baseFunc","_local","ext","_super","prevLocal","prevSuper","_subclassObject","attrName","charAt","_getResolvedPromise","context","argArray","Deferred","this","resolve","promise","resolveWith","_getRejectedPromise","reject","rejectWith","_makeResolveFunc","deferred","_makeNodeTitleMatcher","toLowerCase","node","title","indexOf","FancytreeNode","parent","obj","l","name","cl","ul","li","isStatusNode","data","NODE_ATTRS","extend","NODE_ATTR_MAP","isFunction","NONE_NODE_DATA_MAP","key","FT","_nextNodeKey","active","activeNode","children","_setChildren","Fancytree","widget","$div","element","options","_id","ui","fancytree","_nextId","_ns","focusNode","_hasFocus","lastSelectedNode","systemFocusElement","statusClassPropName","ariaPropName","nodeContainerAttrName","find","remove","$ul","fakeParent","rootNode","class","appendTo","$container","debugLevel","attr","tabbable","aria","version","warn","CLASS_ATTRS","CLASS_ATTR_MAP","focus","_findDirectChild","ptr","push","addChildren","insertBefore","pos","firstNode","nodeList","isPlainObject","concat","inArray","splice","tr","render","selectMode","fixSelection3FromEndNodes","addNode","mode","getParent","getNextSibling","applyPatch","patch","IGNORE_MAP","expanded","hasOwnProperty","removeChildren","isVisible","renderTitle","renderStatus","setExpanded","collapseSiblings","_callHook","copyTo","toDict","countChildren","deep","n","debug","unshift","toString","discard","lazy","isArray","findAll","match","res","visit","findFirst","_changeSelectStatusAttrs","state","changed","selected","partsel","fixSelection3AfterClick","flag","isSelected","_walk","child","allSelected","someSelected","visitParents","unselectable","fromDict","dict","getChildren","hasChildren","getFirstChild","getIndex","getIndexHier","separator","each","getParentList","o","join","getKeyPath","excludeSelf","path","sep","keyPathSeparator","getLastChild","getLevel","level","dtn","ac","includeRoot","includeSelf","getPrevSibling","hasFocus","isActive","isChildOf","otherNode","isDescendantOf","p","isExpanded","isFirstSibling","isFolder","folder","isLastSibling","isLazy","isLoading","isRoot","parents","makeVisible","moveTo","targetNode","prevParent","targetParent","removeChild","navigate","where","activate","_goto","setFocus","setActive","handled","KC","keyCode","sib","BACKSPACE","LEFT","RIGHT","UP","DOWN","lazyLoad","source","_triggerNodeEvent","force","childNode","scheduleAction","ms","timer","clearTimeout","self","setTimeout","scrollIntoView","effects","topNode","duration","queue","topNodeY","dfd","nodeY","span","position","top","nodeHeight","height","scrollTop","horzScrollHeight","Math","max","innerHeight","clientHeight","containerHeight","newScrollTop","animate","setSelected","setTitle","sortChildren","cmp","a","b","x","y","sort","recursive","callback","isEmptyObject","toggleExpanded","toggleSelected","_makeHookContext","originalEvent","extra","ctx","funcName","contextObject","activateKey","getNodeByKey","patchList","p2","patchCount","deferredList","always","when","count","generateFormElements","selectedName","activeName","id","$result","empty","hide","getSelectedNodes","idx","append","type","value","checked","getActiveNode","getFocusNode","searchRoot","el","getElementById","idPrefix","ftnode","stopOnParents","info","loadKeyPath","keyPathList","_rootNode","__lazyload","done","loadMap","fail","root","segList","substr","shift","nodeClick","expand","event","targetType","clickFolderMode","nodeSetFocus","target","localName","className","preventDefault","nodeCollapseSiblings","nodeDblclick","nodeKeydown","opts","ctrlKey","autoActivate","which","NUMPAD_ADD","nodeSetExpanded","NUMPAD_SUBTRACT","SPACE","checkbox","nodeToggleSelected","nodeSetActive","ENTER","nodeLoadChildren","ajax","delay","url","debugDelay","random","round","pipe","postProcess","response","dataType","enableAspx","d","parseJSON","jqXHR","textStatus","errorThrown","message","details","status","nodeSetStatus","ctxErr","metaData","nodeLoadKeyPath","nodeMakeVisible","nodeRemoveChild","subCtx","nodeRemoveChildren","nodeRemoveMarkup","removeNode","nodeRemoveChildMarkup","nodeRenderStatus","nodeRender","collapsed","_recursive","childLI","childNode1","childNode2","firstTime","isRootNode","parentNode","createElement","generateIds","appendChild","nodeRenderTitle","createNode","renderNode","style","display","firstChild","nextSibling","imageSrc","nodeTitle","role","tooltip","ares","icon","minExpandLevel","hideCheckbox","imagePath","iconclass","icons","replace","innerHTML","isLastSib","$ariaElem","cn","_classNames","cnList","statusElem","focused","removeAttr","lastsib","extraClasses","combinedExpanderPrefix","combinedIconPrefix","activeVisible","_afterLoad","prevAC","autoCollapse","autoScroll","easing","fx","notifyWith","errMsg","ctx2","nodeSetSelected","_clearStatusNode","_setStatusNode","removeClass","loading","addClass","strings","loadError","nodeToggleExpanded","treeClear","treeCreate","treeDestroy","treeInit","treeLoad","rootCtx","parseHtml","text","_triggerTreeEvent","treeSetFocus","_calledByNodeSetFocus","toggleClass","reactivate","reload","_trigger","result","cache","disabled","extensions","keyboard","lazyload","_create","$source","_extensions","_init","_bind","_setOption","callDefault","rerender","Widget","destroy","_unbind","ns","unbind","that","on","getNode","prevPhase","phase","et","getEventTarget","getRootNode","getTree","buildType","_FancytreeClass","_FancytreeNodeClass","jquerySupports","positionMyOfs","assert","getEventTargetType","tcn","test","selector","iPos","tmp","classes","$children","allData","jsonData","$li","$liSpan","$liA","html","href","search","substring","json","registerExtension","definition","jQuery","$tdFirst","$table","columnCount","eq","detach","bind","tdList","next","$tdChild","$span","offsetString","_initDragAndDrop","dnd","_registerDnd","dragStart","draggable","addClasses","containment","distance","revert","scroll","scrollSpeed","scrollSensitivity","connectToFancytree","helper","sourceNode","_onDragEvent","start","dragDrop","droppable","tolerance","greedy","didRegisterDnd","plugin","add","offset","click","left","drag","isHelper","prevTargetNode","closest","logMsg","stop","eventType","dropped","dragStop","autoExpandMS","preventVoidMoves","preventRecursiveMoves","dragEnter","dragOver","dragLeave","ESCAPE","_cancelDrag","_setDndStatus","hitMode","accept","posOpts","markerOffsetX","markerAt","instData","$target","$dropMarker","css","z-index","prependTo","my","at","of","show","eventName","$helper","nodeOfs","relPos","relPos2","enterResponse","r","nodeTag","clone","trigger","over","before","after","pageX","pageY","width","dd","ddmanager","current","cancel","_escapeRegex","str","applyFilter","filter","re","leavesOnly","subMatch","RegExp","exec","enableFilter","clearFilter","visible","toggle","enable","create","noop","beforeOpen","open","select","close","menu","$menu","menuId","delegate","_openMenu","menuItem","item","_closeMenu","collision","ACTIVE","EXPANDED","FOCUS","SELECTED","clearCookies","types","inst","persist","cookiePrefix","cookie","getPersistData","instOpts","delim","cookieDelimiter","raw","expires","domain","secure","overrideSource","_setKey","cookieName","cookieList","storeActive","storeExpanded","storeSelected","storeFocus","keyList","prevFocus","insertSiblingAfter","referenceNode","newNode","setChildRowVisibility","findPrevRowNode","last","prev","siblings","indentation","nodeColumnIdx","checkboxColumnIdx","$row","tdRole","tbody","rowFragment","createDocumentFragment","table","get","firstTr","newRow","prevNode","prevTr","hasCollapsedParents","cloneNode","previousSibling","nextTr","$cb","renderColumns","indent","marginLeft","activeClass","foccusClass","hoverClass","selectedClass","$el","nodeName"],"mappings":"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"}
|
@@ -0,0 +1,3715 @@
|
|
1
|
+
/*!
|
2
|
+
* jquery.fancytree.js
|
3
|
+
* Dynamic tree view control, with support for lazy loading of branches.
|
4
|
+
* https://github.com/mar10/fancytree/
|
5
|
+
*
|
6
|
+
* Copyright (c) 2006-2013, Martin Wendt (http://wwWendt.de)
|
7
|
+
* Released under the MIT license
|
8
|
+
* https://github.com/mar10/fancytree/wiki/LicenseInfo
|
9
|
+
*
|
10
|
+
* @version 2.0.0-5
|
11
|
+
* @date 2013-12-23T10:11
|
12
|
+
*/
|
13
|
+
|
14
|
+
// Start of local namespace
|
15
|
+
;(function($, window, document, undefined) {
|
16
|
+
"use strict";
|
17
|
+
|
18
|
+
// prevent duplicate loading
|
19
|
+
if ( $.ui.fancytree && $.ui.fancytree.version ) {
|
20
|
+
$.ui.fancytree.warn("Fancytree: ignored duplicate include");
|
21
|
+
return;
|
22
|
+
}
|
23
|
+
|
24
|
+
|
25
|
+
/* *****************************************************************************
|
26
|
+
* Private functions and variables
|
27
|
+
*/
|
28
|
+
|
29
|
+
function _raiseNotImplemented(msg){
|
30
|
+
msg = msg || "";
|
31
|
+
$.error("Not implemented: " + msg);
|
32
|
+
}
|
33
|
+
|
34
|
+
function _assert(cond, msg){
|
35
|
+
// TODO: see qunit.js extractStacktrace()
|
36
|
+
if(!cond){
|
37
|
+
msg = msg ? ": " + msg : "";
|
38
|
+
$.error("Assertion failed" + msg);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
function consoleApply(method, args){
|
43
|
+
var i, s,
|
44
|
+
fn = window.console ? window.console[method] : null;
|
45
|
+
|
46
|
+
if(fn){
|
47
|
+
if(fn.apply){
|
48
|
+
fn.apply(window.console, args);
|
49
|
+
}else{
|
50
|
+
// IE?
|
51
|
+
s = "";
|
52
|
+
for( i=0; i<args.length; i++){
|
53
|
+
s += args[i];
|
54
|
+
}
|
55
|
+
fn(s);
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
/** Return true if dotted version string is equal or higher than requested version.
|
61
|
+
*
|
62
|
+
* See http://jsfiddle.net/mar10/FjSAN/
|
63
|
+
*/
|
64
|
+
function isVersionAtLeast(dottedVersion, major, minor, patch){
|
65
|
+
var i, v, t,
|
66
|
+
verParts = $.map($.trim(dottedVersion).split("."), function(e){ return parseInt(e, 10); }),
|
67
|
+
testParts = $.map(Array.prototype.slice.call(arguments, 1), function(e){ return parseInt(e, 10); });
|
68
|
+
|
69
|
+
for( i = 0; i < testParts.length; i++ ){
|
70
|
+
v = verParts[i] || 0;
|
71
|
+
t = testParts[i] || 0;
|
72
|
+
if( v !== t ){
|
73
|
+
return ( v > t );
|
74
|
+
}
|
75
|
+
}
|
76
|
+
return true;
|
77
|
+
}
|
78
|
+
|
79
|
+
/** Return a wrapper that calls sub.methodName() and exposes
|
80
|
+
* this : tree
|
81
|
+
* this._local : tree.ext.EXTNAME
|
82
|
+
* this._super : base.methodName()
|
83
|
+
*/
|
84
|
+
function _makeVirtualFunction(methodName, tree, base, extension, extName){
|
85
|
+
// $.ui.fancytree.debug("_makeVirtualFunction", methodName, tree, base, extension, extName);
|
86
|
+
// if(rexTestSuper && !rexTestSuper.test(func)){
|
87
|
+
// // extension.methodName() doesn't call _super(), so no wrapper required
|
88
|
+
// return func;
|
89
|
+
// }
|
90
|
+
// Use an immediate function as closure
|
91
|
+
var proxy = (function(){
|
92
|
+
var prevFunc = tree[methodName], // org. tree method or prev. proxy
|
93
|
+
baseFunc = extension[methodName], //
|
94
|
+
_local = tree.ext[extName],
|
95
|
+
_super = function(){
|
96
|
+
return prevFunc.apply(tree, arguments);
|
97
|
+
};
|
98
|
+
|
99
|
+
// Return the wrapper function
|
100
|
+
return function(){
|
101
|
+
var prevLocal = tree._local,
|
102
|
+
prevSuper = tree._super;
|
103
|
+
try{
|
104
|
+
tree._local = _local;
|
105
|
+
tree._super = _super;
|
106
|
+
return baseFunc.apply(tree, arguments);
|
107
|
+
}finally{
|
108
|
+
tree._local = prevLocal;
|
109
|
+
tree._super = prevSuper;
|
110
|
+
}
|
111
|
+
};
|
112
|
+
})(); // end of Immediate Function
|
113
|
+
return proxy;
|
114
|
+
}
|
115
|
+
|
116
|
+
/**
|
117
|
+
* Subclass `base` by creating proxy functions
|
118
|
+
*/
|
119
|
+
function _subclassObject(tree, base, extension, extName){
|
120
|
+
// $.ui.fancytree.debug("_subclassObject", tree, base, extension, extName);
|
121
|
+
for(var attrName in extension){
|
122
|
+
if(typeof extension[attrName] === "function"){
|
123
|
+
if(typeof tree[attrName] === "function"){
|
124
|
+
// override existing method
|
125
|
+
tree[attrName] = _makeVirtualFunction(attrName, tree, base, extension, extName);
|
126
|
+
}else if(attrName.charAt(0) === "_"){
|
127
|
+
// Create private methods in tree.ext.EXTENSION namespace
|
128
|
+
tree.ext[extName][attrName] = _makeVirtualFunction(attrName, tree, base, extension, extName);
|
129
|
+
}else{
|
130
|
+
$.error("Could not override tree." + attrName + ". Use prefix '_' to create tree." + extName + "._" + attrName);
|
131
|
+
}
|
132
|
+
}else{
|
133
|
+
// Create member variables in tree.ext.EXTENSION namespace
|
134
|
+
if(attrName !== "options"){
|
135
|
+
tree.ext[extName][attrName] = extension[attrName];
|
136
|
+
}
|
137
|
+
}
|
138
|
+
}
|
139
|
+
}
|
140
|
+
|
141
|
+
|
142
|
+
function _getResolvedPromise(context, argArray){
|
143
|
+
if(context === undefined){
|
144
|
+
return $.Deferred(function(){this.resolve();}).promise();
|
145
|
+
}else{
|
146
|
+
return $.Deferred(function(){this.resolveWith(context, argArray);}).promise();
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
|
151
|
+
function _getRejectedPromise(context, argArray){
|
152
|
+
if(context === undefined){
|
153
|
+
return $.Deferred(function(){this.reject();}).promise();
|
154
|
+
}else{
|
155
|
+
return $.Deferred(function(){this.rejectWith(context, argArray);}).promise();
|
156
|
+
}
|
157
|
+
}
|
158
|
+
|
159
|
+
|
160
|
+
function _makeResolveFunc(deferred, context){
|
161
|
+
return function(){
|
162
|
+
deferred.resolveWith(context);
|
163
|
+
};
|
164
|
+
}
|
165
|
+
|
166
|
+
|
167
|
+
// TODO: use currying
|
168
|
+
function _makeNodeTitleMatcher(s){
|
169
|
+
s = s.toLowerCase();
|
170
|
+
return function(node){
|
171
|
+
return node.title.toLowerCase().indexOf(s) >= 0;
|
172
|
+
};
|
173
|
+
}
|
174
|
+
|
175
|
+
var i,
|
176
|
+
FT = null, // initialized below
|
177
|
+
//Boolean attributes that can be set with equivalent class names in the LI tags
|
178
|
+
CLASS_ATTRS = "active expanded focus folder lazy selected unselectable".split(" "),
|
179
|
+
CLASS_ATTR_MAP = {},
|
180
|
+
// Top-level Fancytree node attributes, that can be set by dict
|
181
|
+
NODE_ATTRS = "expanded extraClasses folder hideCheckbox key lazy selected title tooltip unselectable".split(" "),
|
182
|
+
NODE_ATTR_MAP = {},
|
183
|
+
// Attribute names that should NOT be added to node.data
|
184
|
+
NONE_NODE_DATA_MAP = {"active": true, "children": true, "data": true, "focus": true};
|
185
|
+
|
186
|
+
for(i=0; i<CLASS_ATTRS.length; i++){ CLASS_ATTR_MAP[CLASS_ATTRS[i]] = true; }
|
187
|
+
for(i=0; i<NODE_ATTRS.length; i++){ NODE_ATTR_MAP[NODE_ATTRS[i]] = true; }
|
188
|
+
|
189
|
+
|
190
|
+
/* *****************************************************************************
|
191
|
+
* FancytreeNode
|
192
|
+
*/
|
193
|
+
|
194
|
+
|
195
|
+
/**
|
196
|
+
* Creates a new node
|
197
|
+
* @class Represents the hierarchical data model and operations.
|
198
|
+
* @name FancytreeNode
|
199
|
+
* @constructor
|
200
|
+
* @param {FancytreeNode} parent
|
201
|
+
* @param {NodeData} data
|
202
|
+
*
|
203
|
+
* @property {Fancytree} tree
|
204
|
+
* @property {FancytreeNode} parent Parent node
|
205
|
+
* @property {String} key
|
206
|
+
* @property {String} title
|
207
|
+
* @property {object} data Contains all extra data that was passed on node creation
|
208
|
+
* @property {FancytreeNode[] | null | undefined} children list of child nodes
|
209
|
+
* @property {Boolean} isStatusNode
|
210
|
+
* @property {Boolean} expanded
|
211
|
+
* @property {Boolean} folder
|
212
|
+
* @property {Boolean} href
|
213
|
+
* @property {String} extraClasses
|
214
|
+
* @property {Boolean} lazy
|
215
|
+
* @property {Boolean} nolink OBSOLETE
|
216
|
+
* @property {Boolean} selected
|
217
|
+
* @property {String} target
|
218
|
+
* @property {String} tooltip
|
219
|
+
*/
|
220
|
+
function FancytreeNode(parent, obj){
|
221
|
+
var i, l, name, cl;
|
222
|
+
|
223
|
+
this.parent = parent;
|
224
|
+
this.tree = parent.tree;
|
225
|
+
this.ul = null;
|
226
|
+
this.li = null; // <li id='key' ftnode=this> tag
|
227
|
+
this.isStatusNode = false;
|
228
|
+
this.data = {};
|
229
|
+
|
230
|
+
// TODO: merge this code with node.toDict()
|
231
|
+
// copy attributes from obj object
|
232
|
+
for(i=0, l=NODE_ATTRS.length; i<l; i++){
|
233
|
+
name = NODE_ATTRS[i];
|
234
|
+
this[name] = obj[name];
|
235
|
+
}
|
236
|
+
// node.data += obj.data
|
237
|
+
if(obj.data){
|
238
|
+
$.extend(this.data, obj.data);
|
239
|
+
}
|
240
|
+
// copy all other attributes to this.data.NAME
|
241
|
+
for(name in obj){
|
242
|
+
if(!NODE_ATTR_MAP[name] && !$.isFunction(obj[name]) && !NONE_NODE_DATA_MAP[name]){
|
243
|
+
// node.data.NAME = obj.NAME
|
244
|
+
this.data[name] = obj[name];
|
245
|
+
}
|
246
|
+
}
|
247
|
+
|
248
|
+
// Fix missing key
|
249
|
+
if( this.key == null ){ // test for null OR undefined
|
250
|
+
this.key = "_" + (FT._nextNodeKey++);
|
251
|
+
}
|
252
|
+
// Fix tree.activeNode
|
253
|
+
// TODO: not elegant: we use obj.active as marker to set tree.activeNode
|
254
|
+
// when loading from a dictionary.
|
255
|
+
if(obj.active){
|
256
|
+
_assert(this.tree.activeNode === null, "only one active node allowed");
|
257
|
+
this.tree.activeNode = this;
|
258
|
+
}
|
259
|
+
// TODO: handle obj.focus = true
|
260
|
+
// Create child nodes
|
261
|
+
this.children = null;
|
262
|
+
cl = obj.children;
|
263
|
+
if(cl && cl.length){
|
264
|
+
this._setChildren(cl);
|
265
|
+
}
|
266
|
+
}
|
267
|
+
|
268
|
+
|
269
|
+
FancytreeNode.prototype = /**@lends FancytreeNode*/{
|
270
|
+
/* Return the direct child FancytreeNode with a given key, index. */
|
271
|
+
_findDirectChild: function(ptr){
|
272
|
+
var i, l,
|
273
|
+
cl = this.children;
|
274
|
+
|
275
|
+
if(cl){
|
276
|
+
if(typeof ptr === "string"){
|
277
|
+
for(i=0, l=cl.length; i<l; i++){
|
278
|
+
if(cl[i].key === ptr){
|
279
|
+
return cl[i];
|
280
|
+
}
|
281
|
+
}
|
282
|
+
}else if(typeof ptr === "number"){
|
283
|
+
return this.children[ptr];
|
284
|
+
}else if(ptr.parent === this){
|
285
|
+
return ptr;
|
286
|
+
}
|
287
|
+
}
|
288
|
+
return null;
|
289
|
+
},
|
290
|
+
// TODO: activate()
|
291
|
+
// TODO: activateSilently()
|
292
|
+
/* Internal helper called in recursive addChildren sequence.*/
|
293
|
+
_setChildren: function(children){
|
294
|
+
_assert(children && (!this.children || this.children.length === 0), "only init supported");
|
295
|
+
this.children = [];
|
296
|
+
for(var i=0, l=children.length; i<l; i++){
|
297
|
+
this.children.push(new FancytreeNode(this, children[i]));
|
298
|
+
}
|
299
|
+
},
|
300
|
+
/**
|
301
|
+
* Append (or insert) a list of child nodes.
|
302
|
+
*
|
303
|
+
* @param {NodeData[]} children array of child node definitions (also single child accepted)
|
304
|
+
* @param {FancytreeNode | String | Integer} [insertBefore] child node (or key or index of such).
|
305
|
+
* If omitted, the new children are appended.
|
306
|
+
* @returns {FancytreeNode} first child added
|
307
|
+
*
|
308
|
+
* @see applyPatch to modify existing child nodes.
|
309
|
+
* @see FanctreeNode.applyPatch to modify existing child nodes.
|
310
|
+
* @see FanctreeNode#applyPatch to modify existing child nodes.
|
311
|
+
* @see applyPatch
|
312
|
+
* @see FanctreeNode.applyPatch
|
313
|
+
* @see FanctreeNode#applyPatch
|
314
|
+
*/
|
315
|
+
addChildren: function(children, insertBefore){
|
316
|
+
var i, l, pos,
|
317
|
+
firstNode = null,
|
318
|
+
nodeList = [];
|
319
|
+
|
320
|
+
if($.isPlainObject(children) ){
|
321
|
+
children = [children];
|
322
|
+
}
|
323
|
+
if(!this.children){
|
324
|
+
this.children = [];
|
325
|
+
}
|
326
|
+
for(i=0, l=children.length; i<l; i++){
|
327
|
+
nodeList.push(new FancytreeNode(this, children[i]));
|
328
|
+
}
|
329
|
+
firstNode = nodeList[0];
|
330
|
+
if(insertBefore == null){
|
331
|
+
this.children = this.children.concat(nodeList);
|
332
|
+
}else{
|
333
|
+
insertBefore = this._findDirectChild(insertBefore);
|
334
|
+
pos = $.inArray(insertBefore, this.children);
|
335
|
+
_assert(pos >= 0, "insertBefore must be an existing child");
|
336
|
+
// insert nodeList after children[pos]
|
337
|
+
this.children.splice.apply(this.children, [pos, 0].concat(nodeList));
|
338
|
+
}
|
339
|
+
if( !this.parent || this.parent.ul || this.tr ){
|
340
|
+
// render if the parent was rendered (or this is a root node)
|
341
|
+
this.render();
|
342
|
+
}
|
343
|
+
if( this.tree.options.selectMode === 3 ){
|
344
|
+
this.fixSelection3FromEndNodes();
|
345
|
+
}
|
346
|
+
return firstNode;
|
347
|
+
},
|
348
|
+
/**
|
349
|
+
* Append or prepend a node, or append a child node.
|
350
|
+
*
|
351
|
+
* @param {NodeData} node node definition
|
352
|
+
* @param {String} [mode] 'before', 'after', or 'child'
|
353
|
+
* @returns {FancytreeNode} new node
|
354
|
+
*/
|
355
|
+
addNode: function(node, mode){
|
356
|
+
if(mode === undefined || mode === "over"){
|
357
|
+
mode = "child";
|
358
|
+
}
|
359
|
+
switch(mode){
|
360
|
+
case "after":
|
361
|
+
return this.getParent().addChildren(node, this.getNextSibling());
|
362
|
+
case "before":
|
363
|
+
return this.getParent().addChildren(node, this);
|
364
|
+
case "child":
|
365
|
+
case "over":
|
366
|
+
return this.addChildren(node);
|
367
|
+
}
|
368
|
+
_assert(false, "Invalid mode: " + mode);
|
369
|
+
},
|
370
|
+
/**
|
371
|
+
*
|
372
|
+
* @param {NodePatch} patch
|
373
|
+
* @returns {$.Promise}
|
374
|
+
* @see {@link applyPatch} to modify existing child nodes.
|
375
|
+
* @see FancytreeNode#addChildren
|
376
|
+
*/
|
377
|
+
applyPatch: function(patch) {
|
378
|
+
// patch [key, null] means 'remove'
|
379
|
+
if(patch === null){
|
380
|
+
this.remove();
|
381
|
+
return _getResolvedPromise(this);
|
382
|
+
}
|
383
|
+
// TODO: make sure that root node is not collapsed or modified
|
384
|
+
// copy (most) attributes to node.ATTR or node.data.ATTR
|
385
|
+
var name, promise, v,
|
386
|
+
IGNORE_MAP = { children: true, expanded: true, parent: true }; // TODO: should be global
|
387
|
+
|
388
|
+
for(name in patch){
|
389
|
+
v = patch[name];
|
390
|
+
if( !IGNORE_MAP[name] && !$.isFunction(v)){
|
391
|
+
if(NODE_ATTR_MAP[name]){
|
392
|
+
this[name] = v;
|
393
|
+
}else{
|
394
|
+
this.data[name] = v;
|
395
|
+
}
|
396
|
+
}
|
397
|
+
}
|
398
|
+
// Remove and/or create children
|
399
|
+
if(patch.hasOwnProperty("children")){
|
400
|
+
this.removeChildren();
|
401
|
+
if(patch.children){ // only if not null and not empty list
|
402
|
+
// TODO: addChildren instead?
|
403
|
+
this._setChildren(patch.children);
|
404
|
+
}
|
405
|
+
// TODO: how can we APPEND or INSERT child nodes?
|
406
|
+
}
|
407
|
+
if(this.isVisible()){
|
408
|
+
this.renderTitle();
|
409
|
+
this.renderStatus();
|
410
|
+
}
|
411
|
+
// Expand collapse (final step, since this may be async)
|
412
|
+
if(patch.hasOwnProperty("expanded")){
|
413
|
+
promise = this.setExpanded(patch.expanded);
|
414
|
+
}else{
|
415
|
+
promise = _getResolvedPromise(this);
|
416
|
+
}
|
417
|
+
return promise;
|
418
|
+
},
|
419
|
+
/**
|
420
|
+
* @returns {$.Promise}
|
421
|
+
*/
|
422
|
+
collapseSiblings: function() {
|
423
|
+
return this.tree._callHook("nodeCollapseSiblings", this);
|
424
|
+
},
|
425
|
+
/** Copy this node as sibling or child of `node`.
|
426
|
+
*
|
427
|
+
* @param {FancytreeNode} node source node
|
428
|
+
* @param {String} mode 'before' | 'after' | 'child'
|
429
|
+
* @param {Function} [map] callback function(NodeData) that could modify the new node
|
430
|
+
* @returns {FancytreeNode} new
|
431
|
+
*/
|
432
|
+
copyTo: function(node, mode, map) {
|
433
|
+
return node.addNode(this.toDict(true, map), mode);
|
434
|
+
},
|
435
|
+
/** Count direct and indirect children.
|
436
|
+
*
|
437
|
+
* @param {Boolean} [deep=true] pass 'false' to only count direct children
|
438
|
+
* @returns {int} number of child nodes
|
439
|
+
*/
|
440
|
+
countChildren: function(deep) {
|
441
|
+
var cl = this.children, i, l, n;
|
442
|
+
if( !cl ){
|
443
|
+
return 0;
|
444
|
+
}
|
445
|
+
n = cl.length;
|
446
|
+
if(deep !== false){
|
447
|
+
for(i=0, l=n; i<l; i++){
|
448
|
+
n += cl[i].countChildren();
|
449
|
+
}
|
450
|
+
}
|
451
|
+
return n;
|
452
|
+
},
|
453
|
+
// TODO: deactivate()
|
454
|
+
/** Write to browser console if debugLevel >= 2 (prepending node info)
|
455
|
+
*
|
456
|
+
* @param {*} msg string or object or array of such
|
457
|
+
*/
|
458
|
+
debug: function(msg){
|
459
|
+
if( this.tree.options.debugLevel >= 2 ) {
|
460
|
+
Array.prototype.unshift.call(arguments, this.toString());
|
461
|
+
consoleApply("debug", arguments);
|
462
|
+
}
|
463
|
+
},
|
464
|
+
/** Remove all children of a lazy node and collapse.*/
|
465
|
+
discard: function(){
|
466
|
+
if(this.lazy && $.isArray(this.children)){
|
467
|
+
this.removeChildren();
|
468
|
+
return this.setExpanded(false);
|
469
|
+
}
|
470
|
+
},
|
471
|
+
// TODO: expand(flag)
|
472
|
+
/**Find all nodes that contain `match` in the title.
|
473
|
+
*
|
474
|
+
* @param {String | function(node)} match string to search for, of a function that
|
475
|
+
* returns `true` if a node is matched.
|
476
|
+
* @returns {FancytreeNode[]} array of nodes (may be empty)
|
477
|
+
* @see FancytreeNode#findAll
|
478
|
+
*/
|
479
|
+
findAll: function(match) {
|
480
|
+
match = $.isFunction(match) ? match : _makeNodeTitleMatcher(match);
|
481
|
+
var res = [];
|
482
|
+
this.visit(function(n){
|
483
|
+
if(match(n)){
|
484
|
+
res.push(n);
|
485
|
+
}
|
486
|
+
});
|
487
|
+
return res;
|
488
|
+
},
|
489
|
+
/**Find first node that contains `match` in the title (not including self).
|
490
|
+
*
|
491
|
+
* @param {String | function(node)} match string to search for, of a function that
|
492
|
+
* returns `true` if a node is matched.
|
493
|
+
* @returns {FancytreeNode} matching node or null
|
494
|
+
* @example
|
495
|
+
* <b>fat</b> text
|
496
|
+
*/
|
497
|
+
findFirst: function(match) {
|
498
|
+
match = $.isFunction(match) ? match : _makeNodeTitleMatcher(match);
|
499
|
+
var res = null;
|
500
|
+
this.visit(function(n){
|
501
|
+
if(match(n)){
|
502
|
+
res = n;
|
503
|
+
return false;
|
504
|
+
}
|
505
|
+
});
|
506
|
+
return res;
|
507
|
+
},
|
508
|
+
/* Apply selection state (internal use only) */
|
509
|
+
_changeSelectStatusAttrs: function (state) {
|
510
|
+
var changed = false;
|
511
|
+
|
512
|
+
switch(state){
|
513
|
+
case false:
|
514
|
+
changed = ( this.selected || this.partsel );
|
515
|
+
this.selected = false;
|
516
|
+
this.partsel = false;
|
517
|
+
break;
|
518
|
+
case true:
|
519
|
+
changed = ( !this.selected || !this.partsel );
|
520
|
+
this.selected = true;
|
521
|
+
this.partsel = true;
|
522
|
+
break;
|
523
|
+
case undefined:
|
524
|
+
changed = ( this.selected || !this.partsel );
|
525
|
+
this.selected = false;
|
526
|
+
this.partsel = true;
|
527
|
+
break;
|
528
|
+
default:
|
529
|
+
_assert(false, "invalid state: " + state);
|
530
|
+
}
|
531
|
+
this.debug("fixSelection3AfterLoad() _changeSelectStatusAttrs()", state, changed);
|
532
|
+
if( changed ){
|
533
|
+
this.renderStatus();
|
534
|
+
}
|
535
|
+
return changed;
|
536
|
+
},
|
537
|
+
/**
|
538
|
+
* Fix selection status, after this node was (de)selected in multi-hier mode.
|
539
|
+
* This includes (de)selecting all children.
|
540
|
+
*/
|
541
|
+
fixSelection3AfterClick: function() {
|
542
|
+
var flag = this.isSelected();
|
543
|
+
|
544
|
+
// this.debug("fixSelection3AfterClick()");
|
545
|
+
|
546
|
+
this.visit(function(node){
|
547
|
+
node._changeSelectStatusAttrs(flag);
|
548
|
+
});
|
549
|
+
this.fixSelection3FromEndNodes();
|
550
|
+
},
|
551
|
+
/**
|
552
|
+
* Fix selection status for multi-hier mode.
|
553
|
+
* Only end-nodes are considered to update the descendants branch and parents.
|
554
|
+
* Should be called after this node has loaded new children or after
|
555
|
+
* children have been modified using the API.
|
556
|
+
*/
|
557
|
+
fixSelection3FromEndNodes: function() {
|
558
|
+
// this.debug("fixSelection3FromEndNodes()");
|
559
|
+
_assert(this.tree.options.selectMode === 3, "expected selectMode 3");
|
560
|
+
|
561
|
+
// Visit all end nodes and adjust their parent's `selected` and `partsel`
|
562
|
+
// attributes. Return selection state true, false, or undefined.
|
563
|
+
function _walk(node){
|
564
|
+
var i, l, child, s, state, allSelected,someSelected,
|
565
|
+
children = node.children;
|
566
|
+
|
567
|
+
if( children ){
|
568
|
+
// check all children recursively
|
569
|
+
allSelected = true;
|
570
|
+
someSelected = false;
|
571
|
+
|
572
|
+
for( i=0, l=children.length; i<l; i++ ){
|
573
|
+
child = children[i];
|
574
|
+
// the selection state of a node is not relevant; we need the end-nodes
|
575
|
+
s = _walk(child);
|
576
|
+
if( s !== false ) {
|
577
|
+
someSelected = true;
|
578
|
+
}
|
579
|
+
if( s !== true ) {
|
580
|
+
allSelected = false;
|
581
|
+
}
|
582
|
+
}
|
583
|
+
state = allSelected ? true : (someSelected ? undefined : false);
|
584
|
+
}else{
|
585
|
+
// This is an end-node: simply report the status
|
586
|
+
// state = ( node.unselectable ) ? undefined : !!node.selected;
|
587
|
+
state = !!node.selected;
|
588
|
+
}
|
589
|
+
node._changeSelectStatusAttrs(state);
|
590
|
+
return state;
|
591
|
+
}
|
592
|
+
_walk(this);
|
593
|
+
|
594
|
+
// Update parent's state
|
595
|
+
this.visitParents(function(node){
|
596
|
+
var i, l, child, state,
|
597
|
+
children = node.children,
|
598
|
+
allSelected = true,
|
599
|
+
someSelected = false;
|
600
|
+
|
601
|
+
for( i=0, l=children.length; i<l; i++ ){
|
602
|
+
child = children[i];
|
603
|
+
// When fixing the parents, we trust the sibling status (i.e.
|
604
|
+
// we don't recurse)
|
605
|
+
if( child.selected || child.partsel ) {
|
606
|
+
someSelected = true;
|
607
|
+
}
|
608
|
+
if( !child.unselectable && !child.selected ) {
|
609
|
+
allSelected = false;
|
610
|
+
}
|
611
|
+
}
|
612
|
+
state = allSelected ? true : (someSelected ? undefined : false);
|
613
|
+
node._changeSelectStatusAttrs(state);
|
614
|
+
});
|
615
|
+
},
|
616
|
+
// TODO: focus()
|
617
|
+
/**
|
618
|
+
* Update node data. If dict contains 'children', then also replace
|
619
|
+
* the hole sub tree.
|
620
|
+
* @param {NodeData} dict
|
621
|
+
*
|
622
|
+
* @see FancytreeNode#addChildren
|
623
|
+
* @see FancytreeNode#applyPatch
|
624
|
+
*/
|
625
|
+
fromDict: function(dict) {
|
626
|
+
// copy all other attributes to this.data.xxx
|
627
|
+
for(var name in dict){
|
628
|
+
if(NODE_ATTR_MAP[name]){
|
629
|
+
// node.NAME = dict.NAME
|
630
|
+
this[name] = dict[name];
|
631
|
+
}else if(name === "data"){
|
632
|
+
// node.data += dict.data
|
633
|
+
$.extend(this.data, dict.data);
|
634
|
+
}else if(!$.isFunction(dict[name]) && !NONE_NODE_DATA_MAP[name]){
|
635
|
+
// node.data.NAME = dict.NAME
|
636
|
+
this.data[name] = dict[name];
|
637
|
+
}
|
638
|
+
}
|
639
|
+
if(dict.children){
|
640
|
+
// recursively set children and render
|
641
|
+
this.removeChildren();
|
642
|
+
this.addChildren(dict.children);
|
643
|
+
}else{
|
644
|
+
this.renderTitle();
|
645
|
+
}
|
646
|
+
/*
|
647
|
+
var children = dict.children;
|
648
|
+
if(children === undefined){
|
649
|
+
this.data = $.extend(this.data, dict);
|
650
|
+
this.render();
|
651
|
+
return;
|
652
|
+
}
|
653
|
+
dict = $.extend({}, dict);
|
654
|
+
dict.children = undefined;
|
655
|
+
this.data = $.extend(this.data, dict);
|
656
|
+
this.removeChildren();
|
657
|
+
this.addChild(children);
|
658
|
+
*/
|
659
|
+
},
|
660
|
+
/** @returns {FancytreeNode[] | undefined} list of child nodes (undefined for unexpanded lazy nodes).*/
|
661
|
+
getChildren: function() {
|
662
|
+
if(this.hasChildren() === undefined){ // TODO: only required for lazy nodes?
|
663
|
+
return undefined; // Lazy node: unloaded, currently loading, or load error
|
664
|
+
}
|
665
|
+
return this.children;
|
666
|
+
},
|
667
|
+
/** @returns {FancytreeNode | null}*/
|
668
|
+
getFirstChild: function() {
|
669
|
+
return this.children ? this.children[0] : null;
|
670
|
+
},
|
671
|
+
/** @returns {int} 0-based child index.*/
|
672
|
+
getIndex: function() {
|
673
|
+
// return this.parent.children.indexOf(this);
|
674
|
+
return $.inArray(this, this.parent.children); // indexOf doesn't work in IE7
|
675
|
+
},
|
676
|
+
/**@returns {String} hierarchical child index (1-based: '3.2.4').*/
|
677
|
+
getIndexHier: function(separator) {
|
678
|
+
separator = separator || ".";
|
679
|
+
var res = [];
|
680
|
+
$.each(this.getParentList(false, true), function(i, o){
|
681
|
+
res.push(o.getIndex() + 1);
|
682
|
+
});
|
683
|
+
return res.join(separator);
|
684
|
+
},
|
685
|
+
/**
|
686
|
+
* @param {Boolean} [excludeSelf=false]
|
687
|
+
* @returns {String} parent keys separated by options.keyPathSeparator
|
688
|
+
*/
|
689
|
+
getKeyPath: function(excludeSelf) {
|
690
|
+
var path = [],
|
691
|
+
sep = this.tree.options.keyPathSeparator;
|
692
|
+
this.visitParents(function(n){
|
693
|
+
if(n.parent){
|
694
|
+
path.unshift(n.key);
|
695
|
+
}
|
696
|
+
}, !excludeSelf);
|
697
|
+
return sep + path.join(sep);
|
698
|
+
},
|
699
|
+
/**@returns {FancytreeNode | null} last child of this node.*/
|
700
|
+
getLastChild: function() {
|
701
|
+
return this.children ? this.children[this.children.length - 1] : null;
|
702
|
+
},
|
703
|
+
/** @returns {int} node depth. 0: System root node, 1: visible top-level node, 2: first sub-level, .... */
|
704
|
+
getLevel: function() {
|
705
|
+
var level = 0,
|
706
|
+
dtn = this.parent;
|
707
|
+
while( dtn ) {
|
708
|
+
level++;
|
709
|
+
dtn = dtn.parent;
|
710
|
+
}
|
711
|
+
return level;
|
712
|
+
},
|
713
|
+
/** @returns {FancytreeNode | null} */
|
714
|
+
getNextSibling: function() {
|
715
|
+
// TODO: use indexOf, if available: (not in IE6)
|
716
|
+
if( this.parent ){
|
717
|
+
var i, l,
|
718
|
+
ac = this.parent.children;
|
719
|
+
|
720
|
+
for(i=0, l=ac.length-1; i<l; i++){ // up to length-2, so next(last) = null
|
721
|
+
if( ac[i] === this ){
|
722
|
+
return ac[i+1];
|
723
|
+
}
|
724
|
+
}
|
725
|
+
}
|
726
|
+
return null;
|
727
|
+
},
|
728
|
+
/** @returns {FancytreeNode | null} returns null for the system root node*/
|
729
|
+
getParent: function() {
|
730
|
+
// TODO: return null for top-level nodes?
|
731
|
+
return this.parent;
|
732
|
+
},
|
733
|
+
/**
|
734
|
+
* @param {Boolean} [includeRoot=false]
|
735
|
+
* @param {Boolean} [includeSelf=false]
|
736
|
+
* @returns {FancytreeNode[]}
|
737
|
+
*/
|
738
|
+
getParentList: function(includeRoot, includeSelf) {
|
739
|
+
var l = [],
|
740
|
+
dtn = includeSelf ? this : this.parent;
|
741
|
+
while( dtn ) {
|
742
|
+
if( includeRoot || dtn.parent ){
|
743
|
+
l.unshift(dtn);
|
744
|
+
}
|
745
|
+
dtn = dtn.parent;
|
746
|
+
}
|
747
|
+
return l;
|
748
|
+
},
|
749
|
+
/** @returns {FancytreeNode | null} */
|
750
|
+
getPrevSibling: function() {
|
751
|
+
if( this.parent ){
|
752
|
+
var i, l,
|
753
|
+
ac = this.parent.children;
|
754
|
+
|
755
|
+
for(i=1, l=ac.length; i<l; i++){ // start with 1, so prev(first) = null
|
756
|
+
if( ac[i] === this ){
|
757
|
+
return ac[i-1];
|
758
|
+
}
|
759
|
+
}
|
760
|
+
}
|
761
|
+
return null;
|
762
|
+
},
|
763
|
+
/** @returns {boolean | undefined} Check if node has children (returns undefined, if not sure). */
|
764
|
+
hasChildren: function() {
|
765
|
+
if(this.lazy){
|
766
|
+
if(this.children == null ){
|
767
|
+
// null or undefined: Not yet loaded
|
768
|
+
return undefined;
|
769
|
+
}else if(this.children.length === 0){
|
770
|
+
// Loaded, but response was empty
|
771
|
+
return false;
|
772
|
+
}else if(this.children.length === 1 && this.children[0].isStatusNode ){
|
773
|
+
// Currently loading or load error
|
774
|
+
return undefined;
|
775
|
+
}
|
776
|
+
return true;
|
777
|
+
}
|
778
|
+
return !!this.children;
|
779
|
+
},
|
780
|
+
/**@returns {Boolean} true, if node has keyboard focus*/
|
781
|
+
hasFocus: function() {
|
782
|
+
return (this.tree.hasFocus() && this.tree.focusNode === this);
|
783
|
+
},
|
784
|
+
/**@returns {Boolean} true, if node is active*/
|
785
|
+
isActive: function() {
|
786
|
+
return (this.tree.activeNode === this);
|
787
|
+
},
|
788
|
+
/**
|
789
|
+
* @param {FancytreeNode} otherNode
|
790
|
+
* @returns {Boolean} true, if node is a direct child of otherNode
|
791
|
+
*/
|
792
|
+
isChildOf: function(otherNode) {
|
793
|
+
return (this.parent && this.parent === otherNode);
|
794
|
+
},
|
795
|
+
/**
|
796
|
+
* @param {FancytreeNode} otherNode
|
797
|
+
* @returns {Boolean} true, if node is a sub node of otherNode
|
798
|
+
*/
|
799
|
+
isDescendantOf: function(otherNode) {
|
800
|
+
if(!otherNode || otherNode.tree !== this.tree){
|
801
|
+
return false;
|
802
|
+
}
|
803
|
+
var p = this.parent;
|
804
|
+
while( p ) {
|
805
|
+
if( p === otherNode ){
|
806
|
+
return true;
|
807
|
+
}
|
808
|
+
p = p.parent;
|
809
|
+
}
|
810
|
+
return false;
|
811
|
+
},
|
812
|
+
/** @returns {Boolean} true, if node is expanded*/
|
813
|
+
isExpanded: function() {
|
814
|
+
return !!this.expanded;
|
815
|
+
},
|
816
|
+
/** @returns {Boolean}*/
|
817
|
+
isFirstSibling: function() {
|
818
|
+
var p = this.parent;
|
819
|
+
return !p || p.children[0] === this;
|
820
|
+
},
|
821
|
+
/** @returns {Boolean}*/
|
822
|
+
isFolder: function() {
|
823
|
+
return !!this.folder;
|
824
|
+
},
|
825
|
+
/** @returns {Boolean}*/
|
826
|
+
isLastSibling: function() {
|
827
|
+
var p = this.parent;
|
828
|
+
return !p || p.children[p.children.length-1] === this;
|
829
|
+
},
|
830
|
+
/** @returns {Boolean} true, if node is lazy (even if data was already loaded)*/
|
831
|
+
isLazy: function() {
|
832
|
+
return !!this.lazy;
|
833
|
+
},
|
834
|
+
/** @returns {Boolean} true, if children are currently beeing loaded*/
|
835
|
+
isLoading: function() {
|
836
|
+
_raiseNotImplemented(); // TODO: implement
|
837
|
+
},
|
838
|
+
/**@returns {Boolean} true, if node is the (invisible) system root node*/
|
839
|
+
isRoot: function() {
|
840
|
+
return (this.tree.rootNode === this);
|
841
|
+
},
|
842
|
+
/** @returns {Boolean} true, if node is selected (e.g. has a checkmark set)*/
|
843
|
+
isSelected: function() {
|
844
|
+
return !!this.selected;
|
845
|
+
},
|
846
|
+
// TODO: use _isStatusNode as class attribute name
|
847
|
+
// isStatusNode: function() {
|
848
|
+
// return (this.data.isStatusNode === true);
|
849
|
+
// },
|
850
|
+
/** Return true, if all parents are expanded. */
|
851
|
+
isVisible: function() {
|
852
|
+
var i, l,
|
853
|
+
parents = this.getParentList(false, false);
|
854
|
+
|
855
|
+
for(i=0, l=parents.length; i<l; i++){
|
856
|
+
if( ! parents[i].expanded ){ return false; }
|
857
|
+
}
|
858
|
+
return true;
|
859
|
+
},
|
860
|
+
/** Expand all parents and optionally scroll into visible area as neccessary (async).
|
861
|
+
*
|
862
|
+
*/
|
863
|
+
makeVisible: function() {
|
864
|
+
// TODO: implement scolling (http://www.w3.org/TR/wai-aria-practices/#visualfocus)
|
865
|
+
// TODO: return $.promise
|
866
|
+
var i, l,
|
867
|
+
parents = this.getParentList(false, false);
|
868
|
+
|
869
|
+
for(i=0, l=parents.length; i<l; i++){
|
870
|
+
parents[i].setExpanded(true);
|
871
|
+
}
|
872
|
+
},
|
873
|
+
/** Move this node to targetNode.
|
874
|
+
* @param {FancytreeNode} targetNode
|
875
|
+
* @param {String} mode
|
876
|
+
* 'child': append this node as last child of targetNode.
|
877
|
+
* This is the default. To be compatble with the D'n'd
|
878
|
+
* hitMode, we also accept 'over'.
|
879
|
+
* 'before': add this node as sibling before targetNode.
|
880
|
+
* 'after': add this node as sibling after targetNode.
|
881
|
+
* @param [map] optional callback(FancytreeNode) to allow modifcations
|
882
|
+
*/
|
883
|
+
moveTo: function(targetNode, mode, map) {
|
884
|
+
if(mode === undefined || mode === "over"){
|
885
|
+
mode = "child";
|
886
|
+
}
|
887
|
+
var pos,
|
888
|
+
prevParent = this.parent,
|
889
|
+
targetParent = (mode === "child") ? targetNode : targetNode.parent;
|
890
|
+
|
891
|
+
if(this === targetNode){
|
892
|
+
return;
|
893
|
+
}else if( !this.parent ){
|
894
|
+
throw "Cannot move system root";
|
895
|
+
}else if( targetParent.isDescendantOf(this) ){
|
896
|
+
throw "Cannot move a node to it's own descendant";
|
897
|
+
}
|
898
|
+
// Unlink this node from current parent
|
899
|
+
if( this.parent.children.length === 1 ) {
|
900
|
+
this.parent.children = this.parent.lazy ? [] : null;
|
901
|
+
this.parent.expanded = false;
|
902
|
+
} else {
|
903
|
+
pos = $.inArray(this, this.parent.children);
|
904
|
+
_assert(pos >= 0);
|
905
|
+
this.parent.children.splice(pos, 1);
|
906
|
+
}
|
907
|
+
// Remove from source DOM parent
|
908
|
+
// if(this.parent.ul){
|
909
|
+
// this.parent.ul.removeChild(this.li);
|
910
|
+
// }
|
911
|
+
|
912
|
+
// Insert this node to target parent's child list
|
913
|
+
this.parent = targetParent;
|
914
|
+
if( targetParent.hasChildren() ) {
|
915
|
+
switch(mode) {
|
916
|
+
case "child":
|
917
|
+
// Append to existing target children
|
918
|
+
targetParent.children.push(this);
|
919
|
+
break;
|
920
|
+
case "before":
|
921
|
+
// Insert this node before target node
|
922
|
+
pos = $.inArray(targetNode, targetParent.children);
|
923
|
+
_assert(pos >= 0);
|
924
|
+
targetParent.children.splice(pos, 0, this);
|
925
|
+
break;
|
926
|
+
case "after":
|
927
|
+
// Insert this node after target node
|
928
|
+
pos = $.inArray(targetNode, targetParent.children);
|
929
|
+
_assert(pos >= 0);
|
930
|
+
targetParent.children.splice(pos+1, 0, this);
|
931
|
+
break;
|
932
|
+
default:
|
933
|
+
throw "Invalid mode " + mode;
|
934
|
+
}
|
935
|
+
} else {
|
936
|
+
targetParent.children = [ this ];
|
937
|
+
}
|
938
|
+
// Parent has no <ul> tag yet:
|
939
|
+
// if( !targetParent.ul ) {
|
940
|
+
// // This is the parent's first child: create UL tag
|
941
|
+
// // (Hidden, because it will be
|
942
|
+
// targetParent.ul = document.createElement("ul");
|
943
|
+
// targetParent.ul.style.display = "none";
|
944
|
+
// targetParent.li.appendChild(targetParent.ul);
|
945
|
+
// }
|
946
|
+
// // Issue 319: Add to target DOM parent (only if node was already rendered(expanded))
|
947
|
+
// if(this.li){
|
948
|
+
// targetParent.ul.appendChild(this.li);
|
949
|
+
// }^
|
950
|
+
|
951
|
+
// Let caller modify the nodes
|
952
|
+
if( map ){
|
953
|
+
targetNode.visit(map, true);
|
954
|
+
}
|
955
|
+
// Handle cross-tree moves
|
956
|
+
if( this.tree !== targetNode.tree ) {
|
957
|
+
// Fix node.tree for all source nodes
|
958
|
+
// _assert(false, "Cross-tree move is not yet implemented.");
|
959
|
+
this.warn("Cross-tree moveTo is experimantal!");
|
960
|
+
this.visit(function(n){
|
961
|
+
// TODO: fix selection state and activation, ...
|
962
|
+
n.tree = targetNode.tree;
|
963
|
+
}, true);
|
964
|
+
}
|
965
|
+
|
966
|
+
// A collaposed node won't re-render children, so we have to remove it manually
|
967
|
+
if( !targetParent.expanded){
|
968
|
+
prevParent.ul.removeChild(this.li);
|
969
|
+
}
|
970
|
+
|
971
|
+
// Update HTML markup
|
972
|
+
if( !prevParent.isDescendantOf(targetParent)) {
|
973
|
+
prevParent.render();
|
974
|
+
}
|
975
|
+
if( !targetParent.isDescendantOf(prevParent) && targetParent !== prevParent) {
|
976
|
+
targetParent.render();
|
977
|
+
}
|
978
|
+
// TODO: fix selection state
|
979
|
+
// TODO: fix active state
|
980
|
+
|
981
|
+
/*
|
982
|
+
var tree = this.tree;
|
983
|
+
var opts = tree.options;
|
984
|
+
var pers = tree.persistence;
|
985
|
+
|
986
|
+
|
987
|
+
// Always expand, if it's below minExpandLevel
|
988
|
+
// tree.logDebug ("%s._addChildNode(%o), l=%o", this, ftnode, ftnode.getLevel());
|
989
|
+
if ( opts.minExpandLevel >= ftnode.getLevel() ) {
|
990
|
+
// tree.logDebug ("Force expand for %o", ftnode);
|
991
|
+
this.bExpanded = true;
|
992
|
+
}
|
993
|
+
|
994
|
+
// In multi-hier mode, update the parents selection state
|
995
|
+
// issue #82: only if not initializing, because the children may not exist yet
|
996
|
+
// if( !ftnode.data.isStatusNode && opts.selectMode==3 && !isInitializing )
|
997
|
+
// ftnode._fixSelectionState();
|
998
|
+
|
999
|
+
// In multi-hier mode, update the parents selection state
|
1000
|
+
if( ftnode.bSelected && opts.selectMode==3 ) {
|
1001
|
+
var p = this;
|
1002
|
+
while( p ) {
|
1003
|
+
if( !p.hasSubSel )
|
1004
|
+
p._setSubSel(true);
|
1005
|
+
p = p.parent;
|
1006
|
+
}
|
1007
|
+
}
|
1008
|
+
// render this node and the new child
|
1009
|
+
if ( tree.bEnableUpdate )
|
1010
|
+
this.render();
|
1011
|
+
|
1012
|
+
return ftnode;
|
1013
|
+
|
1014
|
+
*/
|
1015
|
+
},
|
1016
|
+
/** Set focus relative to this node and optionally activate.
|
1017
|
+
*
|
1018
|
+
* @param {number} where The keyCode that would normally trigger this move,
|
1019
|
+
* e.g. `$.ui.keyCode.LEFT` would collapse the node if it
|
1020
|
+
* is expanded or move to the parent oterwise.
|
1021
|
+
* @param {boolean} [activate=true]
|
1022
|
+
* @returns {$.Promise}
|
1023
|
+
*/
|
1024
|
+
navigate: function(where, activate) {
|
1025
|
+
var i, parents,
|
1026
|
+
handled = true,
|
1027
|
+
KC = $.ui.keyCode,
|
1028
|
+
sib = null;
|
1029
|
+
|
1030
|
+
// Navigate to node
|
1031
|
+
function _goto(n){
|
1032
|
+
if( n ){
|
1033
|
+
n.makeVisible();
|
1034
|
+
return activate === false ? n.setFocus() : n.setActive();
|
1035
|
+
}
|
1036
|
+
}
|
1037
|
+
|
1038
|
+
switch( where ) {
|
1039
|
+
case KC.BACKSPACE:
|
1040
|
+
if( this.parent && this.parent.parent ) {
|
1041
|
+
_goto(this.parent);
|
1042
|
+
}
|
1043
|
+
break;
|
1044
|
+
case KC.LEFT:
|
1045
|
+
if( this.expanded ) {
|
1046
|
+
this.setExpanded(false);
|
1047
|
+
// tree.nodeSetFocus(ctx);
|
1048
|
+
_goto(this);
|
1049
|
+
} else if( this.parent && this.parent.parent ) {
|
1050
|
+
// this.parent.setFocus();
|
1051
|
+
_goto(this.parent);
|
1052
|
+
}
|
1053
|
+
break;
|
1054
|
+
case KC.RIGHT:
|
1055
|
+
if( !this.expanded && (this.children || this.lazy) ) {
|
1056
|
+
this.setExpanded();
|
1057
|
+
// tree.nodeSetFocus(ctx);
|
1058
|
+
_goto(this);
|
1059
|
+
} else if( this.children && this.children.length ) {
|
1060
|
+
// this.children[0].setFocus();
|
1061
|
+
_goto(this.children[0]);
|
1062
|
+
}
|
1063
|
+
break;
|
1064
|
+
case KC.UP:
|
1065
|
+
sib = this.getPrevSibling();
|
1066
|
+
while( sib && sib.expanded && sib.children && sib.children.length ){
|
1067
|
+
sib = sib.children[sib.children.length - 1];
|
1068
|
+
}
|
1069
|
+
if( !sib && this.parent && this.parent.parent ){
|
1070
|
+
sib = this.parent;
|
1071
|
+
}
|
1072
|
+
_goto(sib);
|
1073
|
+
break;
|
1074
|
+
case KC.DOWN:
|
1075
|
+
if( this.expanded && this.children && this.children.length ) {
|
1076
|
+
sib = this.children[0];
|
1077
|
+
} else {
|
1078
|
+
parents = this.getParentList(false, true);
|
1079
|
+
for(i=parents.length-1; i>=0; i--) {
|
1080
|
+
sib = parents[i].getNextSibling();
|
1081
|
+
if( sib ){ break; }
|
1082
|
+
}
|
1083
|
+
}
|
1084
|
+
_goto(sib);
|
1085
|
+
break;
|
1086
|
+
default:
|
1087
|
+
handled = false;
|
1088
|
+
}
|
1089
|
+
},
|
1090
|
+
/**
|
1091
|
+
* Discard and reload all children of a lazy node.
|
1092
|
+
* @param {Boolean} [discard=false]
|
1093
|
+
* @returns $.Promise
|
1094
|
+
*/
|
1095
|
+
lazyLoad: function(discard) {
|
1096
|
+
if(discard || this.hasChildren() === undefined){
|
1097
|
+
this.discard();
|
1098
|
+
}
|
1099
|
+
_assert(!$.isArray(this.children));
|
1100
|
+
var source = this.tree._triggerNodeEvent("lazyload", this);
|
1101
|
+
_assert(typeof source !== "boolean", "lazyload event must return source in data.result");
|
1102
|
+
return this.tree._callHook("nodeLoadChildren", this, source);
|
1103
|
+
},
|
1104
|
+
/**
|
1105
|
+
* @see Fancytree#nodeRender
|
1106
|
+
*/
|
1107
|
+
render: function(force, deep) {
|
1108
|
+
return this.tree._callHook("nodeRender", this, force, deep);
|
1109
|
+
},
|
1110
|
+
/**
|
1111
|
+
* @see Fancytree#nodeRenderTitle
|
1112
|
+
*/
|
1113
|
+
renderTitle: function() {
|
1114
|
+
return this.tree._callHook("nodeRenderTitle", this);
|
1115
|
+
},
|
1116
|
+
/**
|
1117
|
+
* @see Fancytree#nodeRenderStatus
|
1118
|
+
*/
|
1119
|
+
renderStatus: function() {
|
1120
|
+
return this.tree._callHook("nodeRenderStatus", this);
|
1121
|
+
},
|
1122
|
+
/** Remove this node (not allowed for root).*/
|
1123
|
+
remove: function() {
|
1124
|
+
return this.parent.removeChild(this);
|
1125
|
+
},
|
1126
|
+
/**Remove childNode from list of direct children.*/
|
1127
|
+
removeChild: function(childNode) {
|
1128
|
+
return this.tree._callHook("nodeRemoveChild", this, childNode);
|
1129
|
+
},
|
1130
|
+
/**Remove all child nodes (and descendents).*/
|
1131
|
+
removeChildren: function() {
|
1132
|
+
return this.tree._callHook("nodeRemoveChildren", this);
|
1133
|
+
},
|
1134
|
+
// TODO: resetLazy()
|
1135
|
+
/** Schedule activity for delayed execution (cancel any pending request).
|
1136
|
+
* scheduleAction('cancel') will only cancel a pending request (if any).
|
1137
|
+
*/
|
1138
|
+
scheduleAction: function(mode, ms) {
|
1139
|
+
if( this.tree.timer ) {
|
1140
|
+
clearTimeout(this.tree.timer);
|
1141
|
+
// this.tree.debug("clearTimeout(%o)", this.tree.timer);
|
1142
|
+
}
|
1143
|
+
this.tree.timer = null;
|
1144
|
+
var self = this; // required for closures
|
1145
|
+
switch (mode) {
|
1146
|
+
case "cancel":
|
1147
|
+
// Simply made sure that timer was cleared
|
1148
|
+
break;
|
1149
|
+
case "expand":
|
1150
|
+
this.tree.timer = setTimeout(function(){
|
1151
|
+
self.tree.debug("setTimeout: trigger expand");
|
1152
|
+
self.setExpanded(true);
|
1153
|
+
}, ms);
|
1154
|
+
break;
|
1155
|
+
case "activate":
|
1156
|
+
this.tree.timer = setTimeout(function(){
|
1157
|
+
self.tree.debug("setTimeout: trigger activate");
|
1158
|
+
self.setActive(true);
|
1159
|
+
}, ms);
|
1160
|
+
break;
|
1161
|
+
default:
|
1162
|
+
throw "Invalid mode " + mode;
|
1163
|
+
}
|
1164
|
+
// this.tree.debug("setTimeout(%s, %s): %s", mode, ms, this.tree.timer);
|
1165
|
+
},
|
1166
|
+
/**
|
1167
|
+
*
|
1168
|
+
* @param {Boolean | PlainObject} [effects=false] animation options.
|
1169
|
+
* @param {FancytreeNode} [topNode=null] this node will remain visible in
|
1170
|
+
* any case, even if `this` is outside the scroll pane.
|
1171
|
+
* @returns $.Promise
|
1172
|
+
*/
|
1173
|
+
scrollIntoView: function(effects, topNode) {
|
1174
|
+
effects = (effects === true) ? {duration: 200, queue: false} : effects;
|
1175
|
+
var topNodeY,
|
1176
|
+
dfd = new $.Deferred(),
|
1177
|
+
nodeY = $(this.span).position().top,
|
1178
|
+
nodeHeight = $(this.span).height(),
|
1179
|
+
$container = this.tree.$container,
|
1180
|
+
scrollTop = $container[0].scrollTop,
|
1181
|
+
horzScrollHeight = Math.max(0, ($container.innerHeight() - $container[0].clientHeight)),
|
1182
|
+
// containerHeight = $container.height(),
|
1183
|
+
containerHeight = $container.height() - horzScrollHeight,
|
1184
|
+
newScrollTop = null;
|
1185
|
+
|
1186
|
+
// console.log("horzScrollHeight: " + horzScrollHeight);
|
1187
|
+
// console.log("$container[0].scrollTop: " + $container[0].scrollTop);
|
1188
|
+
// console.log("$container[0].scrollHeight: " + $container[0].scrollHeight);
|
1189
|
+
// console.log("$container[0].clientHeight: " + $container[0].clientHeight);
|
1190
|
+
// console.log("$container.innerHeight(): " + $container.innerHeight());
|
1191
|
+
// console.log("$container.height(): " + $container.height());
|
1192
|
+
|
1193
|
+
if(nodeY < 0){
|
1194
|
+
newScrollTop = scrollTop + nodeY;
|
1195
|
+
}else if((nodeY + nodeHeight) > containerHeight){
|
1196
|
+
newScrollTop = scrollTop + nodeY - containerHeight + nodeHeight;
|
1197
|
+
// If a topNode was passed, make sure that it is never scrolled
|
1198
|
+
// outside the upper border
|
1199
|
+
if(topNode){
|
1200
|
+
topNodeY = topNode ? $(topNode.span).position().top : 0;
|
1201
|
+
if((nodeY - topNodeY) > containerHeight){
|
1202
|
+
newScrollTop = scrollTop + nodeY;
|
1203
|
+
}
|
1204
|
+
}
|
1205
|
+
}
|
1206
|
+
if(newScrollTop !== null){
|
1207
|
+
if(effects){
|
1208
|
+
// TODO: resolve dfd after animation
|
1209
|
+
// var that = this;
|
1210
|
+
$container.animate({scrollTop: newScrollTop}, effects);
|
1211
|
+
}else{
|
1212
|
+
$container[0].scrollTop = newScrollTop;
|
1213
|
+
dfd.resolveWith(this);
|
1214
|
+
}
|
1215
|
+
}else{
|
1216
|
+
dfd.resolveWith(this);
|
1217
|
+
}
|
1218
|
+
return dfd.promise();
|
1219
|
+
/* from jQuery.menu:
|
1220
|
+
var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
|
1221
|
+
if ( this._hasScroll() ) {
|
1222
|
+
borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
|
1223
|
+
paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
|
1224
|
+
offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
|
1225
|
+
scroll = this.activeMenu.scrollTop();
|
1226
|
+
elementHeight = this.activeMenu.height();
|
1227
|
+
itemHeight = item.height();
|
1228
|
+
|
1229
|
+
if ( offset < 0 ) {
|
1230
|
+
this.activeMenu.scrollTop( scroll + offset );
|
1231
|
+
} else if ( offset + itemHeight > elementHeight ) {
|
1232
|
+
this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
|
1233
|
+
}
|
1234
|
+
}
|
1235
|
+
*/
|
1236
|
+
},
|
1237
|
+
|
1238
|
+
/**Activate this node.
|
1239
|
+
* @param {Boolean} [flag=true] pass false to deactivate
|
1240
|
+
*/
|
1241
|
+
setActive: function(flag){
|
1242
|
+
return this.tree._callHook("nodeSetActive", this, flag);
|
1243
|
+
},
|
1244
|
+
/**Expand this node.
|
1245
|
+
* @param {Boolean} [flag=true] pass false to collapse
|
1246
|
+
*/
|
1247
|
+
setExpanded: function(flag){
|
1248
|
+
return this.tree._callHook("nodeSetExpanded", this, flag);
|
1249
|
+
},
|
1250
|
+
/**Set keyboard focus to this node.
|
1251
|
+
* @param {Boolean} [flag=true] pass false to blur
|
1252
|
+
* @see Fancytree#setFocus
|
1253
|
+
*/
|
1254
|
+
setFocus: function(flag){
|
1255
|
+
return this.tree._callHook("nodeSetFocus", this, flag);
|
1256
|
+
},
|
1257
|
+
// TODO: setLazyNodeStatus
|
1258
|
+
/**Select this node.
|
1259
|
+
* @param {Boolean} [flag=true] pass false to deselect
|
1260
|
+
*/
|
1261
|
+
setSelected: function(flag){
|
1262
|
+
return this.tree._callHook("nodeSetSelected", this, flag);
|
1263
|
+
},
|
1264
|
+
/**Rename this node.
|
1265
|
+
* @param {string} title
|
1266
|
+
*/
|
1267
|
+
setTitle: function(title){
|
1268
|
+
this.title = title;
|
1269
|
+
this.renderTitle();
|
1270
|
+
},
|
1271
|
+
/**Sort child list by title.
|
1272
|
+
* @param {function} [cmd] custom compare function.
|
1273
|
+
* @param {Boolean} [deep] pass true to sort all descendant nodes
|
1274
|
+
*/
|
1275
|
+
sortChildren: function(cmp, deep) {
|
1276
|
+
var i,l,
|
1277
|
+
cl = this.children;
|
1278
|
+
|
1279
|
+
if( !cl ){
|
1280
|
+
return;
|
1281
|
+
}
|
1282
|
+
cmp = cmp || function(a, b) {
|
1283
|
+
var x = a.title.toLowerCase(),
|
1284
|
+
y = b.title.toLowerCase();
|
1285
|
+
return x === y ? 0 : x > y ? 1 : -1;
|
1286
|
+
};
|
1287
|
+
cl.sort(cmp);
|
1288
|
+
if( deep ){
|
1289
|
+
for(i=0, l=cl.length; i<l; i++){
|
1290
|
+
if( cl[i].children ){
|
1291
|
+
cl[i].sortChildren(cmp, "$norender$");
|
1292
|
+
}
|
1293
|
+
}
|
1294
|
+
}
|
1295
|
+
if( deep !== "$norender$" ){
|
1296
|
+
this.render();
|
1297
|
+
}
|
1298
|
+
},
|
1299
|
+
/** Convert node (or whole branch) into a dictionary.
|
1300
|
+
*
|
1301
|
+
* The result is compatible with node.addChildren().
|
1302
|
+
*
|
1303
|
+
* @param {Boolean} recursive
|
1304
|
+
* @param {function} callback callback(dict) is called for every dict (), in order to allow modifications
|
1305
|
+
* @returns {NodePatch}
|
1306
|
+
*/
|
1307
|
+
toDict: function(recursive, callback) {
|
1308
|
+
var i, l, node,
|
1309
|
+
dict = {},
|
1310
|
+
self = this;
|
1311
|
+
|
1312
|
+
$.each(NODE_ATTRS, function(i, a){
|
1313
|
+
// if(self[a] !== undefined && self[a] !== null){
|
1314
|
+
if(self[a] || self[a] === false){
|
1315
|
+
dict[a] = self[a];
|
1316
|
+
}
|
1317
|
+
});
|
1318
|
+
if(!$.isEmptyObject(this.data)){
|
1319
|
+
dict.data = $.extend({}, this.data);
|
1320
|
+
if($.isEmptyObject(dict.data)){
|
1321
|
+
delete dict.data;
|
1322
|
+
}
|
1323
|
+
}
|
1324
|
+
if( callback ){
|
1325
|
+
callback(dict);
|
1326
|
+
}
|
1327
|
+
if( recursive ) {
|
1328
|
+
if(this.hasChildren()){
|
1329
|
+
dict.children = [];
|
1330
|
+
for(i=0, l=this.children.length; i<l; i++ ){
|
1331
|
+
node = this.children[i];
|
1332
|
+
if( !node.isStatusNode ){
|
1333
|
+
dict.children.push(node.toDict(true, callback));
|
1334
|
+
}
|
1335
|
+
}
|
1336
|
+
}else{
|
1337
|
+
// dict.children = null;
|
1338
|
+
}
|
1339
|
+
}
|
1340
|
+
return dict;
|
1341
|
+
},
|
1342
|
+
/** Flip expanded status. */
|
1343
|
+
toggleExpanded: function(){
|
1344
|
+
return this.tree._callHook("nodeToggleExpanded", this);
|
1345
|
+
},
|
1346
|
+
/** Flip selection status. */
|
1347
|
+
toggleSelected: function(){
|
1348
|
+
return this.tree._callHook("nodeToggleSelected", this);
|
1349
|
+
},
|
1350
|
+
toString: function() {
|
1351
|
+
return "<FancytreeNode(#" + this.key + ", '" + this.title + "')>";
|
1352
|
+
},
|
1353
|
+
/** Call fn(node) for all child nodes. Stop iteration, if fn() returns false.
|
1354
|
+
* Skip current branch, if fn() returns 'skip'.
|
1355
|
+
* @param {function} fn the callback function.
|
1356
|
+
* Return false to stop iteration, return "skip" to skip this node and children only.
|
1357
|
+
* @param {Boolean} [includeSelf=false]
|
1358
|
+
* @returns {Boolean} false, if the iterator was stopped.
|
1359
|
+
*/
|
1360
|
+
visit: function(fn, includeSelf) {
|
1361
|
+
var i, l,
|
1362
|
+
res = true,
|
1363
|
+
children = this.children;
|
1364
|
+
|
1365
|
+
if( includeSelf === true ) {
|
1366
|
+
res = fn(this);
|
1367
|
+
if( res === false || res === "skip" ){
|
1368
|
+
return res;
|
1369
|
+
}
|
1370
|
+
}
|
1371
|
+
if(children){
|
1372
|
+
for(i=0, l=children.length; i<l; i++){
|
1373
|
+
res = children[i].visit(fn, true);
|
1374
|
+
if( res === false ){
|
1375
|
+
break;
|
1376
|
+
}
|
1377
|
+
}
|
1378
|
+
}
|
1379
|
+
return res;
|
1380
|
+
},
|
1381
|
+
/**
|
1382
|
+
*
|
1383
|
+
* @param fn
|
1384
|
+
* @param includeSelf
|
1385
|
+
* @returns {Boolean}
|
1386
|
+
*/
|
1387
|
+
visitParents: function(fn, includeSelf) {
|
1388
|
+
// Visit parent nodes (bottom up)
|
1389
|
+
if(includeSelf && fn(this) === false){
|
1390
|
+
return false;
|
1391
|
+
}
|
1392
|
+
var p = this.parent;
|
1393
|
+
while( p ) {
|
1394
|
+
if(fn(p) === false){
|
1395
|
+
return false;
|
1396
|
+
}
|
1397
|
+
p = p.parent;
|
1398
|
+
}
|
1399
|
+
return true;
|
1400
|
+
},
|
1401
|
+
/** Write warning to browser console (prepending node info)
|
1402
|
+
*
|
1403
|
+
* @param {*} msg string or object or array of such
|
1404
|
+
*/
|
1405
|
+
warn: function(msg){
|
1406
|
+
Array.prototype.unshift.call(arguments, this.toString());
|
1407
|
+
consoleApply("warn", arguments);
|
1408
|
+
}
|
1409
|
+
};
|
1410
|
+
|
1411
|
+
|
1412
|
+
/* *****************************************************************************
|
1413
|
+
* Fancytree
|
1414
|
+
*/
|
1415
|
+
/**
|
1416
|
+
* Construct a new tree.
|
1417
|
+
* @class The controller behind a fancytree.
|
1418
|
+
* @name Fancytree
|
1419
|
+
* @constructor
|
1420
|
+
* @param {Widget} widget
|
1421
|
+
*
|
1422
|
+
* @property {FancytreeOptions} options
|
1423
|
+
* @property {FancytreeNode} rootNode
|
1424
|
+
* @property {FancytreeNode} activeNode
|
1425
|
+
* @property {FancytreeNode} focusNode
|
1426
|
+
* @property {jQueryObject} $div
|
1427
|
+
* @property {object} widget
|
1428
|
+
* @property {object} ext
|
1429
|
+
* @property {object} data
|
1430
|
+
* @property {object} options
|
1431
|
+
* @property {String} _id
|
1432
|
+
* @property {String} statusClassPropName
|
1433
|
+
* @property {String} ariaPropName
|
1434
|
+
* @property {String} nodeContainerAttrName
|
1435
|
+
* @property {String} $container
|
1436
|
+
* @property {FancytreeNode} lastSelectedNode
|
1437
|
+
*/
|
1438
|
+
function Fancytree(widget){
|
1439
|
+
// TODO: rename widget to widget (it's not a jQuery object)
|
1440
|
+
this.widget = widget;
|
1441
|
+
this.$div = widget.element;
|
1442
|
+
this.options = widget.options;
|
1443
|
+
this.ext = {}; // Active extension instances
|
1444
|
+
this.data = {};
|
1445
|
+
this._id = $.ui.fancytree._nextId++;
|
1446
|
+
this._ns = ".fancytree-" + this._id; // append for namespaced events
|
1447
|
+
this.activeNode = null;
|
1448
|
+
this.focusNode = null;
|
1449
|
+
this._hasFocus = null;
|
1450
|
+
this.lastSelectedNode = null;
|
1451
|
+
this.systemFocusElement = null,
|
1452
|
+
|
1453
|
+
this.statusClassPropName = "span";
|
1454
|
+
this.ariaPropName = "li";
|
1455
|
+
this.nodeContainerAttrName = "li";
|
1456
|
+
|
1457
|
+
// Remove previous markup if any
|
1458
|
+
this.$div.find(">ul.fancytree-container").remove();
|
1459
|
+
|
1460
|
+
// Create a node without parent.
|
1461
|
+
var fakeParent = { tree: this },
|
1462
|
+
$ul;
|
1463
|
+
this.rootNode = new FancytreeNode(fakeParent, {
|
1464
|
+
title: "root",
|
1465
|
+
key: "root_" + this._id,
|
1466
|
+
children: null
|
1467
|
+
});
|
1468
|
+
this.rootNode.parent = null;
|
1469
|
+
|
1470
|
+
// Create root markup
|
1471
|
+
$ul = $("<ul>", {
|
1472
|
+
"class": "ui-fancytree fancytree-container"
|
1473
|
+
}).appendTo(this.$div);
|
1474
|
+
this.$container = $ul;
|
1475
|
+
this.rootNode.ul = $ul[0];
|
1476
|
+
|
1477
|
+
if(this.options.debugLevel == null){
|
1478
|
+
this.options.debugLevel = FT.debugLevel;
|
1479
|
+
}
|
1480
|
+
// Add container to the TAB chain
|
1481
|
+
// See http://www.w3.org/TR/wai-aria-practices/#focus_activedescendant
|
1482
|
+
this.$container.attr("tabindex", this.options.tabbable ? "0" : "-1");
|
1483
|
+
if(this.options.aria){
|
1484
|
+
this.$container
|
1485
|
+
.attr("role", "tree")
|
1486
|
+
.attr("aria-multiselectable", true);
|
1487
|
+
}
|
1488
|
+
}
|
1489
|
+
|
1490
|
+
|
1491
|
+
Fancytree.prototype = /**@lends Fancytree*/{
|
1492
|
+
/** Return a context object that can be re-used for _callHook().
|
1493
|
+
* @param {Fancytree | FancytreeNode | EventData} obj
|
1494
|
+
* @param {Event} originalEvent
|
1495
|
+
* @param {Object} extra
|
1496
|
+
* @returns {EventData}
|
1497
|
+
*/
|
1498
|
+
_makeHookContext: function(obj, originalEvent, extra) {
|
1499
|
+
var ctx, tree;
|
1500
|
+
if(obj.node !== undefined){
|
1501
|
+
// obj is already a context object
|
1502
|
+
if(originalEvent && obj.originalEvent !== originalEvent){
|
1503
|
+
$.error("invalid args");
|
1504
|
+
}
|
1505
|
+
ctx = obj;
|
1506
|
+
}else if(obj.tree){
|
1507
|
+
// obj is a FancytreeNode
|
1508
|
+
tree = obj.tree;
|
1509
|
+
ctx = { node: obj, tree: tree, widget: tree.widget, options: tree.widget.options, originalEvent: originalEvent };
|
1510
|
+
}else if(obj.widget){
|
1511
|
+
// obj is a Fancytree
|
1512
|
+
ctx = { node: null, tree: obj, widget: obj.widget, options: obj.widget.options, originalEvent: originalEvent };
|
1513
|
+
}else{
|
1514
|
+
$.error("invalid args");
|
1515
|
+
}
|
1516
|
+
if(extra){
|
1517
|
+
$.extend(ctx, extra);
|
1518
|
+
}
|
1519
|
+
return ctx;
|
1520
|
+
},
|
1521
|
+
/** Trigger a hook function: funcName(ctx, [...]).
|
1522
|
+
*
|
1523
|
+
* @param {String} funcName
|
1524
|
+
* @param {Fancytree|FancytreeNode|EventData} contextObject
|
1525
|
+
* @param {any, ...} [_extraArgs] optional additional arguments
|
1526
|
+
* @returns {any}
|
1527
|
+
*/
|
1528
|
+
_callHook: function(funcName, contextObject, _extraArgs) {
|
1529
|
+
var ctx = this._makeHookContext(contextObject),
|
1530
|
+
fn = this[funcName],
|
1531
|
+
args = Array.prototype.slice.call(arguments, 2);
|
1532
|
+
if(!$.isFunction(fn)){
|
1533
|
+
$.error("_callHook('" + funcName + "') is not a function");
|
1534
|
+
}
|
1535
|
+
args.unshift(ctx);
|
1536
|
+
// this.debug("_hook", funcName, ctx.node && ctx.node.toString() || ctx.tree.toString(), args);
|
1537
|
+
return fn.apply(this, args);
|
1538
|
+
},
|
1539
|
+
/** Activate node with a given key.
|
1540
|
+
*
|
1541
|
+
* A prevously activated node will be deactivated.
|
1542
|
+
* Pass key = false, to deactivate the current node only.
|
1543
|
+
* @param {String} key
|
1544
|
+
* @returns {FancytreeNode} activated node (null, if not found)
|
1545
|
+
*/
|
1546
|
+
activateKey: function(key) {
|
1547
|
+
var node = this.getNodeByKey(key);
|
1548
|
+
if(node){
|
1549
|
+
node.setActive();
|
1550
|
+
}else if(this.activeNode){
|
1551
|
+
this.activeNode.setActive(false);
|
1552
|
+
}
|
1553
|
+
return node;
|
1554
|
+
},
|
1555
|
+
/**
|
1556
|
+
*
|
1557
|
+
* @param {Array} patchList array of [key, NodePatch] arrays
|
1558
|
+
* @returns {$.Promise} resolved, when all patches have been applied
|
1559
|
+
* @see TreePatch
|
1560
|
+
*/
|
1561
|
+
applyPatch: function(patchList) {
|
1562
|
+
var dfd, i, p2, key, patch, node,
|
1563
|
+
patchCount = patchList.length,
|
1564
|
+
deferredList = [];
|
1565
|
+
|
1566
|
+
for(i=0; i<patchCount; i++){
|
1567
|
+
p2 = patchList[i];
|
1568
|
+
_assert(p2.length === 2, "patchList must be an array of length-2-arrays");
|
1569
|
+
key = p2[0];
|
1570
|
+
patch = p2[1];
|
1571
|
+
node = (key === null) ? this.rootNode : this.getNodeByKey(key);
|
1572
|
+
if(node){
|
1573
|
+
dfd = new $.Deferred();
|
1574
|
+
deferredList.push(dfd);
|
1575
|
+
node.applyPatch(patch).always(_makeResolveFunc(dfd, node));
|
1576
|
+
}else{
|
1577
|
+
this.warn("could not find node with key '" + key + "'");
|
1578
|
+
}
|
1579
|
+
}
|
1580
|
+
// Return a promise that is resovled, when ALL patches were applied
|
1581
|
+
return $.when.apply($, deferredList).promise();
|
1582
|
+
},
|
1583
|
+
/* TODO: implement in dnd extension
|
1584
|
+
cancelDrag: function() {
|
1585
|
+
var dd = $.ui.ddmanager.current;
|
1586
|
+
if(dd){
|
1587
|
+
dd.cancel();
|
1588
|
+
}
|
1589
|
+
},
|
1590
|
+
*/
|
1591
|
+
/** Return the number of child nodes. */
|
1592
|
+
count: function() {
|
1593
|
+
return this.rootNode.countChildren();
|
1594
|
+
},
|
1595
|
+
/** Write to browser console if debugLevel >= 2 (prepending tree info)
|
1596
|
+
*
|
1597
|
+
* @param {*} msg string or object or array of such
|
1598
|
+
*/
|
1599
|
+
debug: function(msg){
|
1600
|
+
if( this.options.debugLevel >= 2 ) {
|
1601
|
+
Array.prototype.unshift.call(arguments, this.toString());
|
1602
|
+
consoleApply("debug", arguments);
|
1603
|
+
}
|
1604
|
+
},
|
1605
|
+
// TODO: disable()
|
1606
|
+
// TODO: enable()
|
1607
|
+
// TODO: enableUpdate()
|
1608
|
+
// TODO: fromDict
|
1609
|
+
/**
|
1610
|
+
* Generate INPUT elements that can be submitted with html forms.
|
1611
|
+
*
|
1612
|
+
* In selectMode 3 only the topmost selected nodes are considered.
|
1613
|
+
*
|
1614
|
+
* @param {Boolean | String} [selected=true]
|
1615
|
+
* @param {Boolean | String} [active=true]
|
1616
|
+
*/
|
1617
|
+
generateFormElements: function(selected, active) {
|
1618
|
+
// TODO: test case
|
1619
|
+
var nodeList,
|
1620
|
+
selectedName = (selected !== false) ? "ft_" + this._id : selected,
|
1621
|
+
activeName = (active !== false) ? "ft_" + this._id + "_active" : active,
|
1622
|
+
id = "fancytree_result_" + this._id,
|
1623
|
+
$result = this.$container.find("div#" + id);
|
1624
|
+
|
1625
|
+
if($result.length){
|
1626
|
+
$result.empty();
|
1627
|
+
}else{
|
1628
|
+
$result = $("<div>", {
|
1629
|
+
id: id
|
1630
|
+
}).hide().appendTo(this.$container);
|
1631
|
+
}
|
1632
|
+
if(selectedName){
|
1633
|
+
nodeList = this.getSelectedNodes( this.options.selectMode === 3 );
|
1634
|
+
$.each(nodeList, function(idx, node){
|
1635
|
+
$result.append($("<input>", {
|
1636
|
+
type: "checkbox",
|
1637
|
+
name: selectedName,
|
1638
|
+
value: node.key,
|
1639
|
+
checked: true
|
1640
|
+
}));
|
1641
|
+
});
|
1642
|
+
}
|
1643
|
+
if(activeName && this.activeNode){
|
1644
|
+
$result.append($("<input>", {
|
1645
|
+
type: "radio",
|
1646
|
+
name: activeName,
|
1647
|
+
value: this.activeNode.key,
|
1648
|
+
checked: true
|
1649
|
+
}));
|
1650
|
+
}
|
1651
|
+
},
|
1652
|
+
/**
|
1653
|
+
* Return node that is active.
|
1654
|
+
* @returns {FancytreeNode}
|
1655
|
+
*/
|
1656
|
+
getActiveNode: function() {
|
1657
|
+
return this.activeNode;
|
1658
|
+
},
|
1659
|
+
/** @returns {FancytreeNode | null}*/
|
1660
|
+
getFirstChild: function() {
|
1661
|
+
return this.rootNode.getFirstChild();
|
1662
|
+
},
|
1663
|
+
/**
|
1664
|
+
* Return node that has keyboard focus.
|
1665
|
+
* @param {Boolean} [ifTreeHasFocus=false]
|
1666
|
+
* @returns {FancytreeNode}
|
1667
|
+
*/
|
1668
|
+
getFocusNode: function(ifTreeHasFocus) {
|
1669
|
+
// TODO: implement ifTreeHasFocus
|
1670
|
+
return this.focusNode;
|
1671
|
+
},
|
1672
|
+
/**
|
1673
|
+
* Return node with a given key.
|
1674
|
+
* @param {String} key
|
1675
|
+
* @param {FancytreeNode} [searchRoot] only search below this node
|
1676
|
+
* @returns {FancytreeNode | null}
|
1677
|
+
*/
|
1678
|
+
getNodeByKey: function(key, searchRoot) {
|
1679
|
+
// Search the DOM by element ID (assuming this is faster than traversing all nodes).
|
1680
|
+
// $("#...") has problems, if the key contains '.', so we use getElementById()
|
1681
|
+
var el, match;
|
1682
|
+
if(!searchRoot){
|
1683
|
+
el = document.getElementById(this.options.idPrefix + key);
|
1684
|
+
if( el ){
|
1685
|
+
return el.ftnode ? el.ftnode : null;
|
1686
|
+
}
|
1687
|
+
}
|
1688
|
+
// Not found in the DOM, but still may be in an unrendered part of tree
|
1689
|
+
// TODO: optimize with specialized loop
|
1690
|
+
// TODO: consider keyMap?
|
1691
|
+
searchRoot = searchRoot || this.rootNode;
|
1692
|
+
match = null;
|
1693
|
+
searchRoot.visit(function(node){
|
1694
|
+
// window.console.log("getNodeByKey(" + key + "): ", node.key);
|
1695
|
+
if(node.key === key) {
|
1696
|
+
match = node;
|
1697
|
+
return false;
|
1698
|
+
}
|
1699
|
+
}, true);
|
1700
|
+
return match;
|
1701
|
+
},
|
1702
|
+
// TODO: getRoot()
|
1703
|
+
/**
|
1704
|
+
* Return a list of selected nodes.
|
1705
|
+
* @param {Boolean} [stopOnParents=false] only return the topmost selected
|
1706
|
+
* node (useful with selectMode 3)
|
1707
|
+
* @returns {FancytreeNode[]}
|
1708
|
+
*/
|
1709
|
+
getSelectedNodes: function(stopOnParents) {
|
1710
|
+
var nodeList = [];
|
1711
|
+
this.rootNode.visit(function(node){
|
1712
|
+
if( node.selected ) {
|
1713
|
+
nodeList.push(node);
|
1714
|
+
if( stopOnParents === true ){
|
1715
|
+
return "skip"; // stop processing this branch
|
1716
|
+
}
|
1717
|
+
}
|
1718
|
+
});
|
1719
|
+
return nodeList;
|
1720
|
+
},
|
1721
|
+
/**
|
1722
|
+
* @returns {Boolean} true if the tree control has keyboard focus
|
1723
|
+
*/
|
1724
|
+
hasFocus: function(){
|
1725
|
+
return !!this._hasFocus;
|
1726
|
+
},
|
1727
|
+
/** Write to browser console if debugLevel >= 1 (prepending tree info)
|
1728
|
+
*
|
1729
|
+
* @param {*} msg string or object or array of such
|
1730
|
+
*/
|
1731
|
+
info: function(msg){
|
1732
|
+
if( this.options.debugLevel >= 1 ) {
|
1733
|
+
Array.prototype.unshift.call(arguments, this.toString());
|
1734
|
+
consoleApply("info", arguments);
|
1735
|
+
}
|
1736
|
+
},
|
1737
|
+
/*
|
1738
|
+
TODO: isInitializing: function() {
|
1739
|
+
return ( this.phase=="init" || this.phase=="postInit" );
|
1740
|
+
},
|
1741
|
+
TODO: isReloading: function() {
|
1742
|
+
return ( this.phase=="init" || this.phase=="postInit" ) && this.options.persist && this.persistence.cookiesFound;
|
1743
|
+
},
|
1744
|
+
TODO: isUserEvent: function() {
|
1745
|
+
return ( this.phase=="userEvent" );
|
1746
|
+
},
|
1747
|
+
*/
|
1748
|
+
/**
|
1749
|
+
* Expand all parents of one or more nodes.
|
1750
|
+
* Calls
|
1751
|
+
* @param {String | String[]} keyPath one or more key paths (e.g. '/3/2_1/7')
|
1752
|
+
* @param {function} callback callbeck(mode) is called for every visited node
|
1753
|
+
* @returns {$.Promise}
|
1754
|
+
*/
|
1755
|
+
/*
|
1756
|
+
_loadKeyPath: function(keyPath, callback) {
|
1757
|
+
var tree = this.tree;
|
1758
|
+
tree.logDebug("%s._loadKeyPath(%s)", this, keyPath);
|
1759
|
+
if(keyPath === ""){
|
1760
|
+
throw "Key path must not be empty";
|
1761
|
+
}
|
1762
|
+
var segList = keyPath.split(tree.options.keyPathSeparator);
|
1763
|
+
if(segList[0] === ""){
|
1764
|
+
throw "Key path must be relative (don't start with '/')";
|
1765
|
+
}
|
1766
|
+
var seg = segList.shift();
|
1767
|
+
|
1768
|
+
for(var i=0, l=this.childList.length; i < l; i++){
|
1769
|
+
var child = this.childList[i];
|
1770
|
+
if( child.data.key === seg ){
|
1771
|
+
if(segList.length === 0) {
|
1772
|
+
// Found the end node
|
1773
|
+
callback.call(tree, child, "ok");
|
1774
|
+
|
1775
|
+
}else if(child.data.isLazy && (child.childList === null || child.childList === undefined)){
|
1776
|
+
tree.logDebug("%s._loadKeyPath(%s) -> reloading %s...", this, keyPath, child);
|
1777
|
+
var self = this;
|
1778
|
+
child.reloadChildren(function(node, isOk){
|
1779
|
+
// After loading, look for direct child with that key
|
1780
|
+
if(isOk){
|
1781
|
+
tree.logDebug("%s._loadKeyPath(%s) -> reloaded %s.", node, keyPath, node);
|
1782
|
+
callback.call(tree, child, "loaded");
|
1783
|
+
node._loadKeyPath(segList.join(tree.options.keyPathSeparator), callback);
|
1784
|
+
}else{
|
1785
|
+
tree.logWarning("%s._loadKeyPath(%s) -> reloadChildren() failed.", self, keyPath);
|
1786
|
+
callback.call(tree, child, "error");
|
1787
|
+
}
|
1788
|
+
}); // Note: this line gives a JSLint warning (Don't make functions within a loop)
|
1789
|
+
// we can ignore it, since it will only be exectuted once, the the loop is ended
|
1790
|
+
// See also http://stackoverflow.com/questions/3037598/how-to-get-around-the-jslint-error-dont-make-functions-within-a-loop
|
1791
|
+
} else {
|
1792
|
+
callback.call(tree, child, "loaded");
|
1793
|
+
// Look for direct child with that key
|
1794
|
+
child._loadKeyPath(segList.join(tree.options.keyPathSeparator), callback);
|
1795
|
+
}
|
1796
|
+
return;
|
1797
|
+
}
|
1798
|
+
}
|
1799
|
+
// Could not find key
|
1800
|
+
tree.logWarning("Node not found: " + seg);
|
1801
|
+
return;
|
1802
|
+
},
|
1803
|
+
|
1804
|
+
*/
|
1805
|
+
|
1806
|
+
/**
|
1807
|
+
* Expand all parents of one or more nodes.
|
1808
|
+
* Calls
|
1809
|
+
* @param {String | String[]} keyPathList one or more key paths (e.g. '/3/2_1/7')
|
1810
|
+
* @param {function} callback callbeck(mode) is called for every visited node ('loaded', 'ok', 'error')
|
1811
|
+
* @returns {$.Promise}
|
1812
|
+
*/
|
1813
|
+
loadKeyPath: function(keyPathList, callback, _rootNode) {
|
1814
|
+
var deferredList, dfd, i, path, key, loadMap, node, segList,
|
1815
|
+
root = _rootNode || this.rootNode,
|
1816
|
+
sep = this.options.keyPathSeparator,
|
1817
|
+
self = this;
|
1818
|
+
|
1819
|
+
if(!$.isArray(keyPathList)){
|
1820
|
+
keyPathList = [keyPathList];
|
1821
|
+
}
|
1822
|
+
// Pass 1: handle all path segments for nodes that are already loaded
|
1823
|
+
// Collect distinct top-most lazy nodes in a map
|
1824
|
+
loadMap = {};
|
1825
|
+
|
1826
|
+
for(i=0; i<keyPathList.length; i++){
|
1827
|
+
path = keyPathList[i];
|
1828
|
+
// strip leading slash
|
1829
|
+
if(path.charAt(0) === sep){
|
1830
|
+
path = path.substr(1);
|
1831
|
+
}
|
1832
|
+
// traverse and strip keys, until we hit a lazy, unloaded node
|
1833
|
+
segList = path.split(sep);
|
1834
|
+
while(segList.length){
|
1835
|
+
key = segList.shift();
|
1836
|
+
// node = _findDirectChild(root, key);
|
1837
|
+
node = root._findDirectChild(key);
|
1838
|
+
if(!node){
|
1839
|
+
this.warn("loadKeyPath: key not found: " + key + " (parent: " + root + ")");
|
1840
|
+
callback.call(this, key, "error");
|
1841
|
+
break;
|
1842
|
+
}else if(segList.length === 0){
|
1843
|
+
callback.call(this, node, "ok");
|
1844
|
+
break;
|
1845
|
+
}else if(!node.lazy || (node.hasChildren() !== undefined )){
|
1846
|
+
callback.call(this, node, "loaded");
|
1847
|
+
root = node;
|
1848
|
+
}else{
|
1849
|
+
callback.call(this, node, "loaded");
|
1850
|
+
// segList.unshift(key);
|
1851
|
+
if(loadMap[key]){
|
1852
|
+
loadMap[key].push(segList.join(sep));
|
1853
|
+
}else{
|
1854
|
+
loadMap[key] = [segList.join(sep)];
|
1855
|
+
}
|
1856
|
+
break;
|
1857
|
+
}
|
1858
|
+
}
|
1859
|
+
}
|
1860
|
+
// alert("loadKeyPath: loadMap=" + JSON.stringify(loadMap));
|
1861
|
+
// Now load all lazy nodes and continue itearation for remaining paths
|
1862
|
+
deferredList = [];
|
1863
|
+
// Avoid jshint warning 'Don't make functions within a loop.':
|
1864
|
+
function __lazyload(key, node, dfd){
|
1865
|
+
callback.call(self, node, "loading");
|
1866
|
+
node.lazyLoad().done(function(){
|
1867
|
+
self.loadKeyPath.call(self, loadMap[key], callback, node).always(_makeResolveFunc(dfd, self));
|
1868
|
+
}).fail(function(errMsg){
|
1869
|
+
self.warn("loadKeyPath: error loading: " + key + " (parent: " + root + ")");
|
1870
|
+
callback.call(self, node, "error");
|
1871
|
+
dfd.reject();
|
1872
|
+
});
|
1873
|
+
}
|
1874
|
+
for(key in loadMap){
|
1875
|
+
node = root._findDirectChild(key);
|
1876
|
+
// alert("loadKeyPath: lazy node(" + key + ") = " + node);
|
1877
|
+
dfd = new $.Deferred();
|
1878
|
+
deferredList.push(dfd);
|
1879
|
+
__lazyload(key, node, dfd);
|
1880
|
+
}
|
1881
|
+
// Return a promise that is resovled, when ALL paths were loaded
|
1882
|
+
return $.when.apply($, deferredList).promise();
|
1883
|
+
},
|
1884
|
+
/** _Default handling for mouse click events. */
|
1885
|
+
nodeClick: function(ctx) {
|
1886
|
+
// this.tree.logDebug("ftnode.onClick(" + event.type + "): ftnode:" + this + ", button:" + event.button + ", which: " + event.which);
|
1887
|
+
var activate, expand,
|
1888
|
+
event = ctx.originalEvent,
|
1889
|
+
targetType = ctx.targetType,
|
1890
|
+
node = ctx.node;
|
1891
|
+
|
1892
|
+
// TODO: use switch
|
1893
|
+
// TODO: make sure clicks on embedded <input> doesn't steal focus (see table sample)
|
1894
|
+
if( targetType === "expander" ) {
|
1895
|
+
// Clicking the expander icon always expands/collapses
|
1896
|
+
this._callHook("nodeToggleExpanded", ctx);
|
1897
|
+
// this._callHook("nodeSetFocus", ctx, true); // issue 95
|
1898
|
+
} else if( targetType === "checkbox" ) {
|
1899
|
+
// Clicking the checkbox always (de)selects
|
1900
|
+
this._callHook("nodeToggleSelected", ctx);
|
1901
|
+
this._callHook("nodeSetFocus", ctx, true); // issue 95
|
1902
|
+
} else {
|
1903
|
+
// Honor `clickFolderMode` for
|
1904
|
+
expand = false;
|
1905
|
+
activate = true;
|
1906
|
+
if( node.folder ) {
|
1907
|
+
switch( ctx.options.clickFolderMode ) {
|
1908
|
+
case 2: // expand only
|
1909
|
+
expand = true;
|
1910
|
+
activate = false;
|
1911
|
+
break;
|
1912
|
+
case 3: // expand and activate
|
1913
|
+
activate = true;
|
1914
|
+
expand = true; //!node.isExpanded();
|
1915
|
+
break;
|
1916
|
+
// else 1 or 4: just activate
|
1917
|
+
}
|
1918
|
+
}
|
1919
|
+
if( activate ) {
|
1920
|
+
this.nodeSetFocus(ctx);
|
1921
|
+
this._callHook("nodeSetActive", ctx, true);
|
1922
|
+
}
|
1923
|
+
if( expand ) {
|
1924
|
+
if(!activate){
|
1925
|
+
// this._callHook("nodeSetFocus", ctx);
|
1926
|
+
}
|
1927
|
+
// this._callHook("nodeSetExpanded", ctx, true);
|
1928
|
+
this._callHook("nodeToggleExpanded", ctx);
|
1929
|
+
}
|
1930
|
+
}
|
1931
|
+
// Make sure that clicks stop, otherwise <a href='#'> jumps to the top
|
1932
|
+
if(event.target.localName === "a" && event.target.className === "fancytree-title"){
|
1933
|
+
event.preventDefault();
|
1934
|
+
}
|
1935
|
+
// TODO: return promise?
|
1936
|
+
},
|
1937
|
+
nodeCollapseSiblings: function(ctx) {
|
1938
|
+
// TODO: return promise?
|
1939
|
+
var ac, i, l,
|
1940
|
+
node = ctx.node;
|
1941
|
+
|
1942
|
+
if( node.parent ){
|
1943
|
+
ac = node.parent.children;
|
1944
|
+
for (i=0, l=ac.length; i<l; i++) {
|
1945
|
+
if ( ac[i] !== node && ac[i].expanded ){
|
1946
|
+
this._callHook("nodeSetExpanded", ac[i], false);
|
1947
|
+
}
|
1948
|
+
}
|
1949
|
+
}
|
1950
|
+
},
|
1951
|
+
nodeDblclick: function(ctx) {
|
1952
|
+
// TODO: return promise?
|
1953
|
+
if( ctx.targetType === "title" && ctx.options.clickFolderMode === 4) {
|
1954
|
+
// this.nodeSetFocus(ctx);
|
1955
|
+
// this._callHook("nodeSetActive", ctx, true);
|
1956
|
+
this._callHook("nodeToggleExpanded", ctx);
|
1957
|
+
}
|
1958
|
+
// TODO: prevent text selection on dblclicks
|
1959
|
+
if( ctx.targetType === "title" ) {
|
1960
|
+
ctx.originalEvent.preventDefault();
|
1961
|
+
}
|
1962
|
+
},
|
1963
|
+
/** Default handling for mouse keydown events.
|
1964
|
+
*
|
1965
|
+
* NOTE: this may be called with node == null if tree (but no node) has focus.
|
1966
|
+
*/
|
1967
|
+
nodeKeydown: function(ctx) {
|
1968
|
+
// TODO: return promise?
|
1969
|
+
var res,
|
1970
|
+
event = ctx.originalEvent,
|
1971
|
+
node = ctx.node,
|
1972
|
+
tree = ctx.tree,
|
1973
|
+
opts = ctx.options,
|
1974
|
+
handled = true,
|
1975
|
+
activate = !(event.ctrlKey || !opts.autoActivate ),
|
1976
|
+
KC = $.ui.keyCode;
|
1977
|
+
|
1978
|
+
// node.debug("ftnode.nodeKeydown(" + event.type + "): ftnode:" + this + ", charCode:" + event.charCode + ", keyCode: " + event.keyCode + ", which: " + event.which);
|
1979
|
+
|
1980
|
+
// Set focus to first node, if no other node has the focus yet
|
1981
|
+
if( !node ){
|
1982
|
+
this.rootNode.getFirstChild().setFocus();
|
1983
|
+
node = ctx.node = this.focusNode;
|
1984
|
+
node.debug("Keydown force focus on first node");
|
1985
|
+
}
|
1986
|
+
|
1987
|
+
switch( event.which ) {
|
1988
|
+
// charCodes:
|
1989
|
+
case KC.NUMPAD_ADD: //107: // '+'
|
1990
|
+
case 187: // '+' @ Chrome, Safari
|
1991
|
+
tree.nodeSetExpanded(ctx, true);
|
1992
|
+
break;
|
1993
|
+
case KC.NUMPAD_SUBTRACT: // '-'
|
1994
|
+
case 189: // '-' @ Chrome, Safari
|
1995
|
+
tree.nodeSetExpanded(ctx, false);
|
1996
|
+
break;
|
1997
|
+
case KC.SPACE:
|
1998
|
+
if(opts.checkbox){
|
1999
|
+
tree.nodeToggleSelected(ctx);
|
2000
|
+
}else{
|
2001
|
+
tree.nodeSetActive(ctx, true);
|
2002
|
+
}
|
2003
|
+
break;
|
2004
|
+
case KC.ENTER:
|
2005
|
+
tree.nodeSetActive(ctx, true);
|
2006
|
+
break;
|
2007
|
+
case KC.BACKSPACE:
|
2008
|
+
case KC.LEFT:
|
2009
|
+
case KC.RIGHT:
|
2010
|
+
case KC.UP:
|
2011
|
+
case KC.DOWN:
|
2012
|
+
res = node.navigate(event.which, activate);
|
2013
|
+
break;
|
2014
|
+
default:
|
2015
|
+
handled = false;
|
2016
|
+
}
|
2017
|
+
if(handled){
|
2018
|
+
event.preventDefault();
|
2019
|
+
}
|
2020
|
+
},
|
2021
|
+
|
2022
|
+
|
2023
|
+
// /** Default handling for mouse keypress events. */
|
2024
|
+
// nodeKeypress: function(ctx) {
|
2025
|
+
// var event = ctx.originalEvent;
|
2026
|
+
// },
|
2027
|
+
|
2028
|
+
// /** Trigger lazyload event (async). */
|
2029
|
+
// nodeLazyLoad: function(ctx) {
|
2030
|
+
// var node = ctx.node;
|
2031
|
+
// if(this._triggerNodeEvent())
|
2032
|
+
// },
|
2033
|
+
/** Load children (async).
|
2034
|
+
* source may be
|
2035
|
+
* - an array of children
|
2036
|
+
* - a node object
|
2037
|
+
* - an Ajax options object
|
2038
|
+
* - an Ajax.promise
|
2039
|
+
*
|
2040
|
+
* @param {EventData} ctx
|
2041
|
+
* @param {object[]|object|string|$.Promise|function} source
|
2042
|
+
* @returns {$.Promise} The deferred will be resolved as soon as the (ajax)
|
2043
|
+
* data was rendered.
|
2044
|
+
*/
|
2045
|
+
nodeLoadChildren: function(ctx, source) {
|
2046
|
+
var ajax, delay,
|
2047
|
+
tree = ctx.tree,
|
2048
|
+
node = ctx.node;
|
2049
|
+
|
2050
|
+
if($.isFunction(source)){
|
2051
|
+
source = source();
|
2052
|
+
}
|
2053
|
+
// TOTHINK: move to 'ajax' extension?
|
2054
|
+
if(source.url){
|
2055
|
+
// `source` is an Ajax options object
|
2056
|
+
ajax = $.extend({}, ctx.options.ajax, source);
|
2057
|
+
if(ajax.debugDelay){
|
2058
|
+
// simulate a slow server
|
2059
|
+
delay = ajax.debugDelay;
|
2060
|
+
if($.isArray(delay)){ // random delay range [min..max]
|
2061
|
+
delay = delay[0] + Math.random() * (delay[1] - delay[0]);
|
2062
|
+
}
|
2063
|
+
|
2064
|
+
node.debug("nodeLoadChildren waiting debug delay " + Math.round(delay) + "ms");
|
2065
|
+
ajax.debugDelay = false;
|
2066
|
+
source = $.Deferred(function (dfd) {
|
2067
|
+
setTimeout(function () {
|
2068
|
+
$.ajax(ajax)
|
2069
|
+
.done(function () { dfd.resolveWith(this, arguments); })
|
2070
|
+
.fail(function () { dfd.rejectWith(this, arguments); });
|
2071
|
+
}, delay);
|
2072
|
+
});
|
2073
|
+
}else{
|
2074
|
+
source = $.ajax(ajax);
|
2075
|
+
}
|
2076
|
+
|
2077
|
+
// TODO: change 'pipe' to 'then' for jQuery 1.8
|
2078
|
+
source = source.pipe(function (data, textStatus, jqXHR) {
|
2079
|
+
var res;
|
2080
|
+
if(typeof data === "string"){ $.error("Ajax request returned a string (did you get the JSON dataType wrong?)."); }
|
2081
|
+
// postProcess is similar to the standard dataFilter hook,
|
2082
|
+
// but it is also called for JSONP
|
2083
|
+
if( ctx.options.postProcess ){
|
2084
|
+
res = tree._triggerNodeEvent("postProcess", ctx, ctx.originalEvent, {response: data, dataType: this.dataType});
|
2085
|
+
data = $.isArray(res) ? res : data;
|
2086
|
+
} else if (data && data.hasOwnProperty("d") && ctx.options.enableAspx ) {
|
2087
|
+
// Process ASPX WebMethod JSON object inside "d" property
|
2088
|
+
data = (typeof data.d === "string") ? $.parseJSON(data.d) : data.d;
|
2089
|
+
}
|
2090
|
+
return data;
|
2091
|
+
}, function (jqXHR, textStatus, errorThrown) {
|
2092
|
+
return tree._makeHookContext(node, null, {
|
2093
|
+
error: jqXHR,
|
2094
|
+
args: Array.prototype.slice.call(arguments),
|
2095
|
+
message: errorThrown,
|
2096
|
+
details: jqXHR.status + ": " + errorThrown
|
2097
|
+
});
|
2098
|
+
});
|
2099
|
+
}
|
2100
|
+
|
2101
|
+
if($.isFunction(source.promise)){
|
2102
|
+
// `source` is a promise
|
2103
|
+
tree.nodeSetStatus(ctx, "loading");
|
2104
|
+
source.done(function () {
|
2105
|
+
tree.nodeSetStatus(ctx, "ok");
|
2106
|
+
}).fail(function(error){
|
2107
|
+
var ctxErr;
|
2108
|
+
if (error.node && error.error && error.message) {
|
2109
|
+
// error is already a context object
|
2110
|
+
ctxErr = error;
|
2111
|
+
} else {
|
2112
|
+
ctxErr = tree._makeHookContext(node, null, {
|
2113
|
+
error: error, // it can be jqXHR or any custom error
|
2114
|
+
args: Array.prototype.slice.call(arguments),
|
2115
|
+
message: error ? (error.message || error.toString()) : ""
|
2116
|
+
});
|
2117
|
+
}
|
2118
|
+
tree._triggerNodeEvent("loaderror", ctxErr, null);
|
2119
|
+
tree.nodeSetStatus(ctx, "error", ctxErr.message, ctxErr.details);
|
2120
|
+
});
|
2121
|
+
}
|
2122
|
+
|
2123
|
+
return $.when(source).done(function(children){
|
2124
|
+
var metaData;
|
2125
|
+
|
2126
|
+
if( $.isPlainObject(children) ){
|
2127
|
+
// We got {foo: 'abc', children: [...]}
|
2128
|
+
// Copy extra properties to tree.data.
|
2129
|
+
_assert($.isArray(children.children), "source must contain (or be) an array of children");
|
2130
|
+
_assert(node.isRoot(), "source may only be an object for root nodes");
|
2131
|
+
metaData = children;
|
2132
|
+
children = children.children;
|
2133
|
+
delete metaData.children;
|
2134
|
+
$.extend(tree.data, metaData);
|
2135
|
+
}
|
2136
|
+
_assert($.isArray(children), "expected array of children");
|
2137
|
+
node._setChildren(children);
|
2138
|
+
if(node.parent){
|
2139
|
+
// trigger fancytreeloadchildren (except for tree-reload)
|
2140
|
+
tree._triggerNodeEvent("loadChildren", node);
|
2141
|
+
}
|
2142
|
+
});
|
2143
|
+
},
|
2144
|
+
// isVisible: function() {
|
2145
|
+
// // Return true, if all parents are expanded.
|
2146
|
+
// var parents = ctx.node.getParentList(false, false);
|
2147
|
+
// for(var i=0, l=parents.length; i<l; i++){
|
2148
|
+
// if( ! parents[i].expanded ){ return false; }
|
2149
|
+
// }
|
2150
|
+
// return true;
|
2151
|
+
// },
|
2152
|
+
/** Expand all keys that */
|
2153
|
+
nodeLoadKeyPath: function(ctx, keyPathList) {
|
2154
|
+
// TODO: implement and improve
|
2155
|
+
// http://code.google.com/p/fancytree/issues/detail?id=222
|
2156
|
+
},
|
2157
|
+
/** Expand all parents.*/
|
2158
|
+
nodeMakeVisible: function(ctx) {
|
2159
|
+
// TODO: also scroll as neccessary: http://stackoverflow.com/questions/8938352/fancytree-how-to-scroll-to-active-node
|
2160
|
+
// Do we need an extra parameter?
|
2161
|
+
var i, l,
|
2162
|
+
parents = ctx.node.getParentList(false, false);
|
2163
|
+
for(i=0, l=parents.length; i<l; i++){
|
2164
|
+
parents[i].setExpanded(true);
|
2165
|
+
}
|
2166
|
+
},
|
2167
|
+
/**
|
2168
|
+
* Remove a single direct child of ctx.node.
|
2169
|
+
* @param ctx
|
2170
|
+
* @param {FancytreeNode} childNode dircect child of ctx.node
|
2171
|
+
*/
|
2172
|
+
nodeRemoveChild: function(ctx, childNode) {
|
2173
|
+
var idx,
|
2174
|
+
node = ctx.node,
|
2175
|
+
opts = ctx.options,
|
2176
|
+
subCtx = $.extend({}, ctx, {node: childNode}),
|
2177
|
+
children = node.children;
|
2178
|
+
|
2179
|
+
FT.debug("nodeRemoveChild()", node.toString(), childNode.toString());
|
2180
|
+
|
2181
|
+
if( children.length === 1 ) {
|
2182
|
+
_assert(childNode === children[0]);
|
2183
|
+
return this.nodeRemoveChildren(ctx);
|
2184
|
+
}
|
2185
|
+
if( this.activeNode && (childNode === this.activeNode || this.activeNode.isDescendantOf(childNode))){
|
2186
|
+
this.activeNode.setActive(false); // TODO: don't fire events
|
2187
|
+
}
|
2188
|
+
if( this.focusNode && (childNode === this.focusNode || this.focusNode.isDescendantOf(childNode))){
|
2189
|
+
this.focusNode = null;
|
2190
|
+
}
|
2191
|
+
// TODO: persist must take care to clear select and expand cookies
|
2192
|
+
this.nodeRemoveMarkup(subCtx);
|
2193
|
+
this.nodeRemoveChildren(subCtx);
|
2194
|
+
idx = $.inArray(childNode, children);
|
2195
|
+
_assert(idx >= 0);
|
2196
|
+
// Unlink to support GC
|
2197
|
+
childNode.visit(function(n){
|
2198
|
+
n.parent = null;
|
2199
|
+
}, true);
|
2200
|
+
if ( opts.removeNode ){
|
2201
|
+
opts.removeNode.call(ctx.tree, {type: "removeNode"}, subCtx);
|
2202
|
+
}
|
2203
|
+
// remove from child list
|
2204
|
+
children.splice(idx, 1);
|
2205
|
+
},
|
2206
|
+
/**Remove HTML markup for all descendents of ctx.node.
|
2207
|
+
* @param {EventData} ctx
|
2208
|
+
*/
|
2209
|
+
nodeRemoveChildMarkup: function(ctx) {
|
2210
|
+
var node = ctx.node;
|
2211
|
+
|
2212
|
+
FT.debug("nodeRemoveChildMarkup()", node.toString());
|
2213
|
+
// TODO: Unlink attr.ftnode to support GC
|
2214
|
+
if(node.ul){
|
2215
|
+
$(node.ul).remove();
|
2216
|
+
node.visit(function(n){
|
2217
|
+
n.li = n.ul = null;
|
2218
|
+
});
|
2219
|
+
node.ul = null;
|
2220
|
+
}
|
2221
|
+
},
|
2222
|
+
/**Remove all descendants of ctx.node.
|
2223
|
+
* @param {EventData} ctx
|
2224
|
+
*/
|
2225
|
+
nodeRemoveChildren: function(ctx) {
|
2226
|
+
var subCtx,
|
2227
|
+
node = ctx.node,
|
2228
|
+
children = node.children,
|
2229
|
+
opts = ctx.options;
|
2230
|
+
|
2231
|
+
FT.debug("nodeRemoveChildren()", node.toString());
|
2232
|
+
if(!children){
|
2233
|
+
return;
|
2234
|
+
}
|
2235
|
+
if( this.activeNode && this.activeNode.isDescendantOf(node)){
|
2236
|
+
this.activeNode.setActive(false); // TODO: don't fire events
|
2237
|
+
}
|
2238
|
+
if( this.focusNode && this.focusNode.isDescendantOf(node)){
|
2239
|
+
this.focusNode = null;
|
2240
|
+
}
|
2241
|
+
// TODO: persist must take care to clear select and expand cookies
|
2242
|
+
this.nodeRemoveChildMarkup(ctx);
|
2243
|
+
// Unlink children to support GC
|
2244
|
+
// TODO: also delete this.children (not possible using visit())
|
2245
|
+
subCtx = $.extend({}, ctx);
|
2246
|
+
node.visit(function(n){
|
2247
|
+
n.parent = null;
|
2248
|
+
if ( opts.removeNode ){
|
2249
|
+
subCtx.node = n;
|
2250
|
+
opts.removeNode.call(ctx.tree, {type: "removeNode"}, subCtx);
|
2251
|
+
}
|
2252
|
+
});
|
2253
|
+
// Set to 'undefined' which is interpreted as 'not yet loaded' for lazy nodes
|
2254
|
+
node.children = undefined;
|
2255
|
+
// TODO: ? this._isLoading = false;
|
2256
|
+
this.nodeRenderStatus(ctx);
|
2257
|
+
},
|
2258
|
+
/**Remove HTML markup for ctx.node and all its descendents.
|
2259
|
+
* @param {EventData} ctx
|
2260
|
+
*/
|
2261
|
+
nodeRemoveMarkup: function(ctx) {
|
2262
|
+
var node = ctx.node;
|
2263
|
+
FT.debug("nodeRemoveMarkup()", node.toString());
|
2264
|
+
// TODO: Unlink attr.ftnode to support GC
|
2265
|
+
if(node.li){
|
2266
|
+
$(node.li).remove();
|
2267
|
+
node.li = null;
|
2268
|
+
}
|
2269
|
+
this.nodeRemoveChildMarkup(ctx);
|
2270
|
+
},
|
2271
|
+
/**
|
2272
|
+
* Create `<li><span>..</span> .. </li>` tags for this node.
|
2273
|
+
*
|
2274
|
+
* This method takes care that all HTML markup is created that is required
|
2275
|
+
* to display this node in it's current state.
|
2276
|
+
*
|
2277
|
+
* Call this method to create new nodes, or after the strucuture
|
2278
|
+
* was changed (e.g. after moving this node or adding/removing children)
|
2279
|
+
* nodeRenderTitle() and nodeRenderStatus() are implied.
|
2280
|
+
*
|
2281
|
+
* Note: if a node was created/removed, nodeRender() must be called for the
|
2282
|
+
* parent!
|
2283
|
+
* <code>
|
2284
|
+
* <li id='KEY' ftnode=NODE>
|
2285
|
+
* <span class='fancytree-node fancytree-expanded fancytree-has-children fancytree-lastsib fancytree-exp-el fancytree-ico-e'>
|
2286
|
+
* <span class="fancytree-expander"></span>
|
2287
|
+
* <span class="fancytree-checkbox"></span> // only present in checkbox mode
|
2288
|
+
* <span class="fancytree-icon"></span>
|
2289
|
+
* <a href="#" class="fancytree-title"> Node 1 </a>
|
2290
|
+
* </span>
|
2291
|
+
* <ul> // only present if node has children
|
2292
|
+
* <li id='KEY' ftnode=NODE> child1 ... </li>
|
2293
|
+
* <li id='KEY' ftnode=NODE> child2 ... </li>
|
2294
|
+
* </ul>
|
2295
|
+
* </li>
|
2296
|
+
* </code>
|
2297
|
+
*
|
2298
|
+
* @param: {EventData} ctx
|
2299
|
+
* @param: {Boolean} [force=false] re-render, even if html markup was already created
|
2300
|
+
* @param: {Boolean} [deep=false] also render all descendants, even if parent is collapsed
|
2301
|
+
* @param: {Boolean} [collapsed=false] force root node to be collapsed, so we can apply animated expand later
|
2302
|
+
*/
|
2303
|
+
nodeRender: function(ctx, force, deep, collapsed, _recursive) {
|
2304
|
+
/* This method must take care of all cases where the current data mode
|
2305
|
+
* (i.e. node hierarchy) does not match the current markup.
|
2306
|
+
*
|
2307
|
+
* - node was not yet rendered:
|
2308
|
+
* create markup
|
2309
|
+
* - node was rendered: exit fast
|
2310
|
+
* - children have been added
|
2311
|
+
* - childern have been removed
|
2312
|
+
*/
|
2313
|
+
var childLI, childNode1, childNode2, i, l, subCtx,
|
2314
|
+
node = ctx.node,
|
2315
|
+
tree = ctx.tree,
|
2316
|
+
opts = ctx.options,
|
2317
|
+
aria = opts.aria,
|
2318
|
+
firstTime = false,
|
2319
|
+
parent = node.parent,
|
2320
|
+
isRootNode = !parent,
|
2321
|
+
children = node.children;
|
2322
|
+
// FT.debug("nodeRender(" + !!force + ", " + !!deep + ")", node.toString());
|
2323
|
+
|
2324
|
+
if( ! isRootNode && ! parent.ul ) {
|
2325
|
+
// issue #105: calling node.collapse on a deep, unrendered node
|
2326
|
+
return;
|
2327
|
+
}
|
2328
|
+
_assert(isRootNode || parent.ul, "parent UL must exist");
|
2329
|
+
|
2330
|
+
// Render the node
|
2331
|
+
if( !isRootNode ){
|
2332
|
+
// Discard markup on force-mode, or if it is not linked to parent <ul>
|
2333
|
+
if(node.li && (force || (node.li.parentNode !== node.parent.ul) ) ){
|
2334
|
+
if(node.li.parentNode !== node.parent.ul){
|
2335
|
+
// alert("unlink " + node + " (must be child of " + node.parent + ")");
|
2336
|
+
this.warn("unlink " + node + " (must be child of " + node.parent + ")");
|
2337
|
+
}
|
2338
|
+
// this.debug("nodeRemoveMarkup...");
|
2339
|
+
this.nodeRemoveMarkup(ctx);
|
2340
|
+
}
|
2341
|
+
// Create <li><span /> </li>
|
2342
|
+
// node.debug("render...");
|
2343
|
+
if( !node.li ) {
|
2344
|
+
// node.debug("render... really");
|
2345
|
+
firstTime = true;
|
2346
|
+
node.li = document.createElement("li");
|
2347
|
+
node.li.ftnode = node;
|
2348
|
+
if(aria){
|
2349
|
+
// TODO: why doesn't this work:
|
2350
|
+
// node.li.role = "treeitem";
|
2351
|
+
// $(node.li).attr("role", "treeitem")
|
2352
|
+
// .attr("aria-labelledby", "ftal_" + node.key);
|
2353
|
+
}
|
2354
|
+
if( node.key && opts.generateIds ){
|
2355
|
+
node.li.id = opts.idPrefix + node.key;
|
2356
|
+
}
|
2357
|
+
node.span = document.createElement("span");
|
2358
|
+
node.span.className = "fancytree-node";
|
2359
|
+
if(aria){
|
2360
|
+
$(node.span).attr("aria-labelledby", "ftal_" + node.key);
|
2361
|
+
}
|
2362
|
+
node.li.appendChild(node.span);
|
2363
|
+
// Note: we don't add the LI to the DOM know, but only after we
|
2364
|
+
// added all sub elements (hoping that this performs better since
|
2365
|
+
// the browser only have to render once)
|
2366
|
+
// TODO: benchmarks to prove this
|
2367
|
+
// parent.ul.appendChild(node.li);
|
2368
|
+
|
2369
|
+
// Create inner HTML for the <span> (expander, checkbox, icon, and title)
|
2370
|
+
this.nodeRenderTitle(ctx);
|
2371
|
+
|
2372
|
+
// Allow tweaking and binding, after node was created for the first time
|
2373
|
+
// tree._triggerNodeEvent("createNode", ctx);
|
2374
|
+
if ( opts.createNode ){
|
2375
|
+
opts.createNode.call(tree, {type: "createNode"}, ctx);
|
2376
|
+
}
|
2377
|
+
}else{
|
2378
|
+
// this.nodeRenderTitle(ctx);
|
2379
|
+
}
|
2380
|
+
// Allow tweaking after node state was rendered
|
2381
|
+
// tree._triggerNodeEvent("renderNode", ctx);
|
2382
|
+
if ( opts.renderNode ){
|
2383
|
+
opts.renderNode.call(tree, {type: "renderNode"}, ctx);
|
2384
|
+
}
|
2385
|
+
}
|
2386
|
+
|
2387
|
+
// Visit child nodes
|
2388
|
+
if( children ){
|
2389
|
+
if( isRootNode || node.expanded || deep === true ) {
|
2390
|
+
// Create a UL to hold the children
|
2391
|
+
if( !node.ul ){
|
2392
|
+
node.ul = document.createElement("ul");
|
2393
|
+
if((collapsed === true && !_recursive) || !node.expanded){
|
2394
|
+
// hide top UL, so we can use an animation to show it later
|
2395
|
+
node.ul.style.display = "none";
|
2396
|
+
}
|
2397
|
+
if(aria){
|
2398
|
+
$(node.ul).attr("role", "group");
|
2399
|
+
}
|
2400
|
+
if ( node.li ) { // issue #67
|
2401
|
+
node.li.appendChild(node.ul);
|
2402
|
+
} else {
|
2403
|
+
node.tree.$div.append(node.ul);
|
2404
|
+
}
|
2405
|
+
}
|
2406
|
+
// Add child markup
|
2407
|
+
for(i=0, l=children.length; i<l; i++) {
|
2408
|
+
subCtx = $.extend({}, ctx, {node: children[i]});
|
2409
|
+
this.nodeRender(subCtx, force, deep, false, true);
|
2410
|
+
}
|
2411
|
+
// Make sure, that <li> order matches node.children order.
|
2412
|
+
// this.nodeFixOrder(ctx);
|
2413
|
+
childLI = node.ul.firstChild;
|
2414
|
+
for(i=0, l=children.length-1; i<l; i++) {
|
2415
|
+
childNode1 = children[i];
|
2416
|
+
childNode2 = childLI.ftnode;
|
2417
|
+
if( childNode1 !== childNode2 ) {
|
2418
|
+
node.debug("_fixOrder: mismatch at index " + i + ": " + childNode1 + " != " + childNode2);
|
2419
|
+
node.ul.insertBefore(childNode1.li, childNode2.li);
|
2420
|
+
} else {
|
2421
|
+
childLI = childLI.nextSibling;
|
2422
|
+
}
|
2423
|
+
}
|
2424
|
+
// TODO: need to check, if node.ul has <li>s, that are not in node.children[] ?
|
2425
|
+
}
|
2426
|
+
}else{
|
2427
|
+
// No children: remove markup if any
|
2428
|
+
if( node.ul ){
|
2429
|
+
// alert("remove child markup for " + node);
|
2430
|
+
this.warn("remove child markup for " + node);
|
2431
|
+
this.nodeRemoveChildMarkup(ctx);
|
2432
|
+
}
|
2433
|
+
}
|
2434
|
+
if( !isRootNode ){
|
2435
|
+
// Update element classes according to node state
|
2436
|
+
this.nodeRenderStatus(ctx);
|
2437
|
+
// Finally add the whole structure to the DOM, so the browser can render
|
2438
|
+
if(firstTime){
|
2439
|
+
parent.ul.appendChild(node.li);
|
2440
|
+
}
|
2441
|
+
}
|
2442
|
+
return;
|
2443
|
+
},
|
2444
|
+
/** Create HTML for the node's outer <span> (expander, checkbox, icon, and title).
|
2445
|
+
* @param {EventData} ctx
|
2446
|
+
*/
|
2447
|
+
nodeRenderTitle: function(ctx, title) {
|
2448
|
+
// set node connector images, links and text
|
2449
|
+
var id, imageSrc, nodeTitle, role, tooltip,
|
2450
|
+
node = ctx.node,
|
2451
|
+
tree = ctx.tree,
|
2452
|
+
opts = ctx.options,
|
2453
|
+
aria = opts.aria,
|
2454
|
+
level = node.getLevel(),
|
2455
|
+
ares = [],
|
2456
|
+
icon = node.data.icon;
|
2457
|
+
|
2458
|
+
if(title !== undefined){
|
2459
|
+
node.title = title;
|
2460
|
+
}
|
2461
|
+
if(!node.span){
|
2462
|
+
// Silently bail out if node was not rendered yet, assuming
|
2463
|
+
// node.render() will be called as the node becomes visible
|
2464
|
+
return;
|
2465
|
+
}
|
2466
|
+
// connector (expanded, expandable or simple)
|
2467
|
+
// TODO: optiimize this if clause
|
2468
|
+
if( level < opts.minExpandLevel ) {
|
2469
|
+
if(level > 1){
|
2470
|
+
if(aria){
|
2471
|
+
ares.push("<span role='button' class='fancytree-expander'></span>");
|
2472
|
+
}else{
|
2473
|
+
ares.push("<span class='fancytree-expander'></span>");
|
2474
|
+
}
|
2475
|
+
}
|
2476
|
+
// .. else (i.e. for root level) skip expander/connector alltogether
|
2477
|
+
} else {
|
2478
|
+
if(aria){
|
2479
|
+
ares.push("<span role='button' class='fancytree-expander'></span>");
|
2480
|
+
}else{
|
2481
|
+
ares.push("<span class='fancytree-expander'></span>");
|
2482
|
+
}
|
2483
|
+
}
|
2484
|
+
// Checkbox mode
|
2485
|
+
if( opts.checkbox && node.hideCheckbox !== true && !node.isStatusNode ) {
|
2486
|
+
if(aria){
|
2487
|
+
ares.push("<span role='checkbox' class='fancytree-checkbox'></span>");
|
2488
|
+
}else{
|
2489
|
+
ares.push("<span class='fancytree-checkbox'></span>");
|
2490
|
+
}
|
2491
|
+
}
|
2492
|
+
// folder or doctype icon
|
2493
|
+
role = aria ? " role='img'" : "";
|
2494
|
+
if ( icon && typeof icon === "string" ) {
|
2495
|
+
imageSrc = (icon.charAt(0) === "/") ? icon : (opts.imagePath + icon);
|
2496
|
+
ares.push("<img src='" + imageSrc + "' alt='' />");
|
2497
|
+
} else if ( node.data.iconclass ) {
|
2498
|
+
// TODO: review and test and document
|
2499
|
+
ares.push("<span " + role + " class='fancytree-custom-icon" + " " + node.data.iconclass + "'></span>");
|
2500
|
+
} else if ( icon === true || (icon !== false && opts.icons !== false) ) {
|
2501
|
+
// opts.icons defines the default behavior.
|
2502
|
+
// node.icon == true/false can override this
|
2503
|
+
ares.push("<span " + role + " class='fancytree-icon'></span>");
|
2504
|
+
}
|
2505
|
+
// node title
|
2506
|
+
nodeTitle = "";
|
2507
|
+
// TODO: currently undocumented; may be removed?
|
2508
|
+
if ( opts.renderTitle ){
|
2509
|
+
nodeTitle = opts.renderTitle.call(tree, {type: "renderTitle"}, ctx) || "";
|
2510
|
+
}
|
2511
|
+
if(!nodeTitle){
|
2512
|
+
// TODO: escape tooltip string
|
2513
|
+
tooltip = node.tooltip ? " title='" + node.tooltip.replace(/\"/g, """) + "'" : "";
|
2514
|
+
id = aria ? " id='ftal_" + node.key + "'" : "";
|
2515
|
+
role = aria ? " role='treeitem'" : "";
|
2516
|
+
// href = node.data.href || "#";
|
2517
|
+
// if( opts.nolink || node.nolink ) {
|
2518
|
+
// nodeTitle = "<span role='treeitem' tabindex='-1' class='fancytree-title'" + id + tooltip + ">" + node.title + "</span>";
|
2519
|
+
nodeTitle = "<span " + role + " class='fancytree-title'" + id + tooltip + ">" + node.title + "</span>";
|
2520
|
+
// } else {
|
2521
|
+
// nodeTitle = "<a href='" + href + "' tabindex='-1' class='fancytree-title'" + tooltip + ">" + node.title + "</a>";
|
2522
|
+
// }
|
2523
|
+
}
|
2524
|
+
ares.push(nodeTitle);
|
2525
|
+
// Note: this will trigger focusout, if node had the focus
|
2526
|
+
node.span.innerHTML = ares.join("");
|
2527
|
+
},
|
2528
|
+
/** Update element classes according to node state.
|
2529
|
+
* @param {EventData} ctx
|
2530
|
+
*/
|
2531
|
+
nodeRenderStatus: function(ctx) {
|
2532
|
+
// Set classes for current status
|
2533
|
+
var node = ctx.node,
|
2534
|
+
tree = ctx.tree,
|
2535
|
+
opts = ctx.options,
|
2536
|
+
// nodeContainer = node[tree.nodeContainerAttrName],
|
2537
|
+
hasChildren = node.hasChildren(),
|
2538
|
+
isLastSib = node.isLastSibling(),
|
2539
|
+
aria = opts.aria,
|
2540
|
+
// $ariaElem = aria ? $(node[tree.ariaPropName]) : null,
|
2541
|
+
$ariaElem = $(node.span).find(".fancytree-title"),
|
2542
|
+
cn = opts._classNames,
|
2543
|
+
cnList = [],
|
2544
|
+
statusElem = node[tree.statusClassPropName];
|
2545
|
+
|
2546
|
+
if( !statusElem ){
|
2547
|
+
// if this function is called for an unrendered node, ignore it (will be updated on nect render anyway)
|
2548
|
+
return;
|
2549
|
+
}
|
2550
|
+
// Build a list of class names that we will add to the node <span>
|
2551
|
+
cnList.push(cn.node);
|
2552
|
+
if( tree.activeNode === node ){
|
2553
|
+
cnList.push(cn.active);
|
2554
|
+
// $(">span.fancytree-title", statusElem).attr("tabindex", "0");
|
2555
|
+
// tree.$container.removeAttr("tabindex");
|
2556
|
+
}else{
|
2557
|
+
// $(">span.fancytree-title", statusElem).removeAttr("tabindex");
|
2558
|
+
// tree.$container.attr("tabindex", "0");
|
2559
|
+
}
|
2560
|
+
if( tree.focusNode === node ){
|
2561
|
+
cnList.push(cn.focused);
|
2562
|
+
if(aria){
|
2563
|
+
// $(">span.fancytree-title", statusElem).attr("tabindex", "0");
|
2564
|
+
// $(">span.fancytree-title", statusElem).attr("tabindex", "-1");
|
2565
|
+
// TODO: is this the right element for this attribute?
|
2566
|
+
$ariaElem
|
2567
|
+
.attr("aria-activedescendant", true);
|
2568
|
+
// .attr("tabindex", "-1");
|
2569
|
+
}
|
2570
|
+
}else if(aria){
|
2571
|
+
// $(">span.fancytree-title", statusElem).attr("tabindex", "-1");
|
2572
|
+
$ariaElem
|
2573
|
+
.removeAttr("aria-activedescendant");
|
2574
|
+
// .removeAttr("tabindex");
|
2575
|
+
}
|
2576
|
+
if( node.expanded ){
|
2577
|
+
cnList.push(cn.expanded);
|
2578
|
+
if(aria){
|
2579
|
+
$ariaElem.attr("aria-expanded", true);
|
2580
|
+
}
|
2581
|
+
}else if(aria){
|
2582
|
+
$ariaElem.removeAttr("aria-expanded");
|
2583
|
+
}
|
2584
|
+
if( node.folder ){
|
2585
|
+
cnList.push(cn.folder);
|
2586
|
+
}
|
2587
|
+
if( hasChildren !== false ){
|
2588
|
+
cnList.push(cn.hasChildren);
|
2589
|
+
}
|
2590
|
+
// TODO: required?
|
2591
|
+
if( isLastSib ){
|
2592
|
+
cnList.push(cn.lastsib);
|
2593
|
+
}
|
2594
|
+
if( node.lazy && node.children == null ){
|
2595
|
+
cnList.push(cn.lazy);
|
2596
|
+
}
|
2597
|
+
if( node.partsel ){
|
2598
|
+
cnList.push(cn.partsel);
|
2599
|
+
}
|
2600
|
+
if( node.selected ){
|
2601
|
+
cnList.push(cn.selected);
|
2602
|
+
if(aria){
|
2603
|
+
$ariaElem.attr("aria-selected", true);
|
2604
|
+
}
|
2605
|
+
}else if(aria){
|
2606
|
+
$ariaElem.attr("aria-selected", false);
|
2607
|
+
}
|
2608
|
+
if( node.extraClasses ){
|
2609
|
+
cnList.push(node.extraClasses);
|
2610
|
+
}
|
2611
|
+
// IE6 doesn't correctly evaluate multiple class names,
|
2612
|
+
// so we create combined class names that can be used in the CSS
|
2613
|
+
if( hasChildren === false ){
|
2614
|
+
cnList.push(cn.combinedExpanderPrefix + "n" +
|
2615
|
+
(isLastSib ? "l" : "")
|
2616
|
+
);
|
2617
|
+
}else{
|
2618
|
+
cnList.push(cn.combinedExpanderPrefix +
|
2619
|
+
(node.expanded ? "e" : "c") +
|
2620
|
+
(node.lazy && node.children == null ? "d" : "") +
|
2621
|
+
(isLastSib ? "l" : "")
|
2622
|
+
);
|
2623
|
+
}
|
2624
|
+
cnList.push(cn.combinedIconPrefix +
|
2625
|
+
(node.expanded ? "e" : "c") +
|
2626
|
+
(node.folder ? "f" : "")
|
2627
|
+
);
|
2628
|
+
// node.span.className = cnList.join(" ");
|
2629
|
+
statusElem.className = cnList.join(" ");
|
2630
|
+
|
2631
|
+
// TODO: we should not set this in the <span> tag also, if we set it here:
|
2632
|
+
// Maybe most (all) of the classes should be set in LI instead of SPAN?
|
2633
|
+
if(node.li){
|
2634
|
+
node.li.className = isLastSib ? cn.lastsib : "";
|
2635
|
+
}
|
2636
|
+
},
|
2637
|
+
/** Activate node.
|
2638
|
+
* flag defaults to true.
|
2639
|
+
* If flag is true, the node is activated (must be a synchronous operation)
|
2640
|
+
* If flag is false, the node is deactivated (must be a synchronous operation)
|
2641
|
+
* @param {EventData} ctx
|
2642
|
+
* @param {Boolean} [flag=true]
|
2643
|
+
*/
|
2644
|
+
nodeSetActive: function(ctx, flag) {
|
2645
|
+
// Handle user click / [space] / [enter], according to clickFolderMode.
|
2646
|
+
var subCtx,
|
2647
|
+
node = ctx.node,
|
2648
|
+
tree = ctx.tree,
|
2649
|
+
opts = ctx.options,
|
2650
|
+
// userEvent = !!ctx.originalEvent,
|
2651
|
+
isActive = (node === tree.activeNode);
|
2652
|
+
// flag defaults to true
|
2653
|
+
flag = (flag !== false);
|
2654
|
+
node.debug("nodeSetActive", flag);
|
2655
|
+
|
2656
|
+
if(isActive === flag){
|
2657
|
+
// Nothing to do
|
2658
|
+
return _getResolvedPromise(node);
|
2659
|
+
}else if(flag && this._triggerNodeEvent("beforeActivate", node, ctx.originalEvent) === false ){
|
2660
|
+
// Callback returned false
|
2661
|
+
return _getRejectedPromise(node, ["rejected"]);
|
2662
|
+
}
|
2663
|
+
if(flag){
|
2664
|
+
if(tree.activeNode){
|
2665
|
+
_assert(tree.activeNode !== node, "node was active (inconsistency)");
|
2666
|
+
subCtx = $.extend({}, ctx, {node: tree.activeNode});
|
2667
|
+
tree.nodeSetActive(subCtx, false);
|
2668
|
+
_assert(tree.activeNode === null, "deactivate was out of sync?");
|
2669
|
+
}
|
2670
|
+
if(opts.activeVisible){
|
2671
|
+
tree.nodeMakeVisible(ctx);
|
2672
|
+
}
|
2673
|
+
tree.activeNode = node;
|
2674
|
+
tree.nodeRenderStatus(ctx);
|
2675
|
+
tree.nodeSetFocus(ctx);
|
2676
|
+
tree._triggerNodeEvent("activate", node);
|
2677
|
+
}else{
|
2678
|
+
_assert(tree.activeNode === node, "node was not active (inconsistency)");
|
2679
|
+
tree.activeNode = null;
|
2680
|
+
this.nodeRenderStatus(ctx);
|
2681
|
+
ctx.tree._triggerNodeEvent("deactivate", node);
|
2682
|
+
}
|
2683
|
+
},
|
2684
|
+
/** Expand or collapse node, return Deferred.promise.
|
2685
|
+
*
|
2686
|
+
* @param {EventData} ctx
|
2687
|
+
* @param {Boolean} [flag=true]
|
2688
|
+
* @returns {$.Promise} The deferred will be resolved as soon as the (lazy)
|
2689
|
+
* data was retrieved, rendered, and the expand animation finshed.
|
2690
|
+
*/
|
2691
|
+
nodeSetExpanded: function(ctx, flag) {
|
2692
|
+
var _afterLoad, dfd, i, l, parents, prevAC,
|
2693
|
+
node = ctx.node,
|
2694
|
+
tree = ctx.tree,
|
2695
|
+
opts = ctx.options;
|
2696
|
+
// flag defaults to true
|
2697
|
+
flag = (flag !== false);
|
2698
|
+
|
2699
|
+
node.debug("nodeSetExpanded(" + flag + ")");
|
2700
|
+
// TODO: !!node.expanded is nicer, but doesn't pass jshint
|
2701
|
+
// https://github.com/jshint/jshint/issues/455
|
2702
|
+
// if( !!node.expanded === !!flag){
|
2703
|
+
if((node.expanded && flag) || (!node.expanded && !flag)){
|
2704
|
+
// Nothing to do
|
2705
|
+
node.debug("nodeSetExpanded(" + flag + "): nothing to do");
|
2706
|
+
return _getResolvedPromise(node);
|
2707
|
+
}else if(flag && !node.lazy && !node.hasChildren() ){
|
2708
|
+
// Prevent expanding of empty nodes
|
2709
|
+
return _getRejectedPromise(node, ["empty"]);
|
2710
|
+
}else if( !flag && node.getLevel() < opts.minExpandLevel ) {
|
2711
|
+
// Prevent collapsing locked levels
|
2712
|
+
return _getRejectedPromise(node, ["locked"]);
|
2713
|
+
}else if ( this._triggerNodeEvent("beforeExpand", node, ctx.originalEvent) === false ){
|
2714
|
+
// Callback returned false
|
2715
|
+
return _getRejectedPromise(node, ["rejected"]);
|
2716
|
+
}
|
2717
|
+
//
|
2718
|
+
dfd = new $.Deferred();
|
2719
|
+
|
2720
|
+
// Auto-collapse mode: collapse all siblings
|
2721
|
+
if( flag && !node.expanded && opts.autoCollapse ) {
|
2722
|
+
parents = node.getParentList(false, true);
|
2723
|
+
prevAC = opts.autoCollapse;
|
2724
|
+
try{
|
2725
|
+
opts.autoCollapse = false;
|
2726
|
+
for(i=0, l=parents.length; i<l; i++){
|
2727
|
+
// TODO: should return promise?
|
2728
|
+
this._callHook("nodeCollapseSiblings", parents[i]);
|
2729
|
+
}
|
2730
|
+
}finally{
|
2731
|
+
opts.autoCollapse = prevAC;
|
2732
|
+
}
|
2733
|
+
}
|
2734
|
+
// Trigger expand/collapse after expanding
|
2735
|
+
dfd.done(function(){
|
2736
|
+
ctx.tree._triggerNodeEvent(flag ? "expand" : "collapse", ctx);
|
2737
|
+
if(opts.autoScroll){
|
2738
|
+
// Scroll down to last child, but keep current node visible
|
2739
|
+
node.getLastChild().scrollIntoView(true, node);
|
2740
|
+
}
|
2741
|
+
});
|
2742
|
+
|
2743
|
+
// vvv Code below is executed after loading finished:
|
2744
|
+
_afterLoad = function(callback){
|
2745
|
+
var duration, easing, isVisible, isExpanded;
|
2746
|
+
|
2747
|
+
node.expanded = flag;
|
2748
|
+
// Create required markup, but make sure the top UL is hidden, so we
|
2749
|
+
// can animate later
|
2750
|
+
tree._callHook("nodeRender", ctx, false, false, true);
|
2751
|
+
|
2752
|
+
// If the currently active node is now hidden, deactivate it
|
2753
|
+
// if( opts.activeVisible && this.activeNode && ! this.activeNode.isVisible() ) {
|
2754
|
+
// this.activeNode.deactivate();
|
2755
|
+
// }
|
2756
|
+
|
2757
|
+
// Expanding a lazy node: set 'loading...' and call callback
|
2758
|
+
// if( bExpand && this.data.isLazy && this.childList === null && !this._isLoading ) {
|
2759
|
+
// this._loadContent();
|
2760
|
+
// return;
|
2761
|
+
// }
|
2762
|
+
// Hide children, if node is collapsed
|
2763
|
+
if( node.ul ) {
|
2764
|
+
isVisible = (node.ul.style.display !== "none");
|
2765
|
+
isExpanded = !!node.expanded;
|
2766
|
+
if ( isVisible === isExpanded ) {
|
2767
|
+
node.warn("nodeSetExpanded: UL.style.display already set");
|
2768
|
+
} else if ( !opts.fx ) {
|
2769
|
+
node.ul.style.display = ( node.expanded || !parent ) ? "" : "none";
|
2770
|
+
} else {
|
2771
|
+
duration = opts.fx.duration || 200;
|
2772
|
+
easing = opts.fx.easing;
|
2773
|
+
node.debug("nodeSetExpanded: animate start...");
|
2774
|
+
$(node.ul).animate(opts.fx, duration, easing, function(){
|
2775
|
+
node.debug("nodeSetExpanded: animate done");
|
2776
|
+
callback();
|
2777
|
+
});
|
2778
|
+
return;
|
2779
|
+
}
|
2780
|
+
}
|
2781
|
+
callback();
|
2782
|
+
};
|
2783
|
+
// ^^^ Code above is executed after loading finshed.
|
2784
|
+
|
2785
|
+
// Load lazy nodes, if any. Then continue with _afterLoad()
|
2786
|
+
if(flag && node.lazy && node.hasChildren() === undefined){
|
2787
|
+
node.debug("nodeSetExpanded: load start...");
|
2788
|
+
node.lazyLoad().done(function(){
|
2789
|
+
node.debug("nodeSetExpanded: load done");
|
2790
|
+
if(dfd.notifyWith){ // requires jQuery 1.6+
|
2791
|
+
dfd.notifyWith(node, ["loaded"]);
|
2792
|
+
}
|
2793
|
+
_afterLoad(function () { dfd.resolveWith(node); });
|
2794
|
+
}).fail(function(errMsg){
|
2795
|
+
_afterLoad(function () { dfd.rejectWith(node, ["load failed (" + errMsg + ")"]); });
|
2796
|
+
});
|
2797
|
+
/*
|
2798
|
+
var source = tree._triggerNodeEvent("lazyload", node, ctx.originalEvent);
|
2799
|
+
_assert(typeof source !== "boolean", "lazyload event must return source in data.result");
|
2800
|
+
node.debug("nodeSetExpanded: load start...");
|
2801
|
+
this._callHook("nodeLoadChildren", ctx, source).done(function(){
|
2802
|
+
node.debug("nodeSetExpanded: load done");
|
2803
|
+
if(dfd.notifyWith){ // requires jQuery 1.6+
|
2804
|
+
dfd.notifyWith(node, ["loaded"]);
|
2805
|
+
}
|
2806
|
+
_afterLoad.call(tree);
|
2807
|
+
}).fail(function(errMsg){
|
2808
|
+
dfd.rejectWith(node, ["load failed (" + errMsg + ")"]);
|
2809
|
+
});
|
2810
|
+
*/
|
2811
|
+
}else{
|
2812
|
+
_afterLoad(function () { dfd.resolveWith(node); });
|
2813
|
+
}
|
2814
|
+
node.debug("nodeSetExpanded: returns");
|
2815
|
+
return dfd.promise();
|
2816
|
+
},
|
2817
|
+
/**
|
2818
|
+
* @param {EventData} ctx
|
2819
|
+
* @param {Boolean} [flag=true]
|
2820
|
+
*/
|
2821
|
+
nodeSetFocus: function(ctx, flag) {
|
2822
|
+
ctx.node.debug("nodeSetFocus(" + flag + ")");
|
2823
|
+
var ctx2,
|
2824
|
+
tree = ctx.tree,
|
2825
|
+
node = ctx.node;
|
2826
|
+
|
2827
|
+
flag = (flag !== false);
|
2828
|
+
|
2829
|
+
// Blur previous node if any
|
2830
|
+
if(tree.focusNode){
|
2831
|
+
if(tree.focusNode === node && flag){
|
2832
|
+
node.debug("nodeSetFocus(" + flag + "): nothing to do");
|
2833
|
+
return;
|
2834
|
+
}
|
2835
|
+
ctx2 = $.extend({}, ctx, {node: tree.focusNode});
|
2836
|
+
tree.focusNode = null;
|
2837
|
+
this._triggerNodeEvent("blur", ctx2);
|
2838
|
+
this._callHook("nodeRenderStatus", ctx2);
|
2839
|
+
}
|
2840
|
+
// Set focus to container and node
|
2841
|
+
if(flag){
|
2842
|
+
if( !this.hasFocus() ){
|
2843
|
+
node.debug("nodeSetFocus: forcing container focus");
|
2844
|
+
// Note: we pass _calledByNodeSetFocus=true
|
2845
|
+
this._callHook("treeSetFocus", ctx, true, true);
|
2846
|
+
}
|
2847
|
+
this.nodeMakeVisible(ctx);
|
2848
|
+
tree.focusNode = node;
|
2849
|
+
// node.debug("FOCUS...");
|
2850
|
+
// $(node.span).find(".fancytree-title").focus();
|
2851
|
+
this._triggerNodeEvent("focus", ctx);
|
2852
|
+
// if(ctx.options.autoActivate){
|
2853
|
+
// tree.nodeSetActive(ctx, true);
|
2854
|
+
// }
|
2855
|
+
if(ctx.options.autoScroll){
|
2856
|
+
node.scrollIntoView();
|
2857
|
+
}
|
2858
|
+
this._callHook("nodeRenderStatus", ctx);
|
2859
|
+
}
|
2860
|
+
},
|
2861
|
+
/** (De)Select node, return new status (sync).
|
2862
|
+
*
|
2863
|
+
* @param {EventData} ctx
|
2864
|
+
* @param {Boolean} [flag=true]
|
2865
|
+
*/
|
2866
|
+
nodeSetSelected: function(ctx, flag) {
|
2867
|
+
var node = ctx.node,
|
2868
|
+
tree = ctx.tree,
|
2869
|
+
opts = ctx.options;
|
2870
|
+
// flag defaults to true
|
2871
|
+
flag = (flag !== false);
|
2872
|
+
|
2873
|
+
node.debug("nodeSetSelected(" + flag + ")", ctx);
|
2874
|
+
if( node.unselectable){
|
2875
|
+
return;
|
2876
|
+
}
|
2877
|
+
// TODO: !!node.expanded is nicer, but doesn't pass jshint
|
2878
|
+
// https://github.com/jshint/jshint/issues/455
|
2879
|
+
// if( !!node.expanded === !!flag){
|
2880
|
+
if((node.selected && flag) || (!node.selected && !flag)){
|
2881
|
+
return !!node.selected;
|
2882
|
+
}else if ( this._triggerNodeEvent("beforeSelect", node, ctx.originalEvent) === false ){
|
2883
|
+
return !!node.selected;
|
2884
|
+
}
|
2885
|
+
if(flag && opts.selectMode === 1){
|
2886
|
+
// single selection mode
|
2887
|
+
if(tree.lastSelectedNode){
|
2888
|
+
tree.lastSelectedNode.setSelected(false);
|
2889
|
+
}
|
2890
|
+
}else if(opts.selectMode === 3){
|
2891
|
+
// multi.hier selection mode
|
2892
|
+
node.selected = flag;
|
2893
|
+
// this._fixSelectionState(node);
|
2894
|
+
node.fixSelection3AfterClick();
|
2895
|
+
}
|
2896
|
+
node.selected = flag;
|
2897
|
+
this.nodeRenderStatus(ctx);
|
2898
|
+
tree.lastSelectedNode = flag ? node : null;
|
2899
|
+
tree._triggerNodeEvent("select", ctx);
|
2900
|
+
},
|
2901
|
+
/** Show node status (ok, loading, error) using styles and a dummy child node.
|
2902
|
+
*
|
2903
|
+
* @param {EventData} ctx
|
2904
|
+
* @param status
|
2905
|
+
* @param message
|
2906
|
+
* @param details
|
2907
|
+
*/
|
2908
|
+
nodeSetStatus: function(ctx, status, message, details) {
|
2909
|
+
var _clearStatusNode, _setStatusNode,
|
2910
|
+
node = ctx.node,
|
2911
|
+
tree = ctx.tree,
|
2912
|
+
cn = ctx.options._classNames;
|
2913
|
+
|
2914
|
+
_clearStatusNode = function() {
|
2915
|
+
var firstChild = ( node.children ? node.children[0] : null );
|
2916
|
+
if ( firstChild && firstChild.isStatusNode ) {
|
2917
|
+
try{
|
2918
|
+
// I've seen exceptions here with loadKeyPath...
|
2919
|
+
if(node.ul){
|
2920
|
+
node.ul.removeChild(firstChild.li);
|
2921
|
+
firstChild.li = null; // avoid leaks (issue 215)
|
2922
|
+
}
|
2923
|
+
}catch(e){}
|
2924
|
+
if( node.children.length === 1 ){
|
2925
|
+
node.children = [];
|
2926
|
+
}else{
|
2927
|
+
node.children.shift();
|
2928
|
+
}
|
2929
|
+
}
|
2930
|
+
};
|
2931
|
+
_setStatusNode = function(data) {
|
2932
|
+
var firstChild = ( node.children ? node.children[0] : null );
|
2933
|
+
if ( firstChild && firstChild.isStatusNode ) {
|
2934
|
+
$.extend(firstChild, data);
|
2935
|
+
tree._callHook("nodeRender", firstChild);
|
2936
|
+
} else {
|
2937
|
+
data.key = "_statusNode";
|
2938
|
+
node._setChildren([data]);
|
2939
|
+
node.children[0].isStatusNode = true;
|
2940
|
+
tree.render();
|
2941
|
+
}
|
2942
|
+
return node.children[0];
|
2943
|
+
};
|
2944
|
+
switch(status){
|
2945
|
+
case "ok":
|
2946
|
+
_clearStatusNode();
|
2947
|
+
$(node.span).removeClass(cn.loading);
|
2948
|
+
$(node.span).removeClass(cn.error);
|
2949
|
+
break;
|
2950
|
+
case "loading":
|
2951
|
+
$(node.span).removeClass(cn.error);
|
2952
|
+
$(node.span).addClass(cn.loading);
|
2953
|
+
if(!node.parent){
|
2954
|
+
_setStatusNode({
|
2955
|
+
title: tree.options.strings.loading + (message ? " (" + message + ") " : ""),
|
2956
|
+
tooltip: details,
|
2957
|
+
extraClasses: "fancytree-statusnode-wait"
|
2958
|
+
});
|
2959
|
+
}
|
2960
|
+
break;
|
2961
|
+
case "error":
|
2962
|
+
$(node.span).removeClass(cn.loading);
|
2963
|
+
$(node.span).addClass(cn.error);
|
2964
|
+
_setStatusNode({
|
2965
|
+
title: tree.options.strings.loadError + (message ? " (" + message + ") " : ""),
|
2966
|
+
tooltip: details,
|
2967
|
+
extraClasses: "fancytree-statusnode-error"
|
2968
|
+
});
|
2969
|
+
break;
|
2970
|
+
default:
|
2971
|
+
$.error("invalid status " + status);
|
2972
|
+
}
|
2973
|
+
},
|
2974
|
+
/**
|
2975
|
+
*
|
2976
|
+
* @param {EventData} ctx
|
2977
|
+
*/
|
2978
|
+
nodeToggleExpanded: function(ctx) {
|
2979
|
+
return this.nodeSetExpanded(ctx, !ctx.node.expanded);
|
2980
|
+
},
|
2981
|
+
/**
|
2982
|
+
* @param {EventData} ctx
|
2983
|
+
*/
|
2984
|
+
nodeToggleSelected: function(ctx) {
|
2985
|
+
return this.nodeSetSelected(ctx, !ctx.node.selected);
|
2986
|
+
},
|
2987
|
+
/** Remove all nodes.
|
2988
|
+
* @param {EventData} ctx
|
2989
|
+
*/
|
2990
|
+
treeClear: function(ctx) {
|
2991
|
+
var tree = ctx.tree;
|
2992
|
+
tree.activeNode = null;
|
2993
|
+
tree.focusNode = null;
|
2994
|
+
tree.$div.find(">ul.fancytree-container").empty();
|
2995
|
+
// TODO: call destructors and remove reference loops
|
2996
|
+
tree.rootNode.children = null;
|
2997
|
+
},
|
2998
|
+
/** Widget was created (called only once, even it re-initialized).
|
2999
|
+
* @param {EventData} ctx
|
3000
|
+
*/
|
3001
|
+
treeCreate: function(ctx) {
|
3002
|
+
},
|
3003
|
+
/** Widget was destroyed.
|
3004
|
+
* @param {EventData} ctx
|
3005
|
+
*/
|
3006
|
+
treeDestroy: function(ctx) {
|
3007
|
+
},
|
3008
|
+
/** Widget was (re-)initialized.
|
3009
|
+
* @param {EventData} ctx
|
3010
|
+
*/
|
3011
|
+
treeInit: function(ctx) {
|
3012
|
+
//this.debug("Fancytree.treeInit()");
|
3013
|
+
this.treeLoad(ctx);
|
3014
|
+
},
|
3015
|
+
/** Parse Fancytree from source, as configured in the options.
|
3016
|
+
* @param {EventData} ctx
|
3017
|
+
* @param {object} [source] new source
|
3018
|
+
*/
|
3019
|
+
treeLoad: function(ctx, source) {
|
3020
|
+
var type, $ul,
|
3021
|
+
tree = ctx.tree,
|
3022
|
+
$container = ctx.widget.element,
|
3023
|
+
dfd,
|
3024
|
+
// calling context for root node
|
3025
|
+
rootCtx = $.extend({}, ctx, {node: this.rootNode});
|
3026
|
+
|
3027
|
+
if(tree.rootNode.children){
|
3028
|
+
this.treeClear(ctx);
|
3029
|
+
}
|
3030
|
+
source = source || this.options.source;
|
3031
|
+
|
3032
|
+
if(!source){
|
3033
|
+
type = $container.data("type") || "html";
|
3034
|
+
switch(type){
|
3035
|
+
case "html":
|
3036
|
+
$ul = $container.find(">ul:first");
|
3037
|
+
$ul.addClass("ui-fancytree-source ui-helper-hidden");
|
3038
|
+
source = $.ui.fancytree.parseHtml($ul);
|
3039
|
+
break;
|
3040
|
+
case "json":
|
3041
|
+
// $().addClass("ui-helper-hidden");
|
3042
|
+
source = $.parseJSON($container.text());
|
3043
|
+
if(source.children){
|
3044
|
+
if(source.title){tree.title = source.title;}
|
3045
|
+
source = source.children;
|
3046
|
+
}
|
3047
|
+
break;
|
3048
|
+
default:
|
3049
|
+
$.error("Invalid data-type: " + type);
|
3050
|
+
}
|
3051
|
+
}else if(typeof source === "string"){
|
3052
|
+
// TODO: source is an element ID
|
3053
|
+
_raiseNotImplemented();
|
3054
|
+
}
|
3055
|
+
|
3056
|
+
// $container.addClass("ui-widget ui-widget-content ui-corner-all");
|
3057
|
+
// Trigger fancytreeinit after nodes have been loaded
|
3058
|
+
dfd = this.nodeLoadChildren(rootCtx, source).done(function(){
|
3059
|
+
tree.render();
|
3060
|
+
if( ctx.options.selectMode === 3 ){
|
3061
|
+
tree.rootNode.fixSelection3FromEndNodes();
|
3062
|
+
}
|
3063
|
+
tree._triggerTreeEvent("init", true);
|
3064
|
+
}).fail(function(){
|
3065
|
+
tree.render();
|
3066
|
+
tree._triggerTreeEvent("init", false);
|
3067
|
+
});
|
3068
|
+
return dfd;
|
3069
|
+
},
|
3070
|
+
treeSetFocus: function(ctx, flag, _calledByNodeSetFocus) {
|
3071
|
+
flag = (flag !== false);
|
3072
|
+
|
3073
|
+
this.debug("treeSetFocus(" + flag + "), _calledByNodeSetFocus: " + _calledByNodeSetFocus);
|
3074
|
+
this.debug(" focusNode: " + this.focusNode);
|
3075
|
+
this.debug(" activeNode: " + this.activeNode);
|
3076
|
+
if( flag !== this.hasFocus() ){
|
3077
|
+
this._hasFocus = flag;
|
3078
|
+
this.$container.toggleClass("fancytree-treefocus", flag);
|
3079
|
+
this._triggerTreeEvent(flag ? "focusTree" : "blurTree");
|
3080
|
+
}
|
3081
|
+
},
|
3082
|
+
/** Re-fire beforeActivate and activate events. */
|
3083
|
+
reactivate: function(setFocus) {
|
3084
|
+
var node = this.activeNode;
|
3085
|
+
if( node ) {
|
3086
|
+
this.activeNode = null; // Force re-activating
|
3087
|
+
node.setActive();
|
3088
|
+
if( setFocus ){
|
3089
|
+
node.setFocus();
|
3090
|
+
}
|
3091
|
+
}
|
3092
|
+
},
|
3093
|
+
// TODO: redraw()
|
3094
|
+
/** Reload tree from source and return a promise.
|
3095
|
+
* @param source
|
3096
|
+
* @returns {$.Promise}
|
3097
|
+
*/
|
3098
|
+
reload: function(source) {
|
3099
|
+
this._callHook("treeClear", this);
|
3100
|
+
return this._callHook("treeLoad", this, source);
|
3101
|
+
},
|
3102
|
+
/**Render tree (i.e. all top-level nodes).
|
3103
|
+
* @param {Boolean} [force=false]
|
3104
|
+
* @param {Boolean} [deep=false]
|
3105
|
+
*/
|
3106
|
+
render: function(force, deep) {
|
3107
|
+
return this.rootNode.render(force, deep);
|
3108
|
+
},
|
3109
|
+
// TODO: selectKey: function(key, select)
|
3110
|
+
// TODO: serializeArray: function(stopOnParents)
|
3111
|
+
/**
|
3112
|
+
* @param {Boolean} [flag=true]
|
3113
|
+
*/
|
3114
|
+
setFocus: function(flag) {
|
3115
|
+
// _assert(false, "Not implemented");
|
3116
|
+
return this._callHook("treeSetFocus", this, flag);
|
3117
|
+
},
|
3118
|
+
/**
|
3119
|
+
* Return all nodes as nested list of {@link NodeData}.
|
3120
|
+
*
|
3121
|
+
* @param {Boolean} [includeRoot=false] Returns the hidden system root node (and it's children)
|
3122
|
+
* @param {function} [callback] Called for every node
|
3123
|
+
* @returns {Array | object}
|
3124
|
+
* @see FancytreeNode#toDict
|
3125
|
+
*/
|
3126
|
+
toDict: function(includeRoot, callback){
|
3127
|
+
var res = this.rootNode.toDict(true, callback);
|
3128
|
+
return includeRoot ? res : res.children;
|
3129
|
+
},
|
3130
|
+
/**Implicitly called for string conversions.
|
3131
|
+
* @returns {String}
|
3132
|
+
*/
|
3133
|
+
toString: function(){
|
3134
|
+
return "<Fancytree(#" + this._id + ")>";
|
3135
|
+
},
|
3136
|
+
/** _trigger a widget event with additional node ctx.
|
3137
|
+
* @see EventData
|
3138
|
+
*/
|
3139
|
+
_triggerNodeEvent: function(type, node, originalEvent, extra) {
|
3140
|
+
// this.debug("_trigger(" + type + "): '" + ctx.node.title + "'", ctx);
|
3141
|
+
var ctx = this._makeHookContext(node, originalEvent, extra),
|
3142
|
+
res = this.widget._trigger(type, originalEvent, ctx);
|
3143
|
+
if(res !== false && ctx.result !== undefined){
|
3144
|
+
return ctx.result;
|
3145
|
+
}
|
3146
|
+
return res;
|
3147
|
+
},
|
3148
|
+
/** _trigger a widget event with additional tree data. */
|
3149
|
+
_triggerTreeEvent: function(type, originalEvent) {
|
3150
|
+
// this.debug("_trigger(" + type + ")", ctx);
|
3151
|
+
var ctx = this._makeHookContext(this, originalEvent),
|
3152
|
+
res = this.widget._trigger(type, originalEvent, ctx);
|
3153
|
+
|
3154
|
+
if(res !== false && ctx.result !== undefined){
|
3155
|
+
return ctx.result;
|
3156
|
+
}
|
3157
|
+
return res;
|
3158
|
+
},
|
3159
|
+
/** Call fn(node) for all nodes.
|
3160
|
+
*
|
3161
|
+
* @param {function} fn the callback function.
|
3162
|
+
* Return false to stop iteration, return "skip" to skip this node and children only.
|
3163
|
+
* @returns {Boolean} false, if the iterator was stopped.
|
3164
|
+
*/
|
3165
|
+
visit: function(fn) {
|
3166
|
+
return this.rootNode.visit(fn, false);
|
3167
|
+
},
|
3168
|
+
/** Write warning to browser console (prepending tree info)
|
3169
|
+
*
|
3170
|
+
* @param {*} msg string or object or array of such
|
3171
|
+
*/
|
3172
|
+
warn: function(msg){
|
3173
|
+
Array.prototype.unshift.call(arguments, this.toString());
|
3174
|
+
consoleApply("warn", arguments);
|
3175
|
+
}
|
3176
|
+
};
|
3177
|
+
|
3178
|
+
|
3179
|
+
/* ******************************************************************************
|
3180
|
+
* jQuery UI widget boilerplate
|
3181
|
+
* @ name ui_fancytree
|
3182
|
+
* @ class The jQuery.ui.fancytree widget
|
3183
|
+
*/
|
3184
|
+
/* * @namespace ui */
|
3185
|
+
/* * @namespace ui.fancytree */
|
3186
|
+
/** @namespace $.ui.fancytree */
|
3187
|
+
$.widget("ui.fancytree",
|
3188
|
+
/** @lends $.ui.fancytree.prototype */
|
3189
|
+
{
|
3190
|
+
/**These options will be used as defaults
|
3191
|
+
* @type {FancytreeOptions}
|
3192
|
+
*/
|
3193
|
+
options:
|
3194
|
+
{
|
3195
|
+
/** @type {Boolean} Make sure, active nodes are visible (expanded). */
|
3196
|
+
activeVisible: true,
|
3197
|
+
ajax: {
|
3198
|
+
type: "GET",
|
3199
|
+
cache: false, // false: Append random '_' argument to the request url to prevent caching.
|
3200
|
+
// timeout: 0, // >0: Make sure we get an ajax error if server is unreachable
|
3201
|
+
dataType: "json" // Expect json format and pass json object to callbacks.
|
3202
|
+
}, //
|
3203
|
+
aria: false, // TODO: default to true
|
3204
|
+
autoActivate: true,
|
3205
|
+
autoCollapse: false,
|
3206
|
+
// autoFocus: false,
|
3207
|
+
autoScroll: false,
|
3208
|
+
checkbox: false,
|
3209
|
+
/**defines click behavior*/
|
3210
|
+
clickFolderMode: 4,
|
3211
|
+
debugLevel: null, // 0..2 (null: use global setting $.ui.fancytree.debugInfo)
|
3212
|
+
disabled: false, // TODO: required anymore?
|
3213
|
+
enableAspx: true, // TODO: document
|
3214
|
+
extensions: [],
|
3215
|
+
fx: { height: "toggle", duration: 200 },
|
3216
|
+
generateIds: false,
|
3217
|
+
icons: true,
|
3218
|
+
idPrefix: "ft_",
|
3219
|
+
keyboard: true,
|
3220
|
+
keyPathSeparator: "/",
|
3221
|
+
minExpandLevel: 1,
|
3222
|
+
selectMode: 2,
|
3223
|
+
strings: {
|
3224
|
+
loading: "Loading…",
|
3225
|
+
loadError: "Load error!"
|
3226
|
+
},
|
3227
|
+
tabbable: true,
|
3228
|
+
_classNames: {
|
3229
|
+
node: "fancytree-node",
|
3230
|
+
folder: "fancytree-folder",
|
3231
|
+
combinedExpanderPrefix: "fancytree-exp-",
|
3232
|
+
combinedIconPrefix: "fancytree-ico-",
|
3233
|
+
hasChildren: "fancytree-has-children",
|
3234
|
+
active: "fancytree-active",
|
3235
|
+
selected: "fancytree-selected",
|
3236
|
+
expanded: "fancytree-expanded",
|
3237
|
+
lazy: "fancytree-lazy",
|
3238
|
+
focused: "fancytree-focused",
|
3239
|
+
partsel: "fancytree-partsel",
|
3240
|
+
lastsib: "fancytree-lastsib",
|
3241
|
+
loading: "fancytree-loading",
|
3242
|
+
error: "fancytree-error"
|
3243
|
+
},
|
3244
|
+
// events
|
3245
|
+
lazyload: null,
|
3246
|
+
postProcess: null
|
3247
|
+
},
|
3248
|
+
/* Set up the widget, Called on first $().fancytree() */
|
3249
|
+
_create: function() {
|
3250
|
+
this.tree = new Fancytree(this);
|
3251
|
+
|
3252
|
+
this.$source = this.source || this.element.data("type") === "json" ? this.element
|
3253
|
+
: this.element.find(">ul:first");
|
3254
|
+
// Subclass Fancytree instance with all enabled extensions
|
3255
|
+
var extension, extName, i,
|
3256
|
+
extensions = this.options.extensions,
|
3257
|
+
base = this.tree;
|
3258
|
+
|
3259
|
+
for(i=0; i<extensions.length; i++){
|
3260
|
+
extName = extensions[i];
|
3261
|
+
extension = $.ui.fancytree._extensions[extName];
|
3262
|
+
if(!extension){
|
3263
|
+
$.error("Could not apply extension '" + extName + "' (it is not registered, did you forget to include it?)");
|
3264
|
+
}
|
3265
|
+
// Add extension options as tree.options.EXTENSION
|
3266
|
+
// _assert(!this.tree.options[extName], "Extension name must not exist as option name: " + extName);
|
3267
|
+
this.tree.options[extName] = $.extend(true, {}, extension.options, this.tree.options[extName]);
|
3268
|
+
// Add a namespace tree.ext.EXTENSION, to hold instance data
|
3269
|
+
_assert(this.tree.ext[extName] === undefined, "Extension name must not exist as Fancytree.ext attribute: '" + extName + "'");
|
3270
|
+
// this.tree[extName] = extension;
|
3271
|
+
this.tree.ext[extName] = {};
|
3272
|
+
// Subclass Fancytree methods using proxies.
|
3273
|
+
_subclassObject(this.tree, base, extension, extName);
|
3274
|
+
// current extension becomes base for the next extension
|
3275
|
+
base = extension;
|
3276
|
+
}
|
3277
|
+
//
|
3278
|
+
this.tree._callHook("treeCreate", this.tree);
|
3279
|
+
// Note: 'fancytreecreate' event is fired by widget base class
|
3280
|
+
// this.tree._triggerTreeEvent("create");
|
3281
|
+
},
|
3282
|
+
|
3283
|
+
/* Called on every $().fancytree() */
|
3284
|
+
_init: function() {
|
3285
|
+
this.tree._callHook("treeInit", this.tree);
|
3286
|
+
// TODO: currently we call bind after treeInit, because treeInit
|
3287
|
+
// might change tree.$container.
|
3288
|
+
// It would be better, to move ebent binding into hooks altogether
|
3289
|
+
this._bind();
|
3290
|
+
},
|
3291
|
+
|
3292
|
+
/* Use the _setOption method to respond to changes to options */
|
3293
|
+
_setOption: function(key, value) {
|
3294
|
+
var callDefault = true,
|
3295
|
+
rerender = false;
|
3296
|
+
switch( key ) {
|
3297
|
+
case "aria":
|
3298
|
+
case "checkbox":
|
3299
|
+
case "icons":
|
3300
|
+
case "minExpandLevel":
|
3301
|
+
case "tabbable":
|
3302
|
+
// case "nolink":
|
3303
|
+
this.tree._callHook("treeCreate", this.tree);
|
3304
|
+
rerender = true;
|
3305
|
+
break;
|
3306
|
+
case "source":
|
3307
|
+
callDefault = false;
|
3308
|
+
this.tree._callHook("treeLoad", this.tree, value);
|
3309
|
+
break;
|
3310
|
+
}
|
3311
|
+
this.tree.debug("set option " + key + "=" + value + " <" + typeof(value) + ">");
|
3312
|
+
if(callDefault){
|
3313
|
+
// In jQuery UI 1.8, you have to manually invoke the _setOption method from the base widget
|
3314
|
+
$.Widget.prototype._setOption.apply(this, arguments);
|
3315
|
+
// TODO: In jQuery UI 1.9 and above, you use the _super method instead
|
3316
|
+
// this._super( "_setOption", key, value );
|
3317
|
+
}
|
3318
|
+
if(rerender){
|
3319
|
+
this.tree.render(true, false); // force, not-deep
|
3320
|
+
}
|
3321
|
+
},
|
3322
|
+
|
3323
|
+
/** Use the destroy method to clean up any modifications your widget has made to the DOM */
|
3324
|
+
destroy: function() {
|
3325
|
+
this._unbind();
|
3326
|
+
this.tree._callHook("treeDestroy", this.tree);
|
3327
|
+
// this.element.removeClass("ui-widget ui-widget-content ui-corner-all");
|
3328
|
+
this.tree.$div.find(">ul.fancytree-container").remove();
|
3329
|
+
this.$source && this.$source.removeClass("ui-helper-hidden");
|
3330
|
+
// In jQuery UI 1.8, you must invoke the destroy method from the base widget
|
3331
|
+
$.Widget.prototype.destroy.call(this);
|
3332
|
+
// TODO: delete tree and nodes to make garbage collect easier?
|
3333
|
+
// TODO: In jQuery UI 1.9 and above, you would define _destroy instead of destroy and not call the base method
|
3334
|
+
},
|
3335
|
+
|
3336
|
+
// -------------------------------------------------------------------------
|
3337
|
+
|
3338
|
+
/* Remove all event handlers for our namespace */
|
3339
|
+
_unbind: function() {
|
3340
|
+
var ns = this.tree._ns;
|
3341
|
+
this.element.unbind(ns);
|
3342
|
+
this.tree.$container.unbind(ns);
|
3343
|
+
$(document).unbind(ns);
|
3344
|
+
},
|
3345
|
+
/* Add mouse and kyboard handlers to the container */
|
3346
|
+
_bind: function() {
|
3347
|
+
var that = this,
|
3348
|
+
opts = this.options,
|
3349
|
+
tree = this.tree,
|
3350
|
+
ns = tree._ns
|
3351
|
+
// selstartEvent = ( $.support.selectstart ? "selectstart" : "mousedown" )
|
3352
|
+
;
|
3353
|
+
|
3354
|
+
// Remove all previuous handlers for this tree
|
3355
|
+
this._unbind();
|
3356
|
+
|
3357
|
+
//alert("keydown" + ns + "foc=" + tree.hasFocus() + tree.$container);
|
3358
|
+
// tree.debug("bind events; container: ", tree.$container);
|
3359
|
+
tree.$container.on("focusin" + ns + " focusout" + ns, function(event){
|
3360
|
+
var node = FT.getNode(event),
|
3361
|
+
flag = (event.type === "focusin");
|
3362
|
+
// tree.debug("Tree container got event " + event.type, node, event);
|
3363
|
+
// tree.treeOnFocusInOut.call(tree, event);
|
3364
|
+
if(node){
|
3365
|
+
// For example clicking into an <input> that is part of a node
|
3366
|
+
tree._callHook("nodeSetFocus", node, flag);
|
3367
|
+
}else{
|
3368
|
+
tree._callHook("treeSetFocus", tree, flag);
|
3369
|
+
}
|
3370
|
+
}).on("selectstart" + ns, "span.fancytree-title", function(event){
|
3371
|
+
// prevent mouse-drags to select text ranges
|
3372
|
+
// tree.debug("<span title> got event " + event.type);
|
3373
|
+
event.preventDefault();
|
3374
|
+
}).on("keydown" + ns, function(event){
|
3375
|
+
// TODO: also bind keyup and keypress
|
3376
|
+
// tree.debug("got event " + event.type + ", hasFocus:" + tree.hasFocus());
|
3377
|
+
// if(opts.disabled || opts.keyboard === false || !tree.hasFocus() ){
|
3378
|
+
if(opts.disabled || opts.keyboard === false ){
|
3379
|
+
return true;
|
3380
|
+
}
|
3381
|
+
var res,
|
3382
|
+
node = tree.focusNode, // node may be null
|
3383
|
+
ctx = tree._makeHookContext(node || tree, event),
|
3384
|
+
prevPhase = tree.phase;
|
3385
|
+
|
3386
|
+
try {
|
3387
|
+
tree.phase = "userEvent";
|
3388
|
+
// If a 'fancytreekeydown' handler returns false, skip the default
|
3389
|
+
// handling (implemented by tree.nodeKeydown()).
|
3390
|
+
if(node){
|
3391
|
+
res = tree._triggerNodeEvent("keydown", node, event);
|
3392
|
+
}else{
|
3393
|
+
res = tree._triggerTreeEvent("keydown", event);
|
3394
|
+
}
|
3395
|
+
if ( res === "preventNav" ){
|
3396
|
+
res = true; // prevent keyboard navigation, but don't prevent default handling of embedded input controls
|
3397
|
+
} else if ( res !== false ){
|
3398
|
+
res = tree._callHook("nodeKeydown", ctx);
|
3399
|
+
}
|
3400
|
+
return res;
|
3401
|
+
} finally {
|
3402
|
+
tree.phase = prevPhase;
|
3403
|
+
}
|
3404
|
+
}).on("click" + ns + " dblclick" + ns, function(event){
|
3405
|
+
if(opts.disabled){
|
3406
|
+
return true;
|
3407
|
+
}
|
3408
|
+
var ctx,
|
3409
|
+
et = FT.getEventTarget(event),
|
3410
|
+
node = et.node,
|
3411
|
+
tree = that.tree,
|
3412
|
+
prevPhase = tree.phase;
|
3413
|
+
|
3414
|
+
if( !node ){
|
3415
|
+
return true; // Allow bubbling of other events
|
3416
|
+
}
|
3417
|
+
ctx = tree._makeHookContext(node, event);
|
3418
|
+
// that.tree.debug("event(" + event.type + "): node: ", node);
|
3419
|
+
try {
|
3420
|
+
tree.phase = "userEvent";
|
3421
|
+
switch(event.type) {
|
3422
|
+
case "click":
|
3423
|
+
ctx.targetType = et.type;
|
3424
|
+
return ( tree._triggerNodeEvent("click", ctx, event) === false ) ? false : tree._callHook("nodeClick", ctx);
|
3425
|
+
case "dblclick":
|
3426
|
+
ctx.targetType = et.type;
|
3427
|
+
return ( tree._triggerNodeEvent("dblclick", ctx, event) === false ) ? false : tree._callHook("nodeDblclick", ctx);
|
3428
|
+
}
|
3429
|
+
// } catch(e) {
|
3430
|
+
// // var _ = null; // issue 117 // TODO
|
3431
|
+
// $.error(e);
|
3432
|
+
} finally {
|
3433
|
+
tree.phase = prevPhase;
|
3434
|
+
}
|
3435
|
+
});
|
3436
|
+
},
|
3437
|
+
/** @returns {FancytreeNode} the active node or null */
|
3438
|
+
getActiveNode: function() {
|
3439
|
+
return this.tree.activeNode;
|
3440
|
+
},
|
3441
|
+
/**
|
3442
|
+
* @param {String} key
|
3443
|
+
* @returns {FancytreeNode} the matching node or null
|
3444
|
+
*/
|
3445
|
+
getNodeByKey: function(key) {
|
3446
|
+
return this.tree.getNodeByKey(key);
|
3447
|
+
},
|
3448
|
+
/** @returns {FancytreeNode} the invisible system root node */
|
3449
|
+
getRootNode: function() {
|
3450
|
+
return this.tree.rootNode;
|
3451
|
+
},
|
3452
|
+
/** @returns {Fancytree} the current tree instance */
|
3453
|
+
getTree: function() {
|
3454
|
+
return this.tree;
|
3455
|
+
}
|
3456
|
+
});
|
3457
|
+
|
3458
|
+
// $.ui.fancytree was created by the widget factory. Create a local shortcut:
|
3459
|
+
FT = $.ui.fancytree;
|
3460
|
+
|
3461
|
+
/**
|
3462
|
+
* Static members in the `$.ui.fancytree` namespace.
|
3463
|
+
* @ name $.ui.fancytree
|
3464
|
+
* @example:
|
3465
|
+
* alert(""version: " + $.ui.fancytree.version);
|
3466
|
+
* var node = $.ui.fancytree.()
|
3467
|
+
*/
|
3468
|
+
$.extend($.ui.fancytree,
|
3469
|
+
/** @lends $.ui.fancytree */
|
3470
|
+
{
|
3471
|
+
/** @type {String} */
|
3472
|
+
version: "2.0.0-5",
|
3473
|
+
/** @type {String} */
|
3474
|
+
buildType: "release",
|
3475
|
+
/** @type {int} */
|
3476
|
+
debugLevel: 1, // used by $.ui.fancytree.debug() and as default for tree.options.debugLevel
|
3477
|
+
|
3478
|
+
_nextId: 1,
|
3479
|
+
_nextNodeKey: 1,
|
3480
|
+
_extensions: {},
|
3481
|
+
// focusTree: null,
|
3482
|
+
|
3483
|
+
/** Expose class object as $.ui.fancytree._FancytreeClass */
|
3484
|
+
_FancytreeClass: Fancytree,
|
3485
|
+
/** Expose class object as $.ui.fancytree._FancytreeNodeClass */
|
3486
|
+
_FancytreeNodeClass: FancytreeNode,
|
3487
|
+
/* Feature checks to provide backwards compatibility */
|
3488
|
+
jquerySupports: {
|
3489
|
+
// http://jqueryui.com/upgrade-guide/1.9/#deprecated-offset-option-merged-into-my-and-at
|
3490
|
+
positionMyOfs: isVersionAtLeast($.ui.version, 1, 9)
|
3491
|
+
},
|
3492
|
+
assert: function(cond, msg){
|
3493
|
+
return _assert(cond, msg);
|
3494
|
+
},
|
3495
|
+
debug: function(msg){
|
3496
|
+
/*jshint expr:true */
|
3497
|
+
($.ui.fancytree.debugLevel >= 2) && consoleApply("log", arguments);
|
3498
|
+
},
|
3499
|
+
error: function(msg){
|
3500
|
+
consoleApply("error", arguments);
|
3501
|
+
},
|
3502
|
+
/** Return a {node: FancytreeNode, type: TYPE} object for a mouse event.
|
3503
|
+
*
|
3504
|
+
* @static
|
3505
|
+
* @param {Event} event Mouse event, e.g. click, ...
|
3506
|
+
* @returns {String} 'title' | 'prefix' | 'expander' | 'checkbox' | 'icon' | undefined
|
3507
|
+
*/
|
3508
|
+
getEventTargetType: function(event){
|
3509
|
+
return this.getEventTarget(event).type;
|
3510
|
+
},
|
3511
|
+
/** Return a {node: FancytreeNode, type: TYPE} object for a mouse event.
|
3512
|
+
*
|
3513
|
+
* @param {Event} event Mouse event, e.g. click, ...
|
3514
|
+
* @returns {object} Return a {node: FancytreeNode, type: TYPE} object
|
3515
|
+
* TYPE: 'title' | 'prefix' | 'expander' | 'checkbox' | 'icon' | undefined
|
3516
|
+
*/
|
3517
|
+
getEventTarget: function(event){
|
3518
|
+
var tcn = event && event.target ? event.target.className : "",
|
3519
|
+
res = {node: this.getNode(event.target), type: undefined};
|
3520
|
+
// tcn may contains UI themeroller or Font Awesome classes, so we use
|
3521
|
+
// a fast version of $(res.node).hasClass()
|
3522
|
+
// See http://jsperf.com/test-for-classname/2
|
3523
|
+
if( /\bfancytree-title\b/.test(tcn) ){
|
3524
|
+
res.type = "title";
|
3525
|
+
}else if( /\bfancytree-expander\b/.test(tcn) ){
|
3526
|
+
res.type = (res.node.hasChildren() === false ? "prefix" : "expander");
|
3527
|
+
}else if( /\bfancytree-checkbox\b/.test(tcn) ){
|
3528
|
+
res.type = "checkbox";
|
3529
|
+
}else if( /\bfancytree-icon\b/.test(tcn) ){
|
3530
|
+
res.type = "icon";
|
3531
|
+
}else if( /\bfancytree-node\b/.test(tcn) ){
|
3532
|
+
// TODO: issue #93 (http://code.google.com/p/fancytree/issues/detail?id=93)
|
3533
|
+
// res.type = this._getTypeForOuterNodeEvent(event);
|
3534
|
+
res.type = "title";
|
3535
|
+
}
|
3536
|
+
return res;
|
3537
|
+
},
|
3538
|
+
/** Return a FancytreeNode instance from element.
|
3539
|
+
*
|
3540
|
+
* @param {Element | jQueryObject | Event} el
|
3541
|
+
* @returns {FancytreeNode} matching node or null
|
3542
|
+
*/
|
3543
|
+
getNode: function(el){
|
3544
|
+
if(el instanceof FancytreeNode){
|
3545
|
+
return el; // el already was a FancytreeNode
|
3546
|
+
}else if(el.selector !== undefined){
|
3547
|
+
el = el[0]; // el was a jQuery object: use the DOM element
|
3548
|
+
}else if(el.originalEvent !== undefined){
|
3549
|
+
el = el.target; // el was an Event
|
3550
|
+
}
|
3551
|
+
while( el ) {
|
3552
|
+
if(el.ftnode) {
|
3553
|
+
return el.ftnode;
|
3554
|
+
}
|
3555
|
+
el = el.parentNode;
|
3556
|
+
}
|
3557
|
+
return null;
|
3558
|
+
},
|
3559
|
+
/* Return a Fancytree instance from element.
|
3560
|
+
* TODO: this function could help to get around the data('fancytree') / data('ui-fancytree') problem
|
3561
|
+
* @param {Element | jQueryObject | Event} el
|
3562
|
+
* @returns {Fancytree} matching tree or null
|
3563
|
+
* /
|
3564
|
+
getTree: function(el){
|
3565
|
+
if(el instanceof Fancytree){
|
3566
|
+
return el; // el already was a Fancytree
|
3567
|
+
}else if(el.selector !== undefined){
|
3568
|
+
el = el[0]; // el was a jQuery object: use the DOM element
|
3569
|
+
}else if(el.originalEvent !== undefined){
|
3570
|
+
el = el.target; // el was an Event
|
3571
|
+
}
|
3572
|
+
...
|
3573
|
+
return null;
|
3574
|
+
},
|
3575
|
+
*/
|
3576
|
+
info: function(msg){
|
3577
|
+
/*jshint expr:true */
|
3578
|
+
($.ui.fancytree.debugLevel >= 1) && consoleApply("info", arguments);
|
3579
|
+
},
|
3580
|
+
/**
|
3581
|
+
* Parse tree data from HTML <ul> markup
|
3582
|
+
*
|
3583
|
+
* @param {jQueryObject} $ul
|
3584
|
+
* @returns {NodeData[]}
|
3585
|
+
*/
|
3586
|
+
parseHtml: function($ul) {
|
3587
|
+
// TODO: understand this:
|
3588
|
+
/*jshint validthis:true */
|
3589
|
+
var $children = $ul.find(">li"),
|
3590
|
+
extraClasses, i, l, iPos, tmp, classes, className,
|
3591
|
+
children = [];
|
3592
|
+
// that = this;
|
3593
|
+
|
3594
|
+
$children.each(function() {
|
3595
|
+
var allData, jsonData,
|
3596
|
+
$li = $(this),
|
3597
|
+
$liSpan = $li.find(">span:first", this),
|
3598
|
+
$liA = $liSpan.length ? null : $li.find(">a:first"),
|
3599
|
+
d = { tooltip: null, data: {} };
|
3600
|
+
|
3601
|
+
if( $liSpan.length ) {
|
3602
|
+
d.title = $liSpan.html();
|
3603
|
+
|
3604
|
+
} else if( $liA && $liA.length ) {
|
3605
|
+
// If a <li><a> tag is specified, use it literally and extract href/target.
|
3606
|
+
d.title = $liA.html();
|
3607
|
+
d.data.href = $liA.attr("href");
|
3608
|
+
d.data.target = $liA.attr("target");
|
3609
|
+
d.tooltip = $liA.attr("title");
|
3610
|
+
|
3611
|
+
} else {
|
3612
|
+
// If only a <li> tag is specified, use the trimmed string up to
|
3613
|
+
// the next child <ul> tag.
|
3614
|
+
d.title = $li.html();
|
3615
|
+
iPos = d.title.search(/<ul/i);
|
3616
|
+
if( iPos >= 0 ){
|
3617
|
+
d.title = d.title.substring(0, iPos);
|
3618
|
+
}
|
3619
|
+
}
|
3620
|
+
d.title = $.trim(d.title);
|
3621
|
+
|
3622
|
+
// Make sure all fields exist
|
3623
|
+
for(i=0, l=CLASS_ATTRS.length; i<l; i++){
|
3624
|
+
d[CLASS_ATTRS[i]] = undefined;
|
3625
|
+
}
|
3626
|
+
// Initialize to `true`, if class is set and collect extraClasses
|
3627
|
+
classes = this.className.split(" ");
|
3628
|
+
extraClasses = [];
|
3629
|
+
for(i=0, l=classes.length; i<l; i++){
|
3630
|
+
className = classes[i];
|
3631
|
+
if(CLASS_ATTR_MAP[className]){
|
3632
|
+
d[className] = true;
|
3633
|
+
}else{
|
3634
|
+
extraClasses.push(className);
|
3635
|
+
}
|
3636
|
+
}
|
3637
|
+
d.extraClasses = extraClasses.join(" ");
|
3638
|
+
|
3639
|
+
// Parse node options from ID, title and class attributes
|
3640
|
+
tmp = $li.attr("title");
|
3641
|
+
if( tmp ){
|
3642
|
+
d.tooltip = tmp; // overrides <a title='...'>
|
3643
|
+
}
|
3644
|
+
tmp = $li.attr("id");
|
3645
|
+
if( tmp ){
|
3646
|
+
d.key = tmp;
|
3647
|
+
}
|
3648
|
+
// Add <li data-NAME='...'> as node.data.NAME
|
3649
|
+
// See http://api.jquery.com/data/#data-html5
|
3650
|
+
allData = $li.data();
|
3651
|
+
// alert("d: " + JSON.stringify(allData));
|
3652
|
+
if(allData && !$.isEmptyObject(allData)) {
|
3653
|
+
// Special handling for <li data-json='...'>
|
3654
|
+
jsonData = allData.json;
|
3655
|
+
delete allData.json;
|
3656
|
+
$.extend(d.data, allData);
|
3657
|
+
// If a 'data-json' attribute is present, evaluate and add to node.data
|
3658
|
+
if(jsonData) {
|
3659
|
+
// alert("$li.data()" + JSON.stringify(jsonData));
|
3660
|
+
// <li data-json='...'> is already returned as object
|
3661
|
+
// see http://api.jquery.com/data/#data-html5
|
3662
|
+
$.extend(d.data, jsonData);
|
3663
|
+
}
|
3664
|
+
}
|
3665
|
+
// that.debug("parse ", d);
|
3666
|
+
// var childNode = parentTreeNode.addChild(data);
|
3667
|
+
// Recursive reading of child nodes, if LI tag contains an UL tag
|
3668
|
+
$ul = $li.find(">ul:first");
|
3669
|
+
if( $ul.length ) {
|
3670
|
+
d.children = $.ui.fancytree.parseHtml($ul);
|
3671
|
+
}else{
|
3672
|
+
d.children = d.lazy ? undefined : null;
|
3673
|
+
}
|
3674
|
+
children.push(d);
|
3675
|
+
// FT.debug("parse ", d, children);
|
3676
|
+
});
|
3677
|
+
return children;
|
3678
|
+
},
|
3679
|
+
/** Add Fancytree extension definition to the list of globally available extensions.
|
3680
|
+
*
|
3681
|
+
* @param name
|
3682
|
+
* @param definition
|
3683
|
+
*/
|
3684
|
+
registerExtension: function(name, definition){
|
3685
|
+
$.ui.fancytree._extensions[name] = definition;
|
3686
|
+
},
|
3687
|
+
warn: function(msg){
|
3688
|
+
consoleApply("warn", arguments);
|
3689
|
+
}
|
3690
|
+
});
|
3691
|
+
|
3692
|
+
// Use $.ui.fancytree.debugLevel as default for tree.options.debugLevel
|
3693
|
+
//$.ui.fancytree.debug($.ui.fancytree.prototype);
|
3694
|
+
//$.ui.fancytree.prototype.options.debugLevel = $.ui.fancytree.debugLevel;
|
3695
|
+
|
3696
|
+
|
3697
|
+
/* *****************************************************************************
|
3698
|
+
* Register AMD
|
3699
|
+
*/
|
3700
|
+
// http://stackoverflow.com/questions/10918063/how-to-make-a-jquery-plugin-loadable-with-requirejs
|
3701
|
+
|
3702
|
+
// if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
|
3703
|
+
// define( "jquery", [], function () { return jQuery; } );
|
3704
|
+
// }
|
3705
|
+
|
3706
|
+
// TODO: maybe like so:?
|
3707
|
+
// https://raw.github.com/malsup/blockui/master/jquery.blockUI.js
|
3708
|
+
/*
|
3709
|
+
if( typeof define === "function" && define.amd ) {
|
3710
|
+
define( ["jquery"], function () {
|
3711
|
+
return jQuery.ui.fancytree;
|
3712
|
+
});
|
3713
|
+
}
|
3714
|
+
*/
|
3715
|
+
}(jQuery, window, document));
|