Skip to content

Commit 76710d5

Browse files
committed
selectable/focus bugfix
persist update/fix for multiple node/loading
1 parent 04225f8 commit 76710d5

17 files changed

+309
-117
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ $(function(){
4040

4141
});
4242

43-
aciTree jQuery Plugin v4.5.0-rc.1
43+
aciTree jQuery Plugin v4.5.0-rc.2
4444
http://acoderinsights.ro
4545

4646
Copyright (c) 2014 Dragos Ursu

aciTree.html

+4-3
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,17 @@
1313
<script type="text/javascript" src="js/jquery.aciSortable.min.js"></script>
1414
<script type="text/javascript" src="js/jquery.aciTree.dom.js"></script>
1515
<script type="text/javascript" src="js/jquery.aciTree.core.js"></script>
16-
<script type="text/javascript" src="js/Xjquery.aciTree.aria.js"></script>
17-
<script type="text/javascript" src="js/Xjquery.aciTree.en_EN.js"></script>
16+
<!--<script type="text/javascript" src="js/jquery.aciTree.aria.js"></script>
17+
<script type="text/javascript" src="js/jquery.aciTree.en_EN.js"></script>-->
1818
<script type="text/javascript" src="js/jquery.aciTree.utils.js"></script>
1919
<script type="text/javascript" src="js/jquery.aciTree.selectable.js"></script>
2020
<script type="text/javascript" src="js/jquery.aciTree.checkbox.js"></script>
2121
<script type="text/javascript" src="js/jquery.aciTree.radio.js"></script>
2222
<script type="text/javascript" src="js/jquery.aciTree.column.js"></script>
2323
<script type="text/javascript" src="js/jquery.aciTree.editable.js"></script>
2424
<script type="text/javascript" src="js/jquery.aciTree.sortable.js"></script>
25-
<script type="text/javascript" src="js/jstorage.min.js"></script>
25+
<!--<script type="text/javascript" src="js/jquery.aciTree.persist.js"></script>
26+
<script type="text/javascript" src="js/jstorage.min.js"></script>-->
2627
</head>
2728
<body>
2829

aciTree.jquery.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"ui",
99
"ajax"
1010
],
11-
"version": "4.5.0-rc.1",
11+
"version": "4.5.0-rc.2",
1212
"author": {
1313
"name": "Dragos Ursu",
1414
"email":"dragosu@acoderinsights.ro",

documentation.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html lang="en">
33
<head>
44
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5-
<title>aciTree v4.5.0-rc.1 - A treeview control with jQuery</title>
5+
<title>aciTree v4.5.0-rc.2 - A treeview control with jQuery</title>
66
<meta name="description" content="aciTree API documentation">
77
<style type="text/css">
88
html {
@@ -146,7 +146,7 @@
146146
</head>
147147

148148
<body>
149-
<h1>aciTree API v4.5.0-rc.1</h1>
149+
<h1>aciTree API v4.5.0-rc.2</h1>
150150

151151
<p>
152152
Please note: here are listed only the public API methods, you need to
@@ -1683,7 +1683,7 @@ <h1>aciTree API v4.5.0-rc.1</h1>
16831683

16841684
</div>
16851685

1686-
<p>aciTree jQuery Plugin v4.5.0-rc.1</p>
1686+
<p>aciTree jQuery Plugin v4.5.0-rc.2</p>
16871687
<p>http://acoderinsights.ro</p>
16881688

16891689
<p>Copyright (c) 2014 Dragos Ursu</p>

js/jquery.aciTree.checkbox.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
/*
3-
* aciTree jQuery Plugin v4.5.0-rc.1
3+
* aciTree jQuery Plugin v4.5.0-rc.2
44
* http://acoderinsights.ro
55
*
66
* Copyright (c) 2014 Dragos Ursu
@@ -99,7 +99,7 @@
9999
if (this.extCheckbox()) {
100100
// support `radio` extension
101101
var radio = this.extRadio && this.hasRadio(item);
102-
if (!radio && (itemData.checkbox || (itemData.checkbox === undefined))) {
102+
if (!radio && (itemData.checkbox || ((itemData.checkbox === undefined) && (!this.extRadio || !this.extRadio())))) {
103103
this._checkboxDOM.add(item, itemData);
104104
}
105105
}

js/jquery.aciTree.column.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
/*
3-
* aciTree jQuery Plugin v4.5.0-rc.1
3+
* aciTree jQuery Plugin v4.5.0-rc.2
44
* http://acoderinsights.ro
55
*
66
* Copyright (c) 2014 Dragos Ursu

js/jquery.aciTree.core.js

+95-69
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
/*
3-
* aciTree jQuery Plugin v4.5.0-rc.1
3+
* aciTree jQuery Plugin v4.5.0-rc.2
44
* http://acoderinsights.ro
55
*
66
* Copyright (c) 2014 Dragos Ursu
@@ -198,18 +198,18 @@
198198
}
199199
})).on('mouseenter' + this._instance.nameSpace + ' mouseleave' + this._instance.nameSpace, '.aciTreePush', function(e) {
200200
// handle the aciTreeHover class
201-
var element = $(e.target);
202-
if (!element.hasClass('aciTreePush')) {
203-
element = element.parents('.aciTreePush:first');
201+
var element = e.target;
202+
if (!domApi.hasClass(element, 'aciTreePush')) {
203+
element = domApi.parentByClass(element, 'aciTreePush');
204204
}
205-
element.toggleClass('aciTreeHover', e.type == 'mouseenter');
205+
domApi.toggleClass(element, 'aciTreeHover', e.type == 'mouseenter');
206206
}).on('mouseenter' + this._instance.nameSpace + ' mouseleave' + this._instance.nameSpace, '.aciTreeLine', function(e) {
207207
// handle the aciTreeHover class
208-
var element = $(e.target);
209-
if (!element.hasClass('aciTreeLine')) {
210-
element = element.parents('.aciTreeLine:first');
208+
var element = e.target;
209+
if (!domApi.hasClass(element, 'aciTreeLine')) {
210+
element = domApi.parentByClass(element, 'aciTreeLine');
211211
}
212-
element.toggleClass('aciTreeHover', e.type == 'mouseenter');
212+
domApi.toggleClass(element, 'aciTreeHover', e.type == 'mouseenter');
213213
});
214214
this._initHook();
215215
// call on success
@@ -334,7 +334,7 @@
334334
return;
335335
}
336336
var callback, async = false;
337-
if (load == 0) {
337+
if (load < options.async * 2) {
338338
// get the next synchronous callback
339339
callback = fifo.shift();
340340
}
@@ -1118,8 +1118,11 @@
11181118
// when `reverse` is TRUE returns the path in reverse order
11191119
path: function(item, reverse) {
11201120
if (item) {
1121-
var path = item.parentsUntil(this._instance.jQuery, '.aciTreeLi');
1122-
return reverse ? path : $(path.get().reverse());
1121+
var parent = item[0], list = [];
1122+
while (parent = domApi.parent(parent)) {
1123+
list.push(parent);
1124+
}
1125+
return reverse ? $(list) : $(list.reverse());
11231126
}
11241127
return $([]);
11251128
},
@@ -1128,10 +1131,10 @@
11281131
isVisible: function(item, center) {
11291132
if (item && this.isOpenPath(item)) {
11301133
// the item path need to be open
1131-
var rect = this._instance.jQuery.get(0).getBoundingClientRect();
1132-
var size = item.children('.aciTreeLine').find('.aciTreeItem');
1133-
var test = size.get(0).getBoundingClientRect();
1134-
var height = size.outerHeight(true);
1134+
var rect = this._instance.jQuery[0].getBoundingClientRect();
1135+
var size = domApi.childrenByClass(item[0], 'aciTreeItem');
1136+
var test = size.getBoundingClientRect();
1137+
var height = $(size).outerHeight(true);
11351138
var offset = center ? this._instance.jQuery.innerHeight() / 2 : 0;
11361139
if ((test.bottom - height < rect.top + offset) || (test.top + height > rect.bottom - offset)) {
11371140
// is out of view
@@ -1166,7 +1169,7 @@
11661169
// test if path to item is open
11671170
isOpenPath: function(item) {
11681171
var parent = this.parent(item);
1169-
return parent.length ? parent.hasClass('aciTreeVisible') : true;
1172+
return parent.length ? this.isOpen(parent) && domApi.hasClass(parent[0], 'aciTreeVisible') : true;
11701173
},
11711174
// get animation speed vs. offset size
11721175
// `speed` is the raw speed
@@ -1212,10 +1215,10 @@
12121215
}
12131216
var process = function() {
12141217
// compute position with getBoundingClientRect
1215-
var rect = this._instance.jQuery.get(0).getBoundingClientRect();
1216-
var size = item.children('.aciTreeLine').find('.aciTreeItem');
1217-
var test = size.get(0).getBoundingClientRect();
1218-
var height = size.outerHeight(true);
1218+
var rect = this._instance.jQuery[0].getBoundingClientRect();
1219+
var size = domApi.childrenByClass(item[0], 'aciTreeItem');
1220+
var test = size.getBoundingClientRect();
1221+
var height = $(size).outerHeight(true);
12191222
var offset = options.center ? this._instance.jQuery.innerHeight() / 2 : 0;
12201223
if (test.bottom - height < rect.top + offset) {
12211224
// item somewhere before the first visible
@@ -1276,7 +1279,7 @@
12761279
},
12771280
// get item parent
12781281
parent: function(item) {
1279-
return item ? item.parent().parent('.aciTreeLi') : $([]);
1282+
return item ? $(domApi.parent(item[0])) : $([]);
12801283
},
12811284
// get item top (ROOT) parent
12821285
topParent: function(item) {
@@ -1307,7 +1310,7 @@
13071310
var process = this.proxy(function(node, itemList) {
13081311
if (node) {
13091312
// set it as a inode
1310-
node.addClass('aciTreeInode').removeClass('aciTreeInodeMaybe');
1313+
domApi.addRemoveClass(node[0], 'aciTreeInode', 'aciTreeInodeMaybe');
13111314
}
13121315
// use .append to add new items
13131316
this.append(node, this._inner(options, {
@@ -1340,7 +1343,7 @@
13401343
if (!parent) {
13411344
parent = this._instance.jQuery;
13421345
}
1343-
return parent.children('.aciTreeUl').children('.aciTreeFirst,.aciTreeLast');
1346+
return $(domApi.withAnyClass(domApi.children(parent[0]), ['aciTreeFirst', 'aciTreeLast']));
13441347
},
13451348
// update first/last items
13461349
_setFirstLast: function(parent, clear) {
@@ -1353,35 +1356,54 @@
13531356
// update odd/even state
13541357
_setOddEven: function(items) {
13551358
// consider only visible items
1356-
var visible = this._instance.jQuery.find('.aciTreeVisible');
1357-
var index = 0;
1358-
if (items) {
1359-
// search the item to start with (by index)
1360-
items.each(function() {
1361-
var found = visible.index(this);
1362-
if (found != -1) {
1363-
index = window.Math.min(found, index);
1364-
}
1365-
});
1366-
index = window.Math.max(index - 1, 0);
1359+
var visible;
1360+
if (this._instance.jQuery[0].getElementsByClassName) {
1361+
visible = this._instance.jQuery[0].getElementsByClassName('aciTreeVisible');
1362+
visible = visible ? window.Array.prototype.slice.call(visible) : [];
1363+
} else {
1364+
visible = $(domApi.children(this._instance.jQuery[0], true, function(node) {
1365+
return this.hasClass(node, 'aciTreeVisible') ? true : null;
1366+
}));
13671367
}
13681368
var odd = true;
1369-
if (index > 0) {
1370-
// determine with what to start with (odd/even)
1371-
var first = visible.eq(index);
1372-
if (first.hasClass('aciTreOdd')) {
1373-
odd = false;
1369+
if (visible.length) {
1370+
var index = 0;
1371+
if (items) {
1372+
// search the item to start with (by index)
1373+
items.each(function() {
1374+
if (visible.indexOf) {
1375+
var found = visible.indexOf(this);
1376+
if (found != -1) {
1377+
index = window.Math.min(found, index);
1378+
}
1379+
} else {
1380+
for (var i = 0; i < visible.length; i++) {
1381+
if (visible[i] === this) {
1382+
index = window.Math.min(i, index);
1383+
break;
1384+
}
1385+
}
1386+
}
1387+
});
1388+
index = window.Math.max(index - 1, 0);
1389+
}
1390+
if (index > 0) {
1391+
// determine with what to start with (odd/even)
1392+
var first = visible[index];
1393+
if (domApi.hasClass(first, 'aciTreOdd')) {
1394+
odd = false;
1395+
}
1396+
// process only after index
1397+
visible = visible.slice(index + 1);
13741398
}
1375-
// process only after index
1376-
visible = visible.filter(':gt(' + index + ')');
13771399
}
1378-
this._coreDOM.oddEven(visible, odd);
1400+
this._coreDOM.oddEven($(visible), odd);
13791401
},
13801402
// update odd/even state for direct children
13811403
_setOddEvenChildren: function(item) {
1382-
var odd = item.hasClass('aciTreeOdd');
1404+
var odd = domApi.hasClass(item[0], 'aciTreeOdd');
13831405
var children = this.children(item);
1384-
this._coreDOM.oddEven(children, odd);
1406+
this._coreDOM.oddEven(children, !odd);
13851407
},
13861408
// process item before inserting into the DOM
13871409
_itemHook: function(parent, item, itemData, level) {
@@ -1529,19 +1551,23 @@
15291551
item = this._instance.jQuery;
15301552
}
15311553
// ensure we have a UL in place
1532-
var container = item.children('.aciTreeUl');
1533-
if (!container.length) {
1534-
container = $('<ul class="aciTreeUl" role="group" style="display:none"></ul>');
1535-
item.append(container);
1554+
var ul = domApi.container(item[0]);
1555+
if (!ul) {
1556+
var ul = window.document.createElement('UL');
1557+
ul.setAttribute('role', 'group');
1558+
ul.className = 'aciTreeUl';
1559+
ul.style.display = 'none';
1560+
item[0].appendChild(ul);
15361561
}
1537-
return container;
1562+
return $(ul);
15381563
},
15391564
// remove children container
15401565
_removeContainer: function(item) {
15411566
if (!item) {
15421567
item = this._instance.jQuery;
15431568
}
1544-
item.children('.aciTreeUl').remove();
1569+
var ul = domApi.container(item[0]);
1570+
ul.parentNode.removeChild(ul);
15451571
},
15461572
// append one or more items to item
15471573
// `options.itemData` can be a item object or array of item objects
@@ -1689,10 +1715,10 @@
16891715
itemFrom: function(element) {
16901716
if (element) {
16911717
var item = $(element);
1692-
if (item.get(0) == this._instance.jQuery.get(0)) {
1718+
if (item[0] === this._instance.jQuery[0]) {
16931719
return $([]);
16941720
} else {
1695-
return item.closest('.aciTreeLi');
1721+
return $(domApi.parentFrom(item[0]));
16961722
}
16971723
}
16981724
return $([]);
@@ -1708,14 +1734,17 @@
17081734
// filter only the visible items (items with all parents opened)
17091735
// if `view` is TRUE then only the items in view are returned
17101736
visible: function(items, view) {
1711-
items = items.filter('.aciTreeVisible');
1737+
var list = domApi.withClass(items.toArray(), 'aciTreeVisible');
17121738
if (view) {
1713-
var visible = $.grep(items.get(), this.proxy(function(item) {
1714-
return this.isVisible($(item));
1715-
}));
1716-
items = $(visible);
1739+
var filter = [];
1740+
for (var i = 0; i < list.length; i++) {
1741+
if (this.isVisible($(list[i]))) {
1742+
filter.push(list[i]);
1743+
}
1744+
}
1745+
return $(filter);
17171746
}
1718-
return items;
1747+
return $(list);
17191748
},
17201749
// filter only inner nodes from items
17211750
// if `state` is set then filter only open/closed ones
@@ -1743,13 +1772,10 @@
17431772
},
17441773
// test if item was loaded
17451774
wasLoad: function(item) {
1746-
if (!item) {
1747-
return this._instance.jQuery.children('.aciTreeUl').length > 0;
1748-
}
1749-
if (this.isInode(item)) {
1750-
return item.children('.aciTreeUl').length > 0;
1775+
if (item) {
1776+
return domApi.container(item[0]) !== null;
17511777
}
1752-
return true;
1778+
return domApi.container(this._instance.jQuery[0]) !== null;
17531779
},
17541780
// set item as inner node
17551781
setInode: function(item, options) {
@@ -2265,20 +2291,20 @@
22652291
// test if item is busy/loading
22662292
isBusy: function(item) {
22672293
if (item) {
2268-
return item.hasClass('aciTreeLoad');
2294+
return domApi.hasClass(item[0], 'aciTreeLoad');
22692295
} else {
22702296
return this._instance.queue.busy();
22712297
}
22722298
},
22732299
// set loading state
22742300
_loading: function(item, state) {
22752301
if (item) {
2302+
domApi.toggleClass(item[0], 'aciTreeLoad', state);
22762303
if (state) {
2277-
item.attr('aria-busy', true);
2304+
item[0].setAttribute('aria-busy', true);
22782305
} else {
2279-
item.removeAttr('aria-busy');
2306+
item[0].removeAttribute('aria-busy');
22802307
}
2281-
item.toggleClass('aciTreeLoad', state);
22822308
} else if (state) {
22832309
this._loader(state);
22842310
}

0 commit comments

Comments
 (0)