From 1a7ac4f228a569dc8c3b0b50130ea126352277a8 Mon Sep 17 00:00:00 2001 From: dhilt Date: Fri, 16 Aug 2019 03:31:27 +0300 Subject: [PATCH 01/12] immutableTop option implementation --- src/modules/adapter.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/modules/adapter.js b/src/modules/adapter.js index ad4655ed..ac20a512 100644 --- a/src/modules/adapter.js +++ b/src/modules/adapter.js @@ -121,24 +121,24 @@ class Adapter { this.viewport.clipBottom(); } - applyUpdates(arg1, arg2) { + applyUpdates(arg1, arg2, arg3) { if (typeof arg1 === 'function') { - this.applyUpdatesFunc(arg1); + this.applyUpdatesFunc(arg1, arg2); } else { - this.applyUpdatesIndex(arg1, arg2); + this.applyUpdatesIndex(arg1, arg2, arg3); } this.doAdjust(); } - applyUpdatesFunc(cb) { + applyUpdatesFunc(cb, options) { this.buffer.slice(0).forEach((wrapper) => { // we need to do it on the buffer clone, because buffer content // may change as we iterate through - this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element)); + this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element), options); }); } - applyUpdatesIndex(index, newItems) { + applyUpdatesIndex(index, newItems, options = {}) { if (index % 1 !== 0) { throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)'); } @@ -146,13 +146,13 @@ class Adapter { // apply updates only within buffer if (_index >= 0 && _index < this.buffer.length) { - this.applyUpdate(this.buffer[_index], newItems); + this.applyUpdate(this.buffer[_index], newItems, options); } // out-of-buffer case: deletion may affect Paddings else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) { if(angular.isArray(newItems) && !newItems.length) { - this.viewport.removeCacheItem(index, index === this.buffer.minIndex); - if(index === this.buffer.getAbsMinIndex()) { + this.viewport.removeCacheItem(index, !options.immutableTop && index === this.buffer.minIndex); + if (!options.immutableTop && index === this.buffer.getAbsMinIndex()) { this.buffer.incrementMinIndex(); } else { @@ -162,14 +162,14 @@ class Adapter { } } - applyUpdate(wrapper, newItems) { + applyUpdate(wrapper, newItems, options = {}) { if (!angular.isArray(newItems)) { return; } let position = this.buffer.indexOf(wrapper); if (!newItems.reverse().some(newItem => newItem === wrapper.item)) { wrapper.op = 'remove'; - if(position === 0 && !newItems.length) { + if (!options.immutableTop && position === 0 && !newItems.length) { wrapper._op = 'isTop'; // to catch "first" edge case on remove } } @@ -178,7 +178,7 @@ class Adapter { position--; } else { // 3 parameter (isTop) is to catch "first" edge case on insert - this.buffer.insert(position + 1, newItem, position === -1); + this.buffer.insert(position + 1, newItem, !options.immutableTop && position === -1); } }); } From cc8c59b6638d948c39137f9fc1371089008dad63 Mon Sep 17 00:00:00 2001 From: dhilt Date: Fri, 16 Aug 2019 03:31:50 +0300 Subject: [PATCH 02/12] immutableTop tests --- test/AdapterTestsSpec.js | 534 ++++++++++++++++++++++++++++----------- 1 file changed, 384 insertions(+), 150 deletions(-) diff --git a/test/AdapterTestsSpec.js b/test/AdapterTestsSpec.js index 55430115..e2e111d6 100644 --- a/test/AdapterTestsSpec.js +++ b/test/AdapterTestsSpec.js @@ -189,60 +189,115 @@ describe('uiScroll', function () { ); }); - it('should delete selected (middle) row', function () { + it('should delete selected (first) row with immutableTop option', function () { runTest(scrollSettings, function (viewport, scope) { scope.adapter.applyUpdates( function (item) { - if (item === 'two') { + if (item === 'one') { return []; } - } + }, + { immutableTop: true } ); expect(viewport.children().length).toBe(4); - var row1 = viewport.children()[1]; - expect(row1.tagName.toLowerCase()).toBe('div'); - expect(row1.innerHTML).toBe('1: one'); - - var row2 = viewport.children()[2]; + var row2 = viewport.children()[1]; expect(row2.tagName.toLowerCase()).toBe('div'); - expect(row2.innerHTML).toBe('2: three'); + expect(row2.innerHTML).toBe('1: two'); + + var row3 = viewport.children()[2]; + expect(row3.tagName.toLowerCase()).toBe('div'); + expect(row3.innerHTML).toBe('2: three'); expect(scope.adapter).toBeTruthy(); - expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: two'); expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('2: three'); } ); }); - it('should delete selected (last) row', function () { + var deleteMiddleRow = function (viewport, scope, options) { + + scope.adapter.applyUpdates( + function (item) { + if (item === 'two') { + return []; + } + }, + options + ); + + expect(viewport.children().length).toBe(4); + + var row1 = viewport.children()[1]; + expect(row1.tagName.toLowerCase()).toBe('div'); + expect(row1.innerHTML).toBe('1: one'); + + var row2 = viewport.children()[2]; + expect(row2.tagName.toLowerCase()).toBe('div'); + expect(row2.innerHTML).toBe('2: three'); + + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('2: three'); + }; + + it('should delete selected (middle) row', function () { runTest(scrollSettings, function (viewport, scope) { + deleteMiddleRow(viewport, scope); + } + ); + }); - scope.adapter.applyUpdates( - function (item) { - if (item === 'three') { - return []; - } - } - ); + it('should delete selected (middle) row with immutableTop option', function () { + runTest(scrollSettings, + function (viewport, scope) { + deleteMiddleRow(viewport, scope, { immutableTop: true }); + } + ); + }); - expect(viewport.children().length).toBe(4); + var deleteLastRow = function (viewport, scope, options) { + scope.adapter.applyUpdates( + function (item) { + if (item === 'three') { + return []; + } + }, + options + ); - var row1 = viewport.children()[1]; - expect(row1.tagName.toLowerCase()).toBe('div'); - expect(row1.innerHTML).toBe('1: one'); + expect(viewport.children().length).toBe(4); - var row2 = viewport.children()[2]; - expect(row2.tagName.toLowerCase()).toBe('div'); - expect(row2.innerHTML).toBe('2: two'); + var row1 = viewport.children()[1]; + expect(row1.tagName.toLowerCase()).toBe('div'); + expect(row1.innerHTML).toBe('1: one'); - expect(scope.adapter).toBeTruthy(); - expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); - expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('2: two'); + var row2 = viewport.children()[2]; + expect(row2.tagName.toLowerCase()).toBe('div'); + expect(row2.innerHTML).toBe('2: two'); + + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('2: two'); + }; + + it('should delete selected (last) row', function () { + runTest(scrollSettings, + function (viewport, scope) { + deleteLastRow(viewport, scope); + } + ); + }); + + it('should delete selected (last) row with immutableTop option', function () { + runTest(scrollSettings, + function (viewport, scope) { + deleteLastRow(viewport, scope, { immutableTop: true }); } ); }); @@ -284,28 +339,28 @@ describe('uiScroll', function () { ); }); - it('should insert a new element after selected (first) row', function () { - var scrollSettings = {datasource: 'myObjectDatasource', adapter: 'adapter', template: '{{$index}}: {{item.text}}'}; + it('should insert a new element before selected (first) row with immutableTop option', function () { runTest(scrollSettings, function (viewport, scope) { scope.adapter.applyUpdates( function (item) { - if (item.text === 'one') { - return [item, {text: 'after one'}]; + if (item === 'one') { + return ['before one', item]; } - } + }, + { immutableTop: true } ); expect(viewport.children().length).toBe(6); var row0 = viewport.children()[1]; expect(row0.tagName.toLowerCase()).toBe('div'); - expect(row0.innerHTML).toBe('1: one'); + expect(row0.innerHTML).toBe('1: before one'); var row1 = viewport.children()[2]; expect(row1.tagName.toLowerCase()).toBe('div'); - expect(row1.innerHTML).toBe('2: after one'); + expect(row1.innerHTML).toBe('2: one'); var row2 = viewport.children()[3]; expect(row2.tagName.toLowerCase()).toBe('div'); @@ -316,82 +371,157 @@ describe('uiScroll', function () { expect(row3.innerHTML).toBe('4: three'); expect(scope.adapter).toBeTruthy(); - expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: before one'); expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: three'); } ); }); - it('should insert a new element before selected (middle) row', function () { + var insertAfterFirst = function (viewport, scope, options) { + scope.adapter.applyUpdates( + function (item) { + if (item.text === 'one') { + return [item, { text: 'after one' }]; + } + }, + options + ); + + expect(viewport.children().length).toBe(6); + + var row0 = viewport.children()[1]; + expect(row0.tagName.toLowerCase()).toBe('div'); + expect(row0.innerHTML).toBe('1: one'); + + var row1 = viewport.children()[2]; + expect(row1.tagName.toLowerCase()).toBe('div'); + expect(row1.innerHTML).toBe('2: after one'); + + var row2 = viewport.children()[3]; + expect(row2.tagName.toLowerCase()).toBe('div'); + expect(row2.innerHTML).toBe('3: two'); + + var row3 = viewport.children()[4]; + expect(row3.tagName.toLowerCase()).toBe('div'); + expect(row3.innerHTML).toBe('4: three'); + + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: three'); + }; + + it('should insert a new element after selected (first) row', function () { + var scrollSettings = { datasource: 'myObjectDatasource', adapter: 'adapter', template: '{{$index}}: {{item.text}}' }; runTest(scrollSettings, function (viewport, scope) { + insertAfterFirst(viewport, scope); + } + ); + }); - scope.adapter.applyUpdates( - function (item) { - if (item === 'two') { - return ['before two', item]; - } - } - ); + it('should insert a new element after selected (first) row with immutableTop option', function () { + var scrollSettings = { datasource: 'myObjectDatasource', adapter: 'adapter', template: '{{$index}}: {{item.text}}' }; + runTest(scrollSettings, + function (viewport, scope) { + insertAfterFirst(viewport, scope, { immutableTop: true }); + } + ); + }); - expect(viewport.children().length).toBe(6); + var insertBeforeSecond = function (viewport, scope, options) { + scope.adapter.applyUpdates( + function (item) { + if (item === 'two') { + return ['before two', item]; + } + }, + options + ); - var row0 = viewport.children()[1]; - expect(row0.tagName.toLowerCase()).toBe('div'); - expect(row0.innerHTML).toBe('1: one'); + expect(viewport.children().length).toBe(6); - var row1 = viewport.children()[2]; - expect(row1.tagName.toLowerCase()).toBe('div'); - expect(row1.innerHTML).toBe('2: before two'); + var row0 = viewport.children()[1]; + expect(row0.tagName.toLowerCase()).toBe('div'); + expect(row0.innerHTML).toBe('1: one'); - var row2 = viewport.children()[3]; - expect(row2.tagName.toLowerCase()).toBe('div'); - expect(row2.innerHTML).toBe('3: two'); + var row1 = viewport.children()[2]; + expect(row1.tagName.toLowerCase()).toBe('div'); + expect(row1.innerHTML).toBe('2: before two'); - var row3 = viewport.children()[4]; - expect(row3.tagName.toLowerCase()).toBe('div'); - expect(row3.innerHTML).toBe('4: three'); + var row2 = viewport.children()[3]; + expect(row2.tagName.toLowerCase()).toBe('div'); + expect(row2.innerHTML).toBe('3: two'); - expect(scope.adapter).toBeTruthy(); - expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); - expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: three'); + var row3 = viewport.children()[4]; + expect(row3.tagName.toLowerCase()).toBe('div'); + expect(row3.innerHTML).toBe('4: three'); + + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: three'); + }; + + it('should insert a new element before selected (middle) row', function () { + runTest(scrollSettings, + function (viewport, scope) { + insertBeforeSecond(viewport, scope); } ); }); - it('should insert a new element after selected (last) row', function () { + it('should insert a new element before selected (middle) row with immutableTop option', function () { runTest(scrollSettings, function (viewport, scope) { + insertBeforeSecond(viewport, scope, { immutableTop: true }); + } + ); + }); - scope.adapter.applyUpdates( - function (item) { - if (item === 'three') { - return [item, 'after three']; - } - } - ); + var insertAfterLast = function (viewport, scope, options) { + scope.adapter.applyUpdates( + function (item) { + if (item === 'three') { + return [item, 'after three']; + } + }, + options + ); - expect(viewport.children().length).toBe(6); + expect(viewport.children().length).toBe(6); - var row0 = viewport.children()[1]; - expect(row0.tagName.toLowerCase()).toBe('div'); - expect(row0.innerHTML).toBe('1: one'); + var row0 = viewport.children()[1]; + expect(row0.tagName.toLowerCase()).toBe('div'); + expect(row0.innerHTML).toBe('1: one'); - var row1 = viewport.children()[2]; - expect(row1.tagName.toLowerCase()).toBe('div'); - expect(row1.innerHTML).toBe('2: two'); + var row1 = viewport.children()[2]; + expect(row1.tagName.toLowerCase()).toBe('div'); + expect(row1.innerHTML).toBe('2: two'); - var row2 = viewport.children()[3]; - expect(row2.tagName.toLowerCase()).toBe('div'); - expect(row2.innerHTML).toBe('3: three'); + var row2 = viewport.children()[3]; + expect(row2.tagName.toLowerCase()).toBe('div'); + expect(row2.innerHTML).toBe('3: three'); - var row3 = viewport.children()[4]; - expect(row3.tagName.toLowerCase()).toBe('div'); - expect(row3.innerHTML).toBe('4: after three'); + var row3 = viewport.children()[4]; + expect(row3.tagName.toLowerCase()).toBe('div'); + expect(row3.innerHTML).toBe('4: after three'); - expect(scope.adapter).toBeTruthy(); - expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); - expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: after three'); + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: after three'); + }; + + it('should insert a new element after selected (last) row', function () { + runTest(scrollSettings, + function (viewport, scope) { + insertAfterLast(viewport, scope); + } + ); + }); + + it('should insert a new element after selected (last) row with immutableTop option', function () { + runTest(scrollSettings, + function (viewport, scope) { + insertAfterLast(viewport, scope, { immutableTop: true }); } ); }); @@ -558,50 +688,89 @@ describe('uiScroll', function () { ); }); - it('should delete selected (middle) row', function () { + it('should delete selected (first) row with immutableTop option', function () { runTest(scrollSettings, function (viewport, scope) { - scope.adapter.applyUpdates(2, []); + expect(viewport.children().length).toBe(5); - expect(viewport.children().length).toBe(4); + scope.adapter.applyUpdates(1, [], { immutableTop: true }); - var row1 = viewport.children()[1]; - expect(row1.tagName.toLowerCase()).toBe('div'); - expect(row1.innerHTML).toBe('1: one'); + expect(viewport.children().length).toBe(4); - var row2 = viewport.children()[2]; + var row2 = viewport.children()[1]; expect(row2.tagName.toLowerCase()).toBe('div'); - expect(row2.innerHTML).toBe('2: three'); + expect(row2.innerHTML).toBe('1: two'); + + var row3 = viewport.children()[2]; + expect(row3.tagName.toLowerCase()).toBe('div'); + expect(row3.innerHTML).toBe('2: three'); expect(scope.adapter).toBeTruthy(); - expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: two'); expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('2: three'); } ); }); - it('should delete selected (last) row', function () { - runTest(scrollSettings, - function (viewport, scope) { + var deleteMiddleRow = function (viewport, scope, options) { + scope.adapter.applyUpdates(2, [], options); - scope.adapter.applyUpdates(3, []); + expect(viewport.children().length).toBe(4); - expect(viewport.children().length).toBe(4); + var row1 = viewport.children()[1]; + expect(row1.tagName.toLowerCase()).toBe('div'); + expect(row1.innerHTML).toBe('1: one'); - var row1 = viewport.children()[1]; - expect(row1.tagName.toLowerCase()).toBe('div'); - expect(row1.innerHTML).toBe('1: one'); + var row2 = viewport.children()[2]; + expect(row2.tagName.toLowerCase()).toBe('div'); + expect(row2.innerHTML).toBe('2: three'); - var row2 = viewport.children()[2]; - expect(row2.tagName.toLowerCase()).toBe('div'); - expect(row2.innerHTML).toBe('2: two'); + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('2: three'); + }; - expect(scope.adapter).toBeTruthy(); - expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); - expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('2: two'); - } - ); + it('should delete selected (middle) row', function () { + runTest(scrollSettings, function (viewport, scope) { + deleteMiddleRow(viewport, scope); + }); + }); + + it('should delete selected (middle) row with immutableTop option', function () { + runTest(scrollSettings, function (viewport, scope) { + deleteMiddleRow(viewport, scope, { immutableTop: true }); + }); + }); + + var deleteLastRow = function (viewport, scope) { + scope.adapter.applyUpdates(3, []); + + expect(viewport.children().length).toBe(4); + + var row1 = viewport.children()[1]; + expect(row1.tagName.toLowerCase()).toBe('div'); + expect(row1.innerHTML).toBe('1: one'); + + var row2 = viewport.children()[2]; + expect(row2.tagName.toLowerCase()).toBe('div'); + expect(row2.innerHTML).toBe('2: two'); + + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('2: two'); + }; + + it('should delete selected (last) row', function () { + runTest(scrollSettings, function (viewport, scope) { + deleteLastRow(viewport, scope); + }); + }); + + it('should delete selected (last) row with immutableTop option', function () { + runTest(scrollSettings, function (viewport, scope) { + deleteLastRow(viewport, scope, { immutableTop: true }); + }); }); it('should insert a new element before selected (first) row', function () { @@ -635,21 +804,23 @@ describe('uiScroll', function () { ); }); - it('should insert a new element after selected (first) row', function () { + it('should insert a new element before selected (first) row with immutableTop option', function () { runTest(scrollSettings, function (viewport, scope) { - scope.adapter.applyUpdates(1, ['one', 'after one']); + expect(viewport.children().length).toBe(5); + + scope.adapter.applyUpdates(1, ['before one', 'one'], { immutableTop: true }); expect(viewport.children().length).toBe(6); var row0 = viewport.children()[1]; expect(row0.tagName.toLowerCase()).toBe('div'); - expect(row0.innerHTML).toBe('1: one'); + expect(row0.innerHTML).toBe('1: before one'); var row1 = viewport.children()[2]; expect(row1.tagName.toLowerCase()).toBe('div'); - expect(row1.innerHTML).toBe('2: after one'); + expect(row1.innerHTML).toBe('2: one'); var row2 = viewport.children()[3]; expect(row2.tagName.toLowerCase()).toBe('div'); @@ -660,71 +831,134 @@ describe('uiScroll', function () { expect(row3.innerHTML).toBe('4: three'); expect(scope.adapter).toBeTruthy(); - expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: before one'); expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: three'); } ); }); - it('should insert a new element before selected (middle) row', function () { + var insertAfterFirst = function (viewport, scope, options) { + scope.adapter.applyUpdates(1, ['one', 'after one'], options); + + expect(viewport.children().length).toBe(6); + + var row0 = viewport.children()[1]; + expect(row0.tagName.toLowerCase()).toBe('div'); + expect(row0.innerHTML).toBe('1: one'); + + var row1 = viewport.children()[2]; + expect(row1.tagName.toLowerCase()).toBe('div'); + expect(row1.innerHTML).toBe('2: after one'); + + var row2 = viewport.children()[3]; + expect(row2.tagName.toLowerCase()).toBe('div'); + expect(row2.innerHTML).toBe('3: two'); + + var row3 = viewport.children()[4]; + expect(row3.tagName.toLowerCase()).toBe('div'); + expect(row3.innerHTML).toBe('4: three'); + + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: three'); + }; + it('should insert a new element after selected (first) row', function () { + runTest(scrollSettings, + function (viewport, scope) { + insertAfterFirst(viewport, scope); + } + ); + }); + + it('should insert a new element after selected (first) row with immutableTop option', function () { runTest(scrollSettings, function (viewport, scope) { + insertAfterFirst(viewport, scope, { immutableTop: true }); + } + ); + }); - scope.adapter.applyUpdates(2, ['before two', 'two']); + var insertBeforeSecond = function (viewport, scope, options) { + scope.adapter.applyUpdates(2, ['before two', 'two'], options); - expect(viewport.children().length).toBe(6); + expect(viewport.children().length).toBe(6); - var row0 = viewport.children()[1]; - expect(row0.tagName.toLowerCase()).toBe('div'); - expect(row0.innerHTML).toBe('1: one'); + var row0 = viewport.children()[1]; + expect(row0.tagName.toLowerCase()).toBe('div'); + expect(row0.innerHTML).toBe('1: one'); - var row1 = viewport.children()[2]; - expect(row1.tagName.toLowerCase()).toBe('div'); - expect(row1.innerHTML).toBe('2: before two'); + var row1 = viewport.children()[2]; + expect(row1.tagName.toLowerCase()).toBe('div'); + expect(row1.innerHTML).toBe('2: before two'); - var row2 = viewport.children()[3]; - expect(row2.tagName.toLowerCase()).toBe('div'); - expect(row2.innerHTML).toBe('3: two'); + var row2 = viewport.children()[3]; + expect(row2.tagName.toLowerCase()).toBe('div'); + expect(row2.innerHTML).toBe('3: two'); - var row3 = viewport.children()[4]; - expect(row3.tagName.toLowerCase()).toBe('div'); - expect(row3.innerHTML).toBe('4: three'); + var row3 = viewport.children()[4]; + expect(row3.tagName.toLowerCase()).toBe('div'); + expect(row3.innerHTML).toBe('4: three'); - expect(scope.adapter).toBeTruthy(); - expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); - expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: three'); + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: three'); + }; + + it('should insert a new element before selected (middle) row', function () { + runTest(scrollSettings, + function (viewport, scope) { + insertBeforeSecond(viewport, scope); } ); }); - it('should insert a new element after selected (last) row', function () { + it('should insert a new element before selected (middle) row with immutableTop option', function () { runTest(scrollSettings, function (viewport, scope) { + insertBeforeSecond(viewport, scope, { immutableTop: true }); + } + ); + }); - scope.adapter.applyUpdates(3, ['three', 'after three']); + var insretAfterLast = function (viewport, scope, options) { + scope.adapter.applyUpdates(3, ['three', 'after three'], options); - expect(viewport.children().length).toBe(6); + expect(viewport.children().length).toBe(6); - var row0 = viewport.children()[1]; - expect(row0.tagName.toLowerCase()).toBe('div'); - expect(row0.innerHTML).toBe('1: one'); + var row0 = viewport.children()[1]; + expect(row0.tagName.toLowerCase()).toBe('div'); + expect(row0.innerHTML).toBe('1: one'); - var row1 = viewport.children()[2]; - expect(row1.tagName.toLowerCase()).toBe('div'); - expect(row1.innerHTML).toBe('2: two'); + var row1 = viewport.children()[2]; + expect(row1.tagName.toLowerCase()).toBe('div'); + expect(row1.innerHTML).toBe('2: two'); - var row2 = viewport.children()[3]; - expect(row2.tagName.toLowerCase()).toBe('div'); - expect(row2.innerHTML).toBe('3: three'); + var row2 = viewport.children()[3]; + expect(row2.tagName.toLowerCase()).toBe('div'); + expect(row2.innerHTML).toBe('3: three'); - var row3 = viewport.children()[4]; - expect(row3.tagName.toLowerCase()).toBe('div'); - expect(row3.innerHTML).toBe('4: after three'); + var row3 = viewport.children()[4]; + expect(row3.tagName.toLowerCase()).toBe('div'); + expect(row3.innerHTML).toBe('4: after three'); - expect(scope.adapter).toBeTruthy(); - expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); - expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: after three'); + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('4: after three'); + }; + + it('should insert a new element after selected (last) row', function () { + runTest(scrollSettings, + function (viewport, scope) { + insretAfterLast(viewport, scope); + } + ); + }); + + it('should insert a new element after selected (last) row with immutableTop option', function () { + runTest(scrollSettings, + function (viewport, scope) { + insretAfterLast(viewport, scope, { immutableTop: true }); } ); }); From 2dcba9267d5bc3444f9bd3669ee44e2e01f70422 Mon Sep 17 00:00:00 2001 From: dhilt Date: Fri, 16 Aug 2019 03:33:34 +0300 Subject: [PATCH 03/12] immutableTop dist --- dist/ui-scroll-grid.js | 2 +- dist/ui-scroll.js | 26 +++++++++++++++----------- dist/ui-scroll.js.map | 2 +- dist/ui-scroll.min.js | 2 +- dist/ui-scroll.min.js.map | 2 +- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/dist/ui-scroll-grid.js b/dist/ui-scroll-grid.js index 9e3c9aa9..27ff7797 100644 --- a/dist/ui-scroll-grid.js +++ b/dist/ui-scroll-grid.js @@ -1,7 +1,7 @@ /*! * angular-ui-scroll * https://github.com/angular-ui/ui-scroll - * Version: 1.7.5 -- 2019-08-03T14:30:38.178Z + * Version: 1.7.5 -- 2019-08-16T00:32:35.657Z * License: MIT */ /******/ (function(modules) { // webpackBootstrap diff --git a/dist/ui-scroll.js b/dist/ui-scroll.js index f4ee3b5f..e807b09f 100644 --- a/dist/ui-scroll.js +++ b/dist/ui-scroll.js @@ -1,7 +1,7 @@ /*! * angular-ui-scroll * https://github.com/angular-ui/ui-scroll - * Version: 1.7.5 -- 2019-08-03T14:30:38.178Z + * Version: 1.7.5 -- 2019-08-16T00:32:35.657Z * License: MIT */ /******/ (function(modules) { // webpackBootstrap @@ -1158,29 +1158,31 @@ function () { } }, { key: "applyUpdates", - value: function applyUpdates(arg1, arg2) { + value: function applyUpdates(arg1, arg2, arg3) { if (typeof arg1 === 'function') { - this.applyUpdatesFunc(arg1); + this.applyUpdatesFunc(arg1, arg2); } else { - this.applyUpdatesIndex(arg1, arg2); + this.applyUpdatesIndex(arg1, arg2, arg3); } this.doAdjust(); } }, { key: "applyUpdatesFunc", - value: function applyUpdatesFunc(cb) { + value: function applyUpdatesFunc(cb, options) { var _this2 = this; this.buffer.slice(0).forEach(function (wrapper) { // we need to do it on the buffer clone, because buffer content // may change as we iterate through - _this2.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element)); + _this2.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element), options); }); } }, { key: "applyUpdatesIndex", value: function applyUpdatesIndex(index, newItems) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + if (index % 1 !== 0) { throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)'); } @@ -1189,13 +1191,13 @@ function () { if (_index >= 0 && _index < this.buffer.length) { - this.applyUpdate(this.buffer[_index], newItems); + this.applyUpdate(this.buffer[_index], newItems, options); } // out-of-buffer case: deletion may affect Paddings else if (index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) { if (angular.isArray(newItems) && !newItems.length) { - this.viewport.removeCacheItem(index, index === this.buffer.minIndex); + this.viewport.removeCacheItem(index, !options.immutableTop && index === this.buffer.minIndex); - if (index === this.buffer.getAbsMinIndex()) { + if (!options.immutableTop && index === this.buffer.getAbsMinIndex()) { this.buffer.incrementMinIndex(); } else { this.buffer.decrementMaxIndex(); @@ -1208,6 +1210,8 @@ function () { value: function applyUpdate(wrapper, newItems) { var _this3 = this; + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + if (!angular.isArray(newItems)) { return; } @@ -1219,7 +1223,7 @@ function () { })) { wrapper.op = 'remove'; - if (position === 0 && !newItems.length) { + if (!options.immutableTop && position === 0 && !newItems.length) { wrapper._op = 'isTop'; // to catch "first" edge case on remove } } @@ -1229,7 +1233,7 @@ function () { position--; } else { // 3 parameter (isTop) is to catch "first" edge case on insert - _this3.buffer.insert(position + 1, newItem, position === -1); + _this3.buffer.insert(position + 1, newItem, !options.immutableTop && position === -1); } }); } diff --git a/dist/ui-scroll.js.map b/dist/ui-scroll.js.map index 583263bb..522b12c1 100644 --- a/dist/ui-scroll.js.map +++ b/dist/ui-scroll.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/adapter.js","webpack:///./src/ui-scroll.js"],"names":["JQLiteExtras","element","convertToPx","css","getStyle","isWindow","angular","prototype","name","value","self","elem","nodeType","style","call","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isValueDefined","documentElement","window","getComputedStyle","parseFloat","currentStyle","result","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","height","width","padding","border","margin","offsetWidth","offsetHeight","getWidthHeight","measurements","outer","outerfull","forEach","before","newElem","children","i","j","parent","ref","contents","prepend","length","after","Error","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","arguments","undefined","getBoundingClientRect","defaultView","parentWindow","pageYOffset","scrollTop","clientTop","pageXOffset","scrollLeft","clientLeft","key","hideClassToken","ElementRoutines","selector","rules","sheet","styleSheets","index","cssRules","err","insertRule","addRule","$injector","$q","$animate","has","get","isAngularVersionLessThen1_3","version","major","minor","wrapper","addClass","removeClass","newElement","previousElement","remove","scope","$destroy","insertElement","deferred","defer","enter","resolve","promise","removeElement","leave","then","ScrollBuffer","elementRoutines","bufferSize","startIndex","buffer","Object","create","Array","extend","size","reset","eof","bof","first","next","minIndex","maxIndex","minIndexUser","maxIndexUser","append","items","item","insert","Math","max","reverse","min","operation","isTop","op","splice","push","unshift","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","effectiveHeight","elements","Number","MAX_VALUE","bottom","NEGATIVE_INFINITY","offsetParent","getItems","filter","getFirstItem","list","getLastItem","CacheProto","$index","sort","a","b","argument","_isTop","Cache","instance","apply","setPrototypeOf","getOwnPropertyNames","methodName","generateElement","template","Node","ELEMENT_NODE","tagName","toLowerCase","table","find","Padding","cache","Viewport","viewportController","$rootScope","topPadding","bottomPadding","viewport","container","bufferPadding","getScope","createPaddingElements","applyContainerStyle","bottomDataPos","scrollHeight","topDataPos","bottomVisiblePos","topVisiblePos","e","sibling","insertElementAnimated","shouldLoadBottom","clipBottom","overage","overageHeight","itemHeight","emptySpaceHeight","add","adjustPaddings","shouldLoadTop","clipTop","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","totalHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","onAfterMinIndexSet","topPaddingHeightOld","diff","onAfterPrepend","updates","prepended","paddingHeight","resetTopPadding","clear","resetBottomPadding","removeCacheItem","removeItem","Adapter","$scope","$parse","$attr","doAdjust","reload","isLoading","disabled","viewportScope","startScope","$parent","publicContext","assignAdapter","adapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","publicMethods","bind","publicProps","property","attr","defineProperty","set","publicPropsImmediate","newItems","applyUpdatesFunc","applyUpdatesIndex","cb","slice","applyUpdate","_index","isArray","position","some","newItem","rowTop","topHeight","topDone","bottomDone","itemTop","isEOF","module","constant","run","elt","jQuery","fn","jquery","registerFor","addCSSRules","directive","restrict","controller","child","console","$timeout","$interval","require","transclude","priority","terminal","link","controllers","linker","match","uiScroll","parseNumber","defaultValue","isFloat","floor","isNaN","parseNumericAttr","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","START_INDEX_DEFAULT","MAX_VIEWPORT_DELAY","VIEWPORT_POLLING_INTERVAL","datasource","itemName","datasourceName","ridActual","pending","isDatasourceValid","toString","onRenderHandlers","onRenderHandlersRunner","handler","persistDatasourceIndex","propName","getter","id","defineDatasourceIndex","propUserName","descriptor","getOwnPropertyDescriptor","fetchNext","success","count","fetchPrevious","initialize","tryCount","timer","cancel","clone","$on","unbindEvents","unbind","wheelHandler","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","isElementVisible","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","$watch","hideElement","promises","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updateDOM","toBePrepended","toBeRemoved","inserted","concat","removed","animated","updatePaddings","all","enqueueFetch","loading","fetch","processUpdates","$$phase","$digest","w","showElement","calculateProperties","doAdjustAfterFetch","shift","event","yMax","clientHeight","preventDefault"],"mappings":"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","file":"ui-scroll.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","/*!\r\n globals: angular, window\r\n List of used element methods available in JQuery but not in JQuery Lite\r\n element.before(elem)\r\n element.height()\r\n element.outerHeight(true)\r\n element.height(value) = only for Top/Bottom padding elements\r\n element.scrollTop()\r\n element.scrollTop(value)\r\n */\r\n\r\nexport default class JQLiteExtras {\r\n\r\n registerFor(element) {\r\n let convertToPx, css, getStyle, isWindow;\r\n // angular implementation blows up if elem is the window\r\n css = angular.element.prototype.css;\r\n\r\n element.prototype.css = function (name, value) {\r\n let self = this;\r\n let elem = self[0];\r\n if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\r\n return css.call(self, name, value);\r\n }\r\n };\r\n\r\n // as defined in angularjs v1.0.5\r\n isWindow = (obj) => obj && obj.document && obj.location && obj.alert && obj.setInterval;\r\n\r\n function scrollTo(self, direction, value) {\r\n let elem = self[0];\r\n let [method, prop, preserve] = {\r\n top: [\r\n 'scrollTop',\r\n 'pageYOffset',\r\n 'scrollLeft'\r\n ],\r\n left: [\r\n 'scrollLeft',\r\n 'pageXOffset',\r\n 'scrollTop'\r\n ]\r\n }[direction];\r\n\r\n const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items) {\r\n items.reverse().forEach((item) => {\r\n --buffer.first;\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n },\r\n\r\n getItems() {\r\n return buffer.filter(item => item.op === 'none');\r\n },\r\n\r\n getFirstItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[0].item;\r\n },\r\n\r\n getLastItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[list.length - 1].item;\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\r\n","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;","import Padding from './padding';\r\n\r\nexport default function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\r\n let topPadding = null;\r\n let bottomPadding = null;\r\n const viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\r\n const container = viewportController && viewportController.container ? viewportController.container : undefined;\r\n const scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\r\n\r\n viewport.css({\r\n 'overflow-anchor': 'none',\r\n 'overflow-y': 'auto',\r\n 'display': 'block'\r\n });\r\n\r\n function bufferPadding() {\r\n return viewport.outerHeight() * padding; // some extra space to initiate preload\r\n }\r\n\r\n angular.extend(viewport, {\r\n getScope() {\r\n return scope;\r\n },\r\n\r\n createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding());\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // read-only immediately calculated public properties\r\n const publicPropsImmediate = ['bufferFirst', 'bufferLast', 'bufferLength'];\r\n for (let i = publicPropsImmediate.length - 1; i >= 0; i--) {\r\n Object.defineProperty(this.publicContext, publicPropsImmediate[i], {\r\n get: () => this[publicPropsImmediate[i]]\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n get bufferLength() {\r\n return this.buffer.getItems().length;\r\n }\r\n\r\n get bufferFirst() {\r\n return this.buffer.getFirstItem();\r\n }\r\n\r\n get bufferLast() {\r\n return this.buffer.getLastItem();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, index === this.buffer.minIndex);\r\n if(index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if(position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n const elt = angular.element;\n !(window.jQuery && elt.fn && elt.fn.jquery) ? (new JQLiteExtras()).registerFor(elt) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumber(value, defaultValue, isFloat) {\n if (!isFloat) {\n value = value === null ? defaultValue : Math.floor(value);\n }\n return isNaN(value) ? defaultValue : value;\n }\n\n function parseNumericAttr(value, defaultValue, isFloat) {\n const result = $parse(value)($scope);\n return parseNumber(result, defaultValue, isFloat);\n }\n\n const BUFFER_MIN = 3;\n const BUFFER_DEFAULT = 10;\n const PADDING_MIN = 0.3;\n const PADDING_DEFAULT = 0.5;\n const START_INDEX_DEFAULT = 1;\n const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT, true));\n let startIndex = parseNumericAttr($attr.startIndex, START_INDEX_DEFAULT);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n unbindEvents();\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = parseNumber(arguments[0], START_INDEX_DEFAULT, false);\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler() {\n if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\n enqueueFetch(ridActual);\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/adapter.js","webpack:///./src/ui-scroll.js"],"names":["JQLiteExtras","element","convertToPx","css","getStyle","isWindow","angular","prototype","name","value","self","elem","nodeType","style","call","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isValueDefined","documentElement","window","getComputedStyle","parseFloat","currentStyle","result","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","height","width","padding","border","margin","offsetWidth","offsetHeight","getWidthHeight","measurements","outer","outerfull","forEach","before","newElem","children","i","j","parent","ref","contents","prepend","length","after","Error","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","arguments","undefined","getBoundingClientRect","defaultView","parentWindow","pageYOffset","scrollTop","clientTop","pageXOffset","scrollLeft","clientLeft","key","hideClassToken","ElementRoutines","selector","rules","sheet","styleSheets","index","cssRules","err","insertRule","addRule","$injector","$q","$animate","has","get","isAngularVersionLessThen1_3","version","major","minor","wrapper","addClass","removeClass","newElement","previousElement","remove","scope","$destroy","insertElement","deferred","defer","enter","resolve","promise","removeElement","leave","then","ScrollBuffer","elementRoutines","bufferSize","startIndex","buffer","Object","create","Array","extend","size","reset","eof","bof","first","next","minIndex","maxIndex","minIndexUser","maxIndexUser","append","items","item","insert","Math","max","reverse","min","operation","isTop","op","splice","push","unshift","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","effectiveHeight","elements","Number","MAX_VALUE","bottom","NEGATIVE_INFINITY","offsetParent","getItems","filter","getFirstItem","list","getLastItem","CacheProto","$index","sort","a","b","argument","_isTop","Cache","instance","apply","setPrototypeOf","getOwnPropertyNames","methodName","generateElement","template","Node","ELEMENT_NODE","tagName","toLowerCase","table","find","Padding","cache","Viewport","viewportController","$rootScope","topPadding","bottomPadding","viewport","container","bufferPadding","getScope","createPaddingElements","applyContainerStyle","bottomDataPos","scrollHeight","topDataPos","bottomVisiblePos","topVisiblePos","e","sibling","insertElementAnimated","shouldLoadBottom","clipBottom","overage","overageHeight","itemHeight","emptySpaceHeight","add","adjustPaddings","shouldLoadTop","clipTop","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","totalHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","onAfterMinIndexSet","topPaddingHeightOld","diff","onAfterPrepend","updates","prepended","paddingHeight","resetTopPadding","clear","resetBottomPadding","removeCacheItem","removeItem","Adapter","$scope","$parse","$attr","doAdjust","reload","isLoading","disabled","viewportScope","startScope","$parent","publicContext","assignAdapter","adapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","publicMethods","bind","publicProps","property","attr","defineProperty","set","publicPropsImmediate","newItems","arg3","applyUpdatesFunc","applyUpdatesIndex","cb","options","slice","applyUpdate","_index","isArray","immutableTop","position","some","newItem","rowTop","topHeight","topDone","bottomDone","itemTop","isEOF","module","constant","run","elt","jQuery","fn","jquery","registerFor","addCSSRules","directive","restrict","controller","child","console","$timeout","$interval","require","transclude","priority","terminal","link","controllers","linker","match","uiScroll","parseNumber","defaultValue","isFloat","floor","isNaN","parseNumericAttr","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","START_INDEX_DEFAULT","MAX_VIEWPORT_DELAY","VIEWPORT_POLLING_INTERVAL","datasource","itemName","datasourceName","ridActual","pending","isDatasourceValid","toString","onRenderHandlers","onRenderHandlersRunner","handler","persistDatasourceIndex","propName","getter","id","defineDatasourceIndex","propUserName","descriptor","getOwnPropertyDescriptor","fetchNext","success","count","fetchPrevious","initialize","tryCount","timer","cancel","clone","$on","unbindEvents","unbind","wheelHandler","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","isElementVisible","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","$watch","hideElement","promises","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updateDOM","toBePrepended","toBeRemoved","inserted","concat","removed","animated","updatePaddings","all","enqueueFetch","loading","fetch","processUpdates","$$phase","$digest","w","showElement","calculateProperties","doAdjustAfterFetch","shift","event","yMax","clientHeight","preventDefault"],"mappings":"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","file":"ui-scroll.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","/*!\r\n globals: angular, window\r\n List of used element methods available in JQuery but not in JQuery Lite\r\n element.before(elem)\r\n element.height()\r\n element.outerHeight(true)\r\n element.height(value) = only for Top/Bottom padding elements\r\n element.scrollTop()\r\n element.scrollTop(value)\r\n */\r\n\r\nexport default class JQLiteExtras {\r\n\r\n registerFor(element) {\r\n let convertToPx, css, getStyle, isWindow;\r\n // angular implementation blows up if elem is the window\r\n css = angular.element.prototype.css;\r\n\r\n element.prototype.css = function (name, value) {\r\n let self = this;\r\n let elem = self[0];\r\n if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\r\n return css.call(self, name, value);\r\n }\r\n };\r\n\r\n // as defined in angularjs v1.0.5\r\n isWindow = (obj) => obj && obj.document && obj.location && obj.alert && obj.setInterval;\r\n\r\n function scrollTo(self, direction, value) {\r\n let elem = self[0];\r\n let [method, prop, preserve] = {\r\n top: [\r\n 'scrollTop',\r\n 'pageYOffset',\r\n 'scrollLeft'\r\n ],\r\n left: [\r\n 'scrollLeft',\r\n 'pageXOffset',\r\n 'scrollTop'\r\n ]\r\n }[direction];\r\n\r\n const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items) {\r\n items.reverse().forEach((item) => {\r\n --buffer.first;\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n },\r\n\r\n getItems() {\r\n return buffer.filter(item => item.op === 'none');\r\n },\r\n\r\n getFirstItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[0].item;\r\n },\r\n\r\n getLastItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[list.length - 1].item;\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\r\n","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
    ');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;","import Padding from './padding';\r\n\r\nexport default function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\r\n let topPadding = null;\r\n let bottomPadding = null;\r\n const viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\r\n const container = viewportController && viewportController.container ? viewportController.container : undefined;\r\n const scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\r\n\r\n viewport.css({\r\n 'overflow-anchor': 'none',\r\n 'overflow-y': 'auto',\r\n 'display': 'block'\r\n });\r\n\r\n function bufferPadding() {\r\n return viewport.outerHeight() * padding; // some extra space to initiate preload\r\n }\r\n\r\n angular.extend(viewport, {\r\n getScope() {\r\n return scope;\r\n },\r\n\r\n createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding());\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // read-only immediately calculated public properties\r\n const publicPropsImmediate = ['bufferFirst', 'bufferLast', 'bufferLength'];\r\n for (let i = publicPropsImmediate.length - 1; i >= 0; i--) {\r\n Object.defineProperty(this.publicContext, publicPropsImmediate[i], {\r\n get: () => this[publicPropsImmediate[i]]\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n get bufferLength() {\r\n return this.buffer.getItems().length;\r\n }\r\n\r\n get bufferFirst() {\r\n return this.buffer.getFirstItem();\r\n }\r\n\r\n get bufferLast() {\r\n return this.buffer.getLastItem();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2, arg3) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1, arg2);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2, arg3);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb, options) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element), options);\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems, options = {}) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems, options);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, !options.immutableTop && index === this.buffer.minIndex);\r\n if (!options.immutableTop && index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems, options = {}) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if (!options.immutableTop && position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, !options.immutableTop && position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n const elt = angular.element;\n !(window.jQuery && elt.fn && elt.fn.jquery) ? (new JQLiteExtras()).registerFor(elt) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumber(value, defaultValue, isFloat) {\n if (!isFloat) {\n value = value === null ? defaultValue : Math.floor(value);\n }\n return isNaN(value) ? defaultValue : value;\n }\n\n function parseNumericAttr(value, defaultValue, isFloat) {\n const result = $parse(value)($scope);\n return parseNumber(result, defaultValue, isFloat);\n }\n\n const BUFFER_MIN = 3;\n const BUFFER_DEFAULT = 10;\n const PADDING_MIN = 0.3;\n const PADDING_DEFAULT = 0.5;\n const START_INDEX_DEFAULT = 1;\n const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT, true));\n let startIndex = parseNumericAttr($attr.startIndex, START_INDEX_DEFAULT);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n unbindEvents();\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = parseNumber(arguments[0], START_INDEX_DEFAULT, false);\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler() {\n if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\n enqueueFetch(ridActual);\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/ui-scroll.min.js b/dist/ui-scroll.min.js index d3f65f93..41b5f189 100644 --- a/dist/ui-scroll.min.js +++ b/dist/ui-scroll.min.js @@ -1,2 +1,2 @@ -!function(n){var r={};function i(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=n,i.c=r,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)i.d(n,r,function(e){return t[e]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=1)}([,function(e,t,n){"use strict";function g(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var a,u=e[Symbol.iterator]();!(r=(a=u.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{r||null==u.return||u.return()}finally{if(i)throw o}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function i(e,t){for(var n=0;ni.minIndexUser)return void i.minIndexUser++;i.minIndex===i.minIndexUser&&i.minIndexUser++}i.minIndex++},decrementMaxIndex:function(){null!==i.maxIndexUser&&i.maxIndex<=i.maxIndexUser&&i.maxIndexUser--,i.maxIndex--},getAbsMinIndex:function(){return null!==i.minIndexUser?Math.min(i.minIndexUser,i.minIndex):i.minIndex},getAbsMaxIndex:function(){return null!==i.maxIndexUser?Math.max(i.maxIndexUser,i.maxIndex):i.maxIndex},effectiveHeight:function(e){if(!e.length)return 0;var t=Number.MAX_VALUE,n=Number.NEGATIVE_INFINITY;return e.forEach(function(e){e.element[0].offsetParent&&(t=Math.min(t,e.element.offset().top),n=Math.max(n,e.element.offset().top+e.element.outerHeight(!0)))}),Math.max(0,n-t)},getItems:function(){return i.filter(function(e){return"none"===e.op})},getFirstItem:function(){var e=i.getItems();return e.length?e[0].item:null},getLastItem:function(){var e=i.getItems();return e.length?e[e.length-1].item:null}}),i.reset(t),i}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var n=0;nt.index?1:0})}},{key:"remove",value:function(e,t){for(var n=e%1==0?e:e.scope.$index,r=e%1==0?t:"isTop"===e._op,i=this.length-1;0<=i;i--)if(this[i].index===n){this.splice(i,1);break}if(!r)for(var o=this.length-1;0<=o;o--)this[o].index>n&&this[o].index--}},{key:"clear",value:function(){this.length=0}}]),e}();function d(){var e=[];return e.push.apply(e,arguments),Object.setPrototypeOf(e,d.prototype),e}d.prototype=Object.create(Array.prototype),Object.getOwnPropertyNames(f.prototype).forEach(function(e){return d.prototype[e]=f.prototype[e]});var h=function(){function t(e){s(this,t),this.element=function(e){if(e.nodeType!==Node.ELEMENT_NODE)throw new Error("ui-scroll directive requires an Element node for templating the view");var t;switch(e.tagName.toLowerCase()){case"dl":throw new Error("ui-scroll directive does not support <".concat(e.tagName,"> as a repeating tag: ").concat(e.outerHTML));case"tr":t=angular.element("
    ").find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t}(e),this.cache=new d}return c(t,[{key:"height",value:function(){return this.element.height.apply(this.element,arguments)}}]),t}();function X(n,c,t,e,r,i){var f=null,d=null,o=e&&e.viewport?e.viewport:angular.element(window),a=e&&e.container?e.container:void 0,u=e&&e.scope?e.scope:r;function s(){return o.outerHeight()*i}return o.css({"overflow-anchor":"none","overflow-y":"auto",display:"block"}),angular.extend(o,{getScope:function(){return u},createPaddingElements:function(e){f=new h(e),d=new h(e),t.before(f.element),t.after(d.element),f.height(0),d.height(0)},applyContainerStyle:function(){return!a||(a!==o&&o.css("height",window.getComputedStyle(a[0]).height),0o.topVisiblePos()-s()},clipTop:function(){for(var e=0,t=0,n=0,r=o.topVisiblePos()-o.topDataPos()-s(),i=0;i=c.next&&(r+=e.height,i++)});var o=(e+t+r)/(n+i+c.length),a=null!==c.minIndexUser&&c.minIndex>c.minIndexUser,u=null!==c.maxIndexUser&&c.maxIndexc.minIndexUser){var t=f.height()-e;for(o.scrollTop(o.scrollTop()+t);0<(t-=o.scrollTop());)d.height(d.height()+t),o.scrollTop(o.scrollTop()+t)}},onAfterPrepend:function(e){if(e.prepended.length){var t=c.effectiveHeight(e.prepended),n=f.height()-t;0<=n?f.height(n):(f.height(0),o.scrollTop(o.scrollTop()-n))}},resetTopPadding:function(){f.height(0),f.cache.clear()},resetBottomPadding:function(){d.height(0),d.cache.clear()},removeCacheItem:function(e,t){f.cache.remove(e,t),d.cache.remove(e,t)},removeItem:function(e){return this.removeCacheItem(e),c.remove(e)}}),o}function p(e,t){for(var n=0;n=this.buffer.getAbsMinIndex()&&e<=this.buffer.getAbsMaxIndex()&&angular.isArray(t)&&!t.length&&(this.viewport.removeCacheItem(e,e===this.buffer.minIndex),e===this.buffer.getAbsMinIndex()?this.buffer.incrementMinIndex():this.buffer.decrementMaxIndex())}},{key:"applyUpdate",value:function(t,e){var n=this;if(angular.isArray(e)){var r=this.buffer.indexOf(t);e.reverse().some(function(e){return e===t.item})||(t.op="remove",0!==r||e.length||(t._op="isTop")),e.forEach(function(e){e===t.item?r--:n.buffer.insert(r+1,e,-1===r)})}}},{key:"calculateProperties",value:function(){for(var e=null,t=0,n=!1,r=!1,i=this.buffer.length,o=0;othis.viewport.topVisiblePos()&&(n=!0,this.topVisible=a.item,this.topVisibleElement=a.element,this.topVisibleScope=a.scope),!r&&(l>=this.viewport.bottomVisiblePos()||o===i-1&&this.isEOF())&&(r=!0,this.bottomVisible=a.item,this.bottomVisibleElement=a.element,this.bottomVisibleScope=a.scope),t+=s}if(e=u,n&&r)break}}},{key:"bufferLength",get:function(){return this.buffer.getItems().length}},{key:"bufferFirst",get:function(){return this.buffer.getFirstItem()}},{key:"bufferLast",get:function(){return this.buffer.getLastItem()}}])&&p(e.prototype,t),n&&p(e,n),s}();angular.module("ui.scroll",[]).constant("JQLiteExtras",r).run(["JQLiteExtras",function(e){var t=angular.element;!(window.jQuery&&t.fn&&t.fn.jquery)&&(new e).registerFor(t),z.addCSSRules()}]).directive("uiScrollViewport",function(){return{restrict:"A",controller:["$scope","$element",function(e,t){var n=this;return this.container=t,this.viewport=t,this.scope=e,angular.forEach(t.children(),function(e){"tbody"===e.tagName.toLowerCase()&&(n.viewport=angular.element(e))}),this}]}}).directive("uiScroll",["$log","$injector","$rootScope","$timeout","$interval","$q","$parse",function(e,F,B,D,R,W,q){return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:function(i,e,t,n,a){var r=t.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!r)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+t.uiScroll+"'");function o(e,t,n){return n||(e=null===e?t:Math.floor(e)),isNaN(e)?t:e}function u(e,t,n){var r=q(e)(i);return o(r,t,n)}var s=null,l=r[1],c=r[2],f=n[0],d=Math.max(3,u(t.bufferSize,10)),h=Math.max(.3,u(t.padding,.5,!0)),p=u(t.startIndex,1),m=0,g=[],v=new z(F,W),b=new Q(v,d,p),x=new X(v,b,e,f,B,h),y=new Y(i,q,t,x,b,V,function(){S(),x.resetTopPadding(),x.resetBottomPadding(),arguments.length&&(p=o(arguments[0],1,!1));b.reset(p),E(s,"minIndex"),E(s,"maxIndex"),V()});f&&(f.adapter=y);var w=function(){return"[object Object]"===Object.prototype.toString.call(s)&&"function"==typeof s.get};if(s=q(c)(i),!w()&&(s=F.get(c),!w()))throw new Error(c+" is not a valid datasource");var I=[];function E(e,t){var n;angular.isNumber(e[t])&&(n=e[t],angular.isNumber(n)&&(I=I.filter(function(e){return e.id!==t})).push({id:t,run:function(){return e[t]=n}}))}function $(n,r,i){var o,e=Object.getOwnPropertyDescriptor(n,r);e&&(e.set||e.get)||(E(n,r),Object.defineProperty(n,r,{set:function(e){if(o=e,!g.length||b.length){b[i]=e;var t=x.topDataPos();x.adjustPaddings(),"minIndex"===r&&x.onAfterMinIndexSet(t)}else E(n,r)},get:function(){return o}}))}$(s,"minIndex","minIndexUser"),$(s,"maxIndex","maxIndexUser");var P=2!==s.get.length?function(e){return s.get(b.next,d,e)}:function(e){s.get({index:b.next,append:b.length?b[b.length-1].item:void 0,count:d},e)},T=2!==s.get.length?function(e){return s.get(b.first-d,d,e)}:function(e){s.get({index:b.first-d,prepend:b.length?b[0].item:void 0,count:d},e)};function k(e){return e&&e!==m||i.$$destroyed}function S(){x.unbind("resize",_),x.unbind("scroll",_)}function A(e){return e.element.height()&&e.element[0].offsetParent}function O(e,t){j(e,t,x.insertElement),A(e)||(e.unregisterVisibilityWatcher=e.scope.$watch(function(){A(e)&&(b.forEach(function(e){"function"==typeof e.unregisterVisibilityWatcher&&(e.unregisterVisibilityWatcher(),delete e.unregisterVisibilityWatcher)}),g.length||D(function(){return V()}))})),v.hideElement(e)}function j(n,e,r){var i=null,o=0i.minIndexUser)return void i.minIndexUser++;i.minIndex===i.minIndexUser&&i.minIndexUser++}i.minIndex++},decrementMaxIndex:function(){null!==i.maxIndexUser&&i.maxIndex<=i.maxIndexUser&&i.maxIndexUser--,i.maxIndex--},getAbsMinIndex:function(){return null!==i.minIndexUser?Math.min(i.minIndexUser,i.minIndex):i.minIndex},getAbsMaxIndex:function(){return null!==i.maxIndexUser?Math.max(i.maxIndexUser,i.maxIndex):i.maxIndex},effectiveHeight:function(e){if(!e.length)return 0;var t=Number.MAX_VALUE,n=Number.NEGATIVE_INFINITY;return e.forEach(function(e){e.element[0].offsetParent&&(t=Math.min(t,e.element.offset().top),n=Math.max(n,e.element.offset().top+e.element.outerHeight(!0)))}),Math.max(0,n-t)},getItems:function(){return i.filter(function(e){return"none"===e.op})},getFirstItem:function(){var e=i.getItems();return e.length?e[0].item:null},getLastItem:function(){var e=i.getItems();return e.length?e[e.length-1].item:null}}),i.reset(t),i}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var n=0;nt.index?1:0})}},{key:"remove",value:function(e,t){for(var n=e%1==0?e:e.scope.$index,r=e%1==0?t:"isTop"===e._op,i=this.length-1;0<=i;i--)if(this[i].index===n){this.splice(i,1);break}if(!r)for(var o=this.length-1;0<=o;o--)this[o].index>n&&this[o].index--}},{key:"clear",value:function(){this.length=0}}]),e}();function d(){var e=[];return e.push.apply(e,arguments),Object.setPrototypeOf(e,d.prototype),e}d.prototype=Object.create(Array.prototype),Object.getOwnPropertyNames(f.prototype).forEach(function(e){return d.prototype[e]=f.prototype[e]});var h=function(){function t(e){s(this,t),this.element=function(e){if(e.nodeType!==Node.ELEMENT_NODE)throw new Error("ui-scroll directive requires an Element node for templating the view");var t;switch(e.tagName.toLowerCase()){case"dl":throw new Error("ui-scroll directive does not support <".concat(e.tagName,"> as a repeating tag: ").concat(e.outerHTML));case"tr":t=angular.element("
    ").find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t}(e),this.cache=new d}return c(t,[{key:"height",value:function(){return this.element.height.apply(this.element,arguments)}}]),t}();function X(n,c,t,e,r,i){var f=null,d=null,o=e&&e.viewport?e.viewport:angular.element(window),a=e&&e.container?e.container:void 0,u=e&&e.scope?e.scope:r;function s(){return o.outerHeight()*i}return o.css({"overflow-anchor":"none","overflow-y":"auto",display:"block"}),angular.extend(o,{getScope:function(){return u},createPaddingElements:function(e){f=new h(e),d=new h(e),t.before(f.element),t.after(d.element),f.height(0),d.height(0)},applyContainerStyle:function(){return!a||(a!==o&&o.css("height",window.getComputedStyle(a[0]).height),0o.topVisiblePos()-s()},clipTop:function(){for(var e=0,t=0,n=0,r=o.topVisiblePos()-o.topDataPos()-s(),i=0;i=c.next&&(r+=e.height,i++)});var o=(e+t+r)/(n+i+c.length),a=null!==c.minIndexUser&&c.minIndex>c.minIndexUser,u=null!==c.maxIndexUser&&c.maxIndexc.minIndexUser){var t=f.height()-e;for(o.scrollTop(o.scrollTop()+t);0<(t-=o.scrollTop());)d.height(d.height()+t),o.scrollTop(o.scrollTop()+t)}},onAfterPrepend:function(e){if(e.prepended.length){var t=c.effectiveHeight(e.prepended),n=f.height()-t;0<=n?f.height(n):(f.height(0),o.scrollTop(o.scrollTop()-n))}},resetTopPadding:function(){f.height(0),f.cache.clear()},resetBottomPadding:function(){d.height(0),d.cache.clear()},removeCacheItem:function(e,t){f.cache.remove(e,t),d.cache.remove(e,t)},removeItem:function(e){return this.removeCacheItem(e),c.remove(e)}}),o}function p(e,t){for(var n=0;n=this.buffer.getAbsMinIndex()&&e<=this.buffer.getAbsMaxIndex()&&angular.isArray(t)&&!t.length&&(this.viewport.removeCacheItem(e,!n.immutableTop&&e===this.buffer.minIndex),n.immutableTop||e!==this.buffer.getAbsMinIndex()?this.buffer.decrementMaxIndex():this.buffer.incrementMinIndex())}},{key:"applyUpdate",value:function(t,e){var n=this,r=2this.viewport.topVisiblePos()&&(n=!0,this.topVisible=a.item,this.topVisibleElement=a.element,this.topVisibleScope=a.scope),!r&&(l>=this.viewport.bottomVisiblePos()||o===i-1&&this.isEOF())&&(r=!0,this.bottomVisible=a.item,this.bottomVisibleElement=a.element,this.bottomVisibleScope=a.scope),t+=s}if(e=u,n&&r)break}}},{key:"bufferLength",get:function(){return this.buffer.getItems().length}},{key:"bufferFirst",get:function(){return this.buffer.getFirstItem()}},{key:"bufferLast",get:function(){return this.buffer.getLastItem()}}])&&p(e.prototype,t),n&&p(e,n),s}();angular.module("ui.scroll",[]).constant("JQLiteExtras",r).run(["JQLiteExtras",function(e){var t=angular.element;!(window.jQuery&&t.fn&&t.fn.jquery)&&(new e).registerFor(t),z.addCSSRules()}]).directive("uiScrollViewport",function(){return{restrict:"A",controller:["$scope","$element",function(e,t){var n=this;return this.container=t,this.viewport=t,this.scope=e,angular.forEach(t.children(),function(e){"tbody"===e.tagName.toLowerCase()&&(n.viewport=angular.element(e))}),this}]}}).directive("uiScroll",["$log","$injector","$rootScope","$timeout","$interval","$q","$parse",function(e,F,B,D,R,W,q){return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:function(i,e,t,n,a){var r=t.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!r)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+t.uiScroll+"'");function o(e,t,n){return n||(e=null===e?t:Math.floor(e)),isNaN(e)?t:e}function u(e,t,n){var r=q(e)(i);return o(r,t,n)}var s=null,l=r[1],c=r[2],f=n[0],d=Math.max(3,u(t.bufferSize,10)),h=Math.max(.3,u(t.padding,.5,!0)),p=u(t.startIndex,1),m=0,g=[],v=new z(F,W),b=new Q(v,d,p),x=new X(v,b,e,f,B,h),y=new Y(i,q,t,x,b,V,function(){S(),x.resetTopPadding(),x.resetBottomPadding(),arguments.length&&(p=o(arguments[0],1,!1));b.reset(p),E(s,"minIndex"),E(s,"maxIndex"),V()});f&&(f.adapter=y);var w=function(){return"[object Object]"===Object.prototype.toString.call(s)&&"function"==typeof s.get};if(s=q(c)(i),!w()&&(s=F.get(c),!w()))throw new Error(c+" is not a valid datasource");var I=[];function E(e,t){var n;angular.isNumber(e[t])&&(n=e[t],angular.isNumber(n)&&(I=I.filter(function(e){return e.id!==t})).push({id:t,run:function(){return e[t]=n}}))}function $(n,r,i){var o,e=Object.getOwnPropertyDescriptor(n,r);e&&(e.set||e.get)||(E(n,r),Object.defineProperty(n,r,{set:function(e){if(o=e,!g.length||b.length){b[i]=e;var t=x.topDataPos();x.adjustPaddings(),"minIndex"===r&&x.onAfterMinIndexSet(t)}else E(n,r)},get:function(){return o}}))}$(s,"minIndex","minIndexUser"),$(s,"maxIndex","maxIndexUser");var T=2!==s.get.length?function(e){return s.get(b.next,d,e)}:function(e){s.get({index:b.next,append:b.length?b[b.length-1].item:void 0,count:d},e)},P=2!==s.get.length?function(e){return s.get(b.first-d,d,e)}:function(e){s.get({index:b.first-d,prepend:b.length?b[0].item:void 0,count:d},e)};function k(e){return e&&e!==m||i.$$destroyed}function S(){x.unbind("resize",_),x.unbind("scroll",_)}function A(e){return e.element.height()&&e.element[0].offsetParent}function O(e,t){j(e,t,x.insertElement),A(e)||(e.unregisterVisibilityWatcher=e.scope.$watch(function(){A(e)&&(b.forEach(function(e){"function"==typeof e.unregisterVisibilityWatcher&&(e.unregisterVisibilityWatcher(),delete e.unregisterVisibilityWatcher)}),g.length||D(function(){return V()}))})),v.hideElement(e)}function j(n,e,r){var i=null,o=0 obj && obj.document && obj.location && obj.alert && obj.setInterval;\r\n\r\n function scrollTo(self, direction, value) {\r\n let elem = self[0];\r\n let [method, prop, preserve] = {\r\n top: [\r\n 'scrollTop',\r\n 'pageYOffset',\r\n 'scrollLeft'\r\n ],\r\n left: [\r\n 'scrollLeft',\r\n 'pageXOffset',\r\n 'scrollTop'\r\n ]\r\n }[direction];\r\n\r\n const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items) {\r\n items.reverse().forEach((item) => {\r\n --buffer.first;\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n },\r\n\r\n getItems() {\r\n return buffer.filter(item => item.op === 'none');\r\n },\r\n\r\n getFirstItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[0].item;\r\n },\r\n\r\n getLastItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[list.length - 1].item;\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\r\n","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
    ');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;","import Padding from './padding';\r\n\r\nexport default function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\r\n let topPadding = null;\r\n let bottomPadding = null;\r\n const viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\r\n const container = viewportController && viewportController.container ? viewportController.container : undefined;\r\n const scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\r\n\r\n viewport.css({\r\n 'overflow-anchor': 'none',\r\n 'overflow-y': 'auto',\r\n 'display': 'block'\r\n });\r\n\r\n function bufferPadding() {\r\n return viewport.outerHeight() * padding; // some extra space to initiate preload\r\n }\r\n\r\n angular.extend(viewport, {\r\n getScope() {\r\n return scope;\r\n },\r\n\r\n createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding());\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // read-only immediately calculated public properties\r\n const publicPropsImmediate = ['bufferFirst', 'bufferLast', 'bufferLength'];\r\n for (let i = publicPropsImmediate.length - 1; i >= 0; i--) {\r\n Object.defineProperty(this.publicContext, publicPropsImmediate[i], {\r\n get: () => this[publicPropsImmediate[i]]\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n get bufferLength() {\r\n return this.buffer.getItems().length;\r\n }\r\n\r\n get bufferFirst() {\r\n return this.buffer.getFirstItem();\r\n }\r\n\r\n get bufferLast() {\r\n return this.buffer.getLastItem();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, index === this.buffer.minIndex);\r\n if(index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if(position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n const elt = angular.element;\n !(window.jQuery && elt.fn && elt.fn.jquery) ? (new JQLiteExtras()).registerFor(elt) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumber(value, defaultValue, isFloat) {\n if (!isFloat) {\n value = value === null ? defaultValue : Math.floor(value);\n }\n return isNaN(value) ? defaultValue : value;\n }\n\n function parseNumericAttr(value, defaultValue, isFloat) {\n const result = $parse(value)($scope);\n return parseNumber(result, defaultValue, isFloat);\n }\n\n const BUFFER_MIN = 3;\n const BUFFER_DEFAULT = 10;\n const PADDING_MIN = 0.3;\n const PADDING_DEFAULT = 0.5;\n const START_INDEX_DEFAULT = 1;\n const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT, true));\n let startIndex = parseNumericAttr($attr.startIndex, START_INDEX_DEFAULT);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n unbindEvents();\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = parseNumber(arguments[0], START_INDEX_DEFAULT, false);\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler() {\n if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\n enqueueFetch(ridActual);\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/adapter.js","webpack:///./src/ui-scroll.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","JQLiteExtras","element","convertToPx","css","getStyle","isWindow","scrollTo","self","direction","elem","_top$left$direction","_slicedToArray","top","left","method","prop","preserve","isValueDefined","document","documentElement","getWidthHeight","measure","result","measurements","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","paddingA","paddingB","height","width","padding","border","margin","_width$height$measure","offsetWidth","offsetHeight","getMeasurements","outer","outerfull","style","parseFloat","angular","this","nodeType","obj","location","alert","setInterval","window","getComputedStyle","currentStyle","rs","rsLeft","RegExp","source","test","runtimeStyle","pixelLeft","forEach","before","newElem","children","j","parent","ref","contents","prepend","length","after","Error","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","arguments","undefined","getBoundingClientRect","defaultView","parentWindow","pageYOffset","scrollTop","clientTop","pageXOffset","scrollLeft","clientLeft","hideClassToken","ElementRoutines","$injector","$q","elementRoutines_classCallCheck","$animate","has","isAngularVersionLessThen1_3","version","major","minor","index","selector","rules","sheet","styleSheets","cssRules","err","insertRule","addRule","wrapper","addClass","removeClass","newElement","previousElement","remove","scope","$destroy","insertElement","deferred","defer","enter","resolve","promise","removeElement","leave","then","ScrollBuffer","elementRoutines","bufferSize","startIndex","buffer","Array","extend","size","reset","eof","bof","first","next","minIndex","maxIndex","minIndexUser","maxIndexUser","append","items","item","insert","Math","max","reverse","min","operation","isTop","op","splice","push","unshift","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","effectiveHeight","elements","Number","MAX_VALUE","bottom","NEGATIVE_INFINITY","offsetParent","getItems","filter","getFirstItem","list","getLastItem","CacheProto","$index","sort","a","b","argument","_isTop","Cache","instance","apply","setPrototypeOf","getOwnPropertyNames","methodName","Padding","template","padding_classCallCheck","Node","ELEMENT_NODE","tagName","toLowerCase","concat","find","generateElement","cache","Viewport","viewportController","$rootScope","topPadding","bottomPadding","viewport","container","bufferPadding","overflow-anchor","overflow-y","display","getScope","createPaddingElements","applyContainerStyle","bottomDataPos","scrollHeight","topDataPos","bottomVisiblePos","topVisiblePos","e","sibling","insertElementAnimated","shouldLoadBottom","clipBottom","overage","overageHeight","itemHeight","emptySpaceHeight","add","adjustPaddings","shouldLoadTop","clipTop","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","onAfterMinIndexSet","topPaddingHeightOld","diff","onAfterPrepend","updates","prepended","paddingHeight","resetTopPadding","clear","resetBottomPadding","removeCacheItem","removeItem","Adapter","$scope","$parse","$attr","doAdjust","reload","adapter_classCallCheck","isLoading","disabled","viewportScope","startScope","$parent","publicContext","assignAdapter","adapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","_this","publicMethods","publicProps","_loop","attr","set","publicPropsImmediate","_loop2","newItems","arg3","applyUpdatesFunc","applyUpdatesIndex","cb","options","_this2","slice","applyUpdate","_index","isArray","immutableTop","_this3","position","some","newItem","rowTop","topHeight","topDone","bottomDone","itemTop","isEOF","constant","run","elt","jQuery","fn","jquery","registerFor","addCSSRules","directive","restrict","controller","child","console","$timeout","$interval","require","transclude","priority","terminal","link","controllers","linker","match","uiScroll","parseNumber","defaultValue","isFloat","floor","isNaN","parseNumericAttr","datasource","itemName","datasourceName","ridActual","pending","unbindEvents","persistDatasourceIndex","isDatasourceValid","toString","onRenderHandlers","propName","handler","id","defineDatasourceIndex","propUserName","descriptor","getOwnPropertyDescriptor","fetchNext","success","count","fetchPrevious","isInvalid","rid","$$destroyed","unbind","resizeAndScrollHandler","isElementVisible","insertWrapperContent","insertAfter","createElement","unregisterVisibilityWatcher","$watch","hideElement","promises","clone","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updatePaddings","animated","all","enqueueFetch","inserted","loading","fetch","processUpdates","toBePrepended","toBeRemoved","removed","updateDOM","$$phase","$digest","w","showElement","calculateProperties","doAdjustAfterFetch","shift","wheelHandler","event","yMax","clientHeight","preventDefault","$on","tryCount","timer","cancel","initialize"],"mappings":"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","file":"ui-scroll.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","/*!\r\n globals: angular, window\r\n List of used element methods available in JQuery but not in JQuery Lite\r\n element.before(elem)\r\n element.height()\r\n element.outerHeight(true)\r\n element.height(value) = only for Top/Bottom padding elements\r\n element.scrollTop()\r\n element.scrollTop(value)\r\n */\r\n\r\nexport default class JQLiteExtras {\r\n\r\n registerFor(element) {\r\n let convertToPx, css, getStyle, isWindow;\r\n // angular implementation blows up if elem is the window\r\n css = angular.element.prototype.css;\r\n\r\n element.prototype.css = function (name, value) {\r\n let self = this;\r\n let elem = self[0];\r\n if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\r\n return css.call(self, name, value);\r\n }\r\n };\r\n\r\n // as defined in angularjs v1.0.5\r\n isWindow = (obj) => obj && obj.document && obj.location && obj.alert && obj.setInterval;\r\n\r\n function scrollTo(self, direction, value) {\r\n let elem = self[0];\r\n let [method, prop, preserve] = {\r\n top: [\r\n 'scrollTop',\r\n 'pageYOffset',\r\n 'scrollLeft'\r\n ],\r\n left: [\r\n 'scrollLeft',\r\n 'pageXOffset',\r\n 'scrollTop'\r\n ]\r\n }[direction];\r\n\r\n const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items) {\r\n items.reverse().forEach((item) => {\r\n --buffer.first;\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n },\r\n\r\n getItems() {\r\n return buffer.filter(item => item.op === 'none');\r\n },\r\n\r\n getFirstItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[0].item;\r\n },\r\n\r\n getLastItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[list.length - 1].item;\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\r\n","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
    ');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;","import Padding from './padding';\r\n\r\nexport default function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\r\n let topPadding = null;\r\n let bottomPadding = null;\r\n const viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\r\n const container = viewportController && viewportController.container ? viewportController.container : undefined;\r\n const scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\r\n\r\n viewport.css({\r\n 'overflow-anchor': 'none',\r\n 'overflow-y': 'auto',\r\n 'display': 'block'\r\n });\r\n\r\n function bufferPadding() {\r\n return viewport.outerHeight() * padding; // some extra space to initiate preload\r\n }\r\n\r\n angular.extend(viewport, {\r\n getScope() {\r\n return scope;\r\n },\r\n\r\n createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding());\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // read-only immediately calculated public properties\r\n const publicPropsImmediate = ['bufferFirst', 'bufferLast', 'bufferLength'];\r\n for (let i = publicPropsImmediate.length - 1; i >= 0; i--) {\r\n Object.defineProperty(this.publicContext, publicPropsImmediate[i], {\r\n get: () => this[publicPropsImmediate[i]]\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n get bufferLength() {\r\n return this.buffer.getItems().length;\r\n }\r\n\r\n get bufferFirst() {\r\n return this.buffer.getFirstItem();\r\n }\r\n\r\n get bufferLast() {\r\n return this.buffer.getLastItem();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2, arg3) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1, arg2);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2, arg3);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb, options) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element), options);\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems, options = {}) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems, options);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, !options.immutableTop && index === this.buffer.minIndex);\r\n if (!options.immutableTop && index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems, options = {}) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if (!options.immutableTop && position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, !options.immutableTop && position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n const elt = angular.element;\n !(window.jQuery && elt.fn && elt.fn.jquery) ? (new JQLiteExtras()).registerFor(elt) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumber(value, defaultValue, isFloat) {\n if (!isFloat) {\n value = value === null ? defaultValue : Math.floor(value);\n }\n return isNaN(value) ? defaultValue : value;\n }\n\n function parseNumericAttr(value, defaultValue, isFloat) {\n const result = $parse(value)($scope);\n return parseNumber(result, defaultValue, isFloat);\n }\n\n const BUFFER_MIN = 3;\n const BUFFER_DEFAULT = 10;\n const PADDING_MIN = 0.3;\n const PADDING_DEFAULT = 0.5;\n const START_INDEX_DEFAULT = 1;\n const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT, true));\n let startIndex = parseNumericAttr($attr.startIndex, START_INDEX_DEFAULT);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n unbindEvents();\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = parseNumber(arguments[0], START_INDEX_DEFAULT, false);\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler() {\n if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\n enqueueFetch(ridActual);\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n"],"sourceRoot":""} \ No newline at end of file From 7a97dda4f9d99d6ee030637171899b9f5a2773c1 Mon Sep 17 00:00:00 2001 From: dhilt Date: Fri, 16 Aug 2019 03:50:57 +0300 Subject: [PATCH 04/12] remove xvfb and sleep from travis config --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f606527e..aad2cd8c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,6 @@ addons: before_script: - export DISPLAY=:99.0 -- sh -e /etc/init.d/xvfb start -- sleep 3 script: - npm run build From 4611bb2d555206fea618691772c642c0849baf2d Mon Sep 17 00:00:00 2001 From: dhilt Date: Fri, 16 Aug 2019 03:59:58 +0300 Subject: [PATCH 05/12] travis: change xvfb syntax --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index aad2cd8c..ff053fae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,8 @@ addons: before_script: - export DISPLAY=:99.0 +- xvfb +- sleep 3 script: - npm run build From 05bd5d59aedcd1e3d7b350df539399f94bc31eca Mon Sep 17 00:00:00 2001 From: dhilt Date: Fri, 16 Aug 2019 04:05:45 +0300 Subject: [PATCH 06/12] travis: shift xvfb to services --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index ff053fae..9256c373 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,10 +13,8 @@ cache: addons: firefox: latest -before_script: -- export DISPLAY=:99.0 +services: - xvfb -- sleep 3 script: - npm run build From f9f3777cf229a71d359609c9591df54277956da2 Mon Sep 17 00:00:00 2001 From: dhilt Date: Sat, 17 Aug 2019 03:11:02 +0300 Subject: [PATCH 07/12] doc for applyUpdates options argument --- README.md | 17 ++++++++--------- src/modules/adapter.js | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index be63bf4f..066e6c6d 100644 --- a/README.md +++ b/README.md @@ -229,13 +229,7 @@ exactly `count` elements unless it hit eof/bof. * Properties `minIndex` and `maxIndex` - As the scroller receives the items requested by the `get` method, the value of minimum and maximum values of the item index are placed in the `minIndex` and `maxIndex` properties respectively. These values are used to maintain the appearance of the scrollbar. The values of the properties can be internaly changed by the ui-scroll engine in three cases: - * reset both properties in response to a call to the adapter `reload` method; - * increment `minIndex` in response to deleting the topmost element via adapter `applyUpdates` method; - * decrement `maxIndex` in response to deleting anything other than the topmost element via adapter `applyUpdates` method. - - Values of the properties can be assigned programmatically. If the range of the index values is known in advance, assigning them programmatically would improve the usability of the scrollBar. - + If the boundaries of the dataset are known, we may virtualize all the dataset by assigning appropriate values to `minIndex` and `maxIndex` datasource properties. This would improve the usability of the scroll bar: the uiScroll will maintain forward and backward padding elements of the viewport assuming the dataset consists of (maxIndex - minIndex) items. So it will be possible to jump to any position immediately. ### Adapter @@ -286,7 +280,7 @@ Adapter object implements the following methods * Method `applyUpdates` - applyUpdates(index, newItems) + applyUpdates(index, newItems, options) Replaces the item in the buffer at the given index with the new items. @@ -294,13 +288,18 @@ Adapter object implements the following methods * **index** provides position of the item to be affected in the dataset (not in the buffer). If the item with the given index currently is not in the buffer no updates will be applied. `$index` property of the item $scope can be used to access the index value for a given item * **newItems** is an array of items to replace the affected item. If the array is empty (`[]`) the item will be deleted, otherwise the items in the array replace the item. If the newItem array contains the old item, the old item stays in place. - applyUpdates(updater) + applyUpdates(updater, options) Updates scroller content as determined by the updater function Parameters * **updater** is a function to be applied to every item currently in the buffer. The function will receive 3 parameters: `item`, `scope`, and `element`. Here `item` is the item to be affected, `scope` is the item $scope, and `element` is the html element for the item. The return value of the function should be an array of items. Similarly to the `newItem` parameter (see above), if the array is empty(`[]`), the item is deleted, otherwise the item is replaced by the items in the array. If the return value is not an array, the item remains unaffected, unless some updates were made to the item in the updater function. This can be thought of as in place update. + Options for both signatures, an object with following fields + * **immutableTop** is a boolean flag with `false` defalt value. This option has an impact on removing/inserting items procedure. If it's `false`, deleting the topmost item will lead to incrementing min index, also inserting new item(s) before the topmost one will lead to decrementing min index. If it's `true`, min index will not be affected, max index will be shifted instead. If it's `true`, no matter which item is going to be removed/inserted, max index will be reduced/increased respectively. + + Let's discuss a little sample. We have `{{$index}}: {{item}}` template and three rows: `1: item1`, `2: item2`, `3: item3`. Then we want to remove the first item. Without `immutableTop` we'll get `2: item2`, `3: item3`. With `immutableTop` we'll get `1: item2`, `2: item3`. The same for inserting, say, `item0` before `item1`. Without `immutableTop` we'll get `0: item0`, `1: item1`, `2: item2`, `3: item3`. With `immutableTop` we'll get `1: item0`, `2: item1`, `3: item2`, `4: item3`. + * Method `append` append(newItems) diff --git a/src/modules/adapter.js b/src/modules/adapter.js index ac20a512..7b9ad2a5 100644 --- a/src/modules/adapter.js +++ b/src/modules/adapter.js @@ -130,7 +130,7 @@ class Adapter { this.doAdjust(); } - applyUpdatesFunc(cb, options) { + applyUpdatesFunc(cb, options = {}) { this.buffer.slice(0).forEach((wrapper) => { // we need to do it on the buffer clone, because buffer content // may change as we iterate through From 1bc6a05195cd2c7beb960c309516576231cc95b8 Mon Sep 17 00:00:00 2001 From: dhilt Date: Sat, 17 Aug 2019 03:35:01 +0300 Subject: [PATCH 08/12] immutableTop for prepend adapter method --- src/modules/adapter.js | 4 ++-- src/modules/buffer.js | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/modules/adapter.js b/src/modules/adapter.js index 7b9ad2a5..5acd569e 100644 --- a/src/modules/adapter.js +++ b/src/modules/adapter.js @@ -114,8 +114,8 @@ class Adapter { this.viewport.clipBottom(); } - prepend(newItems) { - this.buffer.prepend(newItems); + prepend(newItems, options = {}) { + this.buffer.prepend(newItems, options.immutableTop); this.doAdjust(); this.viewport.clipTop(); this.viewport.clipBottom(); diff --git a/src/modules/buffer.js b/src/modules/buffer.js index 51064f0a..4e08573e 100644 --- a/src/modules/buffer.js +++ b/src/modules/buffer.js @@ -24,9 +24,14 @@ export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) { buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex); }, - prepend(items) { + prepend(items, immutableTop) { items.reverse().forEach((item) => { - --buffer.first; + if (immutableTop) { + ++buffer.next; + } + else { + --buffer.first; + } buffer.insert('prepend', item); }); buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex); From 1245462cfb48d0c39ccee52f8032682c137a0978 Mon Sep 17 00:00:00 2001 From: dhilt Date: Sat, 17 Aug 2019 03:36:00 +0300 Subject: [PATCH 09/12] immutableTop prepend tests --- test/AdapterTestsSpec.js | 52 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/test/AdapterTestsSpec.js b/test/AdapterTestsSpec.js index e2e111d6..f97bbfdc 100644 --- a/test/AdapterTestsSpec.js +++ b/test/AdapterTestsSpec.js @@ -1,10 +1,19 @@ describe('uiScroll', function () { 'use strict'; + let datasource; beforeEach(module('ui.scroll')); beforeEach(module('ui.scroll.test.datasources')); + const injectDatasource = (datasourceToken) => + beforeEach( + inject([datasourceToken, function (_datasource) { + datasource = _datasource; + }]) + ); + describe('applyUpdates tests\n', function () { + injectDatasource('myOnePageDatasource'); var scrollSettings = {datasource: 'myOnePageDatasource', adapter: 'adapter'}; it('should create adapter object', function () { @@ -193,6 +202,8 @@ describe('uiScroll', function () { runTest(scrollSettings, function (viewport, scope) { + datasource; + scope.adapter.applyUpdates( function (item) { if (item === 'one') { @@ -1216,7 +1227,7 @@ describe('uiScroll', function () { describe('prepend tests\n', function () { it('should prepend two rows to the dataset', function () { - runTest({datasource: 'myOnePageDatasource', adapter: 'adapter'}, + runTest({ datasource: 'myOnePageDatasource', adapter: 'adapter' }, function (viewport, scope) { scope.adapter.prepend(['prepended one', 'prepended two']); @@ -1250,8 +1261,28 @@ describe('uiScroll', function () { ); }); + it('should prepend two rows to the dataset with immutableTop option', function () { + runTest({ datasource: 'myOnePageDatasource', adapter: 'adapter' }, + function (viewport, scope) { + + scope.adapter.prepend(['prepended one', 'prepended two'], { immutableTop: true }); + + expect(viewport.children().length).toBe(7); + expect(viewport.children()[1].innerHTML).toBe('1: prepended one'); + expect(viewport.children()[2].innerHTML).toBe('2: prepended two'); + expect(viewport.children()[3].innerHTML).toBe('3: one'); + expect(viewport.children()[4].innerHTML).toBe('4: two'); + expect(viewport.children()[5].innerHTML).toBe('5: three'); + + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: prepended one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('5: three'); + } + ); + }); + it('should prepend two rows to the empty dataset', function () { - runTest({datasource: 'myEmptyDatasource', adapter: 'adapter'}, + runTest({ datasource: 'myEmptyDatasource', adapter: 'adapter' }, function (viewport, scope) { scope.adapter.prepend(['prepended one', 'prepended two']); @@ -1273,6 +1304,23 @@ describe('uiScroll', function () { ); }); + it('should prepend two rows to the empty dataset with immutableTop option', function () { + runTest({ datasource: 'myEmptyDatasource', adapter: 'adapter' }, + function (viewport, scope) { + + scope.adapter.prepend(['prepended one', 'prepended two'], { immutableTop: true }); + + expect(viewport.children().length).toBe(4); + expect(viewport.children()[1].innerHTML).toBe('1: prepended one'); + expect(viewport.children()[2].innerHTML).toBe('2: prepended two'); + + expect(scope.adapter).toBeTruthy(); + expect(scope.adapter.topVisibleElement[0].innerHTML).toBe('1: prepended one'); + expect(scope.adapter.bottomVisibleElement[0].innerHTML).toBe('2: prepended two'); + } + ); + }); + }); describe('adapter reload tests', function () { From 353a2d1ef1fd0ee6e52392d13af9c399a6e66267 Mon Sep 17 00:00:00 2001 From: dhilt Date: Sat, 17 Aug 2019 03:37:48 +0300 Subject: [PATCH 10/12] immutableTop prepend doc --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 066e6c6d..a79b8bba 100644 --- a/README.md +++ b/README.md @@ -311,12 +311,13 @@ Adapter object implements the following methods * Method `prepend` - prepend(newItems) + prepend(newItems, options) - Adds new items before the first item in the buffer. + Adds new items before the first item in the buffer. Works exactly as inserting new item(s) before the topmost one via `applyUpdates` method. Parameters * **newItems** provides an array of items to be prepended. + * **options** the same object as the last argument of `applyUpdates` method; `options.immutableTop` set to `true` will make min index unchangeable, max index will be increased. Otherwise (`options.immutableTop = false`, the default case), min index will be increased. #### Manipulating the scroller content with the adapter methods Adapter methods `applyUpdates`, `append` and `prepend` provide a way to update the scroller content without full reload of the content from the datasource. The updates are performed by changing the items in the scroller internal buffer after they are loaded from the datasource. Items in the buffer can be deleted or replaced with one or more items. From 1667d494b608071250b236642248737e32cb1590 Mon Sep 17 00:00:00 2001 From: dhilt Date: Sat, 17 Aug 2019 03:39:55 +0300 Subject: [PATCH 11/12] v1.7.6 release --- README.md | 3 +++ bower.json | 2 +- package.json | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a79b8bba..a013a7ea 100644 --- a/README.md +++ b/README.md @@ -477,6 +477,9 @@ Pull Rerquest should include source code (./scr) changes, may include tests (./t ## Change log +### v1.7.6 + * Added immutableTop option for applyUpdates and prepend Adapter methods. + ### v1.7.5 * Added bufferFirst, bufferLast, bufferLength read-only properties to the Adapter. * Fixed reload unsubscribe issue [226](https://github.com/angular-ui/ui-scroll/issues/226). diff --git a/bower.json b/bower.json index 5c7c1c4f..b9ebcba9 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "angular-ui-scroll", "description": "AngularJS infinite scrolling module", - "version": "1.7.5", + "version": "1.7.6", "main": "./dist/ui-scroll.js", "homepage": "https://github.com/angular-ui/ui-scroll.git", "license": "MIT", diff --git a/package.json b/package.json index 2c42939e..6c038adc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "angular-ui-scroll", "description": "AngularJS infinite scrolling module", - "version": "1.7.5", + "version": "1.7.6", "src": "./src/", "public": "./dist/", "main": "./dist/ui-scroll.js", From 07eb2c343bef6cb997e7c1fac925084b43f4e6c7 Mon Sep 17 00:00:00 2001 From: dhilt Date: Sat, 17 Aug 2019 03:43:46 +0300 Subject: [PATCH 12/12] v.1.7.6 dist --- dist/ui-scroll-grid.js | 2 +- dist/ui-scroll.js | 17 ++++++++++++----- dist/ui-scroll.js.map | 2 +- dist/ui-scroll.min.js | 2 +- dist/ui-scroll.min.js.map | 2 +- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/dist/ui-scroll-grid.js b/dist/ui-scroll-grid.js index 27ff7797..487da57d 100644 --- a/dist/ui-scroll-grid.js +++ b/dist/ui-scroll-grid.js @@ -1,7 +1,7 @@ /*! * angular-ui-scroll * https://github.com/angular-ui/ui-scroll - * Version: 1.7.5 -- 2019-08-16T00:32:35.657Z + * Version: 1.7.6 -- 2019-08-17T00:42:28.970Z * License: MIT */ /******/ (function(modules) { // webpackBootstrap diff --git a/dist/ui-scroll.js b/dist/ui-scroll.js index e807b09f..b63ad9ef 100644 --- a/dist/ui-scroll.js +++ b/dist/ui-scroll.js @@ -1,7 +1,7 @@ /*! * angular-ui-scroll * https://github.com/angular-ui/ui-scroll - * Version: 1.7.5 -- 2019-08-16T00:32:35.657Z + * Version: 1.7.6 -- 2019-08-17T00:42:28.970Z * License: MIT */ /******/ (function(modules) { // webpackBootstrap @@ -531,9 +531,14 @@ function ScrollBuffer(elementRoutines, bufferSize, startIndex) { }); buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex); }, - prepend: function prepend(items) { + prepend: function prepend(items, immutableTop) { items.reverse().forEach(function (item) { - --buffer.first; + if (immutableTop) { + ++buffer.next; + } else { + --buffer.first; + } + buffer.insert('prepend', item); }); buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex); @@ -1151,7 +1156,8 @@ function () { }, { key: "prepend", value: function prepend(newItems) { - this.buffer.prepend(newItems); + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.buffer.prepend(newItems, options.immutableTop); this.doAdjust(); this.viewport.clipTop(); this.viewport.clipBottom(); @@ -1169,9 +1175,10 @@ function () { } }, { key: "applyUpdatesFunc", - value: function applyUpdatesFunc(cb, options) { + value: function applyUpdatesFunc(cb) { var _this2 = this; + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; this.buffer.slice(0).forEach(function (wrapper) { // we need to do it on the buffer clone, because buffer content // may change as we iterate through diff --git a/dist/ui-scroll.js.map b/dist/ui-scroll.js.map index 522b12c1..2fa6aa77 100644 --- a/dist/ui-scroll.js.map +++ b/dist/ui-scroll.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/adapter.js","webpack:///./src/ui-scroll.js"],"names":["JQLiteExtras","element","convertToPx","css","getStyle","isWindow","angular","prototype","name","value","self","elem","nodeType","style","call","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isValueDefined","documentElement","window","getComputedStyle","parseFloat","currentStyle","result","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","height","width","padding","border","margin","offsetWidth","offsetHeight","getWidthHeight","measurements","outer","outerfull","forEach","before","newElem","children","i","j","parent","ref","contents","prepend","length","after","Error","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","arguments","undefined","getBoundingClientRect","defaultView","parentWindow","pageYOffset","scrollTop","clientTop","pageXOffset","scrollLeft","clientLeft","key","hideClassToken","ElementRoutines","selector","rules","sheet","styleSheets","index","cssRules","err","insertRule","addRule","$injector","$q","$animate","has","get","isAngularVersionLessThen1_3","version","major","minor","wrapper","addClass","removeClass","newElement","previousElement","remove","scope","$destroy","insertElement","deferred","defer","enter","resolve","promise","removeElement","leave","then","ScrollBuffer","elementRoutines","bufferSize","startIndex","buffer","Object","create","Array","extend","size","reset","eof","bof","first","next","minIndex","maxIndex","minIndexUser","maxIndexUser","append","items","item","insert","Math","max","reverse","min","operation","isTop","op","splice","push","unshift","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","effectiveHeight","elements","Number","MAX_VALUE","bottom","NEGATIVE_INFINITY","offsetParent","getItems","filter","getFirstItem","list","getLastItem","CacheProto","$index","sort","a","b","argument","_isTop","Cache","instance","apply","setPrototypeOf","getOwnPropertyNames","methodName","generateElement","template","Node","ELEMENT_NODE","tagName","toLowerCase","table","find","Padding","cache","Viewport","viewportController","$rootScope","topPadding","bottomPadding","viewport","container","bufferPadding","getScope","createPaddingElements","applyContainerStyle","bottomDataPos","scrollHeight","topDataPos","bottomVisiblePos","topVisiblePos","e","sibling","insertElementAnimated","shouldLoadBottom","clipBottom","overage","overageHeight","itemHeight","emptySpaceHeight","add","adjustPaddings","shouldLoadTop","clipTop","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","totalHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","onAfterMinIndexSet","topPaddingHeightOld","diff","onAfterPrepend","updates","prepended","paddingHeight","resetTopPadding","clear","resetBottomPadding","removeCacheItem","removeItem","Adapter","$scope","$parse","$attr","doAdjust","reload","isLoading","disabled","viewportScope","startScope","$parent","publicContext","assignAdapter","adapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","publicMethods","bind","publicProps","property","attr","defineProperty","set","publicPropsImmediate","newItems","arg3","applyUpdatesFunc","applyUpdatesIndex","cb","options","slice","applyUpdate","_index","isArray","immutableTop","position","some","newItem","rowTop","topHeight","topDone","bottomDone","itemTop","isEOF","module","constant","run","elt","jQuery","fn","jquery","registerFor","addCSSRules","directive","restrict","controller","child","console","$timeout","$interval","require","transclude","priority","terminal","link","controllers","linker","match","uiScroll","parseNumber","defaultValue","isFloat","floor","isNaN","parseNumericAttr","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","START_INDEX_DEFAULT","MAX_VIEWPORT_DELAY","VIEWPORT_POLLING_INTERVAL","datasource","itemName","datasourceName","ridActual","pending","isDatasourceValid","toString","onRenderHandlers","onRenderHandlersRunner","handler","persistDatasourceIndex","propName","getter","id","defineDatasourceIndex","propUserName","descriptor","getOwnPropertyDescriptor","fetchNext","success","count","fetchPrevious","initialize","tryCount","timer","cancel","clone","$on","unbindEvents","unbind","wheelHandler","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","isElementVisible","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","$watch","hideElement","promises","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updateDOM","toBePrepended","toBeRemoved","inserted","concat","removed","animated","updatePaddings","all","enqueueFetch","loading","fetch","processUpdates","$$phase","$digest","w","showElement","calculateProperties","doAdjustAfterFetch","shift","event","yMax","clientHeight","preventDefault"],"mappings":"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","file":"ui-scroll.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","/*!\r\n globals: angular, window\r\n List of used element methods available in JQuery but not in JQuery Lite\r\n element.before(elem)\r\n element.height()\r\n element.outerHeight(true)\r\n element.height(value) = only for Top/Bottom padding elements\r\n element.scrollTop()\r\n element.scrollTop(value)\r\n */\r\n\r\nexport default class JQLiteExtras {\r\n\r\n registerFor(element) {\r\n let convertToPx, css, getStyle, isWindow;\r\n // angular implementation blows up if elem is the window\r\n css = angular.element.prototype.css;\r\n\r\n element.prototype.css = function (name, value) {\r\n let self = this;\r\n let elem = self[0];\r\n if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\r\n return css.call(self, name, value);\r\n }\r\n };\r\n\r\n // as defined in angularjs v1.0.5\r\n isWindow = (obj) => obj && obj.document && obj.location && obj.alert && obj.setInterval;\r\n\r\n function scrollTo(self, direction, value) {\r\n let elem = self[0];\r\n let [method, prop, preserve] = {\r\n top: [\r\n 'scrollTop',\r\n 'pageYOffset',\r\n 'scrollLeft'\r\n ],\r\n left: [\r\n 'scrollLeft',\r\n 'pageXOffset',\r\n 'scrollTop'\r\n ]\r\n }[direction];\r\n\r\n const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items) {\r\n items.reverse().forEach((item) => {\r\n --buffer.first;\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n },\r\n\r\n getItems() {\r\n return buffer.filter(item => item.op === 'none');\r\n },\r\n\r\n getFirstItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[0].item;\r\n },\r\n\r\n getLastItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[list.length - 1].item;\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\r\n","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
    ');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;","import Padding from './padding';\r\n\r\nexport default function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\r\n let topPadding = null;\r\n let bottomPadding = null;\r\n const viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\r\n const container = viewportController && viewportController.container ? viewportController.container : undefined;\r\n const scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\r\n\r\n viewport.css({\r\n 'overflow-anchor': 'none',\r\n 'overflow-y': 'auto',\r\n 'display': 'block'\r\n });\r\n\r\n function bufferPadding() {\r\n return viewport.outerHeight() * padding; // some extra space to initiate preload\r\n }\r\n\r\n angular.extend(viewport, {\r\n getScope() {\r\n return scope;\r\n },\r\n\r\n createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding());\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // read-only immediately calculated public properties\r\n const publicPropsImmediate = ['bufferFirst', 'bufferLast', 'bufferLength'];\r\n for (let i = publicPropsImmediate.length - 1; i >= 0; i--) {\r\n Object.defineProperty(this.publicContext, publicPropsImmediate[i], {\r\n get: () => this[publicPropsImmediate[i]]\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n get bufferLength() {\r\n return this.buffer.getItems().length;\r\n }\r\n\r\n get bufferFirst() {\r\n return this.buffer.getFirstItem();\r\n }\r\n\r\n get bufferLast() {\r\n return this.buffer.getLastItem();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2, arg3) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1, arg2);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2, arg3);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb, options) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element), options);\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems, options = {}) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems, options);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, !options.immutableTop && index === this.buffer.minIndex);\r\n if (!options.immutableTop && index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems, options = {}) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if (!options.immutableTop && position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, !options.immutableTop && position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n const elt = angular.element;\n !(window.jQuery && elt.fn && elt.fn.jquery) ? (new JQLiteExtras()).registerFor(elt) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumber(value, defaultValue, isFloat) {\n if (!isFloat) {\n value = value === null ? defaultValue : Math.floor(value);\n }\n return isNaN(value) ? defaultValue : value;\n }\n\n function parseNumericAttr(value, defaultValue, isFloat) {\n const result = $parse(value)($scope);\n return parseNumber(result, defaultValue, isFloat);\n }\n\n const BUFFER_MIN = 3;\n const BUFFER_DEFAULT = 10;\n const PADDING_MIN = 0.3;\n const PADDING_DEFAULT = 0.5;\n const START_INDEX_DEFAULT = 1;\n const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT, true));\n let startIndex = parseNumericAttr($attr.startIndex, START_INDEX_DEFAULT);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n unbindEvents();\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = parseNumber(arguments[0], START_INDEX_DEFAULT, false);\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler() {\n if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\n enqueueFetch(ridActual);\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/adapter.js","webpack:///./src/ui-scroll.js"],"names":["JQLiteExtras","element","convertToPx","css","getStyle","isWindow","angular","prototype","name","value","self","elem","nodeType","style","call","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isValueDefined","documentElement","window","getComputedStyle","parseFloat","currentStyle","result","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","height","width","padding","border","margin","offsetWidth","offsetHeight","getWidthHeight","measurements","outer","outerfull","forEach","before","newElem","children","i","j","parent","ref","contents","prepend","length","after","Error","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","arguments","undefined","getBoundingClientRect","defaultView","parentWindow","pageYOffset","scrollTop","clientTop","pageXOffset","scrollLeft","clientLeft","key","hideClassToken","ElementRoutines","selector","rules","sheet","styleSheets","index","cssRules","err","insertRule","addRule","$injector","$q","$animate","has","get","isAngularVersionLessThen1_3","version","major","minor","wrapper","addClass","removeClass","newElement","previousElement","remove","scope","$destroy","insertElement","deferred","defer","enter","resolve","promise","removeElement","leave","then","ScrollBuffer","elementRoutines","bufferSize","startIndex","buffer","Object","create","Array","extend","size","reset","eof","bof","first","next","minIndex","maxIndex","minIndexUser","maxIndexUser","append","items","item","insert","Math","max","immutableTop","reverse","min","operation","isTop","op","splice","push","unshift","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","effectiveHeight","elements","Number","MAX_VALUE","bottom","NEGATIVE_INFINITY","offsetParent","getItems","filter","getFirstItem","list","getLastItem","CacheProto","$index","sort","a","b","argument","_isTop","Cache","instance","apply","setPrototypeOf","getOwnPropertyNames","methodName","generateElement","template","Node","ELEMENT_NODE","tagName","toLowerCase","table","find","Padding","cache","Viewport","viewportController","$rootScope","topPadding","bottomPadding","viewport","container","bufferPadding","getScope","createPaddingElements","applyContainerStyle","bottomDataPos","scrollHeight","topDataPos","bottomVisiblePos","topVisiblePos","e","sibling","insertElementAnimated","shouldLoadBottom","clipBottom","overage","overageHeight","itemHeight","emptySpaceHeight","add","adjustPaddings","shouldLoadTop","clipTop","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","totalHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","onAfterMinIndexSet","topPaddingHeightOld","diff","onAfterPrepend","updates","prepended","paddingHeight","resetTopPadding","clear","resetBottomPadding","removeCacheItem","removeItem","Adapter","$scope","$parse","$attr","doAdjust","reload","isLoading","disabled","viewportScope","startScope","$parent","publicContext","assignAdapter","adapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","publicMethods","bind","publicProps","property","attr","defineProperty","set","publicPropsImmediate","newItems","options","arg3","applyUpdatesFunc","applyUpdatesIndex","cb","slice","applyUpdate","_index","isArray","position","some","newItem","rowTop","topHeight","topDone","bottomDone","itemTop","isEOF","module","constant","run","elt","jQuery","fn","jquery","registerFor","addCSSRules","directive","restrict","controller","child","console","$timeout","$interval","require","transclude","priority","terminal","link","controllers","linker","match","uiScroll","parseNumber","defaultValue","isFloat","floor","isNaN","parseNumericAttr","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","START_INDEX_DEFAULT","MAX_VIEWPORT_DELAY","VIEWPORT_POLLING_INTERVAL","datasource","itemName","datasourceName","ridActual","pending","isDatasourceValid","toString","onRenderHandlers","onRenderHandlersRunner","handler","persistDatasourceIndex","propName","getter","id","defineDatasourceIndex","propUserName","descriptor","getOwnPropertyDescriptor","fetchNext","success","count","fetchPrevious","initialize","tryCount","timer","cancel","clone","$on","unbindEvents","unbind","wheelHandler","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","isElementVisible","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","$watch","hideElement","promises","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updateDOM","toBePrepended","toBeRemoved","inserted","concat","removed","animated","updatePaddings","all","enqueueFetch","loading","fetch","processUpdates","$$phase","$digest","w","showElement","calculateProperties","doAdjustAfterFetch","shift","event","yMax","clientHeight","preventDefault"],"mappings":"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","file":"ui-scroll.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","/*!\r\n globals: angular, window\r\n List of used element methods available in JQuery but not in JQuery Lite\r\n element.before(elem)\r\n element.height()\r\n element.outerHeight(true)\r\n element.height(value) = only for Top/Bottom padding elements\r\n element.scrollTop()\r\n element.scrollTop(value)\r\n */\r\n\r\nexport default class JQLiteExtras {\r\n\r\n registerFor(element) {\r\n let convertToPx, css, getStyle, isWindow;\r\n // angular implementation blows up if elem is the window\r\n css = angular.element.prototype.css;\r\n\r\n element.prototype.css = function (name, value) {\r\n let self = this;\r\n let elem = self[0];\r\n if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\r\n return css.call(self, name, value);\r\n }\r\n };\r\n\r\n // as defined in angularjs v1.0.5\r\n isWindow = (obj) => obj && obj.document && obj.location && obj.alert && obj.setInterval;\r\n\r\n function scrollTo(self, direction, value) {\r\n let elem = self[0];\r\n let [method, prop, preserve] = {\r\n top: [\r\n 'scrollTop',\r\n 'pageYOffset',\r\n 'scrollLeft'\r\n ],\r\n left: [\r\n 'scrollLeft',\r\n 'pageXOffset',\r\n 'scrollTop'\r\n ]\r\n }[direction];\r\n\r\n const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items, immutableTop) {\r\n items.reverse().forEach((item) => {\r\n if (immutableTop) {\r\n ++buffer.next;\r\n }\r\n else {\r\n --buffer.first;\r\n }\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n },\r\n\r\n getItems() {\r\n return buffer.filter(item => item.op === 'none');\r\n },\r\n\r\n getFirstItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[0].item;\r\n },\r\n\r\n getLastItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[list.length - 1].item;\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\r\n","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
    ');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;","import Padding from './padding';\r\n\r\nexport default function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\r\n let topPadding = null;\r\n let bottomPadding = null;\r\n const viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\r\n const container = viewportController && viewportController.container ? viewportController.container : undefined;\r\n const scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\r\n\r\n viewport.css({\r\n 'overflow-anchor': 'none',\r\n 'overflow-y': 'auto',\r\n 'display': 'block'\r\n });\r\n\r\n function bufferPadding() {\r\n return viewport.outerHeight() * padding; // some extra space to initiate preload\r\n }\r\n\r\n angular.extend(viewport, {\r\n getScope() {\r\n return scope;\r\n },\r\n\r\n createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding());\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // read-only immediately calculated public properties\r\n const publicPropsImmediate = ['bufferFirst', 'bufferLast', 'bufferLength'];\r\n for (let i = publicPropsImmediate.length - 1; i >= 0; i--) {\r\n Object.defineProperty(this.publicContext, publicPropsImmediate[i], {\r\n get: () => this[publicPropsImmediate[i]]\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n get bufferLength() {\r\n return this.buffer.getItems().length;\r\n }\r\n\r\n get bufferFirst() {\r\n return this.buffer.getFirstItem();\r\n }\r\n\r\n get bufferLast() {\r\n return this.buffer.getLastItem();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems, options = {}) {\r\n this.buffer.prepend(newItems, options.immutableTop);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2, arg3) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1, arg2);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2, arg3);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb, options = {}) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element), options);\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems, options = {}) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems, options);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, !options.immutableTop && index === this.buffer.minIndex);\r\n if (!options.immutableTop && index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems, options = {}) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if (!options.immutableTop && position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, !options.immutableTop && position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n const elt = angular.element;\n !(window.jQuery && elt.fn && elt.fn.jquery) ? (new JQLiteExtras()).registerFor(elt) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumber(value, defaultValue, isFloat) {\n if (!isFloat) {\n value = value === null ? defaultValue : Math.floor(value);\n }\n return isNaN(value) ? defaultValue : value;\n }\n\n function parseNumericAttr(value, defaultValue, isFloat) {\n const result = $parse(value)($scope);\n return parseNumber(result, defaultValue, isFloat);\n }\n\n const BUFFER_MIN = 3;\n const BUFFER_DEFAULT = 10;\n const PADDING_MIN = 0.3;\n const PADDING_DEFAULT = 0.5;\n const START_INDEX_DEFAULT = 1;\n const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT, true));\n let startIndex = parseNumericAttr($attr.startIndex, START_INDEX_DEFAULT);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n unbindEvents();\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = parseNumber(arguments[0], START_INDEX_DEFAULT, false);\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler() {\n if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\n enqueueFetch(ridActual);\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/ui-scroll.min.js b/dist/ui-scroll.min.js index 41b5f189..6770d8fd 100644 --- a/dist/ui-scroll.min.js +++ b/dist/ui-scroll.min.js @@ -1,2 +1,2 @@ -!function(n){var r={};function i(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=n,i.c=r,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)i.d(n,r,function(e){return t[e]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=1)}([,function(e,t,n){"use strict";function g(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var a,u=e[Symbol.iterator]();!(r=(a=u.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{r||null==u.return||u.return()}finally{if(i)throw o}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function i(e,t){for(var n=0;ni.minIndexUser)return void i.minIndexUser++;i.minIndex===i.minIndexUser&&i.minIndexUser++}i.minIndex++},decrementMaxIndex:function(){null!==i.maxIndexUser&&i.maxIndex<=i.maxIndexUser&&i.maxIndexUser--,i.maxIndex--},getAbsMinIndex:function(){return null!==i.minIndexUser?Math.min(i.minIndexUser,i.minIndex):i.minIndex},getAbsMaxIndex:function(){return null!==i.maxIndexUser?Math.max(i.maxIndexUser,i.maxIndex):i.maxIndex},effectiveHeight:function(e){if(!e.length)return 0;var t=Number.MAX_VALUE,n=Number.NEGATIVE_INFINITY;return e.forEach(function(e){e.element[0].offsetParent&&(t=Math.min(t,e.element.offset().top),n=Math.max(n,e.element.offset().top+e.element.outerHeight(!0)))}),Math.max(0,n-t)},getItems:function(){return i.filter(function(e){return"none"===e.op})},getFirstItem:function(){var e=i.getItems();return e.length?e[0].item:null},getLastItem:function(){var e=i.getItems();return e.length?e[e.length-1].item:null}}),i.reset(t),i}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var n=0;nt.index?1:0})}},{key:"remove",value:function(e,t){for(var n=e%1==0?e:e.scope.$index,r=e%1==0?t:"isTop"===e._op,i=this.length-1;0<=i;i--)if(this[i].index===n){this.splice(i,1);break}if(!r)for(var o=this.length-1;0<=o;o--)this[o].index>n&&this[o].index--}},{key:"clear",value:function(){this.length=0}}]),e}();function d(){var e=[];return e.push.apply(e,arguments),Object.setPrototypeOf(e,d.prototype),e}d.prototype=Object.create(Array.prototype),Object.getOwnPropertyNames(f.prototype).forEach(function(e){return d.prototype[e]=f.prototype[e]});var h=function(){function t(e){s(this,t),this.element=function(e){if(e.nodeType!==Node.ELEMENT_NODE)throw new Error("ui-scroll directive requires an Element node for templating the view");var t;switch(e.tagName.toLowerCase()){case"dl":throw new Error("ui-scroll directive does not support <".concat(e.tagName,"> as a repeating tag: ").concat(e.outerHTML));case"tr":t=angular.element("
    ").find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t}(e),this.cache=new d}return c(t,[{key:"height",value:function(){return this.element.height.apply(this.element,arguments)}}]),t}();function X(n,c,t,e,r,i){var f=null,d=null,o=e&&e.viewport?e.viewport:angular.element(window),a=e&&e.container?e.container:void 0,u=e&&e.scope?e.scope:r;function s(){return o.outerHeight()*i}return o.css({"overflow-anchor":"none","overflow-y":"auto",display:"block"}),angular.extend(o,{getScope:function(){return u},createPaddingElements:function(e){f=new h(e),d=new h(e),t.before(f.element),t.after(d.element),f.height(0),d.height(0)},applyContainerStyle:function(){return!a||(a!==o&&o.css("height",window.getComputedStyle(a[0]).height),0o.topVisiblePos()-s()},clipTop:function(){for(var e=0,t=0,n=0,r=o.topVisiblePos()-o.topDataPos()-s(),i=0;i=c.next&&(r+=e.height,i++)});var o=(e+t+r)/(n+i+c.length),a=null!==c.minIndexUser&&c.minIndex>c.minIndexUser,u=null!==c.maxIndexUser&&c.maxIndexc.minIndexUser){var t=f.height()-e;for(o.scrollTop(o.scrollTop()+t);0<(t-=o.scrollTop());)d.height(d.height()+t),o.scrollTop(o.scrollTop()+t)}},onAfterPrepend:function(e){if(e.prepended.length){var t=c.effectiveHeight(e.prepended),n=f.height()-t;0<=n?f.height(n):(f.height(0),o.scrollTop(o.scrollTop()-n))}},resetTopPadding:function(){f.height(0),f.cache.clear()},resetBottomPadding:function(){d.height(0),d.cache.clear()},removeCacheItem:function(e,t){f.cache.remove(e,t),d.cache.remove(e,t)},removeItem:function(e){return this.removeCacheItem(e),c.remove(e)}}),o}function p(e,t){for(var n=0;n=this.buffer.getAbsMinIndex()&&e<=this.buffer.getAbsMaxIndex()&&angular.isArray(t)&&!t.length&&(this.viewport.removeCacheItem(e,!n.immutableTop&&e===this.buffer.minIndex),n.immutableTop||e!==this.buffer.getAbsMinIndex()?this.buffer.decrementMaxIndex():this.buffer.incrementMinIndex())}},{key:"applyUpdate",value:function(t,e){var n=this,r=2this.viewport.topVisiblePos()&&(n=!0,this.topVisible=a.item,this.topVisibleElement=a.element,this.topVisibleScope=a.scope),!r&&(l>=this.viewport.bottomVisiblePos()||o===i-1&&this.isEOF())&&(r=!0,this.bottomVisible=a.item,this.bottomVisibleElement=a.element,this.bottomVisibleScope=a.scope),t+=s}if(e=u,n&&r)break}}},{key:"bufferLength",get:function(){return this.buffer.getItems().length}},{key:"bufferFirst",get:function(){return this.buffer.getFirstItem()}},{key:"bufferLast",get:function(){return this.buffer.getLastItem()}}])&&p(e.prototype,t),n&&p(e,n),s}();angular.module("ui.scroll",[]).constant("JQLiteExtras",r).run(["JQLiteExtras",function(e){var t=angular.element;!(window.jQuery&&t.fn&&t.fn.jquery)&&(new e).registerFor(t),z.addCSSRules()}]).directive("uiScrollViewport",function(){return{restrict:"A",controller:["$scope","$element",function(e,t){var n=this;return this.container=t,this.viewport=t,this.scope=e,angular.forEach(t.children(),function(e){"tbody"===e.tagName.toLowerCase()&&(n.viewport=angular.element(e))}),this}]}}).directive("uiScroll",["$log","$injector","$rootScope","$timeout","$interval","$q","$parse",function(e,F,B,D,R,W,q){return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:function(i,e,t,n,a){var r=t.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!r)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+t.uiScroll+"'");function o(e,t,n){return n||(e=null===e?t:Math.floor(e)),isNaN(e)?t:e}function u(e,t,n){var r=q(e)(i);return o(r,t,n)}var s=null,l=r[1],c=r[2],f=n[0],d=Math.max(3,u(t.bufferSize,10)),h=Math.max(.3,u(t.padding,.5,!0)),p=u(t.startIndex,1),m=0,g=[],v=new z(F,W),b=new Q(v,d,p),x=new X(v,b,e,f,B,h),y=new Y(i,q,t,x,b,V,function(){S(),x.resetTopPadding(),x.resetBottomPadding(),arguments.length&&(p=o(arguments[0],1,!1));b.reset(p),E(s,"minIndex"),E(s,"maxIndex"),V()});f&&(f.adapter=y);var w=function(){return"[object Object]"===Object.prototype.toString.call(s)&&"function"==typeof s.get};if(s=q(c)(i),!w()&&(s=F.get(c),!w()))throw new Error(c+" is not a valid datasource");var I=[];function E(e,t){var n;angular.isNumber(e[t])&&(n=e[t],angular.isNumber(n)&&(I=I.filter(function(e){return e.id!==t})).push({id:t,run:function(){return e[t]=n}}))}function $(n,r,i){var o,e=Object.getOwnPropertyDescriptor(n,r);e&&(e.set||e.get)||(E(n,r),Object.defineProperty(n,r,{set:function(e){if(o=e,!g.length||b.length){b[i]=e;var t=x.topDataPos();x.adjustPaddings(),"minIndex"===r&&x.onAfterMinIndexSet(t)}else E(n,r)},get:function(){return o}}))}$(s,"minIndex","minIndexUser"),$(s,"maxIndex","maxIndexUser");var T=2!==s.get.length?function(e){return s.get(b.next,d,e)}:function(e){s.get({index:b.next,append:b.length?b[b.length-1].item:void 0,count:d},e)},P=2!==s.get.length?function(e){return s.get(b.first-d,d,e)}:function(e){s.get({index:b.first-d,prepend:b.length?b[0].item:void 0,count:d},e)};function k(e){return e&&e!==m||i.$$destroyed}function S(){x.unbind("resize",_),x.unbind("scroll",_)}function A(e){return e.element.height()&&e.element[0].offsetParent}function O(e,t){j(e,t,x.insertElement),A(e)||(e.unregisterVisibilityWatcher=e.scope.$watch(function(){A(e)&&(b.forEach(function(e){"function"==typeof e.unregisterVisibilityWatcher&&(e.unregisterVisibilityWatcher(),delete e.unregisterVisibilityWatcher)}),g.length||D(function(){return V()}))})),v.hideElement(e)}function j(n,e,r){var i=null,o=0i.minIndexUser)return void i.minIndexUser++;i.minIndex===i.minIndexUser&&i.minIndexUser++}i.minIndex++},decrementMaxIndex:function(){null!==i.maxIndexUser&&i.maxIndex<=i.maxIndexUser&&i.maxIndexUser--,i.maxIndex--},getAbsMinIndex:function(){return null!==i.minIndexUser?Math.min(i.minIndexUser,i.minIndex):i.minIndex},getAbsMaxIndex:function(){return null!==i.maxIndexUser?Math.max(i.maxIndexUser,i.maxIndex):i.maxIndex},effectiveHeight:function(e){if(!e.length)return 0;var t=Number.MAX_VALUE,n=Number.NEGATIVE_INFINITY;return e.forEach(function(e){e.element[0].offsetParent&&(t=Math.min(t,e.element.offset().top),n=Math.max(n,e.element.offset().top+e.element.outerHeight(!0)))}),Math.max(0,n-t)},getItems:function(){return i.filter(function(e){return"none"===e.op})},getFirstItem:function(){var e=i.getItems();return e.length?e[0].item:null},getLastItem:function(){var e=i.getItems();return e.length?e[e.length-1].item:null}}),i.reset(t),i}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var n=0;nt.index?1:0})}},{key:"remove",value:function(e,t){for(var n=e%1==0?e:e.scope.$index,r=e%1==0?t:"isTop"===e._op,i=this.length-1;0<=i;i--)if(this[i].index===n){this.splice(i,1);break}if(!r)for(var o=this.length-1;0<=o;o--)this[o].index>n&&this[o].index--}},{key:"clear",value:function(){this.length=0}}]),e}();function d(){var e=[];return e.push.apply(e,arguments),Object.setPrototypeOf(e,d.prototype),e}d.prototype=Object.create(Array.prototype),Object.getOwnPropertyNames(f.prototype).forEach(function(e){return d.prototype[e]=f.prototype[e]});var h=function(){function t(e){s(this,t),this.element=function(e){if(e.nodeType!==Node.ELEMENT_NODE)throw new Error("ui-scroll directive requires an Element node for templating the view");var t;switch(e.tagName.toLowerCase()){case"dl":throw new Error("ui-scroll directive does not support <".concat(e.tagName,"> as a repeating tag: ").concat(e.outerHTML));case"tr":t=angular.element("
    ").find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t}(e),this.cache=new d}return c(t,[{key:"height",value:function(){return this.element.height.apply(this.element,arguments)}}]),t}();function X(n,c,t,e,r,i){var f=null,d=null,o=e&&e.viewport?e.viewport:angular.element(window),a=e&&e.container?e.container:void 0,u=e&&e.scope?e.scope:r;function s(){return o.outerHeight()*i}return o.css({"overflow-anchor":"none","overflow-y":"auto",display:"block"}),angular.extend(o,{getScope:function(){return u},createPaddingElements:function(e){f=new h(e),d=new h(e),t.before(f.element),t.after(d.element),f.height(0),d.height(0)},applyContainerStyle:function(){return!a||(a!==o&&o.css("height",window.getComputedStyle(a[0]).height),0o.topVisiblePos()-s()},clipTop:function(){for(var e=0,t=0,n=0,r=o.topVisiblePos()-o.topDataPos()-s(),i=0;i=c.next&&(r+=e.height,i++)});var o=(e+t+r)/(n+i+c.length),a=null!==c.minIndexUser&&c.minIndex>c.minIndexUser,u=null!==c.maxIndexUser&&c.maxIndexc.minIndexUser){var t=f.height()-e;for(o.scrollTop(o.scrollTop()+t);0<(t-=o.scrollTop());)d.height(d.height()+t),o.scrollTop(o.scrollTop()+t)}},onAfterPrepend:function(e){if(e.prepended.length){var t=c.effectiveHeight(e.prepended),n=f.height()-t;0<=n?f.height(n):(f.height(0),o.scrollTop(o.scrollTop()-n))}},resetTopPadding:function(){f.height(0),f.cache.clear()},resetBottomPadding:function(){d.height(0),d.cache.clear()},removeCacheItem:function(e,t){f.cache.remove(e,t),d.cache.remove(e,t)},removeItem:function(e){return this.removeCacheItem(e),c.remove(e)}}),o}function p(e,t){for(var n=0;n=this.buffer.getAbsMinIndex()&&e<=this.buffer.getAbsMaxIndex()&&angular.isArray(t)&&!t.length&&(this.viewport.removeCacheItem(e,!n.immutableTop&&e===this.buffer.minIndex),n.immutableTop||e!==this.buffer.getAbsMinIndex()?this.buffer.decrementMaxIndex():this.buffer.incrementMinIndex())}},{key:"applyUpdate",value:function(t,e){var n=this,r=2this.viewport.topVisiblePos()&&(n=!0,this.topVisible=a.item,this.topVisibleElement=a.element,this.topVisibleScope=a.scope),!r&&(l>=this.viewport.bottomVisiblePos()||o===i-1&&this.isEOF())&&(r=!0,this.bottomVisible=a.item,this.bottomVisibleElement=a.element,this.bottomVisibleScope=a.scope),t+=s}if(e=u,n&&r)break}}},{key:"bufferLength",get:function(){return this.buffer.getItems().length}},{key:"bufferFirst",get:function(){return this.buffer.getFirstItem()}},{key:"bufferLast",get:function(){return this.buffer.getLastItem()}}])&&p(e.prototype,t),n&&p(e,n),s}();angular.module("ui.scroll",[]).constant("JQLiteExtras",r).run(["JQLiteExtras",function(e){var t=angular.element;!(window.jQuery&&t.fn&&t.fn.jquery)&&(new e).registerFor(t),z.addCSSRules()}]).directive("uiScrollViewport",function(){return{restrict:"A",controller:["$scope","$element",function(e,t){var n=this;return this.container=t,this.viewport=t,this.scope=e,angular.forEach(t.children(),function(e){"tbody"===e.tagName.toLowerCase()&&(n.viewport=angular.element(e))}),this}]}}).directive("uiScroll",["$log","$injector","$rootScope","$timeout","$interval","$q","$parse",function(e,F,B,D,R,W,q){return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:function(i,e,t,n,a){var r=t.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!r)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+t.uiScroll+"'");function o(e,t,n){return n||(e=null===e?t:Math.floor(e)),isNaN(e)?t:e}function u(e,t,n){var r=q(e)(i);return o(r,t,n)}var s=null,l=r[1],c=r[2],f=n[0],d=Math.max(3,u(t.bufferSize,10)),h=Math.max(.3,u(t.padding,.5,!0)),p=u(t.startIndex,1),m=0,g=[],v=new z(F,W),b=new Q(v,d,p),x=new X(v,b,e,f,B,h),y=new Y(i,q,t,x,b,V,function(){S(),x.resetTopPadding(),x.resetBottomPadding(),arguments.length&&(p=o(arguments[0],1,!1));b.reset(p),E(s,"minIndex"),E(s,"maxIndex"),V()});f&&(f.adapter=y);var w=function(){return"[object Object]"===Object.prototype.toString.call(s)&&"function"==typeof s.get};if(s=q(c)(i),!w()&&(s=F.get(c),!w()))throw new Error(c+" is not a valid datasource");var I=[];function E(e,t){var n;angular.isNumber(e[t])&&(n=e[t],angular.isNumber(n)&&(I=I.filter(function(e){return e.id!==t})).push({id:t,run:function(){return e[t]=n}}))}function T(n,r,i){var o,e=Object.getOwnPropertyDescriptor(n,r);e&&(e.set||e.get)||(E(n,r),Object.defineProperty(n,r,{set:function(e){if(o=e,!g.length||b.length){b[i]=e;var t=x.topDataPos();x.adjustPaddings(),"minIndex"===r&&x.onAfterMinIndexSet(t)}else E(n,r)},get:function(){return o}}))}T(s,"minIndex","minIndexUser"),T(s,"maxIndex","maxIndexUser");var $=2!==s.get.length?function(e){return s.get(b.next,d,e)}:function(e){s.get({index:b.next,append:b.length?b[b.length-1].item:void 0,count:d},e)},P=2!==s.get.length?function(e){return s.get(b.first-d,d,e)}:function(e){s.get({index:b.first-d,prepend:b.length?b[0].item:void 0,count:d},e)};function k(e){return e&&e!==m||i.$$destroyed}function S(){x.unbind("resize",_),x.unbind("scroll",_)}function A(e){return e.element.height()&&e.element[0].offsetParent}function O(e,t){j(e,t,x.insertElement),A(e)||(e.unregisterVisibilityWatcher=e.scope.$watch(function(){A(e)&&(b.forEach(function(e){"function"==typeof e.unregisterVisibilityWatcher&&(e.unregisterVisibilityWatcher(),delete e.unregisterVisibilityWatcher)}),g.length||D(function(){return V()}))})),v.hideElement(e)}function j(n,e,r){var i=null,o=0 obj && obj.document && obj.location && obj.alert && obj.setInterval;\r\n\r\n function scrollTo(self, direction, value) {\r\n let elem = self[0];\r\n let [method, prop, preserve] = {\r\n top: [\r\n 'scrollTop',\r\n 'pageYOffset',\r\n 'scrollLeft'\r\n ],\r\n left: [\r\n 'scrollLeft',\r\n 'pageXOffset',\r\n 'scrollTop'\r\n ]\r\n }[direction];\r\n\r\n const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items) {\r\n items.reverse().forEach((item) => {\r\n --buffer.first;\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n },\r\n\r\n getItems() {\r\n return buffer.filter(item => item.op === 'none');\r\n },\r\n\r\n getFirstItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[0].item;\r\n },\r\n\r\n getLastItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[list.length - 1].item;\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\r\n","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
    ');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;","import Padding from './padding';\r\n\r\nexport default function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\r\n let topPadding = null;\r\n let bottomPadding = null;\r\n const viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\r\n const container = viewportController && viewportController.container ? viewportController.container : undefined;\r\n const scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\r\n\r\n viewport.css({\r\n 'overflow-anchor': 'none',\r\n 'overflow-y': 'auto',\r\n 'display': 'block'\r\n });\r\n\r\n function bufferPadding() {\r\n return viewport.outerHeight() * padding; // some extra space to initiate preload\r\n }\r\n\r\n angular.extend(viewport, {\r\n getScope() {\r\n return scope;\r\n },\r\n\r\n createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding());\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // read-only immediately calculated public properties\r\n const publicPropsImmediate = ['bufferFirst', 'bufferLast', 'bufferLength'];\r\n for (let i = publicPropsImmediate.length - 1; i >= 0; i--) {\r\n Object.defineProperty(this.publicContext, publicPropsImmediate[i], {\r\n get: () => this[publicPropsImmediate[i]]\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n get bufferLength() {\r\n return this.buffer.getItems().length;\r\n }\r\n\r\n get bufferFirst() {\r\n return this.buffer.getFirstItem();\r\n }\r\n\r\n get bufferLast() {\r\n return this.buffer.getLastItem();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2, arg3) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1, arg2);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2, arg3);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb, options) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element), options);\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems, options = {}) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems, options);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, !options.immutableTop && index === this.buffer.minIndex);\r\n if (!options.immutableTop && index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems, options = {}) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if (!options.immutableTop && position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, !options.immutableTop && position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n const elt = angular.element;\n !(window.jQuery && elt.fn && elt.fn.jquery) ? (new JQLiteExtras()).registerFor(elt) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumber(value, defaultValue, isFloat) {\n if (!isFloat) {\n value = value === null ? defaultValue : Math.floor(value);\n }\n return isNaN(value) ? defaultValue : value;\n }\n\n function parseNumericAttr(value, defaultValue, isFloat) {\n const result = $parse(value)($scope);\n return parseNumber(result, defaultValue, isFloat);\n }\n\n const BUFFER_MIN = 3;\n const BUFFER_DEFAULT = 10;\n const PADDING_MIN = 0.3;\n const PADDING_DEFAULT = 0.5;\n const START_INDEX_DEFAULT = 1;\n const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT, true));\n let startIndex = parseNumericAttr($attr.startIndex, START_INDEX_DEFAULT);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n unbindEvents();\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = parseNumber(arguments[0], START_INDEX_DEFAULT, false);\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler() {\n if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\n enqueueFetch(ridActual);\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/adapter.js","webpack:///./src/ui-scroll.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","JQLiteExtras","element","convertToPx","css","getStyle","isWindow","scrollTo","self","direction","elem","_top$left$direction","_slicedToArray","top","left","method","prop","preserve","isValueDefined","document","documentElement","getWidthHeight","measure","result","measurements","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","paddingA","paddingB","height","width","padding","border","margin","_width$height$measure","offsetWidth","offsetHeight","getMeasurements","outer","outerfull","style","parseFloat","angular","this","nodeType","obj","location","alert","setInterval","window","getComputedStyle","currentStyle","rs","rsLeft","RegExp","source","test","runtimeStyle","pixelLeft","forEach","before","newElem","children","j","parent","ref","contents","prepend","length","after","Error","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","arguments","undefined","getBoundingClientRect","defaultView","parentWindow","pageYOffset","scrollTop","clientTop","pageXOffset","scrollLeft","clientLeft","hideClassToken","ElementRoutines","$injector","$q","elementRoutines_classCallCheck","$animate","has","isAngularVersionLessThen1_3","version","major","minor","index","selector","rules","sheet","styleSheets","cssRules","err","insertRule","addRule","wrapper","addClass","removeClass","newElement","previousElement","remove","scope","$destroy","insertElement","deferred","defer","enter","resolve","promise","removeElement","leave","then","ScrollBuffer","elementRoutines","bufferSize","startIndex","buffer","Array","extend","size","reset","eof","bof","first","next","minIndex","maxIndex","minIndexUser","maxIndexUser","append","items","item","insert","Math","max","immutableTop","reverse","min","operation","isTop","op","splice","push","unshift","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","effectiveHeight","elements","Number","MAX_VALUE","bottom","NEGATIVE_INFINITY","offsetParent","getItems","filter","getFirstItem","list","getLastItem","CacheProto","$index","sort","a","b","argument","_isTop","Cache","instance","apply","setPrototypeOf","getOwnPropertyNames","methodName","Padding","template","padding_classCallCheck","Node","ELEMENT_NODE","tagName","toLowerCase","concat","find","generateElement","cache","Viewport","viewportController","$rootScope","topPadding","bottomPadding","viewport","container","bufferPadding","overflow-anchor","overflow-y","display","getScope","createPaddingElements","applyContainerStyle","bottomDataPos","scrollHeight","topDataPos","bottomVisiblePos","topVisiblePos","e","sibling","insertElementAnimated","shouldLoadBottom","clipBottom","overage","overageHeight","itemHeight","emptySpaceHeight","add","adjustPaddings","shouldLoadTop","clipTop","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","onAfterMinIndexSet","topPaddingHeightOld","diff","onAfterPrepend","updates","prepended","paddingHeight","resetTopPadding","clear","resetBottomPadding","removeCacheItem","removeItem","Adapter","$scope","$parse","$attr","doAdjust","reload","adapter_classCallCheck","isLoading","disabled","viewportScope","startScope","$parent","publicContext","assignAdapter","adapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","_this","publicMethods","publicProps","_loop","attr","set","publicPropsImmediate","_loop2","newItems","options","arg3","applyUpdatesFunc","applyUpdatesIndex","cb","_this2","slice","applyUpdate","_index","isArray","_this3","position","some","newItem","rowTop","topHeight","topDone","bottomDone","itemTop","isEOF","constant","run","elt","jQuery","fn","jquery","registerFor","addCSSRules","directive","restrict","controller","child","console","$timeout","$interval","require","transclude","priority","terminal","link","controllers","linker","match","uiScroll","parseNumber","defaultValue","isFloat","floor","isNaN","parseNumericAttr","datasource","itemName","datasourceName","ridActual","pending","unbindEvents","persistDatasourceIndex","isDatasourceValid","toString","onRenderHandlers","propName","handler","id","defineDatasourceIndex","propUserName","descriptor","getOwnPropertyDescriptor","fetchNext","success","count","fetchPrevious","isInvalid","rid","$$destroyed","unbind","resizeAndScrollHandler","isElementVisible","insertWrapperContent","insertAfter","createElement","unregisterVisibilityWatcher","$watch","hideElement","promises","clone","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updatePaddings","animated","all","enqueueFetch","inserted","loading","fetch","processUpdates","toBePrepended","toBeRemoved","removed","updateDOM","$$phase","$digest","w","showElement","calculateProperties","doAdjustAfterFetch","shift","wheelHandler","event","yMax","clientHeight","preventDefault","$on","tryCount","timer","cancel","initialize"],"mappings":"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","file":"ui-scroll.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","/*!\r\n globals: angular, window\r\n List of used element methods available in JQuery but not in JQuery Lite\r\n element.before(elem)\r\n element.height()\r\n element.outerHeight(true)\r\n element.height(value) = only for Top/Bottom padding elements\r\n element.scrollTop()\r\n element.scrollTop(value)\r\n */\r\n\r\nexport default class JQLiteExtras {\r\n\r\n registerFor(element) {\r\n let convertToPx, css, getStyle, isWindow;\r\n // angular implementation blows up if elem is the window\r\n css = angular.element.prototype.css;\r\n\r\n element.prototype.css = function (name, value) {\r\n let self = this;\r\n let elem = self[0];\r\n if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\r\n return css.call(self, name, value);\r\n }\r\n };\r\n\r\n // as defined in angularjs v1.0.5\r\n isWindow = (obj) => obj && obj.document && obj.location && obj.alert && obj.setInterval;\r\n\r\n function scrollTo(self, direction, value) {\r\n let elem = self[0];\r\n let [method, prop, preserve] = {\r\n top: [\r\n 'scrollTop',\r\n 'pageYOffset',\r\n 'scrollLeft'\r\n ],\r\n left: [\r\n 'scrollLeft',\r\n 'pageXOffset',\r\n 'scrollTop'\r\n ]\r\n }[direction];\r\n\r\n const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items, immutableTop) {\r\n items.reverse().forEach((item) => {\r\n if (immutableTop) {\r\n ++buffer.next;\r\n }\r\n else {\r\n --buffer.first;\r\n }\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n },\r\n\r\n getItems() {\r\n return buffer.filter(item => item.op === 'none');\r\n },\r\n\r\n getFirstItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[0].item;\r\n },\r\n\r\n getLastItem() {\r\n const list = buffer.getItems();\r\n if (!list.length) {\r\n return null;\r\n }\r\n return list[list.length - 1].item;\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\r\n","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
    ');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;","import Padding from './padding';\r\n\r\nexport default function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\r\n let topPadding = null;\r\n let bottomPadding = null;\r\n const viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\r\n const container = viewportController && viewportController.container ? viewportController.container : undefined;\r\n const scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\r\n\r\n viewport.css({\r\n 'overflow-anchor': 'none',\r\n 'overflow-y': 'auto',\r\n 'display': 'block'\r\n });\r\n\r\n function bufferPadding() {\r\n return viewport.outerHeight() * padding; // some extra space to initiate preload\r\n }\r\n\r\n angular.extend(viewport, {\r\n getScope() {\r\n return scope;\r\n },\r\n\r\n createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding());\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // read-only immediately calculated public properties\r\n const publicPropsImmediate = ['bufferFirst', 'bufferLast', 'bufferLength'];\r\n for (let i = publicPropsImmediate.length - 1; i >= 0; i--) {\r\n Object.defineProperty(this.publicContext, publicPropsImmediate[i], {\r\n get: () => this[publicPropsImmediate[i]]\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n get bufferLength() {\r\n return this.buffer.getItems().length;\r\n }\r\n\r\n get bufferFirst() {\r\n return this.buffer.getFirstItem();\r\n }\r\n\r\n get bufferLast() {\r\n return this.buffer.getLastItem();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems, options = {}) {\r\n this.buffer.prepend(newItems, options.immutableTop);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2, arg3) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1, arg2);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2, arg3);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb, options = {}) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element), options);\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems, options = {}) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems, options);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, !options.immutableTop && index === this.buffer.minIndex);\r\n if (!options.immutableTop && index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems, options = {}) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if (!options.immutableTop && position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, !options.immutableTop && position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n const elt = angular.element;\n !(window.jQuery && elt.fn && elt.fn.jquery) ? (new JQLiteExtras()).registerFor(elt) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumber(value, defaultValue, isFloat) {\n if (!isFloat) {\n value = value === null ? defaultValue : Math.floor(value);\n }\n return isNaN(value) ? defaultValue : value;\n }\n\n function parseNumericAttr(value, defaultValue, isFloat) {\n const result = $parse(value)($scope);\n return parseNumber(result, defaultValue, isFloat);\n }\n\n const BUFFER_MIN = 3;\n const BUFFER_DEFAULT = 10;\n const PADDING_MIN = 0.3;\n const PADDING_DEFAULT = 0.5;\n const START_INDEX_DEFAULT = 1;\n const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT, true));\n let startIndex = parseNumericAttr($attr.startIndex, START_INDEX_DEFAULT);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n unbindEvents();\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = parseNumber(arguments[0], START_INDEX_DEFAULT, false);\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler() {\n if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\n enqueueFetch(ridActual);\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n"],"sourceRoot":""} \ No newline at end of file