jquery.dgtable 0.6.1 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/jquery.dgtable.cjs.js +181 -57
- package/dist/jquery.dgtable.cjs.js.map +1 -1
- package/dist/jquery.dgtable.cjs.min.js +2 -2
- package/dist/jquery.dgtable.cjs.min.js.map +1 -1
- package/dist/jquery.dgtable.es6.js +181 -57
- package/dist/jquery.dgtable.es6.js.map +1 -1
- package/dist/jquery.dgtable.es6.min.js +2 -2
- package/dist/jquery.dgtable.es6.min.js.map +1 -1
- package/dist/jquery.dgtable.umd.js +242 -118
- package/dist/jquery.dgtable.umd.js.map +1 -1
- package/dist/jquery.dgtable.umd.min.js +2 -2
- package/dist/jquery.dgtable.umd.min.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* jquery.dgtable 0.6.
|
|
2
|
+
* jquery.dgtable 0.6.2
|
|
3
3
|
* git://github.com/danielgindi/jquery.dgtable.git
|
|
4
4
|
*/
|
|
5
5
|
'use strict';
|
|
@@ -1786,6 +1786,45 @@ class SelectionHelper {
|
|
|
1786
1786
|
|
|
1787
1787
|
const hasOwnProperty$1 = Object.prototype.hasOwnProperty;
|
|
1788
1788
|
|
|
1789
|
+
const hasInsertAdjacentElement = Element.prototype.insertAdjacentElement !== undefined;
|
|
1790
|
+
|
|
1791
|
+
function insertBefore(el, before, parent) {
|
|
1792
|
+
if (!before)
|
|
1793
|
+
parent.appendChild(el);else
|
|
1794
|
+
if (hasInsertAdjacentElement === true)
|
|
1795
|
+
before.insertAdjacentElement('beforebegin', el);else
|
|
1796
|
+
parent.insertBefore(el, before);
|
|
1797
|
+
}
|
|
1798
|
+
|
|
1799
|
+
/**
|
|
1800
|
+
*
|
|
1801
|
+
* @param {Element} itemEl
|
|
1802
|
+
* @param {DocumentFragment|null} fragment
|
|
1803
|
+
* @param {Node|undefined} before
|
|
1804
|
+
* @param {Element} itemParent
|
|
1805
|
+
* @returns {DocumentFragment|null}
|
|
1806
|
+
*/
|
|
1807
|
+
function insertBeforeWithFragment(itemEl, fragment, before, itemParent) {
|
|
1808
|
+
if (itemEl.parentNode !== itemParent) {
|
|
1809
|
+
if (!fragment)
|
|
1810
|
+
fragment = document.createDocumentFragment();
|
|
1811
|
+
fragment.appendChild(itemEl);
|
|
1812
|
+
} else {
|
|
1813
|
+
// insert fragment
|
|
1814
|
+
if (fragment && fragment.childNodes.length > 0) {
|
|
1815
|
+
insertBefore(fragment, before, itemParent);
|
|
1816
|
+
fragment = null;
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
// insert element
|
|
1820
|
+
if (itemEl.nextSibling !== before) {
|
|
1821
|
+
insertBefore(itemEl, before, itemParent);
|
|
1822
|
+
}
|
|
1823
|
+
}
|
|
1824
|
+
|
|
1825
|
+
return fragment;
|
|
1826
|
+
}
|
|
1827
|
+
|
|
1789
1828
|
class VirtualListHelper {
|
|
1790
1829
|
/**
|
|
1791
1830
|
* @param {VirtualListHelper~Options} opts
|
|
@@ -2164,6 +2203,7 @@ class VirtualListHelper {
|
|
|
2164
2203
|
const list = p.list;
|
|
2165
2204
|
const virtual = p.virtual;
|
|
2166
2205
|
let virtualWrapper = p.virtualWrapper;
|
|
2206
|
+
let itemParent = p.currentItemsParent;
|
|
2167
2207
|
let scrollTop = list.scrollTop;
|
|
2168
2208
|
let visibleHeight = list.clientHeight;
|
|
2169
2209
|
let visibleBottom = scrollTop + visibleHeight;
|
|
@@ -2184,6 +2224,7 @@ class VirtualListHelper {
|
|
|
2184
2224
|
}
|
|
2185
2225
|
|
|
2186
2226
|
this._resetCurrentItemsParent();
|
|
2227
|
+
itemParent = p.currentItemsParent;
|
|
2187
2228
|
|
|
2188
2229
|
if (p.autoVirtualWrapperWidth) {
|
|
2189
2230
|
virtualWrapper.style.width = '100%';
|
|
@@ -2213,12 +2254,18 @@ class VirtualListHelper {
|
|
|
2213
2254
|
let renderPos = this._calculateItemPosition(index);
|
|
2214
2255
|
let bufferEnd = buffer;
|
|
2215
2256
|
|
|
2216
|
-
|
|
2217
|
-
let
|
|
2257
|
+
// we want to render until viewport's bottom + buffer items
|
|
2258
|
+
let maxIndexToRender = Math.max(index, binarySearchPosition(p.cachedItemPositions, visibleBottom - 1) + 1 + buffer);
|
|
2259
|
+
|
|
2260
|
+
let insertedItems = [];
|
|
2218
2261
|
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2262
|
+
/** @type DocumentFragment|null */
|
|
2263
|
+
let fragment = null;
|
|
2264
|
+
|
|
2265
|
+
// Find the element to insert before
|
|
2266
|
+
let before = virtualWrapper.childNodes[0];
|
|
2267
|
+
|
|
2268
|
+
const findElementToReuse = function (index) {
|
|
2222
2269
|
// Find existing element to reuse
|
|
2223
2270
|
/** @type Element|undefined */
|
|
2224
2271
|
let existingEl = undefined;
|
|
@@ -2240,20 +2287,53 @@ class VirtualListHelper {
|
|
|
2240
2287
|
delete existingEl[ReuseElSymbol];
|
|
2241
2288
|
}
|
|
2242
2289
|
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2290
|
+
return existingEl;
|
|
2291
|
+
};
|
|
2292
|
+
|
|
2293
|
+
// First we iterate and try to add all at once in a fragment, as much as we can.
|
|
2294
|
+
// And then reflow the at once.
|
|
2295
|
+
for (; index < count && index < maxIndexToRender; index++) {
|
|
2296
|
+
let existingEl = findElementToReuse(index);
|
|
2297
|
+
|
|
2298
|
+
if (before && before === existingEl)
|
|
2299
|
+
before = before.nextSibling;
|
|
2247
2300
|
|
|
2248
2301
|
// Dequeue the element by reusing or creating a new one
|
|
2249
|
-
|
|
2302
|
+
const itemEl = this._dequeueElementForIndex(existingEl, index, before, true);
|
|
2303
|
+
insertedItems.push([itemEl, index]);
|
|
2304
|
+
|
|
2305
|
+
fragment = insertBeforeWithFragment(itemEl, fragment, before, itemParent);
|
|
2306
|
+
}
|
|
2307
|
+
|
|
2308
|
+
// Insert any remaining fragment
|
|
2309
|
+
if (fragment && fragment.childNodes.length > 0) {
|
|
2310
|
+
insertBefore(fragment, before, itemParent);
|
|
2311
|
+
}
|
|
2250
2312
|
|
|
2251
|
-
|
|
2313
|
+
// Iterate on inserted items and reflow them
|
|
2314
|
+
for (let item of insertedItems) {
|
|
2315
|
+
const index = item[1];
|
|
2316
|
+
this._insertItemAndFlow(item[0], index, false /* inserted already */);
|
|
2252
2317
|
renderPos = p.cachedItemPositions[index] + p.cachedItemHeights[index];
|
|
2253
|
-
index++;
|
|
2254
2318
|
}
|
|
2255
2319
|
|
|
2256
|
-
//
|
|
2320
|
+
// See if we still need to insert more items
|
|
2321
|
+
if (renderPos < visibleBottom) {
|
|
2322
|
+
for (; (renderPos < visibleBottom || bufferEnd-- > 0) && index < count; index++) {
|
|
2323
|
+
let existingEl = findElementToReuse(index);
|
|
2324
|
+
|
|
2325
|
+
if (before && before === existingEl)
|
|
2326
|
+
before = before.nextSibling;
|
|
2327
|
+
|
|
2328
|
+
// Dequeue the element by reusing or creating a new one
|
|
2329
|
+
this._dequeueElementForIndex(existingEl, index, before, false);
|
|
2330
|
+
|
|
2331
|
+
// Increment pointers
|
|
2332
|
+
renderPos = p.cachedItemPositions[index] + p.cachedItemHeights[index];
|
|
2333
|
+
}
|
|
2334
|
+
}
|
|
2335
|
+
|
|
2336
|
+
// Calculate up-to-date scroll height
|
|
2257
2337
|
let scrollHeight = this.estimateFullHeight();
|
|
2258
2338
|
p.virtualWrapper.style.height = scrollHeight + 'px';
|
|
2259
2339
|
|
|
@@ -2265,8 +2345,12 @@ class VirtualListHelper {
|
|
|
2265
2345
|
existingEls[i][ReuseElSymbol] = true;
|
|
2266
2346
|
}
|
|
2267
2347
|
|
|
2268
|
-
|
|
2269
|
-
let
|
|
2348
|
+
// Find the element to insert before
|
|
2349
|
+
let before = list.childNodes[0];
|
|
2350
|
+
|
|
2351
|
+
/** @type DocumentFragment|null */
|
|
2352
|
+
let fragment = null;
|
|
2353
|
+
|
|
2270
2354
|
for (let index = 0; index < count; index++) {
|
|
2271
2355
|
// Find existing element to reuse
|
|
2272
2356
|
let existingEl = existingEls.find((x) => x[ItemIndexSymbol] === index && x[ReuseElSymbol] === true);
|
|
@@ -2275,13 +2359,18 @@ class VirtualListHelper {
|
|
|
2275
2359
|
delete existingEl[ReuseElSymbol];
|
|
2276
2360
|
}
|
|
2277
2361
|
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
if (insertBefore && insertBefore === existingEl)
|
|
2281
|
-
insertBefore = insertBefore.nextSibling;
|
|
2362
|
+
if (before && before === existingEl)
|
|
2363
|
+
before = before.nextSibling;
|
|
2282
2364
|
|
|
2283
2365
|
// Dequeue the element by reusing or creating a new one
|
|
2284
|
-
|
|
2366
|
+
const itemEl = this._dequeueElementForIndex(existingEl, index, before, true);
|
|
2367
|
+
|
|
2368
|
+
fragment = insertBeforeWithFragment(itemEl, fragment, before, itemParent);
|
|
2369
|
+
}
|
|
2370
|
+
|
|
2371
|
+
// Insert any remaining fragment
|
|
2372
|
+
if (fragment && fragment.childNodes.length > 0) {
|
|
2373
|
+
insertBefore(fragment, before, itemParent);
|
|
2285
2374
|
}
|
|
2286
2375
|
}
|
|
2287
2376
|
}
|
|
@@ -2337,16 +2426,28 @@ class VirtualListHelper {
|
|
|
2337
2426
|
if (existingRange.firstValidArrayIndex === -1)
|
|
2338
2427
|
return this;
|
|
2339
2428
|
|
|
2429
|
+
const itemParent = p.currentItemsParent;
|
|
2430
|
+
|
|
2340
2431
|
let startIndex = existingRange.firstValidArrayIndex + atIndex - existingRange.firstIndex;
|
|
2341
2432
|
|
|
2342
2433
|
this._pushItemIndexesAt(atIndex, count);
|
|
2343
2434
|
|
|
2344
2435
|
/** @type Node|undefined */
|
|
2345
|
-
let
|
|
2436
|
+
let before = existingEls[startIndex - 1] ?
|
|
2437
|
+
existingEls[startIndex - 1].nextSibling :
|
|
2438
|
+
existingEls[0];
|
|
2439
|
+
|
|
2440
|
+
/** @type DocumentFragment|null */
|
|
2441
|
+
let fragment = null;
|
|
2346
2442
|
|
|
2347
2443
|
for (let index = atIndex, end = atIndex + count; index < end; index++) {
|
|
2348
|
-
|
|
2349
|
-
|
|
2444
|
+
const itemEl = this._dequeueElementForIndex(undefined, index, before, true);
|
|
2445
|
+
fragment = insertBeforeWithFragment(itemEl, fragment, before, itemParent);
|
|
2446
|
+
}
|
|
2447
|
+
|
|
2448
|
+
// Insert any remaining fragment
|
|
2449
|
+
if (fragment && fragment.childNodes.length > 0) {
|
|
2450
|
+
insertBefore(fragment, before, itemParent);
|
|
2350
2451
|
}
|
|
2351
2452
|
}
|
|
2352
2453
|
|
|
@@ -2429,7 +2530,7 @@ class VirtualListHelper {
|
|
|
2429
2530
|
if (index >= existingRange.firstIndex && index <= existingRange.lastIndex) {
|
|
2430
2531
|
let itemEl = existingEls[existingRange.firstValidArrayIndex + index - existingRange.firstIndex];
|
|
2431
2532
|
delete itemEl[ItemIndexSymbol];
|
|
2432
|
-
this._dequeueElementForIndex(itemEl, index, itemEl.nextSibling);
|
|
2533
|
+
this._dequeueElementForIndex(itemEl, index, itemEl.nextSibling, false);
|
|
2433
2534
|
}
|
|
2434
2535
|
}
|
|
2435
2536
|
|
|
@@ -2572,7 +2673,7 @@ class VirtualListHelper {
|
|
|
2572
2673
|
createGhostItemElement(ghostIndex, append, ghostTester) {
|
|
2573
2674
|
const p = this._p;
|
|
2574
2675
|
|
|
2575
|
-
let itemEl = this._dequeueElementForIndex(null, ghostIndex, false);
|
|
2676
|
+
let itemEl = this._dequeueElementForIndex(null, ghostIndex, false, true);
|
|
2576
2677
|
try {
|
|
2577
2678
|
if (append) {
|
|
2578
2679
|
p.currentItemsParent.appendChild(itemEl);
|
|
@@ -2823,13 +2924,14 @@ class VirtualListHelper {
|
|
|
2823
2924
|
* @param {Element|undefined} itemEl
|
|
2824
2925
|
* @param {number} index
|
|
2825
2926
|
* @param {Node|boolean|undefined} insertBefore
|
|
2927
|
+
* @param {boolean|undefined} avoidDomReflow
|
|
2826
2928
|
* @returns {Element}
|
|
2827
2929
|
* @private
|
|
2828
2930
|
*/
|
|
2829
|
-
_dequeueElementForIndex(itemEl, index, insertBefore) {
|
|
2931
|
+
_dequeueElementForIndex(itemEl, index, insertBefore, avoidDomReflow) {
|
|
2830
2932
|
const p = this._p;
|
|
2831
2933
|
const virtualWrapper = p.virtualWrapper;
|
|
2832
|
-
|
|
2934
|
+
p.currentItemsParent;
|
|
2833
2935
|
const existingEls = p.existingEls;
|
|
2834
2936
|
const onItemRender = p.onItemRender;
|
|
2835
2937
|
const onItemUnrender = p.onItemUnrender;
|
|
@@ -2864,12 +2966,6 @@ class VirtualListHelper {
|
|
|
2864
2966
|
if (!(insertBefore instanceof Node))
|
|
2865
2967
|
insertBefore = null;
|
|
2866
2968
|
|
|
2867
|
-
// Insert into DOM
|
|
2868
|
-
if (itemEl.parentNode !== itemParent ||
|
|
2869
|
-
itemEl.nextSibling !== insertBefore) {
|
|
2870
|
-
itemParent.insertBefore(itemEl, insertBefore);
|
|
2871
|
-
}
|
|
2872
|
-
|
|
2873
2969
|
// Remove from existing list
|
|
2874
2970
|
if (!isNew) {
|
|
2875
2971
|
let i = existingEls.indexOf(itemEl);
|
|
@@ -2885,37 +2981,65 @@ class VirtualListHelper {
|
|
|
2885
2981
|
existingEls.splice(beforeIndex, 0, itemEl);
|
|
2886
2982
|
}
|
|
2887
2983
|
|
|
2888
|
-
if (
|
|
2889
|
-
|
|
2890
|
-
|
|
2984
|
+
if (!avoidDomReflow) {
|
|
2985
|
+
this._insertItemAndFlow(itemEl, index, insertBefore);
|
|
2986
|
+
}
|
|
2987
|
+
}
|
|
2891
2988
|
|
|
2892
|
-
|
|
2893
|
-
|
|
2894
|
-
if (cachedItemHeight !== itemHeight) {
|
|
2895
|
-
p.cachedItemHeights[index] = itemHeight;
|
|
2896
|
-
}
|
|
2989
|
+
// Add index metadata to item
|
|
2990
|
+
itemEl[ItemIndexSymbol] = index;
|
|
2897
2991
|
|
|
2898
|
-
|
|
2899
|
-
|
|
2900
|
-
this._setItemPositionsNeedsUpdate(index + 1);
|
|
2901
|
-
}
|
|
2992
|
+
return itemEl;
|
|
2993
|
+
}
|
|
2902
2994
|
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2995
|
+
/**
|
|
2996
|
+
* Insert item element into the DOM, set it's flow in the DOM, and update the item's position. <br />
|
|
2997
|
+
* @param {Element|undefined} itemEl
|
|
2998
|
+
* @param {number} index
|
|
2999
|
+
* @param {Node|boolean|undefined} before
|
|
3000
|
+
* @private
|
|
3001
|
+
*/
|
|
3002
|
+
_insertItemAndFlow(itemEl, index, before) {
|
|
3003
|
+
const p = this._p;
|
|
3004
|
+
const virtualWrapper = p.virtualWrapper;
|
|
3005
|
+
const itemParent = p.currentItemsParent;
|
|
2906
3006
|
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
3007
|
+
if (before !== false) {
|
|
3008
|
+
if (!(before instanceof Node))
|
|
3009
|
+
before = null;
|
|
3010
|
+
|
|
3011
|
+
// Insert into DOM
|
|
3012
|
+
if (itemEl.parentNode !== itemParent ||
|
|
3013
|
+
itemEl.nextSibling !== before) {
|
|
3014
|
+
insertBefore(itemEl, before, itemParent);
|
|
2912
3015
|
}
|
|
2913
3016
|
}
|
|
2914
3017
|
|
|
2915
|
-
|
|
2916
|
-
|
|
3018
|
+
if (virtualWrapper) {
|
|
3019
|
+
// Calculate height
|
|
3020
|
+
let itemHeight = itemEl.getBoundingClientRect().height;
|
|
2917
3021
|
|
|
2918
|
-
|
|
3022
|
+
// Put calculated height into cache, and invalidate positions if it's different
|
|
3023
|
+
let cachedItemHeight = p.cachedItemHeights[index];
|
|
3024
|
+
if (cachedItemHeight !== itemHeight) {
|
|
3025
|
+
p.cachedItemHeights[index] = itemHeight;
|
|
3026
|
+
}
|
|
3027
|
+
|
|
3028
|
+
if (cachedItemHeight !== undefined && itemHeight !== cachedItemHeight ||
|
|
3029
|
+
cachedItemHeight === undefined && itemHeight !== p.cachedItemEstimatedHeights[index]) {
|
|
3030
|
+
this._setItemPositionsNeedsUpdate(index + 1);
|
|
3031
|
+
}
|
|
3032
|
+
|
|
3033
|
+
// Set item top position
|
|
3034
|
+
let pos = this._calculateItemPosition(index);
|
|
3035
|
+
const supportedTransform = getSupportedTransform();
|
|
3036
|
+
|
|
3037
|
+
if (supportedTransform === false) {
|
|
3038
|
+
/**@type ElementCSSInlineStyle*/itemEl.style.top = `${pos}px`;
|
|
3039
|
+
} else {
|
|
3040
|
+
/**@type ElementCSSInlineStyle*/itemEl.style[supportedTransform] = `translateY(${pos}px)`;
|
|
3041
|
+
}
|
|
3042
|
+
}
|
|
2919
3043
|
}
|
|
2920
3044
|
|
|
2921
3045
|
/**
|