fancytree-rails 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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));
|