|
1 | 1 |
|
2 | 2 | /*
|
3 |
| - * aciTree jQuery Plugin v4.5.0-rc.1 |
| 3 | + * aciTree jQuery Plugin v4.5.0-rc.2 |
4 | 4 | * http://acoderinsights.ro
|
5 | 5 | *
|
6 | 6 | * Copyright (c) 2014 Dragos Ursu
|
|
198 | 198 | }
|
199 | 199 | })).on('mouseenter' + this._instance.nameSpace + ' mouseleave' + this._instance.nameSpace, '.aciTreePush', function(e) {
|
200 | 200 | // 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'); |
204 | 204 | }
|
205 |
| - element.toggleClass('aciTreeHover', e.type == 'mouseenter'); |
| 205 | + domApi.toggleClass(element, 'aciTreeHover', e.type == 'mouseenter'); |
206 | 206 | }).on('mouseenter' + this._instance.nameSpace + ' mouseleave' + this._instance.nameSpace, '.aciTreeLine', function(e) {
|
207 | 207 | // 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'); |
211 | 211 | }
|
212 |
| - element.toggleClass('aciTreeHover', e.type == 'mouseenter'); |
| 212 | + domApi.toggleClass(element, 'aciTreeHover', e.type == 'mouseenter'); |
213 | 213 | });
|
214 | 214 | this._initHook();
|
215 | 215 | // call on success
|
|
334 | 334 | return;
|
335 | 335 | }
|
336 | 336 | var callback, async = false;
|
337 |
| - if (load == 0) { |
| 337 | + if (load < options.async * 2) { |
338 | 338 | // get the next synchronous callback
|
339 | 339 | callback = fifo.shift();
|
340 | 340 | }
|
|
1118 | 1118 | // when `reverse` is TRUE returns the path in reverse order
|
1119 | 1119 | path: function(item, reverse) {
|
1120 | 1120 | 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()); |
1123 | 1126 | }
|
1124 | 1127 | return $([]);
|
1125 | 1128 | },
|
|
1128 | 1131 | isVisible: function(item, center) {
|
1129 | 1132 | if (item && this.isOpenPath(item)) {
|
1130 | 1133 | // 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); |
1135 | 1138 | var offset = center ? this._instance.jQuery.innerHeight() / 2 : 0;
|
1136 | 1139 | if ((test.bottom - height < rect.top + offset) || (test.top + height > rect.bottom - offset)) {
|
1137 | 1140 | // is out of view
|
|
1166 | 1169 | // test if path to item is open
|
1167 | 1170 | isOpenPath: function(item) {
|
1168 | 1171 | 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; |
1170 | 1173 | },
|
1171 | 1174 | // get animation speed vs. offset size
|
1172 | 1175 | // `speed` is the raw speed
|
|
1212 | 1215 | }
|
1213 | 1216 | var process = function() {
|
1214 | 1217 | // 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); |
1219 | 1222 | var offset = options.center ? this._instance.jQuery.innerHeight() / 2 : 0;
|
1220 | 1223 | if (test.bottom - height < rect.top + offset) {
|
1221 | 1224 | // item somewhere before the first visible
|
|
1276 | 1279 | },
|
1277 | 1280 | // get item parent
|
1278 | 1281 | parent: function(item) {
|
1279 |
| - return item ? item.parent().parent('.aciTreeLi') : $([]); |
| 1282 | + return item ? $(domApi.parent(item[0])) : $([]); |
1280 | 1283 | },
|
1281 | 1284 | // get item top (ROOT) parent
|
1282 | 1285 | topParent: function(item) {
|
|
1307 | 1310 | var process = this.proxy(function(node, itemList) {
|
1308 | 1311 | if (node) {
|
1309 | 1312 | // set it as a inode
|
1310 |
| - node.addClass('aciTreeInode').removeClass('aciTreeInodeMaybe'); |
| 1313 | + domApi.addRemoveClass(node[0], 'aciTreeInode', 'aciTreeInodeMaybe'); |
1311 | 1314 | }
|
1312 | 1315 | // use .append to add new items
|
1313 | 1316 | this.append(node, this._inner(options, {
|
|
1340 | 1343 | if (!parent) {
|
1341 | 1344 | parent = this._instance.jQuery;
|
1342 | 1345 | }
|
1343 |
| - return parent.children('.aciTreeUl').children('.aciTreeFirst,.aciTreeLast'); |
| 1346 | + return $(domApi.withAnyClass(domApi.children(parent[0]), ['aciTreeFirst', 'aciTreeLast'])); |
1344 | 1347 | },
|
1345 | 1348 | // update first/last items
|
1346 | 1349 | _setFirstLast: function(parent, clear) {
|
|
1353 | 1356 | // update odd/even state
|
1354 | 1357 | _setOddEven: function(items) {
|
1355 | 1358 | // 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 | + })); |
1367 | 1367 | }
|
1368 | 1368 | 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); |
1374 | 1398 | }
|
1375 |
| - // process only after index |
1376 |
| - visible = visible.filter(':gt(' + index + ')'); |
1377 | 1399 | }
|
1378 |
| - this._coreDOM.oddEven(visible, odd); |
| 1400 | + this._coreDOM.oddEven($(visible), odd); |
1379 | 1401 | },
|
1380 | 1402 | // update odd/even state for direct children
|
1381 | 1403 | _setOddEvenChildren: function(item) {
|
1382 |
| - var odd = item.hasClass('aciTreeOdd'); |
| 1404 | + var odd = domApi.hasClass(item[0], 'aciTreeOdd'); |
1383 | 1405 | var children = this.children(item);
|
1384 |
| - this._coreDOM.oddEven(children, odd); |
| 1406 | + this._coreDOM.oddEven(children, !odd); |
1385 | 1407 | },
|
1386 | 1408 | // process item before inserting into the DOM
|
1387 | 1409 | _itemHook: function(parent, item, itemData, level) {
|
|
1529 | 1551 | item = this._instance.jQuery;
|
1530 | 1552 | }
|
1531 | 1553 | // 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); |
1536 | 1561 | }
|
1537 |
| - return container; |
| 1562 | + return $(ul); |
1538 | 1563 | },
|
1539 | 1564 | // remove children container
|
1540 | 1565 | _removeContainer: function(item) {
|
1541 | 1566 | if (!item) {
|
1542 | 1567 | item = this._instance.jQuery;
|
1543 | 1568 | }
|
1544 |
| - item.children('.aciTreeUl').remove(); |
| 1569 | + var ul = domApi.container(item[0]); |
| 1570 | + ul.parentNode.removeChild(ul); |
1545 | 1571 | },
|
1546 | 1572 | // append one or more items to item
|
1547 | 1573 | // `options.itemData` can be a item object or array of item objects
|
|
1689 | 1715 | itemFrom: function(element) {
|
1690 | 1716 | if (element) {
|
1691 | 1717 | var item = $(element);
|
1692 |
| - if (item.get(0) == this._instance.jQuery.get(0)) { |
| 1718 | + if (item[0] === this._instance.jQuery[0]) { |
1693 | 1719 | return $([]);
|
1694 | 1720 | } else {
|
1695 |
| - return item.closest('.aciTreeLi'); |
| 1721 | + return $(domApi.parentFrom(item[0])); |
1696 | 1722 | }
|
1697 | 1723 | }
|
1698 | 1724 | return $([]);
|
|
1708 | 1734 | // filter only the visible items (items with all parents opened)
|
1709 | 1735 | // if `view` is TRUE then only the items in view are returned
|
1710 | 1736 | visible: function(items, view) {
|
1711 |
| - items = items.filter('.aciTreeVisible'); |
| 1737 | + var list = domApi.withClass(items.toArray(), 'aciTreeVisible'); |
1712 | 1738 | 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); |
1717 | 1746 | }
|
1718 |
| - return items; |
| 1747 | + return $(list); |
1719 | 1748 | },
|
1720 | 1749 | // filter only inner nodes from items
|
1721 | 1750 | // if `state` is set then filter only open/closed ones
|
|
1743 | 1772 | },
|
1744 | 1773 | // test if item was loaded
|
1745 | 1774 | 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; |
1751 | 1777 | }
|
1752 |
| - return true; |
| 1778 | + return domApi.container(this._instance.jQuery[0]) !== null; |
1753 | 1779 | },
|
1754 | 1780 | // set item as inner node
|
1755 | 1781 | setInode: function(item, options) {
|
|
2265 | 2291 | // test if item is busy/loading
|
2266 | 2292 | isBusy: function(item) {
|
2267 | 2293 | if (item) {
|
2268 |
| - return item.hasClass('aciTreeLoad'); |
| 2294 | + return domApi.hasClass(item[0], 'aciTreeLoad'); |
2269 | 2295 | } else {
|
2270 | 2296 | return this._instance.queue.busy();
|
2271 | 2297 | }
|
2272 | 2298 | },
|
2273 | 2299 | // set loading state
|
2274 | 2300 | _loading: function(item, state) {
|
2275 | 2301 | if (item) {
|
| 2302 | + domApi.toggleClass(item[0], 'aciTreeLoad', state); |
2276 | 2303 | if (state) {
|
2277 |
| - item.attr('aria-busy', true); |
| 2304 | + item[0].setAttribute('aria-busy', true); |
2278 | 2305 | } else {
|
2279 |
| - item.removeAttr('aria-busy'); |
| 2306 | + item[0].removeAttribute('aria-busy'); |
2280 | 2307 | }
|
2281 |
| - item.toggleClass('aciTreeLoad', state); |
2282 | 2308 | } else if (state) {
|
2283 | 2309 | this._loader(state);
|
2284 | 2310 | }
|
|
0 commit comments