fancytree-rails 2.0.0.pre.6.pre.1 → 2.0.0.pre.11.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/Rakefile +6 -7
- data/lib/fancytree/rails/version.rb +2 -2
- data/vendor/assets/images/fancytree/skin-win8-xxl/icons.gif +0 -0
- data/vendor/assets/images/fancytree/skin-win8-xxl/loading.gif +0 -0
- data/vendor/assets/javascripts/fancytree.js +1 -1
- data/vendor/assets/javascripts/fancytree/MIT-LICENSE.txt +21 -0
- data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.js +1267 -475
- data/vendor/assets/javascripts/fancytree/jquery.fancytree-custom.min.js +41 -0
- data/vendor/assets/javascripts/fancytree/jquery.fancytree.js +582 -310
- data/vendor/assets/javascripts/fancytree/jquery.fancytree.min.js +14 -7
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.childcounter.js +185 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.clones.js +417 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.columnview.js +149 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.debug.js +142 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.dnd.js +539 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.edit.js +318 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.filter.js +173 -0
- data/vendor/assets/javascripts/fancytree/{jquery.fancytree.awesome.js → src/jquery.fancytree.glyph.js} +28 -26
- data/vendor/assets/javascripts/fancytree/{jquery.fancytree.gridnav.js → src/jquery.fancytree.gridnav.js} +77 -41
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.js +4027 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.menu.js +155 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.persist.js +345 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.table.js +345 -0
- data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.themeroller.js +82 -0
- data/vendor/assets/stylesheets/fancytree/skin-awesome/ui.fancytree.css +29 -15
- data/vendor/assets/stylesheets/fancytree/skin-awesome/ui.fancytree.min.css +1 -1
- data/vendor/assets/stylesheets/fancytree/skin-bootstrap/ui.fancytree.css +366 -0
- data/vendor/assets/stylesheets/fancytree/skin-bootstrap/ui.fancytree.min.css +6 -0
- data/vendor/assets/stylesheets/fancytree/skin-lion/ui.fancytree.css +34 -7
- data/vendor/assets/stylesheets/fancytree/skin-lion/ui.fancytree.min.css +1 -1
- data/vendor/assets/stylesheets/fancytree/skin-vista/ui.fancytree.css +34 -7
- data/vendor/assets/stylesheets/fancytree/skin-vista/ui.fancytree.min.css +1 -1
- data/vendor/assets/stylesheets/fancytree/skin-win7/ui.fancytree.css +34 -7
- data/vendor/assets/stylesheets/fancytree/skin-win7/ui.fancytree.min.css +1 -1
- data/vendor/assets/stylesheets/fancytree/skin-win8-xxl/ui.fancytree.css +507 -0
- data/vendor/assets/stylesheets/fancytree/skin-win8-xxl/ui.fancytree.min.css +11 -0
- data/vendor/assets/stylesheets/fancytree/skin-win8/ui.fancytree.css +34 -7
- data/vendor/assets/stylesheets/fancytree/skin-win8/ui.fancytree.min.css +1 -1
- data/vendor/assets/stylesheets/fancytree/skin-xp/ui.fancytree.css +34 -7
- data/vendor/assets/stylesheets/fancytree/skin-xp/ui.fancytree.min.css +1 -1
- metadata +24 -13
- data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.min.js +0 -7
- data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.min.js.map +0 -1
- data/vendor/assets/javascripts/fancytree/jquery.fancytree.min.js.map +0 -1
- data/vendor/assets/stylesheets/fancytree/skin-lion/ui.fancytree-org.css +0 -460
- data/vendor/assets/stylesheets/fancytree/skin-themeroller/ui.fancytree-org.css +0 -505
- data/vendor/assets/stylesheets/fancytree/skin-vista/ui.fancytree-org.css +0 -610
- data/vendor/assets/stylesheets/fancytree/skin-win7/ui.fancytree-org.css +0 -592
- data/vendor/assets/stylesheets/fancytree/skin-win8/ui.fancytree-org.css +0 -602
- data/vendor/assets/stylesheets/fancytree/skin-xp/ui.fancytree-org.css +0 -578
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f8597dbe02db0bcac1ca59245d2b4b1ef806241
|
4
|
+
data.tar.gz: 6f23c661681871ae96ea0f8e6bf6408c3c8f1031
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd9930807b36cffe63374ee0ecc41dd5d8c334300122d27379ed07136eb7aa099b0f2a2842574e7fc3818338a196e214c0d4eefc6a64cae78484640ab550805a
|
7
|
+
data.tar.gz: 1d1e2ab886857144211259f04c889765b75ee3b22ad7422b2716754c5cf971ec327ba880cc43aa0149eb03600981e18f4d38e25bcc4c602b5cd0cdc16a172a90
|
data/CHANGELOG.md
CHANGED
data/Rakefile
CHANGED
@@ -7,8 +7,9 @@ namespace :fancytree do
|
|
7
7
|
task :update => :build do
|
8
8
|
cd "tmp/fancytree" do
|
9
9
|
|
10
|
-
cd "
|
11
|
-
|
10
|
+
cd "dist" do
|
11
|
+
js = FileList['*'].exclude(/\Askip*/)
|
12
|
+
FileUtils.cp_r(js, '../../../vendor/assets/javascripts/fancytree')
|
12
13
|
|
13
14
|
css_files = Dir.glob("skin*/*.css")
|
14
15
|
css_files.each do |file|
|
@@ -23,17 +24,15 @@ namespace :fancytree do
|
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
26
|
-
#following files are not in the build yet:
|
27
|
-
FileUtils.cp(['src/jquery.fancytree.awesome.js'], '../../vendor/assets/javascripts/fancytree')
|
28
|
-
|
29
27
|
end
|
30
28
|
end
|
31
29
|
|
32
30
|
task :build => "tmp/fancytree" do
|
33
31
|
cd "tmp/fancytree" do
|
34
32
|
#sh "npm install -g grunt-cli"
|
35
|
-
|
36
|
-
sh "
|
33
|
+
#Non needed any more, currnetyl ./dist contains compiled version for the release
|
34
|
+
# sh "npm install"
|
35
|
+
# sh "grunt build --force" #foce because of tabfix
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
Binary file
|
Binary file
|
@@ -1,2 +1,2 @@
|
|
1
1
|
//= require jquery
|
2
|
-
//= require fancytree/jquery.fancytree-all.
|
2
|
+
//= require fancytree/jquery.fancytree-all.js
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright 2006-2014 Martin Wendt,
|
2
|
+
http://wwWendt.de/
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -7,8 +7,8 @@
|
|
7
7
|
* Released under the MIT license
|
8
8
|
* https://github.com/mar10/fancytree/wiki/LicenseInfo
|
9
9
|
*
|
10
|
-
* @version 2.0.0-
|
11
|
-
* @date 2014-
|
10
|
+
* @version 2.0.0-11
|
11
|
+
* @date 2014-04-27T22:28
|
12
12
|
*/
|
13
13
|
|
14
14
|
/** Core Fancytree module.
|
@@ -168,6 +168,20 @@ function _makeResolveFunc(deferred, context){
|
|
168
168
|
}
|
169
169
|
|
170
170
|
|
171
|
+
function _getElementDataAsDict($el){
|
172
|
+
// Evaluate 'data-NAME' attributes with special treatment for 'data-json'.
|
173
|
+
var d = $.extend({}, $el.data()),
|
174
|
+
json = d.json;
|
175
|
+
delete d.fancytree; // added to container by widget factory
|
176
|
+
if( json ) {
|
177
|
+
delete d.json;
|
178
|
+
// <li data-json='...'> is already returned as object (http://api.jquery.com/data/#data-html5)
|
179
|
+
d = $.extend(d, json);
|
180
|
+
}
|
181
|
+
return d;
|
182
|
+
}
|
183
|
+
|
184
|
+
|
171
185
|
// TODO: use currying
|
172
186
|
function _makeNodeTitleMatcher(s){
|
173
187
|
s = s.toLowerCase();
|
@@ -178,11 +192,12 @@ function _makeNodeTitleMatcher(s){
|
|
178
192
|
|
179
193
|
var i,
|
180
194
|
FT = null, // initialized below
|
195
|
+
ENTITY_MAP = {"&": "&", "<": "<", ">": ">", "\"": """, "'": "'", "/": "/"},
|
181
196
|
//boolean attributes that can be set with equivalent class names in the LI tags
|
182
|
-
CLASS_ATTRS = "active expanded focus folder lazy selected unselectable".split(" "),
|
197
|
+
CLASS_ATTRS = "active expanded focus folder hideCheckbox lazy selected unselectable".split(" "),
|
183
198
|
CLASS_ATTR_MAP = {},
|
184
199
|
// Top-level Fancytree node attributes, that can be set by dict
|
185
|
-
NODE_ATTRS = "expanded extraClasses folder hideCheckbox key lazy selected title tooltip unselectable".split(" "),
|
200
|
+
NODE_ATTRS = "expanded extraClasses folder hideCheckbox key lazy refKey selected title tooltip unselectable".split(" "),
|
186
201
|
NODE_ATTR_MAP = {},
|
187
202
|
// Attribute names that should NOT be added to node.data
|
188
203
|
NONE_NODE_DATA_MAP = {"active": true, "children": true, "data": true, "focus": true};
|
@@ -205,21 +220,22 @@ for(i=0; i<NODE_ATTRS.length; i++){ NODE_ATTR_MAP[NODE_ATTRS[i]] = true; }
|
|
205
220
|
* @param {FancytreeNode} parent
|
206
221
|
* @param {NodeData} obj
|
207
222
|
*
|
208
|
-
* @property {Fancytree} tree
|
209
|
-
* @property {FancytreeNode} parent
|
210
|
-
* @property {string} key
|
211
|
-
* @property {string} title
|
223
|
+
* @property {Fancytree} tree The tree instance
|
224
|
+
* @property {FancytreeNode} parent The parent node
|
225
|
+
* @property {string} key Node id (must be unique inside the tree)
|
226
|
+
* @property {string} title Display name (may contain HTML)
|
212
227
|
* @property {object} data Contains all extra data that was passed on node creation
|
213
|
-
* @property {FancytreeNode[] | null | undefined} children
|
214
|
-
*
|
215
|
-
*
|
216
|
-
* @property {boolean}
|
217
|
-
* @property {string} extraClasses
|
218
|
-
* @property {boolean}
|
219
|
-
*
|
220
|
-
* @property {string}
|
221
|
-
* @property {
|
222
|
-
* @property {
|
228
|
+
* @property {FancytreeNode[] | null | undefined} children Array of child nodes.<br>
|
229
|
+
* For lazy nodes, null or undefined means 'not yet loaded'. Use an empty array
|
230
|
+
* to define a node that has no children.
|
231
|
+
* @property {boolean} expanded Use isExpanded(), setExpanded() to access this property.
|
232
|
+
* @property {string} extraClasses Addtional CSS classes, added to the node's `<span>`
|
233
|
+
* @property {boolean} folder Folder nodes have different default icons and click behavior.<br>
|
234
|
+
* Note: Also non-folders may have children.
|
235
|
+
* @property {string} statusNodeType null or type of temporarily generated system node like 'loading', or 'error'.
|
236
|
+
* @property {boolean} lazy True if this node is loaded on demand, i.e. on first expansion.
|
237
|
+
* @property {boolean} selected Use isSelected(), setSelected() to access this property.
|
238
|
+
* @property {string} tooltip Alternative description used as hover banner
|
223
239
|
*/
|
224
240
|
function FancytreeNode(parent, obj){
|
225
241
|
var i, l, name, cl;
|
@@ -228,7 +244,9 @@ function FancytreeNode(parent, obj){
|
|
228
244
|
this.tree = parent.tree;
|
229
245
|
this.ul = null;
|
230
246
|
this.li = null; // <li id='key' ftnode=this> tag
|
231
|
-
this.
|
247
|
+
this.statusNodeType = null; // if this is a temp. node to display the status of its parent
|
248
|
+
this._isLoading = false; // if this node itself is loading
|
249
|
+
this._error = null; // {message: '...'} if a load error occured
|
232
250
|
this.data = {};
|
233
251
|
|
234
252
|
// TODO: merge this code with node.toDict()
|
@@ -251,8 +269,14 @@ function FancytreeNode(parent, obj){
|
|
251
269
|
|
252
270
|
// Fix missing key
|
253
271
|
if( this.key == null ){ // test for null OR undefined
|
254
|
-
this.
|
272
|
+
if( this.tree.options.defaultKey ) {
|
273
|
+
this.key = this.tree.options.defaultKey(this);
|
274
|
+
_assert(this.key, "defaultKey() must return a unique key");
|
275
|
+
} else {
|
276
|
+
this.key = "_" + (FT._nextNodeKey++);
|
277
|
+
}
|
255
278
|
}
|
279
|
+
|
256
280
|
// Fix tree.activeNode
|
257
281
|
// TODO: not elegant: we use obj.active as marker to set tree.activeNode
|
258
282
|
// when loading from a dictionary.
|
@@ -260,6 +284,9 @@ function FancytreeNode(parent, obj){
|
|
260
284
|
_assert(this.tree.activeNode === null, "only one active node allowed");
|
261
285
|
this.tree.activeNode = this;
|
262
286
|
}
|
287
|
+
if( obj.selected ){ // #186
|
288
|
+
this.tree.lastSelectedNode = this;
|
289
|
+
}
|
263
290
|
// TODO: handle obj.focus = true
|
264
291
|
// Create child nodes
|
265
292
|
this.children = null;
|
@@ -267,6 +294,10 @@ function FancytreeNode(parent, obj){
|
|
267
294
|
if(cl && cl.length){
|
268
295
|
this._setChildren(cl);
|
269
296
|
}
|
297
|
+
// Add to key/ref map (except for root node)
|
298
|
+
// if( parent ) {
|
299
|
+
this.tree._callHook("treeRegisterNode", this.tree, true, this);
|
300
|
+
// }
|
270
301
|
}
|
271
302
|
|
272
303
|
|
@@ -368,6 +399,17 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
368
399
|
}
|
369
400
|
_assert(false, "Invalid mode: " + mode);
|
370
401
|
},
|
402
|
+
/**
|
403
|
+
* Append new node after this.
|
404
|
+
*
|
405
|
+
* This a convenience function that calls addNode(node, 'after')
|
406
|
+
*
|
407
|
+
* @param {NodeData} node node definition
|
408
|
+
* @returns {FancytreeNode} new node
|
409
|
+
*/
|
410
|
+
appendSibling: function(node){
|
411
|
+
return this.addNode(node, "after");
|
412
|
+
},
|
371
413
|
/**
|
372
414
|
* Modify existing child nodes.
|
373
415
|
*
|
@@ -417,7 +459,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
417
459
|
}
|
418
460
|
return promise;
|
419
461
|
},
|
420
|
-
/**
|
462
|
+
/** Collapse all sibling nodes.
|
421
463
|
* @returns {$.Promise}
|
422
464
|
*/
|
423
465
|
collapseSiblings: function() {
|
@@ -462,12 +504,12 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
462
504
|
consoleApply("debug", arguments);
|
463
505
|
}
|
464
506
|
},
|
465
|
-
/**
|
507
|
+
/** Deprecated.
|
508
|
+
* @deprecated since 2014-02-16. Use resetLazy() instead.
|
509
|
+
*/
|
466
510
|
discard: function(){
|
467
|
-
|
468
|
-
|
469
|
-
return this.setExpanded(false);
|
470
|
-
}
|
511
|
+
this.warn("FancytreeNode.discard() is deprecated since 2014-02-16. Use .resetLazy() instead.");
|
512
|
+
return this.resetLazy();
|
471
513
|
},
|
472
514
|
// TODO: expand(flag)
|
473
515
|
/**Find all nodes that contain `match` in the title.
|
@@ -529,7 +571,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
529
571
|
default:
|
530
572
|
_assert(false, "invalid state: " + state);
|
531
573
|
}
|
532
|
-
this.debug("fixSelection3AfterLoad() _changeSelectStatusAttrs()", state, changed);
|
574
|
+
// this.debug("fixSelection3AfterLoad() _changeSelectStatusAttrs()", state, changed);
|
533
575
|
if( changed ){
|
534
576
|
this.renderStatus();
|
535
577
|
}
|
@@ -658,23 +700,31 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
658
700
|
this.addChild(children);
|
659
701
|
*/
|
660
702
|
},
|
661
|
-
/**
|
703
|
+
/** Return the list of child nodes (undefined for unexpanded lazy nodes).
|
704
|
+
* @returns {FancytreeNode[] | undefined}
|
705
|
+
*/
|
662
706
|
getChildren: function() {
|
663
707
|
if(this.hasChildren() === undefined){ // TODO: only required for lazy nodes?
|
664
708
|
return undefined; // Lazy node: unloaded, currently loading, or load error
|
665
709
|
}
|
666
710
|
return this.children;
|
667
711
|
},
|
668
|
-
/**
|
712
|
+
/** Return the first child node or null.
|
713
|
+
* @returns {FancytreeNode | null}
|
714
|
+
*/
|
669
715
|
getFirstChild: function() {
|
670
716
|
return this.children ? this.children[0] : null;
|
671
717
|
},
|
672
|
-
/**
|
718
|
+
/** Return the 0-based child index.
|
719
|
+
* @returns {int}
|
720
|
+
*/
|
673
721
|
getIndex: function() {
|
674
722
|
// return this.parent.children.indexOf(this);
|
675
723
|
return $.inArray(this, this.parent.children); // indexOf doesn't work in IE7
|
676
724
|
},
|
677
|
-
|
725
|
+
/** Return the hierarchical child index (1-based, e.g. '3.2.4').
|
726
|
+
* @returns {string}
|
727
|
+
*/
|
678
728
|
getIndexHier: function(separator) {
|
679
729
|
separator = separator || ".";
|
680
730
|
var res = [];
|
@@ -683,9 +733,9 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
683
733
|
});
|
684
734
|
return res.join(separator);
|
685
735
|
},
|
686
|
-
/**
|
736
|
+
/** Return the parent keys separated by options.keyPathSeparator, e.g. "id_1/id_17/id_32".
|
687
737
|
* @param {boolean} [excludeSelf=false]
|
688
|
-
* @returns {string}
|
738
|
+
* @returns {string}
|
689
739
|
*/
|
690
740
|
getKeyPath: function(excludeSelf) {
|
691
741
|
var path = [],
|
@@ -697,11 +747,15 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
697
747
|
}, !excludeSelf);
|
698
748
|
return sep + path.join(sep);
|
699
749
|
},
|
700
|
-
|
750
|
+
/** Return the last child of this node or null.
|
751
|
+
* @returns {FancytreeNode | null}
|
752
|
+
*/
|
701
753
|
getLastChild: function() {
|
702
754
|
return this.children ? this.children[this.children.length - 1] : null;
|
703
755
|
},
|
704
|
-
/**
|
756
|
+
/** Return node depth. 0: System root node, 1: visible top-level node, 2: first sub-level, ... .
|
757
|
+
* @returns {int}
|
758
|
+
*/
|
705
759
|
getLevel: function() {
|
706
760
|
var level = 0,
|
707
761
|
dtn = this.parent;
|
@@ -711,7 +765,9 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
711
765
|
}
|
712
766
|
return level;
|
713
767
|
},
|
714
|
-
/**
|
768
|
+
/** Return the successor node (under the same parent) or null.
|
769
|
+
* @returns {FancytreeNode | null}
|
770
|
+
*/
|
715
771
|
getNextSibling: function() {
|
716
772
|
// TODO: use indexOf, if available: (not in IE6)
|
717
773
|
if( this.parent ){
|
@@ -726,14 +782,16 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
726
782
|
}
|
727
783
|
return null;
|
728
784
|
},
|
729
|
-
/**
|
785
|
+
/** Return the parent node (null for the system root node).
|
786
|
+
* @returns {FancytreeNode | null}
|
787
|
+
*/
|
730
788
|
getParent: function() {
|
731
789
|
// TODO: return null for top-level nodes?
|
732
790
|
return this.parent;
|
733
791
|
},
|
734
|
-
/**
|
735
|
-
* @param {boolean} [includeRoot=false]
|
736
|
-
* @param {boolean} [includeSelf=false]
|
792
|
+
/** Return an array of all parent nodes (top-down).
|
793
|
+
* @param {boolean} [includeRoot=false] Include the invisible system root node.
|
794
|
+
* @param {boolean} [includeSelf=false] Include the node itself.
|
737
795
|
* @returns {FancytreeNode[]}
|
738
796
|
*/
|
739
797
|
getParentList: function(includeRoot, includeSelf) {
|
@@ -747,7 +805,9 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
747
805
|
}
|
748
806
|
return l;
|
749
807
|
},
|
750
|
-
/**
|
808
|
+
/** Return the predecessor node (under the same parent) or null.
|
809
|
+
* @returns {FancytreeNode | null}
|
810
|
+
*/
|
751
811
|
getPrevSibling: function() {
|
752
812
|
if( this.parent ){
|
753
813
|
var i, l,
|
@@ -761,7 +821,9 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
761
821
|
}
|
762
822
|
return null;
|
763
823
|
},
|
764
|
-
/**
|
824
|
+
/** Return true if node has children. Return undefined if not sure, i.e. the node is lazy and not yet loaded).
|
825
|
+
* @returns {boolean | undefined}
|
826
|
+
*/
|
765
827
|
hasChildren: function() {
|
766
828
|
if(this.lazy){
|
767
829
|
if(this.children == null ){
|
@@ -770,7 +832,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
770
832
|
}else if(this.children.length === 0){
|
771
833
|
// Loaded, but response was empty
|
772
834
|
return false;
|
773
|
-
}else if(this.children.length === 1 && this.children[0].isStatusNode ){
|
835
|
+
}else if(this.children.length === 1 && this.children[0].isStatusNode() ){
|
774
836
|
// Currently loading or load error
|
775
837
|
return undefined;
|
776
838
|
}
|
@@ -778,24 +840,28 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
778
840
|
}
|
779
841
|
return !!this.children;
|
780
842
|
},
|
781
|
-
|
843
|
+
/** Return true if node has keyboard focus.
|
844
|
+
* @returns {boolean}
|
845
|
+
*/
|
782
846
|
hasFocus: function() {
|
783
847
|
return (this.tree.hasFocus() && this.tree.focusNode === this);
|
784
848
|
},
|
785
|
-
|
849
|
+
/** Return true if node is active (see also FancytreeNode#isSelected).
|
850
|
+
* @returns {boolean}
|
851
|
+
*/
|
786
852
|
isActive: function() {
|
787
853
|
return (this.tree.activeNode === this);
|
788
854
|
},
|
789
|
-
/**
|
855
|
+
/** Return true if node is a direct child of otherNode.
|
790
856
|
* @param {FancytreeNode} otherNode
|
791
|
-
* @returns {boolean}
|
857
|
+
* @returns {boolean}
|
792
858
|
*/
|
793
859
|
isChildOf: function(otherNode) {
|
794
860
|
return (this.parent && this.parent === otherNode);
|
795
861
|
},
|
796
|
-
/**
|
862
|
+
/** Return true, if node is a direct or indirect sub node of otherNode.
|
797
863
|
* @param {FancytreeNode} otherNode
|
798
|
-
* @returns {boolean}
|
864
|
+
* @returns {boolean}
|
799
865
|
*/
|
800
866
|
isDescendantOf: function(otherNode) {
|
801
867
|
if(!otherNode || otherNode.tree !== this.tree){
|
@@ -810,45 +876,79 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
810
876
|
}
|
811
877
|
return false;
|
812
878
|
},
|
813
|
-
/**
|
879
|
+
/** Return true if node is expanded.
|
880
|
+
* @returns {boolean}
|
881
|
+
*/
|
814
882
|
isExpanded: function() {
|
815
883
|
return !!this.expanded;
|
816
884
|
},
|
817
|
-
/**
|
885
|
+
/** Return true if node is the first node of its parent's children.
|
886
|
+
* @returns {boolean}
|
887
|
+
*/
|
818
888
|
isFirstSibling: function() {
|
819
889
|
var p = this.parent;
|
820
890
|
return !p || p.children[0] === this;
|
821
891
|
},
|
822
|
-
/**
|
892
|
+
/** Return true if node is a folder, i.e. has the node.folder attribute set.
|
893
|
+
* @returns {boolean}
|
894
|
+
*/
|
823
895
|
isFolder: function() {
|
824
896
|
return !!this.folder;
|
825
897
|
},
|
826
|
-
/**
|
898
|
+
/** Return true if node is the last node of its parent's children.
|
899
|
+
* @returns {boolean}
|
900
|
+
*/
|
827
901
|
isLastSibling: function() {
|
828
902
|
var p = this.parent;
|
829
903
|
return !p || p.children[p.children.length-1] === this;
|
830
904
|
},
|
831
|
-
/**
|
905
|
+
/** Return true if node is lazy (even if data was already loaded)
|
906
|
+
* @returns {boolean}
|
907
|
+
*/
|
832
908
|
isLazy: function() {
|
833
909
|
return !!this.lazy;
|
834
910
|
},
|
835
|
-
/**
|
911
|
+
/** Return true if node is lazy and loaded. For non-lazy nodes always return true.
|
912
|
+
* @returns {boolean}
|
913
|
+
*/
|
914
|
+
isLoaded: function() {
|
915
|
+
return !this.lazy || this.hasChildren() !== undefined; // Also checks if the only child is a status node
|
916
|
+
},
|
917
|
+
/** Return true if children are currently beeing loaded, i.e. a Ajax request is pending.
|
918
|
+
* @returns {boolean}
|
919
|
+
*/
|
836
920
|
isLoading: function() {
|
837
|
-
|
921
|
+
return !!this._isLoading;
|
838
922
|
},
|
839
|
-
|
923
|
+
/** Return true if this is the (invisible) system root node.
|
924
|
+
* @returns {boolean}
|
925
|
+
*/
|
840
926
|
isRoot: function() {
|
841
927
|
return (this.tree.rootNode === this);
|
842
928
|
},
|
843
|
-
/**
|
929
|
+
/** Return true if node is selected, i.e. has a checkmark set (see also FancytreeNode#isActive).
|
930
|
+
* @returns {boolean}
|
931
|
+
*/
|
844
932
|
isSelected: function() {
|
845
933
|
return !!this.selected;
|
846
934
|
},
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
935
|
+
/** Return true if this node is a temporarily generated system node like
|
936
|
+
* 'loading', or 'error' (node.statusNodeType contains the type).
|
937
|
+
* @returns {boolean}
|
938
|
+
*/
|
939
|
+
isStatusNode: function() {
|
940
|
+
return !!this.statusNodeType;
|
941
|
+
},
|
942
|
+
/** Return true if node is lazy and not yet loaded. For non-lazy nodes always return false.
|
943
|
+
* @returns {boolean}
|
944
|
+
*/
|
945
|
+
isUndefined: function() {
|
946
|
+
return this.hasChildren() === undefined; // also checks if the only child is a status node
|
947
|
+
},
|
948
|
+
/** Return true if all parent nodes are expanded. Note: this does not check
|
949
|
+
* whether the node is scrolled into the visible part of the screen.
|
950
|
+
* @returns {boolean}
|
951
|
+
*/
|
852
952
|
isVisible: function() {
|
853
953
|
var i, l,
|
854
954
|
parents = this.getParentList(false, false);
|
@@ -858,28 +958,87 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
858
958
|
}
|
859
959
|
return true;
|
860
960
|
},
|
861
|
-
/**
|
862
|
-
*
|
961
|
+
/** Deprecated.
|
962
|
+
* @deprecated since 2014-02-16: use load() instead.
|
863
963
|
*/
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
964
|
+
lazyLoad: function(discard) {
|
965
|
+
this.warn("FancytreeNode.lazyLoad() is deprecated since 2014-02-16. Use .load() instead.");
|
966
|
+
return this.load(discard);
|
967
|
+
},
|
968
|
+
/**
|
969
|
+
* Load all children of a lazy node.
|
970
|
+
* @param {boolean} [forceReload=false] Pass true to discard any existing nodes before.
|
971
|
+
* @returns {$.Promise}
|
972
|
+
*/
|
973
|
+
load: function(forceReload) {
|
974
|
+
var res, source,
|
975
|
+
that = this;
|
869
976
|
|
870
|
-
|
871
|
-
|
977
|
+
_assert( this.isLazy(), "load() requires a lazy node" );
|
978
|
+
_assert( forceReload || this.isUndefined(), "Pass forceReload=true to re-load a lazy node" );
|
979
|
+
|
980
|
+
if( this.isLoaded() ){
|
981
|
+
this.resetLazy(); // also collapses
|
872
982
|
}
|
983
|
+
// This method is also called by setExpanded() and loadKeyPath(), so we
|
984
|
+
// have to avoid recursion.
|
985
|
+
source = this.tree._triggerNodeEvent("lazyLoad", this);
|
986
|
+
if( source === false ) { // #69
|
987
|
+
return _getResolvedPromise(this);
|
988
|
+
}
|
989
|
+
_assert(typeof source !== "boolean", "lazyLoad event must return source in data.result");
|
990
|
+
res = this.tree._callHook("nodeLoadChildren", this, source);
|
991
|
+
if( this.expanded ) {
|
992
|
+
res.always(function(){
|
993
|
+
that.render();
|
994
|
+
});
|
995
|
+
}
|
996
|
+
return res;
|
997
|
+
},
|
998
|
+
/** Expand all parents and optionally scroll into visible area as neccessary.
|
999
|
+
* Promise is resolved, when lazy loading and animations are done.
|
1000
|
+
* @param {object} [opts] passed to `setExpanded()`.
|
1001
|
+
* Defaults to {noAnimation: false, noEvents: false, scrollIntoView: true}
|
1002
|
+
* @returns {$.Promise}
|
1003
|
+
*/
|
1004
|
+
makeVisible: function(opts) {
|
1005
|
+
var i,
|
1006
|
+
that = this,
|
1007
|
+
deferreds = [],
|
1008
|
+
dfd = new $.Deferred(),
|
1009
|
+
parents = this.getParentList(false, false),
|
1010
|
+
len = parents.length,
|
1011
|
+
effects = !(opts && opts.noAnimation === true),
|
1012
|
+
scroll = !(opts && opts.scrollIntoView === false);
|
1013
|
+
|
1014
|
+
// Expand bottom-up, so only the top node is animated
|
1015
|
+
for(i = len - 1; i >= 0; i--){
|
1016
|
+
// that.debug("pushexpand" + parents[i]);
|
1017
|
+
deferreds.push(parents[i].setExpanded(true, opts));
|
1018
|
+
}
|
1019
|
+
$.when.apply($, deferreds).done(function(){
|
1020
|
+
// All expands have finished
|
1021
|
+
// that.debug("expand DONE", scroll);
|
1022
|
+
if( scroll ){
|
1023
|
+
that.scrollIntoView(effects).done(function(){
|
1024
|
+
// that.debug("scroll DONE");
|
1025
|
+
dfd.resolve();
|
1026
|
+
});
|
1027
|
+
} else {
|
1028
|
+
dfd.resolve();
|
1029
|
+
}
|
1030
|
+
});
|
1031
|
+
return dfd.promise();
|
873
1032
|
},
|
874
1033
|
/** Move this node to targetNode.
|
875
1034
|
* @param {FancytreeNode} targetNode
|
876
|
-
* @param {string} mode
|
1035
|
+
* @param {string} mode <pre>
|
877
1036
|
* 'child': append this node as last child of targetNode.
|
878
1037
|
* This is the default. To be compatble with the D'n'd
|
879
1038
|
* hitMode, we also accept 'over'.
|
880
1039
|
* 'before': add this node as sibling before targetNode.
|
881
|
-
* 'after': add this node as sibling after targetNode
|
882
|
-
* @param
|
1040
|
+
* 'after': add this node as sibling after targetNode.</pre>
|
1041
|
+
* @param {function} [map] optional callback(FancytreeNode) to allow modifcations
|
883
1042
|
*/
|
884
1043
|
moveTo: function(targetNode, mode, map) {
|
885
1044
|
if(mode === undefined || mode === "over"){
|
@@ -993,8 +1152,8 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
993
1152
|
}
|
994
1153
|
|
995
1154
|
// In multi-hier mode, update the parents selection state
|
996
|
-
// issue #82: only if not initializing, because the children may not exist yet
|
997
|
-
// if( !ftnode.data.isStatusNode && opts.selectMode==3 && !isInitializing )
|
1155
|
+
// DT issue #82: only if not initializing, because the children may not exist yet
|
1156
|
+
// if( !ftnode.data.isStatusNode() && opts.selectMode==3 && !isInitializing )
|
998
1157
|
// ftnode._fixSelectionState();
|
999
1158
|
|
1000
1159
|
// In multi-hier mode, update the parents selection state
|
@@ -1091,52 +1250,74 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1091
1250
|
}
|
1092
1251
|
},
|
1093
1252
|
/**
|
1094
|
-
*
|
1095
|
-
* @param {boolean} [discard=false]
|
1096
|
-
* @returns $.Promise
|
1253
|
+
* Remove this node (not allowed for system root).
|
1097
1254
|
*/
|
1098
|
-
|
1099
|
-
|
1100
|
-
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1255
|
+
remove: function() {
|
1256
|
+
return this.parent.removeChild(this);
|
1257
|
+
},
|
1258
|
+
/**
|
1259
|
+
* Remove childNode from list of direct children.
|
1260
|
+
* @param {FancytreeNode} childNode
|
1261
|
+
*/
|
1262
|
+
removeChild: function(childNode) {
|
1263
|
+
return this.tree._callHook("nodeRemoveChild", this, childNode);
|
1106
1264
|
},
|
1107
1265
|
/**
|
1108
|
-
*
|
1266
|
+
* Remove all child nodes and descendents. This converts the node into a leaf.<br>
|
1267
|
+
* If this was a lazy node, it is still considered 'loaded'; call node.resetLazy()
|
1268
|
+
* in order to trigger lazyLoad on next expand.
|
1269
|
+
*/
|
1270
|
+
removeChildren: function() {
|
1271
|
+
return this.tree._callHook("nodeRemoveChildren", this);
|
1272
|
+
},
|
1273
|
+
/**
|
1274
|
+
* This method renders and updates all HTML markup that is required
|
1275
|
+
* to display this node in its current state.<br>
|
1276
|
+
* Note:
|
1277
|
+
* <ul>
|
1278
|
+
* <li>It should only be neccessary to call this method after the node object
|
1279
|
+
* was modified by direct access to its properties, because the common
|
1280
|
+
* API methods (node.setTitle(), moveTo(), addChildren(), remove(), ...)
|
1281
|
+
* already handle this.
|
1282
|
+
* <li> {@link FancytreeNode#renderTitle} and {@link FancytreeNode#renderStatus}
|
1283
|
+
* are implied. If changes are more local, calling only renderTitle() or
|
1284
|
+
* renderStatus() may be sufficient and faster.
|
1285
|
+
* <li>If a node was created/removed, node.render() must be called <i>on the parent</i>.
|
1286
|
+
* </ul>
|
1287
|
+
*
|
1288
|
+
* @param {boolean} [force=false] re-render, even if html markup was already created
|
1289
|
+
* @param {boolean} [deep=false] also render all descendants, even if parent is collapsed
|
1109
1290
|
*/
|
1110
1291
|
render: function(force, deep) {
|
1111
1292
|
return this.tree._callHook("nodeRender", this, force, deep);
|
1112
1293
|
},
|
1113
|
-
/**
|
1294
|
+
/** Create HTML markup for the node's outer <span> (expander, checkbox, icon, and title).
|
1114
1295
|
* @see Fancytree_Hooks#nodeRenderTitle
|
1115
1296
|
*/
|
1116
1297
|
renderTitle: function() {
|
1117
1298
|
return this.tree._callHook("nodeRenderTitle", this);
|
1118
1299
|
},
|
1119
|
-
/**
|
1300
|
+
/** Update element's CSS classes according to node state.
|
1120
1301
|
* @see Fancytree_Hooks#nodeRenderStatus
|
1121
1302
|
*/
|
1122
1303
|
renderStatus: function() {
|
1123
1304
|
return this.tree._callHook("nodeRenderStatus", this);
|
1124
1305
|
},
|
1125
|
-
/**
|
1126
|
-
|
1127
|
-
|
1128
|
-
|
1129
|
-
|
1130
|
-
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
return this.tree._callHook("nodeRemoveChildren", this);
|
1306
|
+
/**
|
1307
|
+
* Remove all children, collapse, and set the lazy-flag, so that the lazyLoad
|
1308
|
+
* event is triggered on next expand.
|
1309
|
+
*/
|
1310
|
+
resetLazy: function() {
|
1311
|
+
this.removeChildren();
|
1312
|
+
this.expanded = false;
|
1313
|
+
this.lazy = true;
|
1314
|
+
this.children = undefined;
|
1315
|
+
this.renderStatus();
|
1136
1316
|
},
|
1137
|
-
// TODO: resetLazy()
|
1138
1317
|
/** Schedule activity for delayed execution (cancel any pending request).
|
1139
1318
|
* scheduleAction('cancel') will only cancel a pending request (if any).
|
1319
|
+
* @param {string} mode
|
1320
|
+
* @param {number} ms
|
1140
1321
|
*/
|
1141
1322
|
scheduleAction: function(mode, ms) {
|
1142
1323
|
if( this.tree.timer ) {
|
@@ -1171,12 +1352,13 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1171
1352
|
* @param {boolean | PlainObject} [effects=false] animation options.
|
1172
1353
|
* @param {FancytreeNode} [topNode=null] this node will remain visible in
|
1173
1354
|
* any case, even if `this` is outside the scroll pane.
|
1174
|
-
* @returns $.Promise
|
1355
|
+
* @returns {$.Promise}
|
1175
1356
|
*/
|
1176
1357
|
scrollIntoView: function(effects, topNode) {
|
1177
1358
|
effects = (effects === true) ? {duration: 200, queue: false} : effects;
|
1178
1359
|
var topNodeY,
|
1179
1360
|
dfd = new $.Deferred(),
|
1361
|
+
that = this,
|
1180
1362
|
nodeY = $(this.span).position().top,
|
1181
1363
|
nodeHeight = $(this.span).height(),
|
1182
1364
|
$container = this.tree.$container,
|
@@ -1210,7 +1392,12 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1210
1392
|
if(effects){
|
1211
1393
|
// TODO: resolve dfd after animation
|
1212
1394
|
// var that = this;
|
1213
|
-
|
1395
|
+
effects.complete = function(){
|
1396
|
+
dfd.resolveWith(that);
|
1397
|
+
};
|
1398
|
+
$container.animate({
|
1399
|
+
scrollTop: newScrollTop
|
1400
|
+
}, effects);
|
1214
1401
|
}else{
|
1215
1402
|
$container[0].scrollTop = newScrollTop;
|
1216
1403
|
dfd.resolveWith(this);
|
@@ -1245,10 +1432,10 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1245
1432
|
setActive: function(flag, opts){
|
1246
1433
|
return this.tree._callHook("nodeSetActive", this, flag, opts);
|
1247
1434
|
},
|
1248
|
-
/**Expand or collapse this node.
|
1435
|
+
/**Expand or collapse this node. Promise is resolved, when lazy loading and animations are done.
|
1249
1436
|
* @param {boolean} [flag=true] pass false to collapse
|
1250
1437
|
* @param {object} [opts] additional options. Defaults to {noAnimation: false, noEvents: false}
|
1251
|
-
* @returns {$.Promise}
|
1438
|
+
* @returns {$.Promise}
|
1252
1439
|
*/
|
1253
1440
|
setExpanded: function(flag, opts){
|
1254
1441
|
return this.tree._callHook("nodeSetExpanded", this, flag, opts);
|
@@ -1261,7 +1448,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1261
1448
|
return this.tree._callHook("nodeSetFocus", this, flag);
|
1262
1449
|
},
|
1263
1450
|
// TODO: setLazyNodeStatus
|
1264
|
-
/**Select this node.
|
1451
|
+
/**Select this node, i.e. check the checkbox.
|
1265
1452
|
* @param {boolean} [flag=true] pass false to deselect
|
1266
1453
|
*/
|
1267
1454
|
setSelected: function(flag){
|
@@ -1334,7 +1521,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1334
1521
|
dict.children = [];
|
1335
1522
|
for(i=0, l=this.children.length; i<l; i++ ){
|
1336
1523
|
node = this.children[i];
|
1337
|
-
if( !node.isStatusNode ){
|
1524
|
+
if( !node.isStatusNode() ){
|
1338
1525
|
dict.children.push(node.toDict(true, callback));
|
1339
1526
|
}
|
1340
1527
|
}
|
@@ -1355,12 +1542,14 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1355
1542
|
toString: function() {
|
1356
1543
|
return "<FancytreeNode(#" + this.key + ", '" + this.title + "')>";
|
1357
1544
|
},
|
1358
|
-
/** Call fn(node) for all child nodes
|
1359
|
-
* Skip current branch, if fn() returns
|
1545
|
+
/** Call fn(node) for all child nodes.<br>
|
1546
|
+
* Stop iteration, if fn() returns false. Skip current branch, if fn() returns "skip".<br>
|
1547
|
+
* Return false if iteration was stopped.
|
1548
|
+
*
|
1360
1549
|
* @param {function} fn the callback function.
|
1361
1550
|
* Return false to stop iteration, return "skip" to skip this node and children only.
|
1362
1551
|
* @param {boolean} [includeSelf=false]
|
1363
|
-
* @returns {boolean}
|
1552
|
+
* @returns {boolean}
|
1364
1553
|
*/
|
1365
1554
|
visit: function(fn, includeSelf) {
|
1366
1555
|
var i, l,
|
@@ -1383,10 +1572,13 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1383
1572
|
}
|
1384
1573
|
return res;
|
1385
1574
|
},
|
1386
|
-
/**
|
1575
|
+
/** Call fn(node) for all parent nodes, bottom-up, including invisible system root.<br>
|
1576
|
+
* Stop iteration, if fn() returns false.<br>
|
1577
|
+
* Return false if iteration was stopped.
|
1387
1578
|
*
|
1388
|
-
* @param fn
|
1389
|
-
*
|
1579
|
+
* @param {function} fn the callback function.
|
1580
|
+
* Return false to stop iteration, return "skip" to skip this node and children only.
|
1581
|
+
* @param {boolean} [includeSelf=false]
|
1390
1582
|
* @returns {boolean}
|
1391
1583
|
*/
|
1392
1584
|
visitParents: function(fn, includeSelf) {
|
@@ -1421,7 +1613,7 @@ FancytreeNode.prototype = /** @lends FancytreeNode# */{
|
|
1421
1613
|
* Construct a new tree object.
|
1422
1614
|
*
|
1423
1615
|
* @class Fancytree
|
1424
|
-
* @classdesc
|
1616
|
+
* @classdesc The controller behind a fancytree.
|
1425
1617
|
* This class also contains 'hook methods': see {@link Fancytree_Hooks}.
|
1426
1618
|
*
|
1427
1619
|
* @param {Widget} widget
|
@@ -1446,15 +1638,24 @@ function Fancytree(widget) {
|
|
1446
1638
|
this.widget = widget;
|
1447
1639
|
this.$div = widget.element;
|
1448
1640
|
this.options = widget.options;
|
1641
|
+
if( this.options && $.isFunction(this.options.lazyload) ) {
|
1642
|
+
if( ! $.isFunction(this.options.lazyLoad ) ) {
|
1643
|
+
this.options.lazyLoad = function() {
|
1644
|
+
FT.warn("The 'lazyload' event is deprecated since 2014-02-25. Use 'lazyLoad' (with uppercase L) instead.");
|
1645
|
+
widget.options.lazyload.apply(this, arguments);
|
1646
|
+
};
|
1647
|
+
}
|
1648
|
+
}
|
1449
1649
|
this.ext = {}; // Active extension instances
|
1450
|
-
|
1650
|
+
// allow to init tree.data.foo from <div data-foo=''>
|
1651
|
+
this.data = _getElementDataAsDict(this.$div);
|
1451
1652
|
this._id = $.ui.fancytree._nextId++;
|
1452
1653
|
this._ns = ".fancytree-" + this._id; // append for namespaced events
|
1453
1654
|
this.activeNode = null;
|
1454
1655
|
this.focusNode = null;
|
1455
1656
|
this._hasFocus = null;
|
1456
1657
|
this.lastSelectedNode = null;
|
1457
|
-
this.systemFocusElement = null
|
1658
|
+
this.systemFocusElement = null;
|
1458
1659
|
|
1459
1660
|
this.statusClassPropName = "span";
|
1460
1661
|
this.ariaPropName = "li";
|
@@ -1695,7 +1896,7 @@ Fancytree.prototype = /** @lends Fancytree# */{
|
|
1695
1896
|
}
|
1696
1897
|
},
|
1697
1898
|
/**
|
1698
|
-
* Return the currently active
|
1899
|
+
* Return the currently active node or null.
|
1699
1900
|
* @returns {FancytreeNode}
|
1700
1901
|
*/
|
1701
1902
|
getActiveNode: function() {
|
@@ -1862,13 +2063,13 @@ Fancytree.prototype = /** @lends Fancytree# */{
|
|
1862
2063
|
// Avoid jshint warning 'Don't make functions within a loop.':
|
1863
2064
|
function __lazyload(key, node, dfd){
|
1864
2065
|
callback.call(self, node, "loading");
|
1865
|
-
node.
|
1866
|
-
|
1867
|
-
|
1868
|
-
|
1869
|
-
|
1870
|
-
|
1871
|
-
|
2066
|
+
node.load().done(function(){
|
2067
|
+
self.loadKeyPath.call(self, loadMap[key], callback, node).always(_makeResolveFunc(dfd, self));
|
2068
|
+
}).fail(function(errMsg){
|
2069
|
+
self.warn("loadKeyPath: error loading: " + key + " (parent: " + root + ")");
|
2070
|
+
callback.call(self, node, "error");
|
2071
|
+
dfd.reject();
|
2072
|
+
});
|
1872
2073
|
}
|
1873
2074
|
for(key in loadMap){
|
1874
2075
|
node = root._findDirectChild(key);
|
@@ -1983,8 +2184,10 @@ Fancytree.prototype = /** @lends Fancytree# */{
|
|
1983
2184
|
$.extend(Fancytree.prototype,
|
1984
2185
|
/** @lends Fancytree_Hooks# */
|
1985
2186
|
{
|
1986
|
-
|
1987
|
-
|
2187
|
+
/** Default handling for mouse click events.
|
2188
|
+
*
|
2189
|
+
* @param {EventData} ctx
|
2190
|
+
*/
|
1988
2191
|
nodeClick: function(ctx) {
|
1989
2192
|
// this.tree.logDebug("ftnode.onClick(" + event.type + "): ftnode:" + this + ", button:" + event.button + ", which: " + event.which);
|
1990
2193
|
var activate, expand,
|
@@ -1997,11 +2200,11 @@ $.extend(Fancytree.prototype,
|
|
1997
2200
|
if( targetType === "expander" ) {
|
1998
2201
|
// Clicking the expander icon always expands/collapses
|
1999
2202
|
this._callHook("nodeToggleExpanded", ctx);
|
2000
|
-
// this._callHook("nodeSetFocus", ctx, true); // issue 95
|
2203
|
+
// this._callHook("nodeSetFocus", ctx, true); // DT issue 95
|
2001
2204
|
} else if( targetType === "checkbox" ) {
|
2002
2205
|
// Clicking the checkbox always (de)selects
|
2003
2206
|
this._callHook("nodeToggleSelected", ctx);
|
2004
|
-
this._callHook("nodeSetFocus", ctx, true); // issue 95
|
2207
|
+
this._callHook("nodeSetFocus", ctx, true); // DT issue 95
|
2005
2208
|
} else {
|
2006
2209
|
// Honor `clickFolderMode` for
|
2007
2210
|
expand = false;
|
@@ -2037,6 +2240,11 @@ $.extend(Fancytree.prototype,
|
|
2037
2240
|
}
|
2038
2241
|
// TODO: return promise?
|
2039
2242
|
},
|
2243
|
+
/** Collapse all other children of same parent.
|
2244
|
+
*
|
2245
|
+
* @param {EventData} ctx
|
2246
|
+
* @param {object} callOpts
|
2247
|
+
*/
|
2040
2248
|
nodeCollapseSiblings: function(ctx, callOpts) {
|
2041
2249
|
// TODO: return promise?
|
2042
2250
|
var ac, i, l,
|
@@ -2051,6 +2259,9 @@ $.extend(Fancytree.prototype,
|
|
2051
2259
|
}
|
2052
2260
|
}
|
2053
2261
|
},
|
2262
|
+
/** Default handling for mouse douleclick events.
|
2263
|
+
* @param {EventData} ctx
|
2264
|
+
*/
|
2054
2265
|
nodeDblclick: function(ctx) {
|
2055
2266
|
// TODO: return promise?
|
2056
2267
|
if( ctx.targetType === "title" && ctx.options.clickFolderMode === 4) {
|
@@ -2066,6 +2277,7 @@ $.extend(Fancytree.prototype,
|
|
2066
2277
|
/** Default handling for mouse keydown events.
|
2067
2278
|
*
|
2068
2279
|
* NOTE: this may be called with node == null if tree (but no node) has focus.
|
2280
|
+
* @param {EventData} ctx
|
2069
2281
|
*/
|
2070
2282
|
nodeKeydown: function(ctx) {
|
2071
2283
|
// TODO: return promise?
|
@@ -2128,17 +2340,12 @@ $.extend(Fancytree.prototype,
|
|
2128
2340
|
// var event = ctx.originalEvent;
|
2129
2341
|
// },
|
2130
2342
|
|
2131
|
-
// /** Trigger
|
2343
|
+
// /** Trigger lazyLoad event (async). */
|
2132
2344
|
// nodeLazyLoad: function(ctx) {
|
2133
2345
|
// var node = ctx.node;
|
2134
2346
|
// if(this._triggerNodeEvent())
|
2135
2347
|
// },
|
2136
|
-
/** Load
|
2137
|
-
* source may be
|
2138
|
-
* - an array of children
|
2139
|
-
* - a node object
|
2140
|
-
* - an Ajax options object
|
2141
|
-
* - an Ajax.promise
|
2348
|
+
/** Load child nodes (async).
|
2142
2349
|
*
|
2143
2350
|
* @param {EventData} ctx
|
2144
2351
|
* @param {object[]|object|string|$.Promise|function} source
|
@@ -2178,9 +2385,12 @@ $.extend(Fancytree.prototype,
|
|
2178
2385
|
}
|
2179
2386
|
|
2180
2387
|
// TODO: change 'pipe' to 'then' for jQuery 1.8
|
2388
|
+
// $.pipe returns a new Promise with filtered results
|
2181
2389
|
source = source.pipe(function (data, textStatus, jqXHR) {
|
2182
2390
|
var res;
|
2183
|
-
if(typeof data === "string"){
|
2391
|
+
if(typeof data === "string"){
|
2392
|
+
$.error("Ajax request returned a string (did you get the JSON dataType wrong?).");
|
2393
|
+
}
|
2184
2394
|
// postProcess is similar to the standard dataFilter hook,
|
2185
2395
|
// but it is also called for JSONP
|
2186
2396
|
if( ctx.options.postProcess ){
|
@@ -2202,8 +2412,11 @@ $.extend(Fancytree.prototype,
|
|
2202
2412
|
}
|
2203
2413
|
|
2204
2414
|
if($.isFunction(source.promise)){
|
2205
|
-
// `source` is a
|
2415
|
+
// `source` is a deferred, i.e. ajax request
|
2416
|
+
_assert(!node.isLoading());
|
2417
|
+
// node._isLoading = true;
|
2206
2418
|
tree.nodeSetStatus(ctx, "loading");
|
2419
|
+
|
2207
2420
|
source.done(function () {
|
2208
2421
|
tree.nodeSetStatus(ctx, "ok");
|
2209
2422
|
}).fail(function(error){
|
@@ -2222,13 +2435,13 @@ $.extend(Fancytree.prototype,
|
|
2222
2435
|
tree.nodeSetStatus(ctx, "error", ctxErr.message, ctxErr.details);
|
2223
2436
|
});
|
2224
2437
|
}
|
2225
|
-
|
2438
|
+
// $.when(source) resolves also for non-deferreds
|
2226
2439
|
return $.when(source).done(function(children){
|
2227
2440
|
var metaData;
|
2228
2441
|
|
2229
2442
|
if( $.isPlainObject(children) ){
|
2230
2443
|
// We got {foo: 'abc', children: [...]}
|
2231
|
-
// Copy extra properties to tree.data.
|
2444
|
+
// Copy extra properties to tree.data.foo
|
2232
2445
|
_assert($.isArray(children.children), "source must contain (or be) an array of children");
|
2233
2446
|
_assert(node.isRoot(), "source may only be an object for root nodes");
|
2234
2447
|
metaData = children;
|
@@ -2238,34 +2451,18 @@ $.extend(Fancytree.prototype,
|
|
2238
2451
|
}
|
2239
2452
|
_assert($.isArray(children), "expected array of children");
|
2240
2453
|
node._setChildren(children);
|
2241
|
-
|
2242
|
-
|
2243
|
-
|
2244
|
-
}
|
2454
|
+
// trigger fancytreeloadchildren
|
2455
|
+
// if( node.parent ) {
|
2456
|
+
tree._triggerNodeEvent("loadChildren", node);
|
2457
|
+
// }
|
2458
|
+
// }).always(function(){
|
2459
|
+
// node._isLoading = false;
|
2245
2460
|
});
|
2246
2461
|
},
|
2247
|
-
|
2248
|
-
// // Return true, if all parents are expanded.
|
2249
|
-
// var parents = ctx.node.getParentList(false, false);
|
2250
|
-
// for(var i=0, l=parents.length; i<l; i++){
|
2251
|
-
// if( ! parents[i].expanded ){ return false; }
|
2252
|
-
// }
|
2253
|
-
// return true;
|
2254
|
-
// },
|
2255
|
-
/** Expand all keys that */
|
2462
|
+
/** [Not Implemented] */
|
2256
2463
|
nodeLoadKeyPath: function(ctx, keyPathList) {
|
2257
2464
|
// TODO: implement and improve
|
2258
|
-
// http://code.google.com/p/
|
2259
|
-
},
|
2260
|
-
/** Expand all parents.*/
|
2261
|
-
nodeMakeVisible: function(ctx) {
|
2262
|
-
// TODO: also scroll as neccessary: http://stackoverflow.com/questions/8938352/fancytree-how-to-scroll-to-active-node
|
2263
|
-
// Do we need an extra parameter?
|
2264
|
-
var i, l,
|
2265
|
-
parents = ctx.node.getParentList(false, false);
|
2266
|
-
for(i=0, l=parents.length; i<l; i++){
|
2267
|
-
parents[i].setExpanded(true);
|
2268
|
-
}
|
2465
|
+
// http://code.google.com/p/dynatree/issues/detail?id=222
|
2269
2466
|
},
|
2270
2467
|
/**
|
2271
2468
|
* Remove a single direct child of ctx.node.
|
@@ -2279,7 +2476,7 @@ $.extend(Fancytree.prototype,
|
|
2279
2476
|
subCtx = $.extend({}, ctx, {node: childNode}),
|
2280
2477
|
children = node.children;
|
2281
2478
|
|
2282
|
-
FT.debug("nodeRemoveChild()", node.toString(), childNode.toString());
|
2479
|
+
// FT.debug("nodeRemoveChild()", node.toString(), childNode.toString());
|
2283
2480
|
|
2284
2481
|
if( children.length === 1 ) {
|
2285
2482
|
_assert(childNode === children[0]);
|
@@ -2300,6 +2497,7 @@ $.extend(Fancytree.prototype,
|
|
2300
2497
|
childNode.visit(function(n){
|
2301
2498
|
n.parent = null;
|
2302
2499
|
}, true);
|
2500
|
+
this._callHook("treeRegisterNode", this, false, childNode);
|
2303
2501
|
if ( opts.removeNode ){
|
2304
2502
|
opts.removeNode.call(ctx.tree, {type: "removeNode"}, subCtx);
|
2305
2503
|
}
|
@@ -2312,7 +2510,7 @@ $.extend(Fancytree.prototype,
|
|
2312
2510
|
nodeRemoveChildMarkup: function(ctx) {
|
2313
2511
|
var node = ctx.node;
|
2314
2512
|
|
2315
|
-
FT.debug("nodeRemoveChildMarkup()", node.toString());
|
2513
|
+
// FT.debug("nodeRemoveChildMarkup()", node.toString());
|
2316
2514
|
// TODO: Unlink attr.ftnode to support GC
|
2317
2515
|
if(node.ul){
|
2318
2516
|
if( node.isRoot() ) {
|
@@ -2331,11 +2529,12 @@ $.extend(Fancytree.prototype,
|
|
2331
2529
|
*/
|
2332
2530
|
nodeRemoveChildren: function(ctx) {
|
2333
2531
|
var subCtx,
|
2532
|
+
tree = ctx.tree,
|
2334
2533
|
node = ctx.node,
|
2335
2534
|
children = node.children,
|
2336
2535
|
opts = ctx.options;
|
2337
2536
|
|
2338
|
-
FT.debug("nodeRemoveChildren()", node.toString());
|
2537
|
+
// FT.debug("nodeRemoveChildren()", node.toString());
|
2339
2538
|
if(!children){
|
2340
2539
|
return;
|
2341
2540
|
}
|
@@ -2352,14 +2551,18 @@ $.extend(Fancytree.prototype,
|
|
2352
2551
|
subCtx = $.extend({}, ctx);
|
2353
2552
|
node.visit(function(n){
|
2354
2553
|
n.parent = null;
|
2554
|
+
tree._callHook("treeRegisterNode", tree, false, n);
|
2355
2555
|
if ( opts.removeNode ){
|
2356
2556
|
subCtx.node = n;
|
2357
2557
|
opts.removeNode.call(ctx.tree, {type: "removeNode"}, subCtx);
|
2358
2558
|
}
|
2359
2559
|
});
|
2360
|
-
|
2361
|
-
|
2362
|
-
|
2560
|
+
if( node.lazy ){
|
2561
|
+
// 'undefined' would be interpreted as 'not yet loaded' for lazy nodes
|
2562
|
+
node.children = [];
|
2563
|
+
} else{
|
2564
|
+
node.children = null;
|
2565
|
+
}
|
2363
2566
|
this.nodeRenderStatus(ctx);
|
2364
2567
|
},
|
2365
2568
|
/**Remove HTML markup for ctx.node and all its descendents.
|
@@ -2367,7 +2570,7 @@ $.extend(Fancytree.prototype,
|
|
2367
2570
|
*/
|
2368
2571
|
nodeRemoveMarkup: function(ctx) {
|
2369
2572
|
var node = ctx.node;
|
2370
|
-
FT.debug("nodeRemoveMarkup()", node.toString());
|
2573
|
+
// FT.debug("nodeRemoveMarkup()", node.toString());
|
2371
2574
|
// TODO: Unlink attr.ftnode to support GC
|
2372
2575
|
if(node.li){
|
2373
2576
|
$(node.li).remove();
|
@@ -2376,7 +2579,7 @@ $.extend(Fancytree.prototype,
|
|
2376
2579
|
this.nodeRemoveChildMarkup(ctx);
|
2377
2580
|
},
|
2378
2581
|
/**
|
2379
|
-
* Create
|
2582
|
+
* Create `<li><span>..</span> .. </li>` tags for this node.
|
2380
2583
|
*
|
2381
2584
|
* This method takes care that all HTML markup is created that is required
|
2382
2585
|
* to display this node in it's current state.
|
@@ -2386,7 +2589,7 @@ $.extend(Fancytree.prototype,
|
|
2386
2589
|
* nodeRenderTitle() and nodeRenderStatus() are implied.
|
2387
2590
|
*
|
2388
2591
|
* Note: if a node was created/removed, nodeRender() must be called for the
|
2389
|
-
* parent
|
2592
|
+
* parent.
|
2390
2593
|
* <code>
|
2391
2594
|
* <li id='KEY' ftnode=NODE>
|
2392
2595
|
* <span class='fancytree-node fancytree-expanded fancytree-has-children fancytree-lastsib fancytree-exp-el fancytree-ico-e'>
|
@@ -2402,10 +2605,10 @@ $.extend(Fancytree.prototype,
|
|
2402
2605
|
* </li>
|
2403
2606
|
* </code>
|
2404
2607
|
*
|
2405
|
-
* @param
|
2406
|
-
* @param
|
2407
|
-
* @param
|
2408
|
-
* @param
|
2608
|
+
* @param {EventData} ctx
|
2609
|
+
* @param {boolean} [force=false] re-render, even if html markup was already created
|
2610
|
+
* @param {boolean} [deep=false] also render all descendants, even if parent is collapsed
|
2611
|
+
* @param {boolean} [collapsed=false] force root node to be collapsed, so we can apply animated expand later
|
2409
2612
|
*/
|
2410
2613
|
nodeRender: function(ctx, force, deep, collapsed, _recursive) {
|
2411
2614
|
/* This method must take care of all cases where the current data mode
|
@@ -2426,10 +2629,10 @@ $.extend(Fancytree.prototype,
|
|
2426
2629
|
parent = node.parent,
|
2427
2630
|
isRootNode = !parent,
|
2428
2631
|
children = node.children;
|
2429
|
-
FT.debug("nodeRender(" + !!force + ", " + !!deep + ")", node.toString());
|
2632
|
+
// FT.debug("nodeRender(" + !!force + ", " + !!deep + ")", node.toString());
|
2430
2633
|
|
2431
2634
|
if( ! isRootNode && ! parent.ul ) {
|
2432
|
-
//
|
2635
|
+
// Calling node.collapse on a deep, unrendered node
|
2433
2636
|
return;
|
2434
2637
|
}
|
2435
2638
|
_assert(isRootNode || parent.ul, "parent UL must exist");
|
@@ -2485,6 +2688,7 @@ $.extend(Fancytree.prototype,
|
|
2485
2688
|
}
|
2486
2689
|
}else{
|
2487
2690
|
// this.nodeRenderTitle(ctx);
|
2691
|
+
this.nodeRenderStatus(ctx);
|
2488
2692
|
}
|
2489
2693
|
// Allow tweaking after node state was rendered
|
2490
2694
|
if ( opts.renderNode ){
|
@@ -2535,7 +2739,7 @@ $.extend(Fancytree.prototype,
|
|
2535
2739
|
childNode1 = children[i];
|
2536
2740
|
childNode2 = childLI.ftnode;
|
2537
2741
|
if( childNode1 !== childNode2 ) {
|
2538
|
-
node.debug("_fixOrder: mismatch at index " + i + ": " + childNode1 + " != " + childNode2);
|
2742
|
+
// node.debug("_fixOrder: mismatch at index " + i + ": " + childNode1 + " != " + childNode2);
|
2539
2743
|
node.ul.insertBefore(childNode1.li, childNode2.li);
|
2540
2744
|
} else {
|
2541
2745
|
childLI = childLI.nextSibling;
|
@@ -2552,7 +2756,7 @@ $.extend(Fancytree.prototype,
|
|
2552
2756
|
}
|
2553
2757
|
if( !isRootNode ){
|
2554
2758
|
// Update element classes according to node state
|
2555
|
-
this.nodeRenderStatus(ctx);
|
2759
|
+
// this.nodeRenderStatus(ctx);
|
2556
2760
|
// Finally add the whole structure to the DOM, so the browser can render
|
2557
2761
|
if(firstTime){
|
2558
2762
|
parent.ul.appendChild(node.li);
|
@@ -2560,7 +2764,10 @@ $.extend(Fancytree.prototype,
|
|
2560
2764
|
}
|
2561
2765
|
},
|
2562
2766
|
/** Create HTML for the node's outer <span> (expander, checkbox, icon, and title).
|
2767
|
+
*
|
2768
|
+
* nodeRenderStatus() is implied.
|
2563
2769
|
* @param {EventData} ctx
|
2770
|
+
* @param {string} [title] optinal new title
|
2564
2771
|
*/
|
2565
2772
|
nodeRenderTitle: function(ctx, title) {
|
2566
2773
|
// set node connector images, links and text
|
@@ -2600,7 +2807,7 @@ $.extend(Fancytree.prototype,
|
|
2600
2807
|
}
|
2601
2808
|
}
|
2602
2809
|
// Checkbox mode
|
2603
|
-
if( opts.checkbox && node.hideCheckbox !== true && !node.isStatusNode ) {
|
2810
|
+
if( opts.checkbox && node.hideCheckbox !== true && !node.isStatusNode() ) {
|
2604
2811
|
if(aria){
|
2605
2812
|
ares.push("<span role='checkbox' class='fancytree-checkbox'></span>");
|
2606
2813
|
}else{
|
@@ -2628,7 +2835,7 @@ $.extend(Fancytree.prototype,
|
|
2628
2835
|
}
|
2629
2836
|
if(!nodeTitle){
|
2630
2837
|
// TODO: escape tooltip string
|
2631
|
-
tooltip = node.tooltip ? " title='" + node.tooltip
|
2838
|
+
tooltip = node.tooltip ? " title='" + FT.escapeHtml(node.tooltip) + "'" : "";
|
2632
2839
|
id = aria ? " id='ftal_" + node.key + "'" : "";
|
2633
2840
|
role = aria ? " role='treeitem'" : "";
|
2634
2841
|
tabindex = opts.titlesTabbable ? " tabindex='0'" : "";
|
@@ -2639,6 +2846,8 @@ $.extend(Fancytree.prototype,
|
|
2639
2846
|
// Note: this will trigger focusout, if node had the focus
|
2640
2847
|
//$(node.span).html(ares.join("")); // it will cleanup the jQuery data currently associated with SPAN (if any), but it executes more slowly
|
2641
2848
|
node.span.innerHTML = ares.join("");
|
2849
|
+
// Update CSS classes
|
2850
|
+
this.nodeRenderStatus(ctx);
|
2642
2851
|
},
|
2643
2852
|
/** Update element classes according to node state.
|
2644
2853
|
* @param {EventData} ctx
|
@@ -2668,7 +2877,7 @@ $.extend(Fancytree.prototype,
|
|
2668
2877
|
cnList.push(cn.active);
|
2669
2878
|
// $(">span.fancytree-title", statusElem).attr("tabindex", "0");
|
2670
2879
|
// tree.$container.removeAttr("tabindex");
|
2671
|
-
}else{
|
2880
|
+
// }else{
|
2672
2881
|
// $(">span.fancytree-title", statusElem).removeAttr("tabindex");
|
2673
2882
|
// tree.$container.attr("tabindex", "0");
|
2674
2883
|
}
|
@@ -2712,6 +2921,12 @@ $.extend(Fancytree.prototype,
|
|
2712
2921
|
if( node.partsel ){
|
2713
2922
|
cnList.push(cn.partsel);
|
2714
2923
|
}
|
2924
|
+
if( node._isLoading ){
|
2925
|
+
cnList.push(cn.loading);
|
2926
|
+
}
|
2927
|
+
if( node._error ){
|
2928
|
+
cnList.push(cn.error);
|
2929
|
+
}
|
2715
2930
|
if( node.selected ){
|
2716
2931
|
cnList.push(cn.selected);
|
2717
2932
|
if(aria){
|
@@ -2755,7 +2970,7 @@ $.extend(Fancytree.prototype,
|
|
2755
2970
|
* If flag is false, the node is deactivated (must be a synchronous operation)
|
2756
2971
|
* @param {EventData} ctx
|
2757
2972
|
* @param {boolean} [flag=true]
|
2758
|
-
* @param {object} [opts] additional options. Defaults to {}
|
2973
|
+
* @param {object} [opts] additional options. Defaults to {noEvents: false}
|
2759
2974
|
*/
|
2760
2975
|
nodeSetActive: function(ctx, flag, callOpts) {
|
2761
2976
|
// Handle user click / [space] / [enter], according to clickFolderMode.
|
@@ -2765,16 +2980,17 @@ $.extend(Fancytree.prototype,
|
|
2765
2980
|
tree = ctx.tree,
|
2766
2981
|
opts = ctx.options,
|
2767
2982
|
// userEvent = !!ctx.originalEvent,
|
2983
|
+
noEvents = (callOpts.noEvents === true),
|
2768
2984
|
isActive = (node === tree.activeNode);
|
2769
2985
|
|
2770
2986
|
// flag defaults to true
|
2771
2987
|
flag = (flag !== false);
|
2772
|
-
node.debug("nodeSetActive", flag);
|
2988
|
+
// node.debug("nodeSetActive", flag);
|
2773
2989
|
|
2774
2990
|
if(isActive === flag){
|
2775
2991
|
// Nothing to do
|
2776
2992
|
return _getResolvedPromise(node);
|
2777
|
-
}else if(flag && this._triggerNodeEvent("beforeActivate", node, ctx.originalEvent) === false ){
|
2993
|
+
}else if(flag && !noEvents && this._triggerNodeEvent("beforeActivate", node, ctx.originalEvent) === false ){
|
2778
2994
|
// Callback returned false
|
2779
2995
|
return _getRejectedPromise(node, ["rejected"]);
|
2780
2996
|
}
|
@@ -2786,24 +3002,29 @@ $.extend(Fancytree.prototype,
|
|
2786
3002
|
_assert(tree.activeNode === null, "deactivate was out of sync?");
|
2787
3003
|
}
|
2788
3004
|
if(opts.activeVisible){
|
2789
|
-
tree.nodeMakeVisible(ctx);
|
3005
|
+
// tree.nodeMakeVisible(ctx);
|
3006
|
+
node.makeVisible();
|
2790
3007
|
}
|
2791
3008
|
tree.activeNode = node;
|
2792
3009
|
tree.nodeRenderStatus(ctx);
|
2793
3010
|
tree.nodeSetFocus(ctx);
|
2794
|
-
|
3011
|
+
if( !noEvents ) {
|
3012
|
+
tree._triggerNodeEvent("activate", node, ctx.originalEvent);
|
3013
|
+
}
|
2795
3014
|
}else{
|
2796
3015
|
_assert(tree.activeNode === node, "node was not active (inconsistency)");
|
2797
3016
|
tree.activeNode = null;
|
2798
3017
|
this.nodeRenderStatus(ctx);
|
2799
|
-
|
3018
|
+
if( !noEvents ) {
|
3019
|
+
ctx.tree._triggerNodeEvent("deactivate", node, ctx.originalEvent);
|
3020
|
+
}
|
2800
3021
|
}
|
2801
3022
|
},
|
2802
3023
|
/** Expand or collapse node, return Deferred.promise.
|
2803
3024
|
*
|
2804
3025
|
* @param {EventData} ctx
|
2805
3026
|
* @param {boolean} [flag=true]
|
2806
|
-
* @param {object} [opts] additional options. Defaults to {noAnimation: false}
|
3027
|
+
* @param {object} [opts] additional options. Defaults to {noAnimation: false, noEvents: false}
|
2807
3028
|
* @returns {$.Promise} The deferred will be resolved as soon as the (lazy)
|
2808
3029
|
* data was retrieved, rendered, and the expand animation finshed.
|
2809
3030
|
*/
|
@@ -2813,24 +3034,26 @@ $.extend(Fancytree.prototype,
|
|
2813
3034
|
node = ctx.node,
|
2814
3035
|
tree = ctx.tree,
|
2815
3036
|
opts = ctx.options,
|
2816
|
-
noAnimation = callOpts.noAnimation === true
|
3037
|
+
noAnimation = (callOpts.noAnimation === true),
|
3038
|
+
noEvents = (callOpts.noEvents === true);
|
2817
3039
|
|
2818
3040
|
// flag defaults to true
|
2819
3041
|
flag = (flag !== false);
|
2820
3042
|
|
2821
|
-
node.debug("nodeSetExpanded(" + flag + ")");
|
3043
|
+
// node.debug("nodeSetExpanded(" + flag + ")");
|
2822
3044
|
|
2823
3045
|
if((node.expanded && flag) || (!node.expanded && !flag)){
|
2824
3046
|
// Nothing to do
|
2825
|
-
node.debug("nodeSetExpanded(" + flag + "): nothing to do");
|
3047
|
+
// node.debug("nodeSetExpanded(" + flag + "): nothing to do");
|
2826
3048
|
return _getResolvedPromise(node);
|
2827
3049
|
}else if(flag && !node.lazy && !node.hasChildren() ){
|
2828
3050
|
// Prevent expanding of empty nodes
|
2829
|
-
return _getRejectedPromise(node, ["empty"]);
|
3051
|
+
// return _getRejectedPromise(node, ["empty"]);
|
3052
|
+
return _getResolvedPromise(node);
|
2830
3053
|
}else if( !flag && node.getLevel() < opts.minExpandLevel ) {
|
2831
3054
|
// Prevent collapsing locked levels
|
2832
3055
|
return _getRejectedPromise(node, ["locked"]);
|
2833
|
-
}else if ( this._triggerNodeEvent("beforeExpand", node, ctx.originalEvent) === false ){
|
3056
|
+
}else if ( !noEvents && this._triggerNodeEvent("beforeExpand", node, ctx.originalEvent) === false ){
|
2834
3057
|
// Callback returned false
|
2835
3058
|
return _getRejectedPromise(node, ["rejected"]);
|
2836
3059
|
}
|
@@ -2857,10 +3080,17 @@ $.extend(Fancytree.prototype,
|
|
2857
3080
|
}
|
2858
3081
|
// Trigger expand/collapse after expanding
|
2859
3082
|
dfd.done(function(){
|
2860
|
-
ctx.tree._triggerNodeEvent(flag ? "expand" : "collapse", ctx);
|
2861
3083
|
if( opts.autoScroll && !noAnimation ) {
|
2862
3084
|
// Scroll down to last child, but keep current node visible
|
2863
|
-
node.getLastChild().scrollIntoView(true, node)
|
3085
|
+
node.getLastChild().scrollIntoView(true, node).always(function(){
|
3086
|
+
if( !noEvents ) {
|
3087
|
+
ctx.tree._triggerNodeEvent(flag ? "expand" : "collapse", ctx);
|
3088
|
+
}
|
3089
|
+
});
|
3090
|
+
} else {
|
3091
|
+
if( !noEvents ) {
|
3092
|
+
ctx.tree._triggerNodeEvent(flag ? "expand" : "collapse", ctx);
|
3093
|
+
}
|
2864
3094
|
}
|
2865
3095
|
});
|
2866
3096
|
|
@@ -2896,9 +3126,9 @@ $.extend(Fancytree.prototype,
|
|
2896
3126
|
} else {
|
2897
3127
|
duration = opts.fx.duration || 200;
|
2898
3128
|
easing = opts.fx.easing;
|
2899
|
-
node.debug("nodeSetExpanded: animate start...");
|
3129
|
+
// node.debug("nodeSetExpanded: animate start...");
|
2900
3130
|
$(node.ul).animate(opts.fx, duration, easing, function(){
|
2901
|
-
node.debug("nodeSetExpanded: animate done");
|
3131
|
+
// node.debug("nodeSetExpanded: animate done");
|
2902
3132
|
callback();
|
2903
3133
|
});
|
2904
3134
|
return;
|
@@ -2910,9 +3140,9 @@ $.extend(Fancytree.prototype,
|
|
2910
3140
|
|
2911
3141
|
// Load lazy nodes, if any. Then continue with _afterLoad()
|
2912
3142
|
if(flag && node.lazy && node.hasChildren() === undefined){
|
2913
|
-
node.debug("nodeSetExpanded: load start...");
|
2914
|
-
node.
|
2915
|
-
node.debug("nodeSetExpanded: load done");
|
3143
|
+
// node.debug("nodeSetExpanded: load start...");
|
3144
|
+
node.load().done(function(){
|
3145
|
+
// node.debug("nodeSetExpanded: load done");
|
2916
3146
|
if(dfd.notifyWith){ // requires jQuery 1.6+
|
2917
3147
|
dfd.notifyWith(node, ["loaded"]);
|
2918
3148
|
}
|
@@ -2921,8 +3151,8 @@ $.extend(Fancytree.prototype,
|
|
2921
3151
|
_afterLoad(function () { dfd.rejectWith(node, ["load failed (" + errMsg + ")"]); });
|
2922
3152
|
});
|
2923
3153
|
/*
|
2924
|
-
var source = tree._triggerNodeEvent("
|
2925
|
-
_assert(typeof source !== "boolean", "
|
3154
|
+
var source = tree._triggerNodeEvent("lazyLoad", node, ctx.originalEvent);
|
3155
|
+
_assert(typeof source !== "boolean", "lazyLoad event must return source in data.result");
|
2926
3156
|
node.debug("nodeSetExpanded: load start...");
|
2927
3157
|
this._callHook("nodeLoadChildren", ctx, source).done(function(){
|
2928
3158
|
node.debug("nodeSetExpanded: load done");
|
@@ -2937,15 +3167,15 @@ $.extend(Fancytree.prototype,
|
|
2937
3167
|
}else{
|
2938
3168
|
_afterLoad(function () { dfd.resolveWith(node); });
|
2939
3169
|
}
|
2940
|
-
node.debug("nodeSetExpanded: returns");
|
3170
|
+
// node.debug("nodeSetExpanded: returns");
|
2941
3171
|
return dfd.promise();
|
2942
3172
|
},
|
2943
|
-
/**
|
3173
|
+
/** Focus ot blur this node.
|
2944
3174
|
* @param {EventData} ctx
|
2945
3175
|
* @param {boolean} [flag=true]
|
2946
3176
|
*/
|
2947
3177
|
nodeSetFocus: function(ctx, flag) {
|
2948
|
-
ctx.node.debug("nodeSetFocus(" + flag + ")");
|
3178
|
+
// ctx.node.debug("nodeSetFocus(" + flag + ")");
|
2949
3179
|
var ctx2,
|
2950
3180
|
tree = ctx.tree,
|
2951
3181
|
node = ctx.node;
|
@@ -2955,7 +3185,7 @@ $.extend(Fancytree.prototype,
|
|
2955
3185
|
// Blur previous node if any
|
2956
3186
|
if(tree.focusNode){
|
2957
3187
|
if(tree.focusNode === node && flag){
|
2958
|
-
node.debug("nodeSetFocus(" + flag + "): nothing to do");
|
3188
|
+
// node.debug("nodeSetFocus(" + flag + "): nothing to do");
|
2959
3189
|
return;
|
2960
3190
|
}
|
2961
3191
|
ctx2 = $.extend({}, ctx, {node: tree.focusNode});
|
@@ -2970,7 +3200,8 @@ $.extend(Fancytree.prototype,
|
|
2970
3200
|
// Note: we pass _calledByNodeSetFocus=true
|
2971
3201
|
this._callHook("treeSetFocus", ctx, true, true);
|
2972
3202
|
}
|
2973
|
-
this.nodeMakeVisible(ctx);
|
3203
|
+
// this.nodeMakeVisible(ctx);
|
3204
|
+
node.makeVisible();
|
2974
3205
|
tree.focusNode = node;
|
2975
3206
|
// node.debug("FOCUS...");
|
2976
3207
|
// $(node.span).find(".fancytree-title").focus();
|
@@ -3032,19 +3263,19 @@ $.extend(Fancytree.prototype,
|
|
3032
3263
|
* @param details
|
3033
3264
|
*/
|
3034
3265
|
nodeSetStatus: function(ctx, status, message, details) {
|
3035
|
-
var
|
3036
|
-
|
3037
|
-
|
3038
|
-
cn = ctx.options._classNames;
|
3266
|
+
var node = ctx.node,
|
3267
|
+
tree = ctx.tree;
|
3268
|
+
// cn = ctx.options._classNames;
|
3039
3269
|
|
3040
|
-
_clearStatusNode
|
3270
|
+
function _clearStatusNode() {
|
3271
|
+
// Remove dedicated dummy node, if any
|
3041
3272
|
var firstChild = ( node.children ? node.children[0] : null );
|
3042
|
-
if ( firstChild && firstChild.isStatusNode ) {
|
3273
|
+
if ( firstChild && firstChild.isStatusNode() ) {
|
3043
3274
|
try{
|
3044
3275
|
// I've seen exceptions here with loadKeyPath...
|
3045
3276
|
if(node.ul){
|
3046
3277
|
node.ul.removeChild(firstChild.li);
|
3047
|
-
firstChild.li = null; // avoid leaks (issue 215)
|
3278
|
+
firstChild.li = null; // avoid leaks (DT issue 215)
|
3048
3279
|
}
|
3049
3280
|
}catch(e){}
|
3050
3281
|
if( node.children.length === 1 ){
|
@@ -3053,48 +3284,58 @@ $.extend(Fancytree.prototype,
|
|
3053
3284
|
node.children.shift();
|
3054
3285
|
}
|
3055
3286
|
}
|
3056
|
-
}
|
3057
|
-
_setStatusNode
|
3287
|
+
}
|
3288
|
+
function _setStatusNode(data, type) {
|
3289
|
+
// Create/modify the dedicated dummy node for 'loading...' or
|
3290
|
+
// 'error!' status. (only called for direct child of the invisible
|
3291
|
+
// system root)
|
3058
3292
|
var firstChild = ( node.children ? node.children[0] : null );
|
3059
|
-
if ( firstChild && firstChild.isStatusNode ) {
|
3293
|
+
if ( firstChild && firstChild.isStatusNode() ) {
|
3060
3294
|
$.extend(firstChild, data);
|
3061
3295
|
tree._callHook("nodeRender", firstChild);
|
3062
3296
|
} else {
|
3063
3297
|
data.key = "_statusNode";
|
3064
3298
|
node._setChildren([data]);
|
3065
|
-
node.children[0].
|
3299
|
+
node.children[0].statusNodeType = type;
|
3066
3300
|
tree.render();
|
3067
3301
|
}
|
3068
3302
|
return node.children[0];
|
3069
|
-
}
|
3070
|
-
|
3303
|
+
}
|
3304
|
+
|
3305
|
+
switch( status ){
|
3071
3306
|
case "ok":
|
3072
3307
|
_clearStatusNode();
|
3073
|
-
$(node.span).removeClass(cn.loading);
|
3074
|
-
|
3308
|
+
// $(node.span).removeClass(cn.loading).removeClass(cn.error);
|
3309
|
+
node._isLoading = false;
|
3310
|
+
node._error = null;
|
3311
|
+
node.renderStatus();
|
3075
3312
|
break;
|
3076
3313
|
case "loading":
|
3077
|
-
$(node.span).removeClass(cn.error);
|
3078
|
-
|
3079
|
-
if(!node.parent){
|
3314
|
+
// $(node.span).removeClass(cn.error).addClass(cn.loading);
|
3315
|
+
if( !node.parent ) {
|
3080
3316
|
_setStatusNode({
|
3081
3317
|
title: tree.options.strings.loading + (message ? " (" + message + ") " : ""),
|
3082
3318
|
tooltip: details,
|
3083
3319
|
extraClasses: "fancytree-statusnode-wait"
|
3084
|
-
});
|
3320
|
+
}, status);
|
3085
3321
|
}
|
3322
|
+
node._isLoading = true;
|
3323
|
+
node._error = null;
|
3324
|
+
node.renderStatus();
|
3086
3325
|
break;
|
3087
3326
|
case "error":
|
3088
|
-
$(node.span).removeClass(cn.loading);
|
3089
|
-
$(node.span).addClass(cn.error);
|
3327
|
+
// $(node.span).removeClass(cn.loading).addClass(cn.error);
|
3090
3328
|
_setStatusNode({
|
3091
3329
|
title: tree.options.strings.loadError + (message ? " (" + message + ") " : ""),
|
3092
3330
|
tooltip: details,
|
3093
3331
|
extraClasses: "fancytree-statusnode-error"
|
3094
|
-
});
|
3332
|
+
}, status);
|
3333
|
+
node._isLoading = false;
|
3334
|
+
node._error = { message: message, details: details };
|
3335
|
+
node.renderStatus();
|
3095
3336
|
break;
|
3096
3337
|
default:
|
3097
|
-
$.error("invalid status " + status);
|
3338
|
+
$.error("invalid node status " + status);
|
3098
3339
|
}
|
3099
3340
|
},
|
3100
3341
|
/**
|
@@ -3140,7 +3381,7 @@ $.extend(Fancytree.prototype,
|
|
3140
3381
|
},
|
3141
3382
|
/** Parse Fancytree from source, as configured in the options.
|
3142
3383
|
* @param {EventData} ctx
|
3143
|
-
* @param {object} [source] new source
|
3384
|
+
* @param {object} [source] optional new source (use last data otherwise)
|
3144
3385
|
*/
|
3145
3386
|
treeLoad: function(ctx, source) {
|
3146
3387
|
var type, $ul,
|
@@ -3162,6 +3403,8 @@ $.extend(Fancytree.prototype,
|
|
3162
3403
|
$ul = $container.find(">ul:first");
|
3163
3404
|
$ul.addClass("ui-fancytree-source ui-helper-hidden");
|
3164
3405
|
source = $.ui.fancytree.parseHtml($ul);
|
3406
|
+
// allow to init tree.data.foo from <ul data-foo=''>
|
3407
|
+
this.data = $.extend(this.data, _getElementDataAsDict($ul));
|
3165
3408
|
break;
|
3166
3409
|
case "json":
|
3167
3410
|
// $().addClass("ui-helper-hidden");
|
@@ -3193,12 +3436,23 @@ $.extend(Fancytree.prototype,
|
|
3193
3436
|
});
|
3194
3437
|
return dfd;
|
3195
3438
|
},
|
3439
|
+
/** Node was inserted into or removed from the tree.
|
3440
|
+
* @param {EventData} ctx
|
3441
|
+
* @param {boolean} add
|
3442
|
+
* @param {FancytreeNode} node
|
3443
|
+
*/
|
3444
|
+
treeRegisterNode: function(ctx, add, node) {
|
3445
|
+
},
|
3446
|
+
/** Widget got focus.
|
3447
|
+
* @param {EventData} ctx
|
3448
|
+
* @param {boolean} [flag=true]
|
3449
|
+
*/
|
3196
3450
|
treeSetFocus: function(ctx, flag, _calledByNodeSetFocus) {
|
3197
3451
|
flag = (flag !== false);
|
3198
3452
|
|
3199
|
-
this.debug("treeSetFocus(" + flag + "), _calledByNodeSetFocus: " + _calledByNodeSetFocus);
|
3200
|
-
this.debug(" focusNode: " + this.focusNode);
|
3201
|
-
this.debug(" activeNode: " + this.activeNode);
|
3453
|
+
// this.debug("treeSetFocus(" + flag + "), _calledByNodeSetFocus: " + _calledByNodeSetFocus);
|
3454
|
+
// this.debug(" focusNode: " + this.focusNode);
|
3455
|
+
// this.debug(" activeNode: " + this.activeNode);
|
3202
3456
|
if( flag !== this.hasFocus() ){
|
3203
3457
|
this._hasFocus = flag;
|
3204
3458
|
this.$container.toggleClass("fancytree-treefocus", flag);
|
@@ -3211,20 +3465,21 @@ $.extend(Fancytree.prototype,
|
|
3211
3465
|
/* ******************************************************************************
|
3212
3466
|
* jQuery UI widget boilerplate
|
3213
3467
|
*/
|
3468
|
+
|
3214
3469
|
/**
|
3215
|
-
*
|
3216
|
-
*
|
3217
|
-
*
|
3218
|
-
*
|
3219
|
-
*
|
3220
|
-
*
|
3221
|
-
* var tree = $(selector).fancytree("getTree");
|
3222
|
-
* // Access static members:
|
3223
|
-
* alert($.ui.fancytree.version);
|
3470
|
+
* The plugin (derrived from <a href=" http://api.jqueryui.com/jQuery.widget/">jQuery.Widget</a>).<br>
|
3471
|
+
* This constructor is not called directly. Use `$(selector).fancytree({})`
|
3472
|
+
* to initialize the plugin instead.<br>
|
3473
|
+
* <pre class="sh_javascript sunlight-highlight-javascript">// Access widget methods and members:
|
3474
|
+
* var tree = $("#tree").fancytree("getTree");
|
3475
|
+
* var node = $("#tree").fancytree("getActiveNode", "1234");
|
3224
3476
|
* </pre>
|
3477
|
+
*
|
3478
|
+
* @mixin Fancytree_Widget
|
3225
3479
|
*/
|
3480
|
+
|
3226
3481
|
$.widget("ui.fancytree",
|
3227
|
-
/** @lends
|
3482
|
+
/** @lends Fancytree_Widget# */
|
3228
3483
|
{
|
3229
3484
|
/**These options will be used as defaults
|
3230
3485
|
* @type {FancytreeOptions}
|
@@ -3281,7 +3536,7 @@ $.widget("ui.fancytree",
|
|
3281
3536
|
error: "fancytree-error"
|
3282
3537
|
},
|
3283
3538
|
// events
|
3284
|
-
|
3539
|
+
lazyLoad: null,
|
3285
3540
|
postProcess: null
|
3286
3541
|
},
|
3287
3542
|
/* Set up the widget, Called on first $().fancytree() */
|
@@ -3466,29 +3721,35 @@ $.widget("ui.fancytree",
|
|
3466
3721
|
return ( tree._triggerNodeEvent("dblclick", ctx, event) === false ) ? false : tree._callHook("nodeDblclick", ctx);
|
3467
3722
|
}
|
3468
3723
|
// } catch(e) {
|
3469
|
-
// // var _ = null; // issue 117 // TODO
|
3724
|
+
// // var _ = null; // DT issue 117 // TODO
|
3470
3725
|
// $.error(e);
|
3471
3726
|
} finally {
|
3472
3727
|
tree.phase = prevPhase;
|
3473
3728
|
}
|
3474
3729
|
});
|
3475
3730
|
},
|
3476
|
-
/**
|
3731
|
+
/** Return the active node or null.
|
3732
|
+
* @returns {FancytreeNode}
|
3733
|
+
*/
|
3477
3734
|
getActiveNode: function() {
|
3478
3735
|
return this.tree.activeNode;
|
3479
3736
|
},
|
3480
|
-
/**
|
3737
|
+
/** Return the matching node or null.
|
3481
3738
|
* @param {string} key
|
3482
|
-
* @returns {FancytreeNode}
|
3739
|
+
* @returns {FancytreeNode}
|
3483
3740
|
*/
|
3484
3741
|
getNodeByKey: function(key) {
|
3485
3742
|
return this.tree.getNodeByKey(key);
|
3486
3743
|
},
|
3487
|
-
/**
|
3744
|
+
/** Return the invisible system root node.
|
3745
|
+
* @returns {FancytreeNode}
|
3746
|
+
*/
|
3488
3747
|
getRootNode: function() {
|
3489
3748
|
return this.tree.rootNode;
|
3490
3749
|
},
|
3491
|
-
/**
|
3750
|
+
/** Return the current tree instance.
|
3751
|
+
* @returns {Fancytree}
|
3752
|
+
*/
|
3492
3753
|
getTree: function() {
|
3493
3754
|
return this.tree;
|
3494
3755
|
}
|
@@ -3497,22 +3758,26 @@ $.widget("ui.fancytree",
|
|
3497
3758
|
// $.ui.fancytree was created by the widget factory. Create a local shortcut:
|
3498
3759
|
FT = $.ui.fancytree;
|
3499
3760
|
|
3500
|
-
|
3501
|
-
* Static members in the `$.ui.fancytree` namespace
|
3502
|
-
*
|
3503
|
-
*
|
3504
|
-
* alert(""version: " + $.ui.fancytree.version);
|
3761
|
+
/**
|
3762
|
+
* Static members in the `$.ui.fancytree` namespace.<br>
|
3763
|
+
* <br>
|
3764
|
+
* <pre class="sh_javascript sunlight-highlight-javascript">// Access static members:
|
3505
3765
|
* var node = $.ui.fancytree.getNode(element);
|
3766
|
+
* alert($.ui.fancytree.version);
|
3767
|
+
* </pre>
|
3768
|
+
*
|
3769
|
+
* @mixin Fancytree_Static
|
3506
3770
|
*/
|
3507
3771
|
$.extend($.ui.fancytree,
|
3508
|
-
/** @lends
|
3772
|
+
/** @lends Fancytree_Static# */
|
3509
3773
|
{
|
3510
3774
|
/** @type {string} */
|
3511
|
-
version: "2.0.0-
|
3775
|
+
version: "2.0.0-11", // Set to semver by 'grunt release'
|
3512
3776
|
/** @type {string} */
|
3513
|
-
buildType: "
|
3777
|
+
buildType: "production", // Set to 'production' by 'grunt build'
|
3514
3778
|
/** @type {int} */
|
3515
|
-
debugLevel: 1,
|
3779
|
+
debugLevel: 1, // Set to 1 by 'grunt build'
|
3780
|
+
// Used by $.ui.fancytree.debug() and as default for tree.options.debugLevel
|
3516
3781
|
|
3517
3782
|
_nextId: 1,
|
3518
3783
|
_nextNodeKey: 1,
|
@@ -3528,19 +3793,48 @@ $.extend($.ui.fancytree,
|
|
3528
3793
|
// http://jqueryui.com/upgrade-guide/1.9/#deprecated-offset-option-merged-into-my-and-at
|
3529
3794
|
positionMyOfs: isVersionAtLeast($.ui.version, 1, 9)
|
3530
3795
|
},
|
3796
|
+
/** Throw an error if condition fails (debug method).
|
3797
|
+
* @param {boolean} cond
|
3798
|
+
* @param {string} msg
|
3799
|
+
*/
|
3531
3800
|
assert: function(cond, msg){
|
3532
3801
|
return _assert(cond, msg);
|
3533
3802
|
},
|
3803
|
+
/** Write message to console if debugLevel >= 2
|
3804
|
+
* @param {string} msg
|
3805
|
+
*/
|
3534
3806
|
debug: function(msg){
|
3535
3807
|
/*jshint expr:true */
|
3536
3808
|
($.ui.fancytree.debugLevel >= 2) && consoleApply("log", arguments);
|
3537
3809
|
},
|
3810
|
+
/** Write error message to console.
|
3811
|
+
* @param {string} msg
|
3812
|
+
*/
|
3538
3813
|
error: function(msg){
|
3539
3814
|
consoleApply("error", arguments);
|
3540
3815
|
},
|
3816
|
+
/** Convert <, >, &, ", ', / to the equivalent entitites.
|
3817
|
+
*
|
3818
|
+
* @param {string} s
|
3819
|
+
* @returns {string}
|
3820
|
+
*/
|
3821
|
+
escapeHtml: function(s){
|
3822
|
+
return ("" + s).replace(/[&<>"'\/]/g, function (s) {
|
3823
|
+
return ENTITY_MAP[s];
|
3824
|
+
});
|
3825
|
+
},
|
3826
|
+
/** Inverse of escapeHtml().
|
3827
|
+
*
|
3828
|
+
* @param {string} s
|
3829
|
+
* @returns {string}
|
3830
|
+
*/
|
3831
|
+
unescapeHtml: function(s){
|
3832
|
+
var e = document.createElement("div");
|
3833
|
+
e.innerHTML = s;
|
3834
|
+
return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
|
3835
|
+
},
|
3541
3836
|
/** Return a {node: FancytreeNode, type: TYPE} object for a mouse event.
|
3542
3837
|
*
|
3543
|
-
* @static
|
3544
3838
|
* @param {Event} event Mouse event, e.g. click, ...
|
3545
3839
|
* @returns {string} 'title' | 'prefix' | 'expander' | 'checkbox' | 'icon' | undefined
|
3546
3840
|
*/
|
@@ -3563,12 +3857,12 @@ $.extend($.ui.fancytree,
|
|
3563
3857
|
res.type = "title";
|
3564
3858
|
}else if( /\bfancytree-expander\b/.test(tcn) ){
|
3565
3859
|
res.type = (res.node.hasChildren() === false ? "prefix" : "expander");
|
3566
|
-
}else if( /\bfancytree-checkbox\b/.test(tcn) ){
|
3860
|
+
}else if( /\bfancytree-checkbox\b/.test(tcn) || /\bfancytree-radio\b/.test(tcn) ){
|
3567
3861
|
res.type = "checkbox";
|
3568
3862
|
}else if( /\bfancytree-icon\b/.test(tcn) ){
|
3569
3863
|
res.type = "icon";
|
3570
3864
|
}else if( /\bfancytree-node\b/.test(tcn) ){
|
3571
|
-
// TODO:
|
3865
|
+
// TODO: (http://code.google.com/p/dynatree/issues/detail?id=93)
|
3572
3866
|
// res.type = this._getTypeForOuterNodeEvent(event);
|
3573
3867
|
res.type = "title";
|
3574
3868
|
}
|
@@ -3612,6 +3906,9 @@ $.extend($.ui.fancytree,
|
|
3612
3906
|
return null;
|
3613
3907
|
},
|
3614
3908
|
*/
|
3909
|
+
/** Write message to console if debugLevel >= 1
|
3910
|
+
* @param {string} msg
|
3911
|
+
*/
|
3615
3912
|
info: function(msg){
|
3616
3913
|
/*jshint expr:true */
|
3617
3914
|
($.ui.fancytree.debugLevel >= 1) && consoleApply("info", arguments);
|
@@ -3625,13 +3922,12 @@ $.extend($.ui.fancytree,
|
|
3625
3922
|
parseHtml: function($ul) {
|
3626
3923
|
// TODO: understand this:
|
3627
3924
|
/*jshint validthis:true */
|
3628
|
-
var
|
3629
|
-
|
3925
|
+
var extraClasses, i, l, iPos, tmp, tmp2, classes, className,
|
3926
|
+
$children = $ul.find(">li"),
|
3630
3927
|
children = [];
|
3631
|
-
// that = this;
|
3632
3928
|
|
3633
3929
|
$children.each(function() {
|
3634
|
-
var allData,
|
3930
|
+
var allData,
|
3635
3931
|
$li = $(this),
|
3636
3932
|
$liSpan = $li.find(">span:first", this),
|
3637
3933
|
$liA = $liSpan.length ? null : $li.find(">a:first"),
|
@@ -3685,24 +3981,20 @@ $.extend($.ui.fancytree,
|
|
3685
3981
|
d.key = tmp;
|
3686
3982
|
}
|
3687
3983
|
// Add <li data-NAME='...'> as node.data.NAME
|
3688
|
-
|
3689
|
-
allData = $li.data();
|
3690
|
-
// alert("d: " + JSON.stringify(allData));
|
3984
|
+
allData = _getElementDataAsDict($li);
|
3691
3985
|
if(allData && !$.isEmptyObject(allData)) {
|
3692
|
-
//
|
3693
|
-
|
3694
|
-
|
3695
|
-
|
3696
|
-
|
3697
|
-
|
3698
|
-
|
3699
|
-
|
3700
|
-
// see http://api.jquery.com/data/#data-html5
|
3701
|
-
$.extend(d.data, jsonData);
|
3986
|
+
// #56: Allow to set special node.attributes from data-...
|
3987
|
+
for(i=0, l=NODE_ATTRS.length; i<l; i++){
|
3988
|
+
tmp = NODE_ATTRS[i];
|
3989
|
+
tmp2 = allData[tmp];
|
3990
|
+
if( tmp2 != null ) {
|
3991
|
+
delete allData[tmp];
|
3992
|
+
d[tmp] = tmp2;
|
3993
|
+
}
|
3702
3994
|
}
|
3995
|
+
// All other data-... goes to node.data...
|
3996
|
+
$.extend(d.data, allData);
|
3703
3997
|
}
|
3704
|
-
// that.debug("parse ", d);
|
3705
|
-
// var childNode = parentTreeNode.addChild(data);
|
3706
3998
|
// Recursive reading of child nodes, if LI tag contains an UL tag
|
3707
3999
|
$ul = $li.find(">ul:first");
|
3708
4000
|
if( $ul.length ) {
|
@@ -3717,42 +4009,208 @@ $.extend($.ui.fancytree,
|
|
3717
4009
|
},
|
3718
4010
|
/** Add Fancytree extension definition to the list of globally available extensions.
|
3719
4011
|
*
|
3720
|
-
* @param {
|
4012
|
+
* @param {object} definition
|
3721
4013
|
*/
|
3722
4014
|
registerExtension: function(definition){
|
3723
4015
|
_assert(definition.name != null, "extensions must have a `name` property.");
|
3724
4016
|
_assert(definition.version != null, "extensions must have a `version` property.");
|
3725
4017
|
$.ui.fancytree._extensions[definition.name] = definition;
|
3726
4018
|
},
|
4019
|
+
/** Write warning message to console.
|
4020
|
+
* @param {string} msg
|
4021
|
+
*/
|
3727
4022
|
warn: function(msg){
|
3728
4023
|
consoleApply("warn", arguments);
|
3729
4024
|
}
|
3730
4025
|
});
|
3731
4026
|
|
3732
|
-
|
3733
|
-
//$.ui.fancytree.debug($.ui.fancytree.prototype);
|
3734
|
-
//$.ui.fancytree.prototype.options.debugLevel = $.ui.fancytree.debugLevel;
|
4027
|
+
}(jQuery, window, document));
|
3735
4028
|
|
4029
|
+
// Extending Fancytree
|
4030
|
+
// ===================
|
4031
|
+
//
|
4032
|
+
// See also the [live demo](http://wwwendt.de/tech/fancytree/demo/sample-ext-childcounter.html) of this code.
|
4033
|
+
//
|
4034
|
+
// Every extension should have a comment header containing some information
|
4035
|
+
// about the author, copyright and licensing. Also a pointer to the latest
|
4036
|
+
// source code.
|
4037
|
+
// Prefix with `/*!` so the comment is not removed by the minifier.
|
3736
4038
|
|
3737
|
-
|
3738
|
-
*
|
4039
|
+
/*!
|
4040
|
+
* jquery.fancytree.childcounter.js
|
4041
|
+
*
|
4042
|
+
* Add a child counter bubble to tree nodes.
|
4043
|
+
* (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)
|
4044
|
+
*
|
4045
|
+
* Copyright (c) 2014, Martin Wendt (http://wwWendt.de)
|
4046
|
+
*
|
4047
|
+
* Released under the MIT license
|
4048
|
+
* https://github.com/mar10/fancytree/wiki/LicenseInfo
|
4049
|
+
*
|
4050
|
+
* @version 2.0.0-11
|
4051
|
+
* @date 2014-04-27T22:28
|
3739
4052
|
*/
|
3740
|
-
// http://stackoverflow.com/questions/10918063/how-to-make-a-jquery-plugin-loadable-with-requirejs
|
3741
4053
|
|
3742
|
-
//
|
3743
|
-
// define( "jquery", [], function () { return jQuery; } );
|
3744
|
-
// }
|
4054
|
+
// To keep the global namespace clean, we wrap everything in a closure
|
3745
4055
|
|
3746
|
-
|
3747
|
-
|
3748
|
-
|
3749
|
-
|
3750
|
-
|
3751
|
-
|
3752
|
-
|
3753
|
-
|
3754
|
-
|
3755
|
-
|
4056
|
+
;(function($, undefined) {
|
4057
|
+
|
4058
|
+
// Consider to use [strict mode](http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/)
|
4059
|
+
"use strict";
|
4060
|
+
|
4061
|
+
// The [coding guidelines](http://contribute.jquery.org/style-guide/js/)
|
4062
|
+
// require jshint compliance.
|
4063
|
+
// But for this sample, we want to allow unused variables for demonstration purpose.
|
4064
|
+
|
4065
|
+
/*jshint unused:false */
|
4066
|
+
|
4067
|
+
|
4068
|
+
// Adding methods
|
4069
|
+
// --------------
|
4070
|
+
|
4071
|
+
// New member functions can be added to the `Fancytree` class.
|
4072
|
+
// This function will be available for every tree instance.
|
4073
|
+
//
|
4074
|
+
// var tree = $("#tree").fancytree("getTree");
|
4075
|
+
// tree.countSelected(false);
|
4076
|
+
|
4077
|
+
$.ui.fancytree._FancytreeClass.prototype.countSelected = function(topOnly){
|
4078
|
+
var tree = this,
|
4079
|
+
treeOptions = tree.options;
|
4080
|
+
return tree.getSelectedNodes(topOnly).length;
|
4081
|
+
};
|
4082
|
+
|
4083
|
+
|
4084
|
+
// The `FancytreeNode` class can also be easily extended. This would be called
|
4085
|
+
// like
|
4086
|
+
//
|
4087
|
+
// node.toUpper();
|
4088
|
+
|
4089
|
+
$.ui.fancytree._FancytreeNodeClass.prototype.toUpper = function(){
|
4090
|
+
var node = this;
|
4091
|
+
return node.setTitle(node.title.toUpperCase());
|
4092
|
+
};
|
4093
|
+
|
4094
|
+
|
4095
|
+
// Finally, we can extend the widget API and create functions that are called
|
4096
|
+
// like so:
|
4097
|
+
//
|
4098
|
+
// $("#tree").fancytree("widgetMethod1", "abc");
|
4099
|
+
|
4100
|
+
$.ui.fancytree.prototype.widgetMethod1 = function(arg1){
|
4101
|
+
var tree = this.tree;
|
4102
|
+
return arg1;
|
4103
|
+
};
|
4104
|
+
|
4105
|
+
|
4106
|
+
// Register a Fancytree extension
|
4107
|
+
// ------------------------------
|
4108
|
+
// A full blown extension, extension is available for all trees and can be
|
4109
|
+
// enabled like so (see also the [live demo](http://wwwendt.de/tech/fancytree/demo/sample-ext-childcounter.html)):
|
4110
|
+
//
|
4111
|
+
// <script src="../src/jquery.fancytree.js" type="text/javascript"></script>
|
4112
|
+
// <script src="../src/jquery.fancytree.childcounter.js" type="text/javascript"></script>
|
4113
|
+
// ...
|
4114
|
+
//
|
4115
|
+
// $("#tree").fancytree({
|
4116
|
+
// extensions: ["childcounter"],
|
4117
|
+
// childcounter: {
|
4118
|
+
// hideExpanded: true
|
4119
|
+
// },
|
4120
|
+
// ...
|
4121
|
+
// });
|
4122
|
+
//
|
4123
|
+
|
4124
|
+
|
4125
|
+
/* 'childcounter' extension */
|
4126
|
+
$.ui.fancytree.registerExtension({
|
4127
|
+
// Every extension must be registered by a unique name.
|
4128
|
+
name: "childcounter",
|
4129
|
+
// Version information should be compliant with [semver](http://semver.org)
|
4130
|
+
version: "1.0.0",
|
4131
|
+
|
4132
|
+
// Extension specific options and their defaults.
|
4133
|
+
// This options will be available as `tree.options.childcounter.hideExpanded`
|
4134
|
+
|
4135
|
+
options: {
|
4136
|
+
deep: true,
|
4137
|
+
hideZeros: true,
|
4138
|
+
hideExpanded: false
|
4139
|
+
},
|
4140
|
+
|
4141
|
+
// Attributes other than `options` (or functions) can be defined here, and
|
4142
|
+
// will be added to the tree.ext.EXTNAME namespace, in this case `tree.ext.childcounter.foo`.
|
4143
|
+
// They can also be accessed as `this._local.foo` from within the extension
|
4144
|
+
// methods.
|
4145
|
+
foo: 42,
|
4146
|
+
|
4147
|
+
// Local functions are prefixed with an underscore '_'.
|
4148
|
+
// Callable as `this._local._appendCounter()`.
|
4149
|
+
|
4150
|
+
_appendCounter: function(bar){
|
4151
|
+
var tree = this;
|
4152
|
+
},
|
4153
|
+
|
4154
|
+
// **Override virtual methods for this extension.**
|
4155
|
+
//
|
4156
|
+
// Fancytree implements a number of 'hook methods', prefixed by 'node...' or 'tree...'.
|
4157
|
+
// with a `ctx` argument (see [EventData](http://www.wwwendt.de/tech/fancytree/doc/jsdoc/global.html#EventData)
|
4158
|
+
// for details) and an extended calling context:<br>
|
4159
|
+
// `this` : the Fancytree instance<br>
|
4160
|
+
// `this._local`: the namespace that contains extension attributes and private methods (same as this.ext.EXTNAME)<br>
|
4161
|
+
// `this._super`: the virtual function that was overridden (member of previous extension or Fancytree)
|
4162
|
+
//
|
4163
|
+
// See also the [complete list of available hook functions](http://www.wwwendt.de/tech/fancytree/doc/jsdoc/Fancytree_Hooks.html).
|
4164
|
+
|
4165
|
+
/* Init */
|
4166
|
+
// `treeInit` is triggered when a tree is initalized. We can set up classes or
|
4167
|
+
// bind event handlers here...
|
4168
|
+
treeInit: function(ctx){
|
4169
|
+
var tree = this, // same as ctx.tree,
|
4170
|
+
opts = ctx.options,
|
4171
|
+
extOpts = ctx.options.childcounter;
|
4172
|
+
// Optionally check for dependencies with other extensions
|
4173
|
+
// this._requireExtension("glyph", false, false);
|
4174
|
+
// Call the base implementation
|
4175
|
+
this._super(ctx);
|
4176
|
+
// Add a class to the tree container
|
4177
|
+
this.$container.addClass("fancytree-ext-childcounter");
|
4178
|
+
},
|
4179
|
+
|
4180
|
+
// Destroy this tree instance (we only call the default implementation, so
|
4181
|
+
// this method could as well be omitted).
|
4182
|
+
|
4183
|
+
treeDestroy: function(ctx){
|
4184
|
+
this._super(ctx);
|
4185
|
+
},
|
4186
|
+
|
4187
|
+
// Overload the `renderTitle` hook, to append a counter badge
|
4188
|
+
nodeRenderTitle: function(ctx, title) {
|
4189
|
+
var node = ctx.node,
|
4190
|
+
extOpts = ctx.options.childcounter,
|
4191
|
+
count = (node.data.childCounter == null) ? node.countChildren(extOpts.deep) : +node.data.childCounter;
|
4192
|
+
// Let the base implementation render the title
|
4193
|
+
this._super(ctx, title);
|
4194
|
+
// Append a counter badge
|
4195
|
+
if( (count || ! extOpts.hideZeros) && (!node.isExpanded() || !extOpts.hideExpanded) ){
|
4196
|
+
$("span.fancytree-icon", node.span).append($("<span class='fancytree-childcounter'/>").text(count));
|
4197
|
+
}
|
4198
|
+
},
|
4199
|
+
// Overload the `setExpanded` hook, so the counters are updated
|
4200
|
+
nodeSetExpanded: function(ctx, flag, opts) {
|
4201
|
+
var tree = ctx.tree,
|
4202
|
+
node = ctx.node;
|
4203
|
+
// Let the base implementation expand/collapse the node, then redraw the title
|
4204
|
+
// after the animation has finished
|
4205
|
+
return this._super(ctx, flag, opts).always(function(){
|
4206
|
+
tree.nodeRenderTitle(ctx);
|
4207
|
+
});
|
4208
|
+
}
|
4209
|
+
|
4210
|
+
// End of extension definition
|
4211
|
+
});
|
4212
|
+
// End of namespace closure
|
4213
|
+
}(jQuery));
|
3756
4214
|
|
3757
4215
|
/*!
|
3758
4216
|
* jquery.fancytree.dnd.js
|
@@ -3765,8 +4223,8 @@ if( typeof define === "function" && define.amd ) {
|
|
3765
4223
|
* Released under the MIT license
|
3766
4224
|
* https://github.com/mar10/fancytree/wiki/LicenseInfo
|
3767
4225
|
*
|
3768
|
-
* @version 2.0.0-
|
3769
|
-
* @date 2014-
|
4226
|
+
* @version 2.0.0-11
|
4227
|
+
* @date 2014-04-27T22:28
|
3770
4228
|
*/
|
3771
4229
|
|
3772
4230
|
;(function($, window, document, undefined) {
|
@@ -3790,12 +4248,12 @@ function offsetString(n){
|
|
3790
4248
|
function _initDragAndDrop(tree) {
|
3791
4249
|
var dnd = tree.options.dnd || null;
|
3792
4250
|
// Register 'connectToFancytree' option with ui.draggable
|
3793
|
-
if(
|
4251
|
+
if( dnd ) {
|
3794
4252
|
_registerDnd();
|
3795
4253
|
}
|
3796
4254
|
// Attach ui.draggable to this Fancytree instance
|
3797
4255
|
if(dnd && dnd.dragStart ) {
|
3798
|
-
tree.widget.element.draggable({
|
4256
|
+
tree.widget.element.draggable($.extend({
|
3799
4257
|
addClasses: false,
|
3800
4258
|
appendTo: "body",
|
3801
4259
|
containment: false,
|
@@ -3811,21 +4269,21 @@ function _initDragAndDrop(tree) {
|
|
3811
4269
|
// Let source tree create the helper element
|
3812
4270
|
helper: function(event) {
|
3813
4271
|
var sourceNode = $.ui.fancytree.getNode(event.target);
|
3814
|
-
if(!sourceNode){ // issue 211
|
3815
|
-
//
|
4272
|
+
if(!sourceNode){ // Dynatree issue 211
|
4273
|
+
// might happen, if dragging a table *header*
|
3816
4274
|
return "<div>ERROR?: helper requested but sourceNode not found</div>";
|
3817
4275
|
}
|
3818
4276
|
return sourceNode.tree.ext.dnd._onDragEvent("helper", sourceNode, null, event, null, null);
|
3819
4277
|
},
|
3820
4278
|
start: function(event, ui) {
|
3821
|
-
|
3822
|
-
//
|
4279
|
+
var sourceNode = ui.helper.data("ftSourceNode");
|
4280
|
+
return !!sourceNode; // Abort dragging if no node could be found
|
3823
4281
|
}
|
3824
|
-
});
|
4282
|
+
}, tree.options.dnd.draggable));
|
3825
4283
|
}
|
3826
4284
|
// Attach ui.droppable to this Fancytree instance
|
3827
4285
|
if(dnd && dnd.dragDrop) {
|
3828
|
-
tree.widget.element.droppable({
|
4286
|
+
tree.widget.element.droppable($.extend({
|
3829
4287
|
addClasses: false,
|
3830
4288
|
tolerance: "intersect",
|
3831
4289
|
greedy: false
|
@@ -3850,7 +4308,7 @@ function _initDragAndDrop(tree) {
|
|
3850
4308
|
logMsg("droppable - over", event, ui);
|
3851
4309
|
}
|
3852
4310
|
*/
|
3853
|
-
});
|
4311
|
+
}, tree.options.dnd.droppable));
|
3854
4312
|
}
|
3855
4313
|
}
|
3856
4314
|
|
@@ -3963,21 +4421,24 @@ function _registerDnd() {
|
|
3963
4421
|
$.ui.fancytree.registerExtension(
|
3964
4422
|
{
|
3965
4423
|
name: "dnd",
|
3966
|
-
version: "0.0
|
4424
|
+
version: "0.1.0",
|
3967
4425
|
// Default options for this extension.
|
3968
4426
|
options: {
|
3969
4427
|
// Make tree nodes draggable:
|
3970
|
-
dragStart: null,
|
3971
|
-
dragStop: null,
|
4428
|
+
dragStart: null, // Callback(sourceNode, data), return true, to enable dnd
|
4429
|
+
dragStop: null, // Callback(sourceNode, data)
|
3972
4430
|
// helper: null,
|
3973
4431
|
// Make tree nodes accept draggables
|
3974
4432
|
autoExpandMS: 1000, // Expand nodes after n milliseconds of hovering.
|
3975
4433
|
preventVoidMoves: true, // Prevent dropping nodes 'before self', etc.
|
3976
4434
|
preventRecursiveMoves: true, // Prevent dropping nodes on own descendants
|
3977
|
-
dragEnter: null,
|
3978
|
-
dragOver: null,
|
3979
|
-
dragDrop: null,
|
3980
|
-
dragLeave: null
|
4435
|
+
dragEnter: null, // Callback(targetNode, data)
|
4436
|
+
dragOver: null, // Callback(targetNode, data)
|
4437
|
+
dragDrop: null, // Callback(targetNode, data)
|
4438
|
+
dragLeave: null, // Callback(targetNode, data)
|
4439
|
+
//
|
4440
|
+
draggable: null, // Additional options passed to jQuery draggable
|
4441
|
+
droppable: null // Additional options passed to jQuery droppable
|
3981
4442
|
},
|
3982
4443
|
// Override virtual methods for this extension.
|
3983
4444
|
// `this` : Fancytree instance
|
@@ -4150,7 +4611,7 @@ $.ui.fancytree.registerExtension(
|
|
4150
4611
|
res = $helper;
|
4151
4612
|
break;
|
4152
4613
|
case "start":
|
4153
|
-
if( node.isStatusNode ) {
|
4614
|
+
if( node.isStatusNode() ) {
|
4154
4615
|
res = false;
|
4155
4616
|
} else if(dnd.dragStart) {
|
4156
4617
|
res = dnd.dragStart(node, ctx);
|
@@ -4302,11 +4763,8 @@ $.ui.fancytree.registerExtension(
|
|
4302
4763
|
* Released under the MIT license
|
4303
4764
|
* https://github.com/mar10/fancytree/wiki/LicenseInfo
|
4304
4765
|
*
|
4305
|
-
* @version 2.0.0-
|
4306
|
-
* @date 2014-
|
4307
|
-
*/
|
4308
|
-
/**
|
4309
|
-
* @module fancytree/edit
|
4766
|
+
* @version 2.0.0-11
|
4767
|
+
* @date 2014-04-27T22:28
|
4310
4768
|
*/
|
4311
4769
|
|
4312
4770
|
;(function($, window, document, undefined) {
|
@@ -4318,7 +4776,9 @@ $.ui.fancytree.registerExtension(
|
|
4318
4776
|
* Private functions and variables
|
4319
4777
|
*/
|
4320
4778
|
|
4321
|
-
var isMac = /Mac/.test(navigator.platform)
|
4779
|
+
var isMac = /Mac/.test(navigator.platform),
|
4780
|
+
escapeHtml = $.ui.fancytree.escapeHtml,
|
4781
|
+
unescapeHtml = $.ui.fancytree.unescapeHtml;
|
4322
4782
|
// modifiers = {shift: "shiftKey", ctrl: "ctrlKey", alt: "altKey", meta: "metaKey"},
|
4323
4783
|
// specialKeys = {
|
4324
4784
|
// 8: "backspace", 9: "tab", 10: "return", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
|
@@ -4334,8 +4794,8 @@ var isMac = /Mac/.test(navigator.platform)
|
|
4334
4794
|
// "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&",
|
4335
4795
|
// "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<",
|
4336
4796
|
// ".": ">", "/": "?", "\\": "|"
|
4337
|
-
// }
|
4338
|
-
|
4797
|
+
// };
|
4798
|
+
|
4339
4799
|
|
4340
4800
|
// $.ui.fancytree.isKeydownEvent = function(e, code){
|
4341
4801
|
// var i, part, partmap, partlist = code.split("+"), len = parts.length;
|
@@ -4383,7 +4843,7 @@ $.ui.fancytree._FancytreeNodeClass.prototype.editStart = function(){
|
|
4383
4843
|
// Replace node with <input>
|
4384
4844
|
$input = $("<input />", {
|
4385
4845
|
"class": "fancytree-edit-input",
|
4386
|
-
value: prevTitle
|
4846
|
+
value: unescapeHtml(prevTitle)
|
4387
4847
|
});
|
4388
4848
|
if ( instOpts.adjustWidthOfs != null ) {
|
4389
4849
|
$input.width($title.width() + instOpts.adjustWidthOfs);
|
@@ -4456,7 +4916,7 @@ $.ui.fancytree._FancytreeNodeClass.prototype.editEnd = function(applyChanges, _e
|
|
4456
4916
|
$(document).off(".fancytree-edit");
|
4457
4917
|
|
4458
4918
|
if( doSave ) {
|
4459
|
-
node.setTitle( newVal );
|
4919
|
+
node.setTitle( escapeHtml(newVal) );
|
4460
4920
|
}else{
|
4461
4921
|
node.renderTitle();
|
4462
4922
|
}
|
@@ -4473,13 +4933,13 @@ $.ui.fancytree._FancytreeNodeClass.prototype.editEnd = function(applyChanges, _e
|
|
4473
4933
|
|
4474
4934
|
|
4475
4935
|
$.ui.fancytree._FancytreeNodeClass.prototype.startEdit = function(){
|
4476
|
-
this.warn("FancytreeNode.startEdit() is deprecated. Use .editStart() instead.");
|
4936
|
+
this.warn("FancytreeNode.startEdit() is deprecated since 2014-01-04. Use .editStart() instead.");
|
4477
4937
|
return this.editStart.apply(this, arguments);
|
4478
4938
|
};
|
4479
4939
|
|
4480
4940
|
|
4481
4941
|
$.ui.fancytree._FancytreeNodeClass.prototype.endEdit = function(){
|
4482
|
-
this.warn("FancytreeNode.endEdit() is deprecated. Use .editEnd() instead.");
|
4942
|
+
this.warn("FancytreeNode.endEdit() is deprecated since 2014-01-04. Use .editEnd() instead.");
|
4483
4943
|
return this.editEnd.apply(this, arguments);
|
4484
4944
|
};
|
4485
4945
|
|
@@ -4622,8 +5082,8 @@ $.ui.fancytree.registerExtension({
|
|
4622
5082
|
* Released under the MIT license
|
4623
5083
|
* https://github.com/mar10/fancytree/wiki/LicenseInfo
|
4624
5084
|
*
|
4625
|
-
* @version 2.0.0-
|
4626
|
-
* @date 2014-
|
5085
|
+
* @version 2.0.0-11
|
5086
|
+
* @date 2014-04-27T22:28
|
4627
5087
|
*/
|
4628
5088
|
|
4629
5089
|
;(function($, window, document, undefined) {
|
@@ -4640,24 +5100,33 @@ function _escapeRegex(str){
|
|
4640
5100
|
return (str + "").replace(/([.?*+\^\$\[\]\\(){}|-])/g, "\\$1");
|
4641
5101
|
}
|
4642
5102
|
|
5103
|
+
/* EXT-TABLE: Show/hide all rows that are structural descendants of `parent`. */
|
5104
|
+
// function setChildRowVisibility(parent, flag) {
|
5105
|
+
// parent.visit(function(node){
|
5106
|
+
// var tr = node.tr;
|
5107
|
+
// if(tr){
|
5108
|
+
// tr.style.display = flag ? "" : "none";
|
5109
|
+
// }
|
5110
|
+
// node.debug(flag ? "SHOW" : "HIDE");
|
5111
|
+
// if(!node.expanded){
|
5112
|
+
// return "skip";
|
5113
|
+
// }
|
5114
|
+
// });
|
5115
|
+
// }
|
4643
5116
|
|
4644
5117
|
/**
|
4645
|
-
* Dimm or hide nodes.
|
5118
|
+
* [ext-filter] Dimm or hide nodes.
|
4646
5119
|
*
|
4647
5120
|
* @param {function | string} filter
|
4648
5121
|
* @returns {integer} count
|
4649
|
-
* @
|
5122
|
+
* @alias Fancytree#applyFilter
|
4650
5123
|
* @requires jquery.fancytree.filter.js
|
4651
5124
|
*/
|
4652
5125
|
$.ui.fancytree._FancytreeClass.prototype.applyFilter = function(filter){
|
4653
5126
|
var match, re,
|
4654
5127
|
count = 0,
|
5128
|
+
hideMode = this.options.filter.mode === "hide",
|
4655
5129
|
leavesOnly = this.options.filter.leavesOnly;
|
4656
|
-
// Reset current filter
|
4657
|
-
this.visit(function(node){
|
4658
|
-
delete node.match;
|
4659
|
-
delete node.subMatch;
|
4660
|
-
});
|
4661
5130
|
|
4662
5131
|
// Default to 'match title substring (not case sensitive)'
|
4663
5132
|
if(typeof filter === "string"){
|
@@ -4670,38 +5139,49 @@ $.ui.fancytree._FancytreeClass.prototype.applyFilter = function(filter){
|
|
4670
5139
|
|
4671
5140
|
this.enableFilter = true;
|
4672
5141
|
this.$div.addClass("fancytree-ext-filter");
|
4673
|
-
if(
|
5142
|
+
if( hideMode ){
|
4674
5143
|
this.$div.addClass("fancytree-ext-filter-hide");
|
5144
|
+
} else {
|
5145
|
+
this.$div.addClass("fancytree-ext-filter-dimm");
|
4675
5146
|
}
|
5147
|
+
// Reset current filter
|
5148
|
+
this.visit(function(node){
|
5149
|
+
// node.hide = hideMode && true;
|
5150
|
+
delete node.match;
|
5151
|
+
delete node.subMatch;
|
5152
|
+
});
|
5153
|
+
// Adjust node.hide, .match, .subMatch flags
|
4676
5154
|
this.visit(function(node){
|
4677
5155
|
if ((!leavesOnly || node.children == null) && filter(node)) {
|
4678
5156
|
count++;
|
5157
|
+
// node.hide = false;
|
4679
5158
|
node.match = true;
|
4680
5159
|
node.visitParents(function(p){
|
5160
|
+
// p.hide = false;
|
4681
5161
|
p.subMatch = true;
|
4682
5162
|
});
|
4683
5163
|
}
|
4684
5164
|
});
|
5165
|
+
// Redraw
|
4685
5166
|
this.render();
|
4686
5167
|
return count;
|
4687
5168
|
};
|
4688
5169
|
|
4689
5170
|
/**
|
4690
|
-
* Reset the filter.
|
5171
|
+
* [ext-filter] Reset the filter.
|
4691
5172
|
*
|
4692
|
-
* @
|
5173
|
+
* @alias Fancytree#applyFilter
|
4693
5174
|
* @requires jquery.fancytree.filter.js
|
4694
5175
|
*/
|
4695
5176
|
$.ui.fancytree._FancytreeClass.prototype.clearFilter = function(){
|
4696
5177
|
this.visit(function(node){
|
5178
|
+
// delete node.hide;
|
4697
5179
|
delete node.match;
|
4698
5180
|
delete node.subMatch;
|
4699
|
-
$(node.li).show();
|
4700
5181
|
});
|
4701
|
-
|
4702
5182
|
this.enableFilter = false;
|
5183
|
+
this.$div.removeClass("fancytree-ext-filter fancytree-ext-filter-dimm fancytree-ext-filter-hide");
|
4703
5184
|
this.render();
|
4704
|
-
this.$div.removeClass("fancytree-ext-filter fancytree-ext-filter-hide");
|
4705
5185
|
};
|
4706
5186
|
|
4707
5187
|
|
@@ -4710,7 +5190,7 @@ $.ui.fancytree._FancytreeClass.prototype.clearFilter = function(){
|
|
4710
5190
|
*/
|
4711
5191
|
$.ui.fancytree.registerExtension({
|
4712
5192
|
name: "filter",
|
4713
|
-
version: "0.0.
|
5193
|
+
version: "0.0.2",
|
4714
5194
|
// Default options for this extension.
|
4715
5195
|
options: {
|
4716
5196
|
mode: "dimm",
|
@@ -4729,39 +5209,168 @@ $.ui.fancytree.registerExtension({
|
|
4729
5209
|
},
|
4730
5210
|
nodeRenderStatus: function(ctx) {
|
4731
5211
|
// Set classes for current status
|
4732
|
-
var
|
5212
|
+
var res,
|
4733
5213
|
node = ctx.node,
|
4734
|
-
opts = ctx.options,
|
4735
5214
|
tree = ctx.tree,
|
4736
5215
|
$span = $(node[tree.statusClassPropName]);
|
4737
5216
|
|
5217
|
+
res = this._super(ctx);
|
5218
|
+
|
4738
5219
|
if(!$span.length){
|
4739
|
-
return; // nothing to do, if node was not yet rendered
|
5220
|
+
return res; // nothing to do, if node was not yet rendered
|
4740
5221
|
}
|
4741
|
-
this._super(ctx);
|
4742
5222
|
if(!tree.enableFilter){
|
5223
|
+
return res;
|
5224
|
+
}
|
5225
|
+
$span.toggleClass("fancytree-match", !!node.match);
|
5226
|
+
$span.toggleClass("fancytree-submatch", !!node.subMatch);
|
5227
|
+
$span.toggleClass("fancytree-hide", !(node.match || node.subMatch));
|
5228
|
+
|
5229
|
+
// if(opts.filter.mode === "hide"){
|
5230
|
+
// // visible = !!(node.match || node.subMatch);
|
5231
|
+
// visible = !node.hide;
|
5232
|
+
// node.debug(node.title + ": visible=" + visible);
|
5233
|
+
// if( node.li ) {
|
5234
|
+
// $(node.li).toggle(visible);
|
5235
|
+
// } else if( node.tr ) {
|
5236
|
+
// // Show/hide all rows that are structural descendants of `parent`
|
5237
|
+
// $(node.tr).toggle(visible);
|
5238
|
+
// // if( !visible ) {
|
5239
|
+
// // setChildRowVisibility(node, visible);
|
5240
|
+
// // }
|
5241
|
+
// }
|
5242
|
+
// }
|
5243
|
+
return res;
|
5244
|
+
}
|
5245
|
+
});
|
5246
|
+
}(jQuery, window, document));
|
5247
|
+
|
5248
|
+
/*!
|
5249
|
+
* jquery.fancytree.glyph.js
|
5250
|
+
*
|
5251
|
+
* Use glyph fonts as instead of icon sprites.
|
5252
|
+
* (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)
|
5253
|
+
*
|
5254
|
+
* Copyright (c) 2014, Martin Wendt (http://wwWendt.de)
|
5255
|
+
*
|
5256
|
+
* Released under the MIT license
|
5257
|
+
* https://github.com/mar10/fancytree/wiki/LicenseInfo
|
5258
|
+
*
|
5259
|
+
* @version 2.0.0-11
|
5260
|
+
* @date 2014-04-27T22:28
|
5261
|
+
*/
|
5262
|
+
|
5263
|
+
;(function($, window, document, undefined) {
|
5264
|
+
|
5265
|
+
"use strict";
|
5266
|
+
|
5267
|
+
/* *****************************************************************************
|
5268
|
+
* Private functions and variables
|
5269
|
+
*/
|
5270
|
+
|
5271
|
+
function _getIcon(opts, type){
|
5272
|
+
return opts.map[type];
|
5273
|
+
}
|
5274
|
+
|
5275
|
+
$.ui.fancytree.registerExtension({
|
5276
|
+
name: "glyph",
|
5277
|
+
version: "0.0.2",
|
5278
|
+
// Default options for this extension.
|
5279
|
+
options: {
|
5280
|
+
prefix: "icon-",
|
5281
|
+
extra: null,
|
5282
|
+
map: {
|
5283
|
+
doc: "icon-file-alt",
|
5284
|
+
docOpen: "icon-file-alt",
|
5285
|
+
checkbox: "icon-check-empty",
|
5286
|
+
checkboxSelected: "icon-check",
|
5287
|
+
checkboxUnknown: "icon-check icon-muted",
|
5288
|
+
error: "icon-exclamation-sign",
|
5289
|
+
expanderClosed: "icon-caret-right",
|
5290
|
+
expanderLazy: "icon-angle-right",
|
5291
|
+
// expanderLazy: "icon-refresh icon-spin",
|
5292
|
+
expanderOpen: "icon-caret-down",
|
5293
|
+
folder: "icon-folder-close-alt",
|
5294
|
+
folderOpen: "icon-folder-open-alt",
|
5295
|
+
loading: "icon-refresh icon-spin",
|
5296
|
+
// loading: "icon-spinner icon-spin"
|
5297
|
+
noExpander: ""
|
5298
|
+
},
|
5299
|
+
icon: null // TODO: allow callback here
|
5300
|
+
},
|
5301
|
+
// Overide virtual methods for this extension.
|
5302
|
+
// `this` : is this extension object
|
5303
|
+
// `this._super`: the virtual function that was overriden (member of prev. extension or Fancytree)
|
5304
|
+
treeInit: function(ctx){
|
5305
|
+
var tree = ctx.tree;
|
5306
|
+
this._super(ctx);
|
5307
|
+
tree.$container.addClass("fancytree-ext-glyph");
|
5308
|
+
},
|
5309
|
+
nodeRenderStatus: function(ctx) {
|
5310
|
+
var icon, span,
|
5311
|
+
node = ctx.node,
|
5312
|
+
opts = ctx.options.glyph,
|
5313
|
+
// callback = opts.icon,
|
5314
|
+
map = opts.map
|
5315
|
+
// prefix = opts.prefix
|
5316
|
+
// $span = $(node.span)
|
5317
|
+
;
|
5318
|
+
|
5319
|
+
this._super(ctx);
|
5320
|
+
|
5321
|
+
if( node.isRoot() ){
|
4743
5322
|
return;
|
4744
5323
|
}
|
4745
|
-
|
4746
|
-
|
4747
|
-
|
4748
|
-
|
5324
|
+
|
5325
|
+
span = $("span.fancytree-expander", node.span).get(0);
|
5326
|
+
if( span ){
|
5327
|
+
if( node.isLoading() ){
|
5328
|
+
icon = "loading";
|
5329
|
+
}else if( node.expanded ){
|
5330
|
+
icon = "expanderOpen";
|
5331
|
+
}else if( node.isUndefined() ){
|
5332
|
+
icon = "expanderLazy";
|
5333
|
+
}else if( node.hasChildren() ){
|
5334
|
+
icon = "expanderClosed";
|
5335
|
+
}else{
|
5336
|
+
icon = "noExpander";
|
5337
|
+
}
|
5338
|
+
span.className = "fancytree-expander " + map[icon];
|
5339
|
+
}
|
5340
|
+
|
5341
|
+
span = $("span.fancytree-checkbox", node.tr || node.span).get(0);
|
5342
|
+
if( span ){
|
5343
|
+
icon = node.selected ? "checkboxSelected" : (node.partsel ? "checkboxUnknown" : "checkbox");
|
5344
|
+
span.className = "fancytree-checkbox " + map[icon];
|
4749
5345
|
}
|
4750
|
-
|
4751
|
-
|
5346
|
+
|
5347
|
+
span = $("span.fancytree-icon", node.span).get(0);
|
5348
|
+
if( span ){
|
5349
|
+
if( node.folder ){
|
5350
|
+
icon = node.expanded ? _getIcon(opts, "folderOpen") : _getIcon(opts, "folder");
|
5351
|
+
}else{
|
5352
|
+
icon = node.expanded ? _getIcon(opts, "docOpen") : _getIcon(opts, "doc");
|
5353
|
+
}
|
5354
|
+
span.className = "fancytree-icon " + icon;
|
5355
|
+
}
|
5356
|
+
},
|
5357
|
+
nodeSetStatus: function(ctx, status, message, details) {
|
5358
|
+
var span,
|
5359
|
+
opts = ctx.options.glyph,
|
5360
|
+
node = ctx.node;
|
5361
|
+
|
5362
|
+
this._super(ctx, status, message, details);
|
5363
|
+
|
5364
|
+
if(node.parent){
|
5365
|
+
span = $("span.fancytree-expander", node.span).get(0);
|
4752
5366
|
}else{
|
4753
|
-
$
|
4754
|
-
}
|
4755
|
-
if(
|
4756
|
-
|
4757
|
-
|
4758
|
-
|
4759
|
-
|
4760
|
-
// The following is too simple, since we have to hide all TRs that
|
4761
|
-
// belong to that parent:
|
4762
|
-
// if( node.tr ) {
|
4763
|
-
// $(node.tr).toggle(visible);
|
4764
|
-
// }
|
5367
|
+
span = $(".fancytree-statusnode-wait, .fancytree-statusnode-error", node[this.nodeContainerAttrName]).find("span.fancytree-expander").get(0);
|
5368
|
+
}
|
5369
|
+
if( status === "loading"){
|
5370
|
+
// $("span.fancytree-expander", ctx.node.span).addClass(_getIcon(opts, "loading"));
|
5371
|
+
span.className = "fancytree-expander " + _getIcon(opts, "loading");
|
5372
|
+
}else if( status === "error"){
|
5373
|
+
span.className = "fancytree-expander " + _getIcon(opts, "error");
|
4765
5374
|
}
|
4766
5375
|
}
|
4767
5376
|
});
|
@@ -4778,8 +5387,8 @@ $.ui.fancytree.registerExtension({
|
|
4778
5387
|
* Released under the MIT license
|
4779
5388
|
* https://github.com/mar10/fancytree/wiki/LicenseInfo
|
4780
5389
|
*
|
4781
|
-
* @version 2.0.0-
|
4782
|
-
* @date 2014-
|
5390
|
+
* @version 2.0.0-11
|
5391
|
+
* @date 2014-04-27T22:28
|
4783
5392
|
*/
|
4784
5393
|
|
4785
5394
|
;(function($, window, document, undefined) {
|
@@ -4805,21 +5414,80 @@ var KC = $.ui.keyCode,
|
|
4805
5414
|
};
|
4806
5415
|
|
4807
5416
|
|
5417
|
+
/* Calculate TD column index (considering colspans).*/
|
5418
|
+
function getColIdx($tr, $td) {
|
5419
|
+
var colspan,
|
5420
|
+
td = $td.get(0),
|
5421
|
+
idx = 0;
|
5422
|
+
|
5423
|
+
$tr.children().each(function () {
|
5424
|
+
if( this === td ) {
|
5425
|
+
return false;
|
5426
|
+
}
|
5427
|
+
colspan = $(this).prop("colspan");
|
5428
|
+
idx += colspan ? colspan : 1;
|
5429
|
+
});
|
5430
|
+
return idx;
|
5431
|
+
}
|
5432
|
+
|
5433
|
+
|
5434
|
+
/* Find TD at given column index (considering colspans).*/
|
5435
|
+
function findTdAtColIdx($tr, colIdx) {
|
5436
|
+
var colspan,
|
5437
|
+
res = null,
|
5438
|
+
idx = 0;
|
5439
|
+
|
5440
|
+
$tr.children().each(function () {
|
5441
|
+
if( idx >= colIdx ) {
|
5442
|
+
res = $(this);
|
5443
|
+
return false;
|
5444
|
+
}
|
5445
|
+
colspan = $(this).prop("colspan");
|
5446
|
+
idx += colspan ? colspan : 1;
|
5447
|
+
});
|
5448
|
+
return res;
|
5449
|
+
}
|
5450
|
+
|
5451
|
+
|
5452
|
+
/* Find adjacent cell for a given direction. Skip empty cells and consider merged cells */
|
4808
5453
|
function findNeighbourTd($target, keyCode){
|
4809
|
-
var $
|
5454
|
+
var $tr, colIdx,
|
5455
|
+
$td = $target.closest("td"),
|
5456
|
+
$tdNext = null;
|
5457
|
+
|
4810
5458
|
switch( keyCode ){
|
4811
5459
|
case KC.LEFT:
|
4812
|
-
|
5460
|
+
$tdNext = $td.prev();
|
5461
|
+
break;
|
4813
5462
|
case KC.RIGHT:
|
4814
|
-
|
5463
|
+
$tdNext = $td.next();
|
5464
|
+
break;
|
4815
5465
|
case KC.UP:
|
4816
|
-
return $td.parent().prevAll(":visible").first().find("td").eq($td.index());
|
4817
5466
|
case KC.DOWN:
|
4818
|
-
|
5467
|
+
$tr = $td.parent();
|
5468
|
+
colIdx = getColIdx($tr, $td);
|
5469
|
+
while( true ) {
|
5470
|
+
$tr = (keyCode === KC.UP) ? $tr.prev() : $tr.next();
|
5471
|
+
if( !$tr.length ) {
|
5472
|
+
break;
|
5473
|
+
}
|
5474
|
+
// Skip hidden rows
|
5475
|
+
if( $tr.is(":hidden") ) {
|
5476
|
+
continue;
|
5477
|
+
}
|
5478
|
+
// Find adjacent cell in the same column
|
5479
|
+
$tdNext = findTdAtColIdx($tr, colIdx);
|
5480
|
+
// Skip cells that don't conatain a focusable element
|
5481
|
+
if( $tdNext && $tdNext.find(":input").length ) {
|
5482
|
+
break;
|
5483
|
+
}
|
5484
|
+
}
|
5485
|
+
break;
|
4819
5486
|
}
|
4820
|
-
return
|
5487
|
+
return $tdNext;
|
4821
5488
|
}
|
4822
5489
|
|
5490
|
+
|
4823
5491
|
/*******************************************************************************
|
4824
5492
|
* Extension code
|
4825
5493
|
*/
|
@@ -4887,7 +5555,7 @@ $.ui.fancytree.registerExtension({
|
|
4887
5555
|
|
4888
5556
|
// jQuery
|
4889
5557
|
inputType = $target.is(":input:enabled") ? $target.prop("type") : null;
|
4890
|
-
ctx.tree.debug("ext-gridnav nodeKeydown", event, inputType);
|
5558
|
+
// ctx.tree.debug("ext-gridnav nodeKeydown", event, inputType);
|
4891
5559
|
|
4892
5560
|
if( inputType && opts.handleCursorKeys ){
|
4893
5561
|
handleKeys = NAV_KEYS[inputType];
|
@@ -4921,8 +5589,8 @@ $.ui.fancytree.registerExtension({
|
|
4921
5589
|
* Released under the MIT license
|
4922
5590
|
* https://github.com/mar10/fancytree/wiki/LicenseInfo
|
4923
5591
|
*
|
4924
|
-
* @version 2.0.0-
|
4925
|
-
* @date 2014-
|
5592
|
+
* @version 2.0.0-11
|
5593
|
+
* @date 2014-04-27T22:28
|
4926
5594
|
*/
|
4927
5595
|
|
4928
5596
|
;(function($, window, document, undefined) {
|
@@ -4945,12 +5613,72 @@ var ACTIVE = "active",
|
|
4945
5613
|
FOCUS = "focus",
|
4946
5614
|
SELECTED = "selected";
|
4947
5615
|
|
5616
|
+
|
5617
|
+
/* Recursively load lazy nodes
|
5618
|
+
* @param {string} mode 'load', 'expand', false
|
5619
|
+
*/
|
5620
|
+
function _loadLazyNodes(tree, instData, keyList, mode, dfd) {
|
5621
|
+
var i, key, l, node,
|
5622
|
+
foundOne = false,
|
5623
|
+
deferredList = [],
|
5624
|
+
// lazyNodeList = [],
|
5625
|
+
missingKeyList = []; //keyList.slice(0),
|
5626
|
+
|
5627
|
+
keyList = keyList || [];
|
5628
|
+
// expand = expand !== false;
|
5629
|
+
dfd = dfd || $.Deferred();
|
5630
|
+
|
5631
|
+
for( i=0, l=keyList.length; i<l; i++ ) {
|
5632
|
+
key = keyList[i];
|
5633
|
+
node = tree.getNodeByKey(key);
|
5634
|
+
if( node ) {
|
5635
|
+
if( mode && node.isUndefined() ) {
|
5636
|
+
// lazyNodeList.push(node);
|
5637
|
+
foundOne = true;
|
5638
|
+
tree.debug("_loadLazyNodes: " + node + " is lazy: loading...");
|
5639
|
+
if( mode === "expand" ) {
|
5640
|
+
deferredList.push(node.setExpanded());
|
5641
|
+
} else {
|
5642
|
+
deferredList.push(node.load());
|
5643
|
+
}
|
5644
|
+
} else {
|
5645
|
+
tree.debug("_loadLazyNodes: " + node + " already loaded.");
|
5646
|
+
node.setExpanded();
|
5647
|
+
// node.expanded = true;
|
5648
|
+
// node.render();
|
5649
|
+
}
|
5650
|
+
} else {
|
5651
|
+
missingKeyList.push(key);
|
5652
|
+
tree.debug("_loadLazyNodes: " + node + " was not yet found.");
|
5653
|
+
}
|
5654
|
+
}
|
5655
|
+
|
5656
|
+
$.when.apply($, deferredList).always(function(){
|
5657
|
+
// All lazy-expands have finished
|
5658
|
+
if( foundOne && missingKeyList.length > 0 ) {
|
5659
|
+
// If we read new nodes from server, try to resolve yet-missing keys
|
5660
|
+
_loadLazyNodes(tree, instData, missingKeyList, mode, dfd);
|
5661
|
+
} else {
|
5662
|
+
if( missingKeyList.length ) {
|
5663
|
+
tree.warn("_loadLazyNodes: could not load those keys: ", missingKeyList);
|
5664
|
+
for( i=0, l=missingKeyList.length; i<l; i++ ) {
|
5665
|
+
key = keyList[i];
|
5666
|
+
instData._setKey(EXPANDED, keyList[i], false);
|
5667
|
+
}
|
5668
|
+
}
|
5669
|
+
dfd.resolve();
|
5670
|
+
}
|
5671
|
+
});
|
5672
|
+
return dfd;
|
5673
|
+
}
|
5674
|
+
|
5675
|
+
|
4948
5676
|
/**
|
4949
|
-
*
|
5677
|
+
* [ext-persist] Remove persistence cookies of the given type(s).
|
4950
5678
|
* Called like
|
4951
5679
|
* $("#tree").fancytree("getTree").clearCookies("active expanded focus selected");
|
4952
5680
|
*
|
4953
|
-
* @
|
5681
|
+
* @alias Fancytree#clearCookies
|
4954
5682
|
* @requires jquery.fancytree.persist.js
|
4955
5683
|
*/
|
4956
5684
|
$.ui.fancytree._FancytreeClass.prototype.clearCookies = function(types){
|
@@ -4960,29 +5688,33 @@ $.ui.fancytree._FancytreeClass.prototype.clearCookies = function(types){
|
|
4960
5688
|
types = types || "active expanded focus selected";
|
4961
5689
|
// TODO: optimize
|
4962
5690
|
if(types.indexOf(ACTIVE) >= 0){
|
4963
|
-
$.cookie(cookiePrefix + ACTIVE, null);
|
5691
|
+
// $.cookie(cookiePrefix + ACTIVE, null);
|
5692
|
+
$.removeCookie(cookiePrefix + ACTIVE);
|
4964
5693
|
}
|
4965
5694
|
if(types.indexOf(EXPANDED) >= 0){
|
4966
|
-
$.cookie(cookiePrefix + EXPANDED, null);
|
5695
|
+
// $.cookie(cookiePrefix + EXPANDED, null);
|
5696
|
+
$.removeCookie(cookiePrefix + EXPANDED);
|
4967
5697
|
}
|
4968
5698
|
if(types.indexOf(FOCUS) >= 0){
|
4969
|
-
$.cookie(cookiePrefix + FOCUS, null);
|
5699
|
+
// $.cookie(cookiePrefix + FOCUS, null);
|
5700
|
+
$.removeCookie(cookiePrefix + FOCUS);
|
4970
5701
|
}
|
4971
5702
|
if(types.indexOf(SELECTED) >= 0){
|
4972
|
-
$.cookie(cookiePrefix + SELECTED, null);
|
5703
|
+
// $.cookie(cookiePrefix + SELECTED, null);
|
5704
|
+
$.removeCookie(cookiePrefix + SELECTED);
|
4973
5705
|
}
|
4974
5706
|
};
|
4975
5707
|
|
4976
5708
|
|
4977
5709
|
/**
|
4978
|
-
* Return persistence information from cookies
|
4979
|
-
*
|
4980
|
-
* Called like
|
4981
|
-
* $("#tree").fancytree("getTree").getPersistData();
|
4982
|
-
*
|
4983
|
-
* @
|
4984
|
-
* @requires jquery.fancytree.persist.js
|
4985
|
-
*/
|
5710
|
+
* [ext-persist] Return persistence information from cookies
|
5711
|
+
*
|
5712
|
+
* Called like
|
5713
|
+
* $("#tree").fancytree("getTree").getPersistData();
|
5714
|
+
*
|
5715
|
+
* @alias Fancytree#getPersistData
|
5716
|
+
* @requires jquery.fancytree.persist.js
|
5717
|
+
*/
|
4986
5718
|
$.ui.fancytree._FancytreeClass.prototype.getPersistData = function(){
|
4987
5719
|
var inst = this.ext.persist,
|
4988
5720
|
instOpts= this.options.persist,
|
@@ -4993,6 +5725,7 @@ $.ui.fancytree._FancytreeClass.prototype.getPersistData = function(){
|
|
4993
5725
|
res[EXPANDED] = ($.cookie(inst.cookiePrefix + EXPANDED) || "").split(delim);
|
4994
5726
|
res[SELECTED] = ($.cookie(inst.cookiePrefix + SELECTED) || "").split(delim);
|
4995
5727
|
res[FOCUS] = $.cookie(inst.cookiePrefix + FOCUS);
|
5728
|
+
return res;
|
4996
5729
|
};
|
4997
5730
|
|
4998
5731
|
|
@@ -5001,7 +5734,7 @@ $.ui.fancytree._FancytreeClass.prototype.getPersistData = function(){
|
|
5001
5734
|
*/
|
5002
5735
|
$.ui.fancytree.registerExtension({
|
5003
5736
|
name: "persist",
|
5004
|
-
version: "0.0
|
5737
|
+
version: "0.2.0",
|
5005
5738
|
// Default options for this extension.
|
5006
5739
|
options: {
|
5007
5740
|
// appendRequestInfo: false,
|
@@ -5014,6 +5747,7 @@ $.ui.fancytree.registerExtension({
|
|
5014
5747
|
domain: "",
|
5015
5748
|
secure: false
|
5016
5749
|
},
|
5750
|
+
expandLazy: false, // true: recursively expand and load lazy nodes
|
5017
5751
|
overrideSource: false, // true: cookie takes precedence over `source` data attributes.
|
5018
5752
|
types: "active expanded focus selected"
|
5019
5753
|
},
|
@@ -5055,68 +5789,80 @@ $.ui.fancytree.registerExtension({
|
|
5055
5789
|
instData.storeFocus = instOpts.types.indexOf(FOCUS) >= 0;
|
5056
5790
|
|
5057
5791
|
// Bind init-handler to apply cookie state
|
5058
|
-
tree.$div.bind("fancytreeinit", function(
|
5059
|
-
var cookie,
|
5060
|
-
|
5061
|
-
i,
|
5062
|
-
prevFocus = $.cookie(instData.cookiePrefix + FOCUS), // record this before node.setActive() overrides it
|
5063
|
-
node;
|
5792
|
+
tree.$div.bind("fancytreeinit", function(event){
|
5793
|
+
var cookie, dfd, i, keyList, node,
|
5794
|
+
prevFocus = $.cookie(instData.cookiePrefix + FOCUS); // record this before node.setActive() overrides it;
|
5064
5795
|
|
5065
5796
|
tree.debug("COOKIE " + document.cookie);
|
5066
5797
|
|
5067
|
-
|
5068
|
-
|
5069
|
-
|
5070
|
-
|
5071
|
-
|
5072
|
-
|
5073
|
-
|
5074
|
-
|
5075
|
-
//
|
5076
|
-
|
5077
|
-
|
5798
|
+
cookie = $.cookie(instData.cookiePrefix + EXPANDED);
|
5799
|
+
keyList = cookie && cookie.split(instOpts.cookieDelimiter);
|
5800
|
+
|
5801
|
+
if( instData.storeExpanded ) {
|
5802
|
+
// Recursively load nested lazy nodes if expandLazy is 'expand' or 'load'
|
5803
|
+
// Also remove expand-cookies for unmatched nodes
|
5804
|
+
dfd = _loadLazyNodes(tree, instData, keyList, instOpts.expandLazy ? "expand" : false , null);
|
5805
|
+
} else {
|
5806
|
+
// nothing to do
|
5807
|
+
dfd = new $.Deferred().resolve();
|
5808
|
+
}
|
5809
|
+
|
5810
|
+
dfd.done(function(){
|
5811
|
+
// alert("persistent expand done");
|
5812
|
+
// if(instData.storeExpanded){
|
5813
|
+
// cookie = $.cookie(instData.cookiePrefix + EXPANDED);
|
5814
|
+
// if(cookie){
|
5815
|
+
// keyList = cookie.split(instOpts.cookieDelimiter);
|
5816
|
+
// for(i=0; i<keyList.length; i++){
|
5817
|
+
// node = tree.getNodeByKey(keyList[i]);
|
5818
|
+
// if(node){
|
5819
|
+
// if(node.expanded === undefined || instOpts.overrideSource && (node.expanded === false)){
|
5820
|
+
// // node.setExpanded();
|
5821
|
+
// node.expanded = true;
|
5822
|
+
// node.render();
|
5823
|
+
// }
|
5824
|
+
// }else{
|
5825
|
+
// // node is no longer member of the tree: remove from cookie
|
5826
|
+
// instData._setKey(EXPANDED, keyList[i], false);
|
5827
|
+
// }
|
5828
|
+
// }
|
5829
|
+
// }
|
5830
|
+
// }
|
5831
|
+
if(instData.storeSelected){
|
5832
|
+
cookie = $.cookie(instData.cookiePrefix + SELECTED);
|
5833
|
+
if(cookie){
|
5834
|
+
keyList = cookie.split(instOpts.cookieDelimiter);
|
5835
|
+
for(i=0; i<keyList.length; i++){
|
5836
|
+
node = tree.getNodeByKey(keyList[i]);
|
5837
|
+
if(node){
|
5838
|
+
if(node.selected === undefined || instOpts.overrideSource && (node.selected === false)){
|
5839
|
+
// node.setSelected();
|
5840
|
+
node.selected = true;
|
5841
|
+
node.renderStatus();
|
5842
|
+
}
|
5843
|
+
}else{
|
5844
|
+
// node is no longer member of the tree: remove from cookie also
|
5845
|
+
instData._setKey(SELECTED, keyList[i], false);
|
5078
5846
|
}
|
5079
|
-
}else{
|
5080
|
-
// node is no longer member of the tree: remove from cookie
|
5081
|
-
instData._setKey(EXPANDED, keyList[i], false);
|
5082
5847
|
}
|
5083
5848
|
}
|
5084
5849
|
}
|
5085
|
-
|
5086
|
-
|
5087
|
-
|
5088
|
-
|
5089
|
-
keyList = cookie.split(instOpts.cookieDelimiter);
|
5090
|
-
for(i=0; i<keyList.length; i++){
|
5091
|
-
node = tree.getNodeByKey(keyList[i]);
|
5850
|
+
if(instData.storeActive){
|
5851
|
+
cookie = $.cookie(instData.cookiePrefix + ACTIVE);
|
5852
|
+
if(cookie && (opts.persist.overrideSource || !tree.activeNode)){
|
5853
|
+
node = tree.getNodeByKey(cookie);
|
5092
5854
|
if(node){
|
5093
|
-
|
5094
|
-
// node.setSelected();
|
5095
|
-
node.selected = true;
|
5096
|
-
node.renderStatus();
|
5097
|
-
}
|
5098
|
-
}else{
|
5099
|
-
// node is no longer member of the tree: remove from cookie also
|
5100
|
-
instData._setKey(SELECTED, keyList[i], false);
|
5855
|
+
node.setActive();
|
5101
5856
|
}
|
5102
5857
|
}
|
5103
5858
|
}
|
5104
|
-
|
5105
|
-
|
5106
|
-
cookie = $.cookie(instData.cookiePrefix + ACTIVE);
|
5107
|
-
if(cookie && (opts.persist.overrideSource || !tree.activeNode)){
|
5108
|
-
node = tree.getNodeByKey(cookie);
|
5859
|
+
if(instData.storeFocus && prevFocus){
|
5860
|
+
node = tree.getNodeByKey(prevFocus);
|
5109
5861
|
if(node){
|
5110
|
-
node.
|
5862
|
+
node.setFocus();
|
5111
5863
|
}
|
5112
5864
|
}
|
5113
|
-
}
|
5114
|
-
if(instData.storeFocus && prevFocus){
|
5115
|
-
node = tree.getNodeByKey(prevFocus);
|
5116
|
-
if(node){
|
5117
|
-
node.setFocus();
|
5118
|
-
}
|
5119
|
-
}
|
5865
|
+
});
|
5120
5866
|
});
|
5121
5867
|
// Init the tree
|
5122
5868
|
this._super(ctx);
|
@@ -5128,6 +5874,7 @@ $.ui.fancytree.registerExtension({
|
|
5128
5874
|
var instData = this._local,
|
5129
5875
|
instOpts = this.options.persist;
|
5130
5876
|
|
5877
|
+
flag = flag !== false;
|
5131
5878
|
this._super(ctx, flag, opts);
|
5132
5879
|
|
5133
5880
|
if(instData.storeActive){
|
@@ -5141,6 +5888,7 @@ $.ui.fancytree.registerExtension({
|
|
5141
5888
|
node = ctx.node,
|
5142
5889
|
instData = this._local;
|
5143
5890
|
|
5891
|
+
flag = flag !== false;
|
5144
5892
|
res = this._super(ctx, flag, opts);
|
5145
5893
|
|
5146
5894
|
if(instData.storeExpanded){
|
@@ -5155,7 +5903,7 @@ $.ui.fancytree.registerExtension({
|
|
5155
5903
|
this._super(ctx);
|
5156
5904
|
|
5157
5905
|
if(instData.storeFocus){
|
5158
|
-
$.cookie(
|
5906
|
+
$.cookie(instData.cookiePrefix + FOCUS,
|
5159
5907
|
this.focusNode ? this.focusNode.key : null,
|
5160
5908
|
instOpts.cookie);
|
5161
5909
|
}
|
@@ -5164,6 +5912,7 @@ $.ui.fancytree.registerExtension({
|
|
5164
5912
|
var node = ctx.node,
|
5165
5913
|
instData = this._local;
|
5166
5914
|
|
5915
|
+
flag = flag !== false;
|
5167
5916
|
this._super(ctx, flag);
|
5168
5917
|
|
5169
5918
|
if(instData.storeSelected){
|
@@ -5184,8 +5933,8 @@ $.ui.fancytree.registerExtension({
|
|
5184
5933
|
* Released under the MIT license
|
5185
5934
|
* https://github.com/mar10/fancytree/wiki/LicenseInfo
|
5186
5935
|
*
|
5187
|
-
* @version 2.0.0-
|
5188
|
-
* @date 2014-
|
5936
|
+
* @version 2.0.0-11
|
5937
|
+
* @date 2014-04-27T22:28
|
5189
5938
|
*/
|
5190
5939
|
|
5191
5940
|
;(function($, window, document, undefined) {
|
@@ -5210,8 +5959,9 @@ function insertSiblingAfter(referenceNode, newNode) {
|
|
5210
5959
|
function setChildRowVisibility(parent, flag) {
|
5211
5960
|
parent.visit(function(node){
|
5212
5961
|
var tr = node.tr;
|
5962
|
+
// currentFlag = node.hide ? false : flag; // fix for ext-filter
|
5213
5963
|
if(tr){
|
5214
|
-
tr.style.display = flag ? "" : "
|
5964
|
+
tr.style.display = (node.hide || !flag) ? "none" : "";
|
5215
5965
|
}
|
5216
5966
|
if(!node.expanded){
|
5217
5967
|
return "skip";
|
@@ -5248,12 +5998,13 @@ function findPrevRowNode(node){
|
|
5248
5998
|
|
5249
5999
|
$.ui.fancytree.registerExtension({
|
5250
6000
|
name: "table",
|
5251
|
-
version: "0.
|
6001
|
+
version: "0.2.0",
|
5252
6002
|
// Default options for this extension.
|
5253
6003
|
options: {
|
5254
|
-
|
5255
|
-
|
5256
|
-
|
6004
|
+
checkboxColumnIdx: null, // render the checkboxes into the this column index (default: nodeColumnIdx)
|
6005
|
+
customStatus: false, // true: generate renderColumns events for status nodes
|
6006
|
+
indentation: 16, // indent every node level by 16px
|
6007
|
+
nodeColumnIdx: 0 // render node expander, icon, and title to this column (default: #0)
|
5257
6008
|
},
|
5258
6009
|
// Overide virtual methods for this extension.
|
5259
6010
|
// `this` : is this extension object
|
@@ -5269,7 +6020,7 @@ $.ui.fancytree.registerExtension({
|
|
5269
6020
|
$(tree.tbody).empty();
|
5270
6021
|
|
5271
6022
|
tree.rowFragment = document.createDocumentFragment();
|
5272
|
-
$row = $("<tr
|
6023
|
+
$row = $("<tr />");
|
5273
6024
|
tdRole = "";
|
5274
6025
|
if(ctx.options.aria){
|
5275
6026
|
$row.attr("role", "row");
|
@@ -5277,9 +6028,9 @@ $.ui.fancytree.registerExtension({
|
|
5277
6028
|
}
|
5278
6029
|
for(i=0; i<tree.columnCount; i++) {
|
5279
6030
|
if(ctx.options.table.nodeColumnIdx === i){
|
5280
|
-
$row.append("<td" + tdRole + "><span class='fancytree-node'
|
6031
|
+
$row.append("<td" + tdRole + "><span class='fancytree-node' /></td>");
|
5281
6032
|
}else{
|
5282
|
-
$row.append("<td" + tdRole + "
|
6033
|
+
$row.append("<td" + tdRole + " />");
|
5283
6034
|
}
|
5284
6035
|
}
|
5285
6036
|
tree.rowFragment.appendChild($row.get(0));
|
@@ -5336,13 +6087,19 @@ $.ui.fancytree.registerExtension({
|
|
5336
6087
|
if( !_recursive ){
|
5337
6088
|
ctx.hasCollapsedParents = node.parent && !node.parent.expanded;
|
5338
6089
|
}
|
5339
|
-
$.ui.fancytree.debug("*** nodeRender " + node + ", isRoot=" + isRootNode);
|
6090
|
+
// $.ui.fancytree.debug("*** nodeRender " + node + ", isRoot=" + isRootNode, "tr=" + node.tr, "hcp=" + ctx.hasCollapsedParents, "parent.tr=" + (node.parent && node.parent.tr));
|
5340
6091
|
if( !isRootNode ){
|
5341
6092
|
if(!node.tr){
|
6093
|
+
if( ctx.hasCollapsedParents /*&& !node.parent.tr*/ ) {
|
6094
|
+
// #166: we assume that the parent will be (recursively) rendered
|
6095
|
+
// later anyway.
|
6096
|
+
node.debug("nodeRender ignored due to unrendered parent");
|
6097
|
+
return;
|
6098
|
+
}
|
5342
6099
|
// Create new <tr> after previous row
|
5343
6100
|
newRow = tree.rowFragment.firstChild.cloneNode(true);
|
5344
6101
|
prevNode = findPrevRowNode(node);
|
5345
|
-
//
|
6102
|
+
// $.ui.fancytree.debug("*** nodeRender " + node + ": prev: " + prevNode.key);
|
5346
6103
|
_assert(prevNode);
|
5347
6104
|
if(collapsed === true && _recursive){
|
5348
6105
|
// hide all child rows, so we can use an animation to show it later
|
@@ -5377,11 +6134,16 @@ $.ui.fancytree.registerExtension({
|
|
5377
6134
|
opts.createNode.call(tree, {type: "createNode"}, ctx);
|
5378
6135
|
}
|
5379
6136
|
} else {
|
5380
|
-
|
5381
|
-
|
6137
|
+
if( force ) {
|
6138
|
+
// Set icon, link, and title (normally this is only required on initial render)
|
6139
|
+
this.nodeRenderTitle(ctx); // triggers renderColumns()
|
6140
|
+
} else {
|
6141
|
+
// Update element classes according to node state
|
6142
|
+
this.nodeRenderStatus(ctx);
|
6143
|
+
}
|
5382
6144
|
}
|
5383
6145
|
}
|
5384
|
-
|
6146
|
+
// Allow tweaking after node state was rendered
|
5385
6147
|
// tree._triggerNodeEvent("renderNode", ctx);
|
5386
6148
|
if ( opts.renderNode ){
|
5387
6149
|
opts.renderNode.call(tree, {type: "renderNode"}, ctx);
|
@@ -5418,9 +6180,9 @@ $.ui.fancytree.registerExtension({
|
|
5418
6180
|
});
|
5419
6181
|
}
|
5420
6182
|
// Update element classes according to node state
|
5421
|
-
if(!isRootNode){
|
5422
|
-
|
5423
|
-
}
|
6183
|
+
// if(!isRootNode){
|
6184
|
+
// this.nodeRenderStatus(ctx);
|
6185
|
+
// }
|
5424
6186
|
},
|
5425
6187
|
nodeRenderTitle: function(ctx, title) {
|
5426
6188
|
var $cb,
|
@@ -5429,13 +6191,19 @@ $.ui.fancytree.registerExtension({
|
|
5429
6191
|
|
5430
6192
|
this._super(ctx);
|
5431
6193
|
// Move checkbox to custom column
|
5432
|
-
if(opts.checkbox && opts.table.checkboxColumnIdx != null){
|
6194
|
+
if(opts.checkbox && opts.table.checkboxColumnIdx != null ){
|
5433
6195
|
$cb = $("span.fancytree-checkbox", node.span).detach();
|
5434
6196
|
$(node.tr).find("td:first").html($cb);
|
5435
6197
|
}
|
5436
6198
|
// Let user code write column content
|
5437
6199
|
// ctx.tree._triggerNodeEvent("renderColumns", node);
|
5438
|
-
|
6200
|
+
// Update element classes according to node state
|
6201
|
+
if( ! node.isRoot() ){
|
6202
|
+
this.nodeRenderStatus(ctx);
|
6203
|
+
}
|
6204
|
+
if( !opts.table.customStatus && node.isStatusNode() ) {
|
6205
|
+
// default rendering for status node: leave other cells empty
|
6206
|
+
} else if ( opts.renderColumns ) {
|
5439
6207
|
opts.renderColumns.call(ctx.tree, {type: "renderColumns"}, ctx);
|
5440
6208
|
}
|
5441
6209
|
},
|
@@ -5453,21 +6221,45 @@ $.ui.fancytree.registerExtension({
|
|
5453
6221
|
},
|
5454
6222
|
/* Expand node, return Deferred.promise. */
|
5455
6223
|
nodeSetExpanded: function(ctx, flag, opts) {
|
5456
|
-
|
6224
|
+
var dfd = new $.Deferred(),
|
6225
|
+
prevOpts = opts || {};
|
6226
|
+
|
6227
|
+
opts = $.extend({}, opts, {noEvents: true, noAnimation: true});
|
6228
|
+
|
6229
|
+
function _afterExpand(ok) {
|
5457
6230
|
flag = (flag !== false);
|
5458
6231
|
setChildRowVisibility(ctx.node, flag);
|
6232
|
+
if( !prevOpts.noEvents ) {
|
6233
|
+
ctx.tree._triggerNodeEvent(flag ? "expand" : "collapse", ctx);
|
6234
|
+
}
|
6235
|
+
if( ok ) {
|
6236
|
+
dfd.resolveWith(ctx.node);
|
6237
|
+
} else {
|
6238
|
+
dfd.rejectWith(ctx.node);
|
6239
|
+
}
|
6240
|
+
}
|
6241
|
+
this._super(ctx, flag, opts).done(function () {
|
6242
|
+
_afterExpand(true);
|
6243
|
+
}).fail(function () {
|
6244
|
+
_afterExpand(false);
|
5459
6245
|
});
|
6246
|
+
return dfd.promise();
|
5460
6247
|
},
|
5461
6248
|
nodeSetStatus: function(ctx, status, message, details) {
|
5462
6249
|
if(status === "ok"){
|
5463
6250
|
var node = ctx.node,
|
5464
6251
|
firstChild = ( node.children ? node.children[0] : null );
|
5465
|
-
if ( firstChild && firstChild.isStatusNode ) {
|
6252
|
+
if ( firstChild && firstChild.isStatusNode() ) {
|
5466
6253
|
$(firstChild.tr).remove();
|
5467
6254
|
}
|
5468
6255
|
}
|
5469
6256
|
this._super(ctx, status, message, details);
|
5470
|
-
}
|
6257
|
+
},
|
6258
|
+
treeClear: function(ctx) {
|
6259
|
+
this.nodeRemoveChildMarkup(this._makeHookContext(this.rootNode));
|
6260
|
+
return this._super(ctx);
|
6261
|
+
}
|
6262
|
+
/*,
|
5471
6263
|
treeSetFocus: function(ctx, flag) {
|
5472
6264
|
// alert("treeSetFocus" + ctx.tree.$container);
|
5473
6265
|
ctx.tree.$container.focus();
|
@@ -5489,8 +6281,8 @@ $.ui.fancytree.registerExtension({
|
|
5489
6281
|
* Released under the MIT license
|
5490
6282
|
* https://github.com/mar10/fancytree/wiki/LicenseInfo
|
5491
6283
|
*
|
5492
|
-
* @version 2.0.0-
|
5493
|
-
* @date 2014-
|
6284
|
+
* @version 2.0.0-11
|
6285
|
+
* @date 2014-04-27T22:28
|
5494
6286
|
*/
|
5495
6287
|
|
5496
6288
|
;(function($, window, document, undefined) {
|