From 298431aad305ee6507226f6cb4f4b93d45fd1c03 Mon Sep 17 00:00:00 2001 From: dhilt Date: Fri, 3 Mar 2017 07:26:39 +0300 Subject: [PATCH 1/7] adapter assignments rebuild --- src/modules/adapter.js | 283 ++++++++++++++++++++++++---------------- src/modules/viewport.js | 7 +- src/ui-scroll-grid.js | 2 +- src/ui-scroll.js | 7 +- test/AssigningSpec.js | 9 +- 5 files changed, 183 insertions(+), 125 deletions(-) diff --git a/src/modules/adapter.js b/src/modules/adapter.js index fb71866e..b6dddfd6 100644 --- a/src/modules/adapter.js +++ b/src/modules/adapter.js @@ -1,33 +1,150 @@ -export default function Adapter($rootScope, $parse, $attr, viewport, buffer, adjustBuffer, element) { - const viewportScope = viewport.scope() || $rootScope; - let disabled = false; - let self = this; - - createValueInjector('adapter')(self); - let topVisibleInjector = createValueInjector('topVisible'); - let topVisibleElementInjector = createValueInjector('topVisibleElement'); - let topVisibleScopeInjector = createValueInjector('topVisibleScope'); - let isLoadingInjector = createValueInjector('isLoading'); - - // Adapter API definition - - Object.defineProperty(this, 'disabled', { - get: () => disabled, - set: (value) => (!(disabled = value)) ? adjustBuffer() : null - }); - - this.isLoading = false; - this.isBOF = () => buffer.bof; - this.isEOF = () => buffer.eof; - this.isEmpty = () => !buffer.length; - - this.applyUpdates = (arg1, arg2) => { +function findCtrl(scope, ctrl) { + if (!scope) { + return; + } + if (scope.hasOwnProperty(ctrl) && Object.getPrototypeOf(scope[ctrl]).constructor.hasOwnProperty('$inject')) { + return scope[ctrl]; + } + return findCtrl(scope.$parent, ctrl); +} + +function assignAttr(attr, scope, element) { + if (!attr || !(attr = attr.replace(/^\s+|\s+$/gm, ''))) { + return; + } + + let onSyntax = attr.match(/^(.+)(\s+on\s+)(.+)?/); + let asSyntax = attr.match(/^([^.]+)\.(.+)?/); + + if (onSyntax && onSyntax.length === 4) { // controller on (backward compatibility), deprecated since v1.6.1 + window.console.warn('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.'); + let ctrl = onSyntax[3]; + let tail = onSyntax[1]; + let candidate = element; + while (candidate.length) { + let candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true + let candidateName = (candidate.attr('ng-controller') || '').match(/(\w(?:\w|\d)*)(?:\s+as\s+(\w(?:\w|\d)*))?/); + if (candidateName && candidateName[1] === ctrl) { + return { + target: candidateScope, + source: tail + }; + } + candidate = candidate.parent(); + } + throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller "' + ctrl + '" to inject "' + tail + '"'); + } + else if (asSyntax && asSyntax.length === 3) { // controller as + let ctrl = asSyntax[1]; + let tail = asSyntax[2]; + let foundCtrl = findCtrl(scope, ctrl); + if (foundCtrl) { + return { + target: foundCtrl, + source: tail + }; + } + } + + return { + target: scope, + source: attr + }; +} + +class Adapter { + + constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element) { + this.viewport = viewport; + this.buffer = buffer; + this.adjustBuffer = adjustBuffer; + this.reload = reload; + + this.publicContext = {}; + this.assignAdapter($attr, $parse, element); + this.generatePublicContext($attr, $parse, element); + + this.isLoading = false; + this.disabled = false; + } + + assignAdapter($attr, $parse, element) { + let data = assignAttr($attr.adapter, this.viewport.getScope(), element); + + if (data) { + try { + $parse(data.source).assign(data.target, {}); + let adapterOnScope = $parse(data.source)(data.target); + + angular.extend(adapterOnScope, this.publicContext); + this.publicContext = adapterOnScope; + } + catch (error) { + error.message = `Angular ui-scroll Adapter assignment exception.\n` + + `Can't parse "${$attr.adapter}" expression.\n` + + error.message; + throw error; + } + } + } + + generatePublicContext($attr, $parse, element) { + // these methods will be accessible out of ui-scroll via user defined adapter + const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty']; + for (let i = publicMethods.length - 1; i >= 0; i--) { + this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this); + } + + // these read-only props will be accessible out of ui-scroll via user defined adapter + const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope']; + for (let i = publicProps.length - 1; i >= 0; i--) { + let property, assignProp; + let data = assignAttr($attr[publicProps[i]], this.viewport.getScope(), element); + if (data) { + assignProp = $parse(data.source).assign; + } + Object.defineProperty(this, publicProps[i], { + get: () => property, + set: (value) => { + property = value; + if (assignProp) { + assignProp(data.target, value); + } + this.publicContext[publicProps[i]] = value; + } + }); + } + + // non-read-only public property + Object.defineProperty(this.publicContext, 'disabled', { + get: () => this.disabled, + set: (value) => (!(this.disabled = value)) ? this.adjustBuffer() : null + }); + } + + loading(value) { + this['isLoading'] = value; + } + + isBOF() { + return this.buffer.bof; + } + + isEOF() { + return this.buffer.eof; + } + + isEmpty() { + return !this.buffer.length; + } + + applyUpdates(arg1, arg2) { if (angular.isFunction(arg1)) { // arg1 is the updater function, arg2 is ignored - buffer.slice(0).forEach((wrapper) => { + this.buffer.slice(0).forEach((wrapper) => { // we need to do it on the buffer clone, because buffer content // may change as we iterate through - applyUpdate(wrapper, arg1(wrapper.item, wrapper.scope, wrapper.element)); + this.applyUpdate(wrapper, arg1(wrapper.item, wrapper.scope, wrapper.element)); }); } else { // arg1 is item index, arg2 is the newItems array @@ -35,127 +152,63 @@ export default function Adapter($rootScope, $parse, $attr, viewport, buffer, adj throw new Error('applyUpdates - ' + arg1 + ' is not a valid index'); } - const index = arg1 - buffer.first; - if ((index >= 0 && index < buffer.length)) { - applyUpdate(buffer[index], arg2); + const index = arg1 - this.buffer.first; + if ((index >= 0 && index < this.buffer.length)) { + this.applyUpdate(this.buffer[index], arg2); } } - adjustBuffer(); - }; - - this.append = (newItems) => { - buffer.append(newItems); - adjustBuffer(); - }; + this.adjustBuffer(); + } - this.prepend = (newItems) => { - buffer.prepend(newItems); - adjustBuffer(); - }; + append(newItems) { + this.buffer.append(newItems); + this.adjustBuffer(); + } - this.loading = (value) => { - isLoadingInjector(value); - }; + prepend(newItems) { + this.buffer.prepend(newItems); + this.adjustBuffer(); + } - this.calculateProperties = () => { + calculateProperties() { let item, itemHeight, itemTop, isNewRow, rowTop = null; let topHeight = 0; - for (let i = 0; i < buffer.length; i++) { - item = buffer[i]; + for (let i = 0; i < this.buffer.length; i++) { + item = this.buffer[i]; itemTop = item.element.offset().top; isNewRow = rowTop !== itemTop; rowTop = itemTop; if (isNewRow) { itemHeight = item.element.outerHeight(true); } - if (isNewRow && (viewport.topDataPos() + topHeight + itemHeight <= viewport.topVisiblePos())) { + if (isNewRow && (this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos())) { topHeight += itemHeight; } else { if (isNewRow) { - topVisibleInjector(item.item); - topVisibleElementInjector(item.element); - topVisibleScopeInjector(item.scope); + this['topVisible'] = item.item; + this['topVisibleElement'] = item.element; + this['topVisibleScope'] = item.scope; } break; } } - }; - - // private function definitions - - function createValueInjector(attribute) { - let expression = $attr[attribute]; - let scope = viewportScope; - let assign; - if (expression) { - // it is ok to have relaxed validation for the first part of the 'on' expression. - // additional validation will be done by the $parse service below - let match = expression.match(/^(\S+)(?:\s+on\s+(\w(?:\w|\d)*))?/); - if (!match) - throw new Error('Expected injection expression in form of \'target\' or \'target on controller\' but got \'' + expression + '\''); - let target = match[1]; - let onControllerName = match[2]; - - let parseController = (controllerName, on) => { - let candidate = element; - while (candidate.length) { - let candidateScope = candidate.scope(); - // ng-controller's "Controller As" parsing - let candidateName = (candidate.attr('ng-controller') || '').match(/(\w(?:\w|\d)*)(?:\s+as\s+(\w(?:\w|\d)*))?/); - if (candidateName && candidateName[on ? 1 : 2] === controllerName) { - scope = candidateScope; - return true; - } - // directive's/component's "Controller As" parsing - if (!on && candidateScope && candidateScope.hasOwnProperty(controllerName) && Object.getPrototypeOf(candidateScope[controllerName]).constructor.hasOwnProperty('$inject')) { - scope = candidateScope; - return true; - } - candidate = candidate.parent(); - } - }; - - if (onControllerName) { // 'on' syntax DOM parsing (adapter="adapter on ctrl") - scope = null; - parseController(onControllerName, true); - if (!scope) { - throw new Error('Failed to locate target controller \'' + onControllerName + '\' to inject \'' + target + '\''); - } - } - else { // try to parse DOM with 'Controller As' syntax (adapter="ctrl.adapter") - let controllerAsName; - let dotIndex = target.indexOf('.'); - if (dotIndex > 0) { - controllerAsName = target.substr(0, dotIndex); - parseController(controllerAsName, false); - } - } - - assign = $parse(target).assign; - } - return (value) => { - if (self !== value) // just to avoid injecting adapter reference in the adapter itself. Kludgy, I know. - self[attribute] = value; - if (assign) - assign(scope, value); - }; } - function applyUpdate(wrapper, newItems) { + applyUpdate(wrapper, newItems) { if (!angular.isArray(newItems)) { return; } let keepIt; - let pos = (buffer.indexOf(wrapper)) + 1; + let pos = (this.buffer.indexOf(wrapper)) + 1; newItems.reverse().forEach((newItem) => { if (newItem === wrapper.item) { keepIt = true; pos--; } else { - buffer.insert(pos, newItem); + this.buffer.insert(pos, newItem); } }); @@ -164,4 +217,6 @@ export default function Adapter($rootScope, $parse, $attr, viewport, buffer, adj } } -} \ No newline at end of file +} + +export default Adapter; \ No newline at end of file diff --git a/src/modules/viewport.js b/src/modules/viewport.js index b245404a..b28ad56f 100644 --- a/src/modules/viewport.js +++ b/src/modules/viewport.js @@ -1,10 +1,11 @@ import Padding from './padding'; -export default function Viewport(elementRoutines, buffer, element, viewportController, padding) { +export default function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) { let topPadding = null; let bottomPadding = null; const viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window); const container = viewportController && viewportController.container ? viewportController.container : undefined; + const scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope; viewport.css({ 'overflow-anchor': 'none', @@ -17,6 +18,10 @@ export default function Viewport(elementRoutines, buffer, element, viewportContr } angular.extend(viewport, { + getScope() { + return scope; + }, + createPaddingElements(template) { topPadding = new Padding(template); bottomPadding = new Padding(template); diff --git a/src/ui-scroll-grid.js b/src/ui-scroll-grid.js index 2152b0ef..ebddc865 100644 --- a/src/ui-scroll-grid.js +++ b/src/ui-scroll-grid.js @@ -112,7 +112,7 @@ angular.module('ui.scroll.grid', []) let rowMap = new Map(); $timeout(() => { - scrollViewport.adapter.gridAdapter = new GridAdapter(this); + scrollViewport.adapter.publicContext.gridAdapter = new GridAdapter(this); scrollViewport.adapter.transform = (scope, item) => transform(rowMap.get(scope), item); }); diff --git a/src/ui-scroll.js b/src/ui-scroll.js index 956460c2..3f510ae1 100644 --- a/src/ui-scroll.js +++ b/src/ui-scroll.js @@ -20,6 +20,7 @@ angular.module('ui.scroll', []) function (scope, element) { this.container = element; this.viewport = element; + this.scope = scope; angular.forEach(element.children(), (child => { if (child.tagName.toLowerCase() === 'tbody') { @@ -79,8 +80,8 @@ angular.module('ui.scroll', []) let elementRoutines = new ElementRoutines($injector, $q); let buffer = new ScrollBuffer(elementRoutines, bufferSize); - let viewport = new Viewport(elementRoutines, buffer, element, viewportController, padding); - let adapter = new Adapter($rootScope, $parse, $attr, viewport, buffer, adjustBuffer, element); + let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding); + let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element); if (viewportController) { viewportController.adapter = adapter; @@ -140,8 +141,6 @@ angular.module('ui.scroll', []) }, success); }; - adapter.reload = reload; - /** * Build padding elements * diff --git a/test/AssigningSpec.js b/test/AssigningSpec.js index 48de89cd..e756b8ab 100644 --- a/test/AssigningSpec.js +++ b/test/AssigningSpec.js @@ -11,7 +11,6 @@ describe('uiScroll', function () { }); myApp.controller('MyInnerController', function($scope) { $scope.name = 'MyInnerController'; - $scope.container = {}; }); myApp.controller('MyBottomController', function($scope) { $scope.name = 'MyBottomController'; @@ -196,7 +195,7 @@ describe('uiScroll', function () { '' + '' + ''; - executeTest(template, 'MyInnerController as ctrl', 'ctrl'); + executeTest(template, null, 'ctrl'); }); it('should work for custom directive with "Controller As" syntax (viewport)', function () { @@ -238,14 +237,14 @@ describe('uiScroll', function () { '' + '' + ''; - executeTest(template, 2, 'ctrl'); + executeTest(template, null, 'ctrl'); }); it('should work for custom directive with the adapter defined on some external controller', function () { myApp.directive('myDir3', setDirective({ ctrlAs: 'ctrl2', template: -'
' + +'
' + '
' + '{{$index}}: {{item}}' + '
' + @@ -266,7 +265,7 @@ describe('uiScroll', function () { myApp.directive('myDir4', setDirective({ ctrlAs: 'ctrl2', template: -'
' + +'
' + '
' + '{{$index}}: {{item}}' + '
' + From ff1fb377c0b5be2679384887849fbe4baa252a22 Mon Sep 17 00:00:00 2001 From: dhilt Date: Fri, 3 Mar 2017 07:30:11 +0300 Subject: [PATCH 2/7] examples updates --- demo/adapter/adapter.html | 12 +-- demo/adapter/adapter.js | 101 ++++++++++-------- demo/append/append.html | 2 +- demo/css/style.css | 2 +- demo/css/style.less | 2 +- .../grid-layout-manipulations.html | 2 +- demo/index.html | 4 +- demo/insideComponent/insideComponent.html | 10 +- demo/insideComponent/insideComponent.js | 13 +-- demo/insideDirective/insideDirective.html | 1 + demo/scopeDatasource/scopeDatasource.html | 10 +- demo/serviceDatasource/serviceDatasource.html | 8 +- 12 files changed, 95 insertions(+), 72 deletions(-) diff --git a/demo/adapter/adapter.html b/demo/adapter/adapter.html index 94c8122c..c528fab4 100644 --- a/demo/adapter/adapter.html +++ b/demo/adapter/adapter.html @@ -18,14 +18,14 @@

Adapter (updatable scroller)

    -
  • New mechanism of scroller data custom processing is introduced.
  • -
  • Single datasource but two different viewports with two different processing adapters.
  • -
  • The firstListAdapter is initially defined on ctrl $scope as a first level object with some property.
  • -
  • The second.list.adapter chain is not defined on ctrl $scope. The scroller defines it during linking.
  • +
  • This is a simple demo which demonstrates some basic Adapter usage.
  • +
  • For all operations presented here the only one Adapter method is being used: applyUpdates.
  • +
  • In this demo we have single datasource defined on the Main Controller .
  • +
  • And two different viewports with two different processing Adapters (on the First and the Second Controllers).
-
+

1st list

@@ -49,7 +49,7 @@

1st list


-
+

2st list

diff --git a/demo/adapter/adapter.js b/demo/adapter/adapter.js index 673198bb..f19d03e9 100644 --- a/demo/adapter/adapter.js +++ b/demo/adapter/adapter.js @@ -1,39 +1,54 @@ -angular.module('application', ['ui.scroll']).controller('mainController', [ - '$scope', '$log', '$timeout', function($scope, console, $timeout) { - var datasource, idList1, idList2; - datasource = {}; - datasource.get = function(index, count, success) { - return $timeout(function() { - var i, item, j, ref, ref1, result; - result = []; - for (i = j = ref = index, ref1 = index + count - 1; ref <= ref1 ? j <= ref1 : j >= ref1; i = ref <= ref1 ? ++j : --j) { - item = {}; - item.id = i; - item.content = "item #" + i; - result.push(item); - } - return success(result); - }, 100); - }; - $scope.datasource = datasource; +angular.module('application', ['ui.scroll']) + + .controller('mainController', [ + '$scope', '$timeout', + function ($scope, $timeout) { + + $scope.title = 'Main Controller'; + + var datasource = {}; + + datasource.get = function (index, count, success) { + $timeout(function () { + var result = []; + for (var i = index; i <= index + count - 1; i++) { + result.push({ + id: i, + content: "item #" + i + }); + } + success(result); + }, 100); + }; + + $scope.datasource = datasource; + } + ]) + + .controller('firstController', ['$scope', function ($scope) { + $scope.title = 'First Controller'; + $scope.firstListAdapter = { remain: true }; - $scope.updateList1 = function() { - return $scope.firstListAdapter.applyUpdates(function(item, scope) { + + $scope.updateList1 = function () { + return $scope.firstListAdapter.applyUpdates(function (item, scope) { return item.content += ' *'; }); }; - $scope.removeFromList1 = function() { - return $scope.firstListAdapter.applyUpdates(function(item, scope) { + + $scope.removeFromList1 = function () { + return $scope.firstListAdapter.applyUpdates(function (item, scope) { if (scope.$index % 2 === 0) { return []; } }); }; - idList1 = 1000; - $scope.addToList1 = function() { - return $scope.firstListAdapter.applyUpdates(function(item, scope) { + + var idList1 = 1000; + $scope.addToList1 = function () { + return $scope.firstListAdapter.applyUpdates(function (item, scope) { var newItem; newItem = void 0; if (scope.$index === 2) { @@ -46,42 +61,38 @@ angular.module('application', ['ui.scroll']).controller('mainController', [ } }); }; - $scope.updateList2 = function() { - return $scope.second.list.adapter.applyUpdates(function(item, scope) { + }]) + + .controller('secondController', ['$scope', function ($scope) { + $scope.title = 'Second Controller'; + + $scope.updateList2 = function () { + return $scope.second.list.adapter.applyUpdates(function (item, scope) { return item.content += ' *'; }); }; - $scope.removeFromList2 = function() { - return $scope.second.list.adapter.applyUpdates(function(item, scope) { + + $scope.removeFromList2 = function () { + return $scope.second.list.adapter.applyUpdates(function (item, scope) { if (scope.$index % 2 !== 0) { return []; } }); }; - idList2 = 2000; - return $scope.addToList2 = function() { - return $scope.second.list.adapter.applyUpdates(function(item, scope) { + + var idList2 = 2000; + $scope.addToList2 = function () { + return $scope.second.list.adapter.applyUpdates(function (item, scope) { var newItem; newItem = void 0; if (scope.$index === 4) { newItem = { id: idList2, - content: 'a new one #' + idList1 + content: 'a new one #' + idList2 }; idList2++; return [item, newItem]; } }); }; - } -]); - - - - -/* -//# sourceURL=src/adapter.js - */ - -// --- -// generated by coffee-script 1.9.2 \ No newline at end of file + }]); diff --git a/demo/append/append.html b/demo/append/append.html index c23824df..4906225d 100644 --- a/demo/append/append.html +++ b/demo/append/append.html @@ -40,7 +40,7 @@

Append and prepend demo

Then we have adapter.append() and adapter.prepend() methods to provide an injection of just created item to the viewport. Note that in this demo new items would not be appended to the viewport if the EOF (end of file) is not reached. Also new items would not be prepended to the viewport if the BOF - (begin of file) is not reached. This is very important to build proper UI. Learn sources! + (begin of file) is not reached. This is very important to build proper UI. Follow the sources of the demo!

diff --git a/demo/css/style.css b/demo/css/style.css index c6e03aba..d94bac34 100644 --- a/demo/css/style.css +++ b/demo/css/style.css @@ -291,7 +291,7 @@ } #viewport-scrollBubblingPrevent-wrap:before, #viewport-scrollBubblingPrevent-wrap:after { - content: "padding"; + content: "wrapper"; position: absolute; width: 100%; text-align: center; diff --git a/demo/css/style.less b/demo/css/style.less index 4ed77f78..fa97d5aa 100644 --- a/demo/css/style.less +++ b/demo/css/style.less @@ -384,7 +384,7 @@ &:before, &:after { - content: "padding"; + content: "wrapper"; position: absolute; width: 100%; text-align: center; diff --git a/demo/grid-layout-manipulations/grid-layout-manipulations.html b/demo/grid-layout-manipulations/grid-layout-manipulations.html index bb160cfc..15c53765 100644 --- a/demo/grid-layout-manipulations/grid-layout-manipulations.html +++ b/demo/grid-layout-manipulations/grid-layout-manipulations.html @@ -29,7 +29,7 @@

Grid layout manipulations

 layout = $scope.adapter.gridAdapter.getLayout()
- Note that saving via cookie does not work when you run this demo locally. + Note that saving via cookie requires web-server.

diff --git a/demo/index.html b/demo/index.html index ba9a80b0..0fc46a07 100644 --- a/demo/index.html +++ b/demo/index.html @@ -121,12 +121,12 @@

Scroller Examples

  • - Inside the es6 component + Inside Angular 1.5+ Component
  • - Append on controller + Adapter "on controller"
  • diff --git a/demo/insideComponent/insideComponent.html b/demo/insideComponent/insideComponent.html index 51c71fc4..01dc6c92 100644 --- a/demo/insideComponent/insideComponent.html +++ b/demo/insideComponent/insideComponent.html @@ -2,7 +2,7 @@ - Inside es6 component + Inside Angular 1.5+ component @@ -14,10 +14,14 @@ browse other examples -

    Scroller inside ES6 Component

    +

    Scroller inside Angular 1.5+ Component

    - This sample demonstrates encapsulation of the ui-scroll directive inside some custom component (Angular 1.5+). The controller of this Component is implemented as ES6 class. Note that this demo might not work in old browsers which don't support ES6 classes. + This sample demonstrates encapsulation of the ui-scroll directive inside some custom component (Angular 1.5+). + + To demonstrate the work of the Adapter, click on any row. The text of the item should change after click. + + The controller of this Component is implemented as ES6 class. Note that this demo might not work in old browsers which don't support ES6 classes.
    diff --git a/demo/insideComponent/insideComponent.js b/demo/insideComponent/insideComponent.js index f6c6f856..24c7ce6b 100644 --- a/demo/insideComponent/insideComponent.js +++ b/demo/insideComponent/insideComponent.js @@ -1,9 +1,10 @@ -(function(angular) { +(function (angular) { class Ctrl { - constructor($timeout) { - this.timeout = $timeout; - this.show = true; + constructor($timeout, $scope) { + this.timeout = $timeout; + this.show = true; + this.$scope = $scope; } get(index, count, success) { @@ -20,7 +21,7 @@ } update(id) { - return this.scrollAdapter.applyUpdates(function(item) { + return this.scrollAdapter.applyUpdates(function (item) { if (item.id === id) { item.name += " *"; } @@ -40,5 +41,5 @@ '
  • ', controller: Ctrl }); - + })(angular); diff --git a/demo/insideDirective/insideDirective.html b/demo/insideDirective/insideDirective.html index 27e6d5c6..f31f6674 100644 --- a/demo/insideDirective/insideDirective.html +++ b/demo/insideDirective/insideDirective.html @@ -18,6 +18,7 @@

    Scroller inside the directive

    This sample demonstrates encapsulation of the ui-scroll directive inside another custom directive wich has it's own controller and wich uses "Controller As" syntax in it's template. + To demonstrate the work of the Adapter, click on any row. The text of the item should change after click.
    diff --git a/demo/scopeDatasource/scopeDatasource.html b/demo/scopeDatasource/scopeDatasource.html index 32a53c03..2ed4a6ed 100644 --- a/demo/scopeDatasource/scopeDatasource.html +++ b/demo/scopeDatasource/scopeDatasource.html @@ -28,10 +28,14 @@

    Datasource on scope (not as service)
    -angular.module('application', ['ui.scroll']).controller('mainController', ...
    +angular.module('application', ['ui.scroll'])
    +  .controller('mainController', ...
     
    -	$scope.datasource = {}
    -	$scope.datasource.get = function...
    + var get = function(index, count, success) { ... }; + + $scope.datasource = { get: get }; + + );

    diff --git a/demo/serviceDatasource/serviceDatasource.html b/demo/serviceDatasource/serviceDatasource.html index 2418477c..030ac514 100644 --- a/demo/serviceDatasource/serviceDatasource.html +++ b/demo/serviceDatasource/serviceDatasource.html @@ -27,11 +27,13 @@

    Datasource as service

    -angular.module('application', ['ui.scroll']).factory('datasource', ...
    +angular.module('application', ['ui.scroll'])
    +  .factory('datasource', function() { ...
     
    -	var get = function ...
    +    var get = function(index, count, success) { ... };
     
    -	return { get: get };
    + return { get: get }; + });
    From 62c4b504af7fafcf34fcc1fb2cd9a8ee6f2193c9 Mon Sep 17 00:00:00 2001 From: dhilt Date: Fri, 3 Mar 2017 08:05:48 +0300 Subject: [PATCH 3/7] v1.6.1 readme changes --- README.md | 56 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 1547bc78..3c9ccadf 100644 --- a/README.md +++ b/README.md @@ -64,8 +64,10 @@ It will start retrieving new data for new elements again if the user scrolls up/ ### Basic usage ```html - + + ... + ``` Listing `ANY` for the tag, the directive can be applied to, stretches the truth - a little bit. The directive works well with majority @@ -81,6 +83,10 @@ _Important!_ The viewport height must be constrained. If the height of the viewp in the datasource. Even if it does not, using the directive this way does not provide any advantages over using ng-repeat, because item template will be always instantiated for every item in the datasource. +_Important!_ There is a Scroll Anchoring feature enforced by Google Chrome (since Chrome 56) which makes scroller behaviour incorrect. +The ui-scroll-viewport directive eliminates this effect by disabling the 'overflow-anchor' css-property on its element. +But if the ui-scroll-viewport is not presented in the template, you should take care of this manually. + ### Examples @@ -152,19 +158,14 @@ It is empty since it was deprecated in v1.6.0. Some of the properties offered by the adapter can also be accessed directly from the directive by using matching attributes. In the same way as for the adapter attribute, syntax for such attributes allows for providing a reference expression to be used to access the corresponding value. Below is a list of such attributes: -* **is-loading - assignable expression**, optional - a boolean value indicating whether there are any pending load requests will be injected in the appropriate scope. See also `isLoading` adapter property. -* **top-visible - assignable expression**, optional - a reference to the item currently in the topmost visible position will be injected in the appropriate scope. See also `topVisible` adapter property. -* **top-visible-element - assignable expression**, optional - a reference to the DOM element currently in the topmost visible position will be injected in the appropriate scope. See also `topVisibleElement` adapter property. -* **top-visible-scope - assignable expression**, optional - a reference to the scope created for the item currently in the topmost visible position will be injected in the appropriate scope. See also `topVisibleScope` adapter property. +* **is-loading - assignable expression**, optional - a boolean value indicating whether there are any pending load requests will be injected in the appropriate scope. See also `isLoading` adapter property, which is preferable. +* **top-visible - assignable expression**, optional - a reference to the item currently in the topmost visible position will be injected in the appropriate scope. See also `topVisible` adapter property, which is preferable. +* **top-visible-element - assignable expression**, optional - a reference to the DOM element currently in the topmost visible position will be injected in the appropriate scope. See also `topVisibleElement` adapter property, which is preferable. +* **top-visible-scope - assignable expression**, optional - a reference to the scope created for the item currently in the topmost visible position will be injected in the appropriate scope. See also `topVisibleScope` adapter property, which is preferable. The `expression` can be any angular expression (assignable expression where so specified). All expressions are evaluated once at the time when the scroller is initialized. Changes in the expression value after scroller initialization will have no impact on the scroller behavior. -The assignable expressions will be used by scroller to inject the requested value into the target scope. The scope associated with the viewport (the element marked with the [uiScrollViewport](#uiscrollviewport-directive) directive) will be used as the target scope. If the viewport is not defined (window viewport), the $rootScope will be used as the target scope. Note that the nearest additional scope-wrapper (like ng-if directive set right on the viewport) makes this mechanism unusable. There are two options which help in this case: - -1. The second format `expression on controller` can be used to explicitly target the scope associated with the specified controller as the target scope for the injection. In this format `expression` is any angular assignable expression, and `controller` is the name of controller constructor function as specified in the `ng-controller` directive. The scroller will traverse its parents to locate the target scope associated with the specified controller. - -2. Also `Controller As` syntax could be used as an alternative way to specify target controller in assignable expressions. - +The assignable expressions will be used by scroller to inject the requested value into the target scope. The scope associated with the viewport (the element marked with the [uiScrollViewport](#uiscrollviewport-directive) directive) will be used as the target scope. If the viewport is not defined (window viewport), the $rootScope will be used as the target scope. Also `Controller As` syntax could be used as an alternative way to specify target controller in assignable expressions. ### Datasource @@ -186,7 +187,8 @@ The data source object implements methods and properties to be used by the direc get(index, count, success) This is a mandatory method used by the directive to retrieve the data. -#### Parameters + + Parameters * **descriptor** is an object defining the portion of the dataset requested. The object will have 3 properties. Two of them named `index` and `count`. They have the same meaning as in the alternative signature when the parameters passed explicitly (see below). The third one will be named either `append` if the items will be appended to the last item in the buffer, or `prepend` if they are to be prepended to the first item in the buffer. The value of the property in either case will be the item the new items will be appended/prepended to. This is useful if it is easier to identify the items to be added based on the previously requested items rather than on the index. Keep in mind that in certain use cases (i.e. on initial load) the value of the append/prepend property can be undefined. * **index** indicates the first data row requested * **count** indicates number of data rows requested @@ -204,7 +206,7 @@ exactly `count` elements unless it hit eof/bof. ###Adapter -The adapter object is an internal object created for every instance of the scroller. Properties and methods of the adapter can be used to manipulate and assess the scroller the adapter was created for. Adapter based API replaces old (undocumented) event based API introduced earlier for this purpose. The event based API is now deprecated and no longer supported. +The adapter object is an internal object created for every instance of the scroller. Properties and methods of the adapter can be used to manipulate and assess the scroller the adapter was created for. Adapter object implements the following properties: @@ -250,14 +252,16 @@ Adapter object implements the following methods applyUpdates(index, newItems) Replaces the item in the buffer at the given index with the new items. -#### Parameters + + Parameters * **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) Updates scroller content as determined by the updater function -#### Parameters + + 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. * Method `append` @@ -265,7 +269,8 @@ Adapter object implements the following methods append(newItems) Adds new items after the last item in the buffer. -#### Parameters + + Parameters * **newItems** provides an array of items to be appended. * Method `prepend` @@ -273,7 +278,8 @@ Adapter object implements the following methods prepend(newItems) Adds new items before the first item in the buffer. -#### Parameters + + Parameters * **newItems** provides an array of items to be prepended. #### Manipulating the scroller content with adapter methods @@ -433,12 +439,16 @@ PR should include source code (./scr) and tests (./test) changes and may not inc ## Change log +###v1.6.1 + * Refactored Adapter assignments logic + * Fixed Chrome Scroll Anchoring enforced feature [bug](https://github.com/angular-ui/ui-scroll/issues/138) + ###v1.6.0 * Introduced ES6 modules in the source codes. * Improved build process with Webpack. * Added sourcemaps. Fixed dev-server. * Removed 'ui.scroll.jqlite' module. Added jqLiteExtras service to 'ui.scroll' module. - * Significantly changed readme. + * Significantly changed the README. ###v1.5.2 * Refactored assignable expressions and attributes scope bindings. @@ -481,21 +491,21 @@ PR should include source code (./scr) and tests (./test) changes and may not inc ###v1.3.0 * Reorganized the repository structure. -####v1.2.1 +###v1.2.1 * Dismiss pending requests on applyUpdates(). -####v1.2.0 +###v1.2.0 * Changed the algorithm of list items building. * Integration with angular $animation. * Insert/update/delete events are no longer supported. -####v1.1.2 +###v1.1.2 * Fixed inserting elements via applyUpdates error. -####v1.1.1 +###v1.1.1 * Fixed jqlite on $destroy error. -####v1.1.0 +###v1.1.0 * Introduced API to dynamically update scroller content. * Deep 'name' properties access via dot-notation in template. * Fixed the problem occurring if the scroller is $destroyed while there are requests pending: [#64](https://github.com/Hill30/NGScroller/issues/64). From e0298343ace9cd64f03055ba23f6b5e7d2a80f9f Mon Sep 17 00:00:00 2001 From: dhilt Date: Fri, 3 Mar 2017 08:28:11 +0300 Subject: [PATCH 4/7] v1.6.1 package.json + distributive --- bower.json | 2 +- dist/ui-scroll-grid.js | 4 +- dist/ui-scroll-grid.js.map | 2 +- dist/ui-scroll-grid.min.js | 4 +- dist/ui-scroll-grid.min.js.map | 2 +- dist/ui-scroll.js | 401 ++++++++++++++++++++------------- dist/ui-scroll.js.map | 2 +- dist/ui-scroll.min.js | 4 +- dist/ui-scroll.min.js.map | 2 +- package.json | 4 +- 10 files changed, 256 insertions(+), 171 deletions(-) diff --git a/bower.json b/bower.json index c2e29c04..7d83bea1 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "angular-ui-scroll", "description": "AngularJS infinite scrolling module", - "version": "1.6.0", + "version": "1.6.1", "main": "./dist/ui-scroll.js", "homepage": "https://github.com/angular-ui/ui-scroll.git", "license": "MIT", diff --git a/dist/ui-scroll-grid.js b/dist/ui-scroll-grid.js index e4c852ff..62c7140f 100644 --- a/dist/ui-scroll-grid.js +++ b/dist/ui-scroll-grid.js @@ -1,7 +1,7 @@ /*! * angular-ui-scroll (uncompressed) * https://github.com/angular-ui/ui-scroll - * Version: 1.6.0 -- 2017-02-04T09:24:37.966Z + * Version: 1.6.1 -- 2017-03-03T05:28:34.208Z * License: MIT */ /******/ (function(modules) { // webpackBootstrap @@ -188,7 +188,7 @@ var rowMap = new Map(); $timeout(function () { - scrollViewport.adapter.gridAdapter = new GridAdapter(_this3); + scrollViewport.adapter.publicContext.gridAdapter = new GridAdapter(_this3); scrollViewport.adapter.transform = function (scope, item) { return transform(rowMap.get(scope), item); }; diff --git a/dist/ui-scroll-grid.js.map b/dist/ui-scroll-grid.js.map index 153a9d21..9f455ade 100644 --- a/dist/ui-scroll-grid.js.map +++ b/dist/ui-scroll-grid.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 193204225f0698037b75?5aba","webpack:///./src/ui-scroll-grid.js"],"names":["angular","module","directive","console","$timeout","GridAdapter","controller","getLayout","applyLayout","layout","columnFromPoint","x","y","Object","defineProperty","get","getColumns","ColumnAdapter","column","css","attr","arguments","value","length","header","forEachRow","row","id","moveBefore","index","exchangeWith","ColumnController","columns","mapTo","extend","applyCss","target","moveLast","insidePoint","result","element","offset","left","outerWidth","top","outerHeight","detach","before","parent","append","removeAttr","hasOwnProperty","GridController","scrollViewport","rowMap","Map","adapter","gridAdapter","transform","scope","item","registerColumn","push","registerCell","cell","set","unregisterCell","i","indexOf","splice","delete","callback","forEach","slice","sort","a","b","layouts","Error","map","selected","columnId","next","c","find","col","undefined","visible","require","restrict","link","$scope","$attr","controllers","gridController","$on"],"mappings":";;;;;;;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;;;ACtCAA,SAAQC,MAAR,CAAe,gBAAf,EAAiC,EAAjC,EACGC,SADH,CACa,YADb,EAC2B,CAAC,MAAD,EAAS,UAAT,EAAqB,UAAUC,OAAV,EAAmBC,QAAnB,EAA6B;;AAEzE,YAASC,WAAT,CAAqBC,UAArB,EAAiC;;AAE/B,UAAKC,SAAL,GAAiB;AAAA,cAAMD,WAAWC,SAAX,EAAN;AAAA,MAAjB;;AAEA,UAAKC,WAAL,GAAmB,UAACC,MAAD;AAAA,cAAYH,WAAWE,WAAX,CAAuBC,MAAvB,CAAZ;AAAA,MAAnB;;AAEA,UAAKC,eAAL,GAAuB,UAACC,CAAD,EAAIC,CAAJ;AAAA,cAAUN,WAAWI,eAAX,CAA2BC,CAA3B,EAA8BC,CAA9B,CAAV;AAAA,MAAvB;;AAEAC,YAAOC,cAAP,CAAsB,IAAtB,EAA4B,SAA5B,EAAuC,EAACC,KAAK;AAAA,gBAAMT,WAAWU,UAAX,EAAN;AAAA,QAAN,EAAvC;AACD;;AAED,YAASC,aAAT,CAAuBX,UAAvB,EAAmCY,MAAnC,EAA2C;;AAEzC,UAAKC,GAAL,GAAW,YAAU,iBAAmB;AACtC,WAAIC,OAAOC,UAAU,CAAV,CAAX;AACA,WAAIC,QAAQD,UAAU,CAAV,CAAZ;AACA,WAAIA,UAAUE,MAAV,IAAoB,CAAxB,EAA2B;AACzB,gBAAOL,OAAOM,MAAP,CAAcL,GAAd,CAAkBC,IAAlB,CAAP;AACD;AACD,WAAIC,UAAUE,MAAV,IAAoB,CAAxB,EAA2B;AACzBL,gBAAOM,MAAP,CAAcL,GAAd,CAAkBC,IAAlB,EAAwBE,KAAxB;AACAhB,oBAAWmB,UAAX,CAAsB,UAACC,GAAD;AAAA,kBAASA,IAAIR,OAAOS,EAAX,EAAeR,GAAf,CAAmBC,IAAnB,EAAyBE,KAAzB,CAAT;AAAA,UAAtB;AACAJ,gBAAOC,GAAP,CAAWC,IAAX,IAAmBE,KAAnB;AACD;AACF,MAXD;;AAaA,UAAKM,UAAL,GAAkB,UAACC,KAAD;AAAA,cAAWvB,WAAWsB,UAAX,CAAsBV,MAAtB,EAA8BW,KAA9B,CAAX;AAAA,MAAlB;;AAEA,UAAKC,YAAL,GAAoB,UAACD,KAAD;AAAA,cAAWvB,WAAWwB,YAAX,CAAwBZ,MAAxB,EAAgCW,KAAhC,CAAX;AAAA,MAApB;;AAEAhB,YAAOC,cAAP,CAAsB,IAAtB,EAA4B,UAA5B,EAAwC,EAACC,KAAK;AAAA,gBAAMG,OAAOS,EAAb;AAAA,QAAN,EAAxC;AACD;;AAED,YAASI,gBAAT,CAA0BzB,UAA1B,EAAsC0B,OAAtC,EAA+CR,MAA/C,EAAuD;;AAErD,UAAKA,MAAL,GAAcA,MAAd;AACA,UAAKL,GAAL,GAAW,EAAX;AACA,UAAKc,KAAL,GAAaD,QAAQT,MAArB;AACA,UAAKI,EAAL,GAAUK,QAAQT,MAAlB;;AAEA;;AAEA,UAAKf,WAAL,GAAmB,UAAUC,MAAV,EAAkB;AACnC,YAAKU,GAAL,GAAWnB,QAAQkC,MAAR,CAAe,EAAf,EAAmBzB,OAAOU,GAA1B,CAAX;AACA,YAAKc,KAAL,GAAaxB,OAAOwB,KAApB;AACAE,gBAAS,KAAKX,MAAd,EAAsB,KAAKL,GAA3B;AACD,MAJD;;AAMA,UAAKS,UAAL,GAAkB,UAAUQ,MAAV,EAAkB;AAAA;;AAClC,WAAIA,MAAJ,EAAY;AACVR,oBAAWJ,MAAX,EAAmBY,OAAOZ,MAA1B;AACAlB,oBAAWmB,UAAX,CAAsB,UAACC,GAAD;AAAA,kBAASE,WAAWF,IAAI,MAAKC,EAAT,CAAX,EAAyBD,IAAIU,OAAOT,EAAX,CAAzB,CAAT;AAAA,UAAtB;AACD,QAHD,MAGO;AACLU,kBAASb,MAAT;AACAlB,oBAAWmB,UAAX,CAAsB,UAACC,GAAD;AAAA,kBAASW,SAASX,IAAI,MAAKC,EAAT,CAAT,CAAT;AAAA,UAAtB;AACD;AACF,MARD;;AAUA,UAAKjB,eAAL,GAAuB,UAAUC,CAAV,EAAaC,CAAb,EAAgB;AAAA;;AACrC,WAAI0B,YAAYd,MAAZ,EAAoBb,CAApB,EAAuBC,CAAvB,CAAJ,EAA+B;AAC7B,gBAAO,IAAP;AACD;AACD,WAAI2B,SAAS,IAAb;AACAjC,kBAAWmB,UAAX,CAAsB,UAACC,GAAD;AAAA,gBACpBa,SAASD,YAAYZ,IAAI,OAAKC,EAAT,CAAZ,EAA0BhB,CAA1B,EAA6BC,CAA7B,aAAyC2B,MAD9B;AAAA,QAAtB;AAGA,cAAOA,MAAP;AACD,MATD;;AAWA,UAAKJ,QAAL,GAAgB,UAAUC,MAAV,EAAkB;AAChCD,gBAASC,MAAT,EAAiB,KAAKjB,GAAtB;AACD,MAFD;;AAIA;;AAEA,cAASmB,WAAT,CAAqBE,OAArB,EAA8B7B,CAA9B,EAAiCC,CAAjC,EAAoC;AAClC,WAAI6B,SAASD,QAAQC,MAAR,EAAb;AACA,WAAI9B,IAAI8B,OAAOC,IAAX,IAAmBD,OAAOC,IAAP,GAAcF,QAAQG,UAAR,CAAmB,IAAnB,CAAd,GAAyChC,CAAhE,EACE,OAAO,KAAP;AACF,WAAIC,IAAI6B,OAAOG,GAAX,IAAkBH,OAAOG,GAAP,GAAaJ,QAAQK,WAAR,CAAoB,IAApB,CAAb,GAAyCjC,CAA/D,EACE,OAAO,KAAP;AACF,cAAO,IAAP;AACD;;AAED,cAASgB,UAAT,CAAoBY,OAApB,EAA6BJ,MAA7B,EAAqC;AACnCI,eAAQM,MAAR;AACAV,cAAOW,MAAP,CAAcP,OAAd;AACD;;AAED,cAASH,QAAT,CAAkBG,OAAlB,EAA2B;AACzB,WAAIQ,SAASR,QAAQQ,MAAR,EAAb;AACAR,eAAQM,MAAR;AACAE,cAAOC,MAAP,CAAcT,OAAd;AACD;;AAED,cAASL,QAAT,CAAkBC,MAAlB,EAA0BjB,GAA1B,EAA+B;AAC7BiB,cAAOc,UAAP,CAAkB,OAAlB;AACA,YAAK,IAAI9B,IAAT,IAAiBD,GAAjB,EAAsB;AACpB,aAAIA,IAAIgC,cAAJ,CAAmB/B,IAAnB,CAAJ,EAA8B;AAC5BgB,kBAAOjB,GAAP,CAAWC,IAAX,EAAiBD,IAAIC,IAAJ,CAAjB;AACD;AACF;AACF;AAEF;;AAED,YAASgC,cAAT,CAAwBC,cAAxB,EAAwC;AAAA;;AACtC,SAAIrB,UAAU,EAAd;AACA,SAAIsB,SAAS,IAAIC,GAAJ,EAAb;;AAEAnD,cAAS,YAAM;AACbiD,sBAAeG,OAAf,CAAuBC,WAAvB,GAAqC,IAAIpD,WAAJ,QAArC;AACAgD,sBAAeG,OAAf,CAAuBE,SAAvB,GAAmC,UAACC,KAAD,EAAQC,IAAR;AAAA,gBAAiBF,UAAUJ,OAAOvC,GAAP,CAAW4C,KAAX,CAAV,EAA6BC,IAA7B,CAAjB;AAAA,QAAnC;AACD,MAHD;;AAKA,UAAKC,cAAL,GAAsB,UAAUrC,MAAV,EAAkB;AACtCQ,eAAQ8B,IAAR,CAAa,IAAI/B,gBAAJ,CAAqB,IAArB,EAA2BC,OAA3B,EAAoCR,MAApC,CAAb;AACD,MAFD;;AAIA,UAAKuC,YAAL,GAAoB,UAAUJ,KAAV,EAAiBK,IAAjB,EAAuB;AACzC,WAAItC,MAAM4B,OAAOvC,GAAP,CAAW4C,KAAX,CAAV;AACA,WAAI,CAACjC,GAAL,EAAU;AACRA,eAAM,EAAN;AACA4B,gBAAOW,GAAP,CAAWN,KAAX,EAAkBjC,GAAlB;AACD;AACD,WAAIA,IAAIH,MAAJ,IAAcS,QAAQT,MAA1B,EAAkC;AAChC,gBAAO,KAAP;AACD;AACDG,WAAIoC,IAAJ,CAASE,IAAT;AACA,cAAO,IAAP;AACD,MAXD;;AAaA,UAAKE,cAAL,GAAsB,UAAUP,KAAV,EAAiBK,IAAjB,EAAuB;AAC3C,WAAItC,MAAM4B,OAAOvC,GAAP,CAAW4C,KAAX,CAAV;AACA,WAAIQ,IAAIzC,IAAI0C,OAAJ,CAAYJ,IAAZ,CAAR;AACAtC,WAAI2C,MAAJ,CAAWF,CAAX,EAAc,CAAd;AACA,WAAI,CAACzC,IAAIH,MAAT,EAAiB;AACf+B,gBAAOgB,MAAP,CAAcX,KAAd;AACD;AACF,MAPD;;AASA,UAAKlC,UAAL,GAAkB,UAAU8C,QAAV,EAAoB;AACpCjB,cAAOkB,OAAP,CAAeD,QAAf;AACD,MAFD;;AAIA,UAAKvD,UAAL,GAAkB,YAAY;AAAA;;AAC5B,WAAIuB,SAAS,EAAb;AACAP,eAAQyC,KAAR,GACGC,IADH,CACQ,UAACC,CAAD,EAAIC,CAAJ;AAAA,gBAAUD,EAAE1C,KAAF,GAAU2C,EAAE3C,KAAtB;AAAA,QADR,EAEGuC,OAFH,CAEW,UAACtD,MAAD;AAAA,gBAAYqB,OAAOuB,IAAP,CAAY,IAAI7C,aAAJ,SAAwBC,MAAxB,CAAZ,CAAZ;AAAA,QAFX;AAGA,cAAOqB,MAAP;AACD,MAND;;AAQA,UAAKhC,SAAL,GAAiB,YAAY;AAC3B,WAAIgC,SAAS,EAAb;AACAP,eAAQwC,OAAR,CAAgB,UAACtD,MAAD,EAASW,KAAT;AAAA,gBAAmBU,OAAOuB,IAAP,CAAY;AAC3CjC,kBAAOA,KADoC;AAE3CV,gBAAKnB,QAAQkC,MAAR,CAAe,EAAf,EAAmBhB,OAAOC,GAA1B,CAFsC;AAG3Cc,kBAAOf,OAAOe;AAH6B,UAAZ,CAAnB;AAAA,QAAhB;AAMA,cAAOM,MAAP;AACD,MATD;;AAWA,UAAK/B,WAAL,GAAmB,UAAUqE,OAAV,EAAmB;AACpC,WAAI,CAACA,OAAD,IAAYA,QAAQtD,MAAR,IAAkBS,QAAQT,MAA1C,EAAkD;AAChD,eAAM,IAAIuD,KAAJ,CAAU,2EAAV,CAAN;AACD;AACDD,eAAQL,OAAR,CAAgB,UAAC/D,MAAD,EAASoB,KAAT;AAAA,gBAAmBG,QAAQH,KAAR,EAAerB,WAAf,CAA2BC,MAA3B,CAAnB;AAAA,QAAhB;AACAiD,iBAAU1B,QAAQ+C,GAAR,CAAY,UAAC7D,MAAD;AAAA,gBAAYA,OAAOM,MAAnB;AAAA,QAAZ,CAAV;AACA8B,cAAOkB,OAAP,CAAe,UAAC9C,GAAD;AAAA,gBAASgC,UAAUhC,GAAV,CAAT;AAAA,QAAf;AACD,MAPD;;AASA,UAAKE,UAAL,GAAkB,UAAUoD,QAAV,EAAoB5C,MAApB,EAA4B;AAC5C,WAAIP,QAAQO,MAAZ;;AAEA,WAAIA,SAAS,CAAT,KAAe,CAAnB,EAAsB;AACpBP,iBAAQO,SAASJ,QAAQI,OAAO6C,QAAf,EAAyBhD,KAAlC,GAA0CD,QAAQT,MAA1D;AACD;AACD,WAAIM,QAAQ,CAAR,IAAaA,QAAQG,QAAQT,MAAjC,EAAyC;AACvC,gBADuC,CAC/B;AACT;;AAED,WAAIU,QAAQ+C,SAAS/C,KAArB;AAAA,WAA4BiD,OAAO,IAAnC;AACArD,gBAASI,QAAQJ,KAAR,GAAgB,CAAhB,GAAoB,CAA7B;;AAEAG,eAAQwC,OAAR,CAAgB,aAAK;AACnBW,WAAElD,KAAF,IAAWkD,EAAElD,KAAF,GAAUA,KAAV,GAAkB,CAAlB,GAAsB,CAAjC;AACAkD,WAAElD,KAAF,IAAWkD,EAAElD,KAAF,IAAWJ,KAAX,GAAmB,CAAnB,GAAuB,CAAlC;AACAqD,gBAAOC,EAAElD,KAAF,KAAYJ,QAAQ,CAApB,GAAwBsD,CAAxB,GAA4BD,IAAnC;AACD,QAJD;;AAMAF,gBAAS/C,KAAT,GAAiBJ,KAAjB;AACAmD,gBAASpD,UAAT,CAAoBsD,IAApB;AACD,MArBD;;AAuBA,UAAKpD,YAAL,GAAoB,UAAUkD,QAAV,EAAoBnD,KAApB,EAA2B;AAC7C,WAAIA,QAAQ,CAAR,IAAaA,SAASG,QAAQT,MAAlC,EAA0C;AACxC;AACD;AACDS,eAAQoD,IAAR,CAAa;AAAA,gBAAKD,EAAElD,KAAF,KAAYJ,KAAjB;AAAA,QAAb,EAAqCI,KAArC,GAA6C+C,SAAS/C,KAAtD;AACA+C,gBAAS/C,KAAT,GAAiBJ,KAAjB;AACD,MAND;;AAQA,UAAKnB,eAAL,GAAuB,UAAUC,CAAV,EAAaC,CAAb,EAAgB;AACrC,WAAIM,SAASc,QAAQoD,IAAR,CAAa;AAAA,gBAAOC,IAAI3E,eAAJ,CAAoBC,CAApB,EAAuBC,CAAvB,CAAP;AAAA,QAAb,CAAb;AACA,cAAOM,SAAS,IAAID,aAAJ,CAAkB,IAAlB,EAAwBC,MAAxB,CAAT,GAA2CoE,SAAlD;AACD,MAHD;;AAKA;;AAEA,cAAS5B,SAAT,CAAmBhC,GAAnB,EAAwB;AACtB,WAAIsB,SAAStB,IAAI,CAAJ,EAAOsB,MAAP,EAAb;AACA,WAAIuC,UAAU,EAAd;;AAEA7D,WAAI8C,OAAJ,CAAY,UAACR,IAAD,EAAOnC,KAAP,EAAiB;AAC3BG,iBAAQH,KAAR,EAAeM,QAAf,CAAwB6B,IAAxB;AACAuB,iBAAQvD,QAAQH,KAAR,EAAeI,KAAvB,IAAgCP,IAAIG,KAAJ,CAAhC;AACAH,aAAIG,KAAJ,EAAWiB,MAAX;AACD,QAJD;;AAMAyC,eAAQf,OAAR,CAAgB;AAAA,gBAAQxB,OAAOC,MAAP,CAAce,IAAd,CAAR;AAAA,QAAhB;AACD;AAEF;;AAED,UAAO;AACLwB,cAAS,CAAC,oBAAD,CADJ;AAELC,eAAU,GAFL;AAGLC,WAAM,cAACC,MAAD,EAASnD,OAAT,EAAkBoD,KAAlB,EAAyBC,WAAzB,EAAyC;AAC7CA,mBAAY,CAAZ,EAAeC,cAAf,GAAgCD,YAAY,CAAZ,EAAeC,cAAf,IAAiC,IAAI1C,cAAJ,CAAmByC,YAAY,CAAZ,CAAnB,CAAjE;AACAA,mBAAY,CAAZ,EAAeC,cAAf,CAA8BjC,cAA9B,CAA6CrB,OAA7C;AACD;AANI,IAAP;AAQD,EA5OwB,CAD3B,EA+OGtC,SA/OH,CA+Oa,YA/Ob,EA+O2B,YAAY;AACnC,UAAO;AACLsF,cAAS,CAAC,qBAAD,CADJ;AAELC,eAAU,GAFL;AAGLC,WAAM,cAACC,MAAD,EAASnD,OAAT,EAAkBoD,KAAlB,EAAyBC,WAAzB,EAAyC;AAC7C,WAAIA,YAAY,CAAZ,CAAJ,EAAoB;AAAA;AAClB,eAAIC,iBAAiBD,YAAY,CAAZ,EAAeC,cAApC;AACA,eAAIA,eAAe/B,YAAf,CAA4B4B,MAA5B,EAAoCnD,OAApC,CAAJ,EAAkD;AAChDmD,oBAAOI,GAAP,CAAW,UAAX,EAAuB;AAAA,sBAAMD,eAAe5B,cAAf,CAA8ByB,MAA9B,EAAsCnD,OAAtC,CAAN;AAAA,cAAvB;AACD;AAJiB;AAKnB;AACF;AAVI,IAAP;AAYD,EA5PH,E","file":"ui-scroll-grid.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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 193204225f0698037b75","angular.module('ui.scroll.grid', [])\n .directive('uiScrollTh', ['$log', '$timeout', function (console, $timeout) {\n\n function GridAdapter(controller) {\n\n this.getLayout = () => controller.getLayout();\n\n this.applyLayout = (layout) => controller.applyLayout(layout);\n\n this.columnFromPoint = (x, y) => controller.columnFromPoint(x, y);\n\n Object.defineProperty(this, 'columns', {get: () => controller.getColumns()});\n }\n\n function ColumnAdapter(controller, column) {\n\n this.css = function (/* attr, value */) {\n var attr = arguments[0];\n var value = arguments[1];\n if (arguments.length == 1) {\n return column.header.css(attr);\n }\n if (arguments.length == 2) {\n column.header.css(attr, value);\n controller.forEachRow((row) => row[column.id].css(attr, value));\n column.css[attr] = value;\n }\n };\n\n this.moveBefore = (index) => controller.moveBefore(column, index);\n\n this.exchangeWith = (index) => controller.exchangeWith(column, index);\n\n Object.defineProperty(this, 'columnId', {get: () => column.id});\n }\n\n function ColumnController(controller, columns, header) {\n\n this.header = header;\n this.css = {};\n this.mapTo = columns.length;\n this.id = columns.length;\n\n // controller api methods\n\n this.applyLayout = function (layout) {\n this.css = angular.extend({}, layout.css);\n this.mapTo = layout.mapTo;\n applyCss(this.header, this.css);\n };\n\n this.moveBefore = function (target) {\n if (target) {\n moveBefore(header, target.header);\n controller.forEachRow((row) => moveBefore(row[this.id], row[target.id]));\n } else {\n moveLast(header);\n controller.forEachRow((row) => moveLast(row[this.id]));\n }\n };\n\n this.columnFromPoint = function (x, y) {\n if (insidePoint(header, x, y)) {\n return this;\n }\n let result = null;\n controller.forEachRow((row) =>\n result = insidePoint(row[this.id], x, y) ? this : result\n );\n return result;\n };\n\n this.applyCss = function (target) {\n applyCss(target, this.css);\n };\n\n // function definitions\n\n function insidePoint(element, x, y) {\n let offset = element.offset();\n if (x < offset.left || offset.left + element.outerWidth(true) < x)\n return false;\n if (y < offset.top || offset.top + element.outerHeight(true) < y)\n return false;\n return true;\n }\n\n function moveBefore(element, target) {\n element.detach();\n target.before(element);\n }\n\n function moveLast(element) {\n let parent = element.parent();\n element.detach();\n parent.append(element);\n }\n\n function applyCss(target, css) {\n target.removeAttr('style');\n for (let attr in css) {\n if (css.hasOwnProperty(attr)) {\n target.css(attr, css[attr]);\n }\n }\n }\n\n }\n\n function GridController(scrollViewport) {\n let columns = [];\n let rowMap = new Map();\n\n $timeout(() => {\n scrollViewport.adapter.gridAdapter = new GridAdapter(this);\n scrollViewport.adapter.transform = (scope, item) => transform(rowMap.get(scope), item);\n });\n\n this.registerColumn = function (header) {\n columns.push(new ColumnController(this, columns, header));\n };\n\n this.registerCell = function (scope, cell) {\n let row = rowMap.get(scope);\n if (!row) {\n row = [];\n rowMap.set(scope, row);\n }\n if (row.length >= columns.length) {\n return false;\n }\n row.push(cell);\n return true;\n };\n\n this.unregisterCell = function (scope, cell) {\n let row = rowMap.get(scope);\n let i = row.indexOf(cell);\n row.splice(i, 1);\n if (!row.length) {\n rowMap.delete(scope);\n }\n };\n\n this.forEachRow = function (callback) {\n rowMap.forEach(callback);\n };\n\n this.getColumns = function () {\n let result = [];\n columns.slice()\n .sort((a, b) => a.mapTo - b.mapTo)\n .forEach((column) => result.push(new ColumnAdapter(this, column)));\n return result;\n };\n\n this.getLayout = function () {\n let result = [];\n columns.forEach((column, index) => result.push({\n index: index,\n css: angular.extend({}, column.css),\n mapTo: column.mapTo\n })\n );\n return result;\n };\n\n this.applyLayout = function (layouts) {\n if (!layouts || layouts.length != columns.length) {\n throw new Error('Failed to apply layout - number of layouts should match number of columns');\n }\n layouts.forEach((layout, index) => columns[index].applyLayout(layout));\n transform(columns.map((column) => column.header));\n rowMap.forEach((row) => transform(row));\n };\n\n this.moveBefore = function (selected, target) {\n let index = target;\n\n if (target % 1 !== 0) {\n index = target ? columns[target.columnId].mapTo : columns.length;\n }\n if (index < 0 || index > columns.length) {\n return; // throw an error?\n }\n\n let mapTo = selected.mapTo, next = null;\n index -= mapTo < index ? 1 : 0;\n\n columns.forEach(c => {\n c.mapTo -= c.mapTo > mapTo ? 1 : 0;\n c.mapTo += c.mapTo >= index ? 1 : 0;\n next = c.mapTo === index + 1 ? c : next;\n });\n\n selected.mapTo = index;\n selected.moveBefore(next);\n };\n\n this.exchangeWith = function (selected, index) {\n if (index < 0 || index >= columns.length) {\n return;\n }\n columns.find(c => c.mapTo === index).mapTo = selected.mapTo;\n selected.mapTo = index;\n };\n\n this.columnFromPoint = function (x, y) {\n let column = columns.find(col => col.columnFromPoint(x, y));\n return column ? new ColumnAdapter(this, column) : undefined;\n };\n\n // function definitions\n\n function transform(row) {\n let parent = row[0].parent();\n let visible = [];\n\n row.forEach((cell, index) => {\n columns[index].applyCss(cell);\n visible[columns[index].mapTo] = row[index];\n row[index].detach();\n });\n\n visible.forEach(cell => parent.append(cell));\n }\n\n }\n\n return {\n require: ['^^uiScrollViewport'],\n restrict: 'A',\n link: ($scope, element, $attr, controllers) => {\n controllers[0].gridController = controllers[0].gridController || new GridController(controllers[0]);\n controllers[0].gridController.registerColumn(element);\n }\n };\n }])\n\n .directive('uiScrollTd', function () {\n return {\n require: ['?^^uiScrollViewport'],\n restrict: 'A',\n link: ($scope, element, $attr, controllers) => {\n if (controllers[0]) {\n let gridController = controllers[0].gridController;\n if (gridController.registerCell($scope, element)) {\n $scope.$on('$destroy', () => gridController.unregisterCell($scope, element));\n }\n }\n }\n };\n });\n\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll-grid.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 0a8b101f02aaa0804c9e?4797","webpack:///./src/ui-scroll-grid.js"],"names":["angular","module","directive","console","$timeout","GridAdapter","controller","getLayout","applyLayout","layout","columnFromPoint","x","y","Object","defineProperty","get","getColumns","ColumnAdapter","column","css","attr","arguments","value","length","header","forEachRow","row","id","moveBefore","index","exchangeWith","ColumnController","columns","mapTo","extend","applyCss","target","moveLast","insidePoint","result","element","offset","left","outerWidth","top","outerHeight","detach","before","parent","append","removeAttr","hasOwnProperty","GridController","scrollViewport","rowMap","Map","adapter","publicContext","gridAdapter","transform","scope","item","registerColumn","push","registerCell","cell","set","unregisterCell","i","indexOf","splice","delete","callback","forEach","slice","sort","a","b","layouts","Error","map","selected","columnId","next","c","find","col","undefined","visible","require","restrict","link","$scope","$attr","controllers","gridController","$on"],"mappings":"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","file":"ui-scroll-grid.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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0a8b101f02aaa0804c9e","angular.module('ui.scroll.grid', [])\n .directive('uiScrollTh', ['$log', '$timeout', function (console, $timeout) {\n\n function GridAdapter(controller) {\n\n this.getLayout = () => controller.getLayout();\n\n this.applyLayout = (layout) => controller.applyLayout(layout);\n\n this.columnFromPoint = (x, y) => controller.columnFromPoint(x, y);\n\n Object.defineProperty(this, 'columns', {get: () => controller.getColumns()});\n }\n\n function ColumnAdapter(controller, column) {\n\n this.css = function (/* attr, value */) {\n var attr = arguments[0];\n var value = arguments[1];\n if (arguments.length == 1) {\n return column.header.css(attr);\n }\n if (arguments.length == 2) {\n column.header.css(attr, value);\n controller.forEachRow((row) => row[column.id].css(attr, value));\n column.css[attr] = value;\n }\n };\n\n this.moveBefore = (index) => controller.moveBefore(column, index);\n\n this.exchangeWith = (index) => controller.exchangeWith(column, index);\n\n Object.defineProperty(this, 'columnId', {get: () => column.id});\n }\n\n function ColumnController(controller, columns, header) {\n\n this.header = header;\n this.css = {};\n this.mapTo = columns.length;\n this.id = columns.length;\n\n // controller api methods\n\n this.applyLayout = function (layout) {\n this.css = angular.extend({}, layout.css);\n this.mapTo = layout.mapTo;\n applyCss(this.header, this.css);\n };\n\n this.moveBefore = function (target) {\n if (target) {\n moveBefore(header, target.header);\n controller.forEachRow((row) => moveBefore(row[this.id], row[target.id]));\n } else {\n moveLast(header);\n controller.forEachRow((row) => moveLast(row[this.id]));\n }\n };\n\n this.columnFromPoint = function (x, y) {\n if (insidePoint(header, x, y)) {\n return this;\n }\n let result = null;\n controller.forEachRow((row) =>\n result = insidePoint(row[this.id], x, y) ? this : result\n );\n return result;\n };\n\n this.applyCss = function (target) {\n applyCss(target, this.css);\n };\n\n // function definitions\n\n function insidePoint(element, x, y) {\n let offset = element.offset();\n if (x < offset.left || offset.left + element.outerWidth(true) < x)\n return false;\n if (y < offset.top || offset.top + element.outerHeight(true) < y)\n return false;\n return true;\n }\n\n function moveBefore(element, target) {\n element.detach();\n target.before(element);\n }\n\n function moveLast(element) {\n let parent = element.parent();\n element.detach();\n parent.append(element);\n }\n\n function applyCss(target, css) {\n target.removeAttr('style');\n for (let attr in css) {\n if (css.hasOwnProperty(attr)) {\n target.css(attr, css[attr]);\n }\n }\n }\n\n }\n\n function GridController(scrollViewport) {\n let columns = [];\n let rowMap = new Map();\n\n $timeout(() => {\n scrollViewport.adapter.publicContext.gridAdapter = new GridAdapter(this);\n scrollViewport.adapter.transform = (scope, item) => transform(rowMap.get(scope), item);\n });\n\n this.registerColumn = function (header) {\n columns.push(new ColumnController(this, columns, header));\n };\n\n this.registerCell = function (scope, cell) {\n let row = rowMap.get(scope);\n if (!row) {\n row = [];\n rowMap.set(scope, row);\n }\n if (row.length >= columns.length) {\n return false;\n }\n row.push(cell);\n return true;\n };\n\n this.unregisterCell = function (scope, cell) {\n let row = rowMap.get(scope);\n let i = row.indexOf(cell);\n row.splice(i, 1);\n if (!row.length) {\n rowMap.delete(scope);\n }\n };\n\n this.forEachRow = function (callback) {\n rowMap.forEach(callback);\n };\n\n this.getColumns = function () {\n let result = [];\n columns.slice()\n .sort((a, b) => a.mapTo - b.mapTo)\n .forEach((column) => result.push(new ColumnAdapter(this, column)));\n return result;\n };\n\n this.getLayout = function () {\n let result = [];\n columns.forEach((column, index) => result.push({\n index: index,\n css: angular.extend({}, column.css),\n mapTo: column.mapTo\n })\n );\n return result;\n };\n\n this.applyLayout = function (layouts) {\n if (!layouts || layouts.length != columns.length) {\n throw new Error('Failed to apply layout - number of layouts should match number of columns');\n }\n layouts.forEach((layout, index) => columns[index].applyLayout(layout));\n transform(columns.map((column) => column.header));\n rowMap.forEach((row) => transform(row));\n };\n\n this.moveBefore = function (selected, target) {\n let index = target;\n\n if (target % 1 !== 0) {\n index = target ? columns[target.columnId].mapTo : columns.length;\n }\n if (index < 0 || index > columns.length) {\n return; // throw an error?\n }\n\n let mapTo = selected.mapTo, next = null;\n index -= mapTo < index ? 1 : 0;\n\n columns.forEach(c => {\n c.mapTo -= c.mapTo > mapTo ? 1 : 0;\n c.mapTo += c.mapTo >= index ? 1 : 0;\n next = c.mapTo === index + 1 ? c : next;\n });\n\n selected.mapTo = index;\n selected.moveBefore(next);\n };\n\n this.exchangeWith = function (selected, index) {\n if (index < 0 || index >= columns.length) {\n return;\n }\n columns.find(c => c.mapTo === index).mapTo = selected.mapTo;\n selected.mapTo = index;\n };\n\n this.columnFromPoint = function (x, y) {\n let column = columns.find(col => col.columnFromPoint(x, y));\n return column ? new ColumnAdapter(this, column) : undefined;\n };\n\n // function definitions\n\n function transform(row) {\n let parent = row[0].parent();\n let visible = [];\n\n row.forEach((cell, index) => {\n columns[index].applyCss(cell);\n visible[columns[index].mapTo] = row[index];\n row[index].detach();\n });\n\n visible.forEach(cell => parent.append(cell));\n }\n\n }\n\n return {\n require: ['^^uiScrollViewport'],\n restrict: 'A',\n link: ($scope, element, $attr, controllers) => {\n controllers[0].gridController = controllers[0].gridController || new GridController(controllers[0]);\n controllers[0].gridController.registerColumn(element);\n }\n };\n }])\n\n .directive('uiScrollTd', function () {\n return {\n require: ['?^^uiScrollViewport'],\n restrict: 'A',\n link: ($scope, element, $attr, controllers) => {\n if (controllers[0]) {\n let gridController = controllers[0].gridController;\n if (gridController.registerCell($scope, element)) {\n $scope.$on('$destroy', () => gridController.unregisterCell($scope, element));\n }\n }\n }\n };\n });\n\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll-grid.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/ui-scroll-grid.min.js b/dist/ui-scroll-grid.min.js index fb3cdc3b..96a0d3c4 100644 --- a/dist/ui-scroll-grid.min.js +++ b/dist/ui-scroll-grid.min.js @@ -1,8 +1,8 @@ /*! * angular-ui-scroll (compressed) * https://github.com/angular-ui/ui-scroll - * Version: 1.6.0 -- 2017-02-04T09:24:38.215Z + * Version: 1.6.1 -- 2017-03-03T05:28:34.249Z * License: MIT */ -!function(t){function n(o){if(r[o])return r[o].exports;var e=r[o]={exports:{},id:o,loaded:!1};return t[o].call(e.exports,e,e.exports,n),e.loaded=!0,e.exports}var r={};return n.m=t,n.c=r,n.p="",n(0)}([function(t,n){"use strict";angular.module("ui.scroll.grid",[]).directive("uiScrollTh",["$log","$timeout",function(t,n){function r(t){this.getLayout=function(){return t.getLayout()},this.applyLayout=function(n){return t.applyLayout(n)},this.columnFromPoint=function(n,r){return t.columnFromPoint(n,r)},Object.defineProperty(this,"columns",{get:function(){return t.getColumns()}})}function o(t,n){this.css=function(){var r=arguments[0],o=arguments[1];return 1==arguments.length?n.header.css(r):void(2==arguments.length&&(n.header.css(r,o),t.forEachRow(function(t){return t[n.id].css(r,o)}),n.css[r]=o))},this.moveBefore=function(r){return t.moveBefore(n,r)},this.exchangeWith=function(r){return t.exchangeWith(n,r)},Object.defineProperty(this,"columnId",{get:function(){return n.id}})}function e(t,n,r){function o(t,n,r){var o=t.offset();return!(n=c.length)&&(r.push(n),!0)},this.unregisterCell=function(t,n){var r=a.get(t),o=r.indexOf(n);r.splice(o,1),r.length||a.delete(t)},this.forEachRow=function(t){a.forEach(t)},this.getColumns=function(){var t=this,n=[];return c.slice().sort(function(t,n){return t.mapTo-n.mapTo}).forEach(function(r){return n.push(new o(t,r))}),n},this.getLayout=function(){var t=[];return c.forEach(function(n,r){return t.push({index:r,css:angular.extend({},n.css),mapTo:n.mapTo})}),t},this.applyLayout=function(t){if(!t||t.length!=c.length)throw new Error("Failed to apply layout - number of layouts should match number of columns");t.forEach(function(t,n){return c[n].applyLayout(t)}),i(c.map(function(t){return t.header})),a.forEach(function(t){return i(t)})},this.moveBefore=function(t,n){var r=n;if(n%1!==0&&(r=n?c[n.columnId].mapTo:c.length),!(r<0||r>c.length)){var o=t.mapTo,e=null;r-=oo?1:0,t.mapTo+=t.mapTo>=r?1:0,e=t.mapTo===r+1?t:e}),t.mapTo=r,t.moveBefore(e)}},this.exchangeWith=function(t,n){n<0||n>=c.length||(c.find(function(t){return t.mapTo===n}).mapTo=t.mapTo,t.mapTo=n)},this.columnFromPoint=function(t,n){var r=c.find(function(r){return r.columnFromPoint(t,n)});return r?new o(this,r):void 0}}return{require:["^^uiScrollViewport"],restrict:"A",link:function(t,n,r,o){o[0].gridController=o[0].gridController||new i(o[0]),o[0].gridController.registerColumn(n)}}}]).directive("uiScrollTd",function(){return{require:["?^^uiScrollViewport"],restrict:"A",link:function(t,n,r,o){o[0]&&!function(){var r=o[0].gridController;r.registerCell(t,n)&&t.$on("$destroy",function(){return r.unregisterCell(t,n)})}()}}})}]); +!function(t){function n(o){if(r[o])return r[o].exports;var e=r[o]={exports:{},id:o,loaded:!1};return t[o].call(e.exports,e,e.exports,n),e.loaded=!0,e.exports}var r={};return n.m=t,n.c=r,n.p="",n(0)}([function(t,n){"use strict";angular.module("ui.scroll.grid",[]).directive("uiScrollTh",["$log","$timeout",function(t,n){function r(t){this.getLayout=function(){return t.getLayout()},this.applyLayout=function(n){return t.applyLayout(n)},this.columnFromPoint=function(n,r){return t.columnFromPoint(n,r)},Object.defineProperty(this,"columns",{get:function(){return t.getColumns()}})}function o(t,n){this.css=function(){var r=arguments[0],o=arguments[1];return 1==arguments.length?n.header.css(r):void(2==arguments.length&&(n.header.css(r,o),t.forEachRow(function(t){return t[n.id].css(r,o)}),n.css[r]=o))},this.moveBefore=function(r){return t.moveBefore(n,r)},this.exchangeWith=function(r){return t.exchangeWith(n,r)},Object.defineProperty(this,"columnId",{get:function(){return n.id}})}function e(t,n,r){function o(t,n,r){var o=t.offset();return!(n=c.length)&&(r.push(n),!0)},this.unregisterCell=function(t,n){var r=a.get(t),o=r.indexOf(n);r.splice(o,1),r.length||a.delete(t)},this.forEachRow=function(t){a.forEach(t)},this.getColumns=function(){var t=this,n=[];return c.slice().sort(function(t,n){return t.mapTo-n.mapTo}).forEach(function(r){return n.push(new o(t,r))}),n},this.getLayout=function(){var t=[];return c.forEach(function(n,r){return t.push({index:r,css:angular.extend({},n.css),mapTo:n.mapTo})}),t},this.applyLayout=function(t){if(!t||t.length!=c.length)throw new Error("Failed to apply layout - number of layouts should match number of columns");t.forEach(function(t,n){return c[n].applyLayout(t)}),i(c.map(function(t){return t.header})),a.forEach(function(t){return i(t)})},this.moveBefore=function(t,n){var r=n;if(n%1!==0&&(r=n?c[n.columnId].mapTo:c.length),!(r<0||r>c.length)){var o=t.mapTo,e=null;r-=oo?1:0,t.mapTo+=t.mapTo>=r?1:0,e=t.mapTo===r+1?t:e}),t.mapTo=r,t.moveBefore(e)}},this.exchangeWith=function(t,n){n<0||n>=c.length||(c.find(function(t){return t.mapTo===n}).mapTo=t.mapTo,t.mapTo=n)},this.columnFromPoint=function(t,n){var r=c.find(function(r){return r.columnFromPoint(t,n)});return r?new o(this,r):void 0}}return{require:["^^uiScrollViewport"],restrict:"A",link:function(t,n,r,o){o[0].gridController=o[0].gridController||new i(o[0]),o[0].gridController.registerColumn(n)}}}]).directive("uiScrollTd",function(){return{require:["?^^uiScrollViewport"],restrict:"A",link:function(t,n,r,o){o[0]&&!function(){var r=o[0].gridController;r.registerCell(t,n)&&t.$on("$destroy",function(){return r.unregisterCell(t,n)})}()}}})}]); //# sourceMappingURL=ui-scroll-grid.min.js.map \ No newline at end of file diff --git a/dist/ui-scroll-grid.min.js.map b/dist/ui-scroll-grid.min.js.map index c3d24d04..2a8ed950 100644 --- a/dist/ui-scroll-grid.min.js.map +++ b/dist/ui-scroll-grid.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///ui-scroll-grid.min.js","webpack:///webpack/bootstrap 4a3e30973317185735be?d5e9","webpack:///./src/ui-scroll-grid.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","angular","directive","console","$timeout","GridAdapter","controller","this","getLayout","applyLayout","layout","columnFromPoint","x","y","Object","defineProperty","get","getColumns","ColumnAdapter","column","css","attr","arguments","value","length","header","forEachRow","row","moveBefore","index","exchangeWith","ColumnController","columns","insidePoint","element","offset","left","outerWidth","top","outerHeight","target","detach","before","moveLast","parent","append","applyCss","removeAttr","hasOwnProperty","mapTo","extend","_this","_this2","result","GridController","scrollViewport","transform","visible","forEach","cell","_this3","rowMap","Map","adapter","gridAdapter","scope","item","registerColumn","push","registerCell","set","unregisterCell","i","indexOf","splice","delete","callback","_this4","slice","sort","a","b","layouts","Error","map","selected","columnId","next","find","col","undefined","require","restrict","link","$scope","$attr","controllers","gridController","$on"],"mappings":"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","file":"ui-scroll-grid.min.js","sourcesContent":["/*!\r\n * angular-ui-scroll (uncompressed)\r\n * https://github.com/angular-ui/ui-scroll\r\n * Version: 1.6.0 -- 2017-02-04T09:24:37.966Z\r\n * License: MIT\r\n */\n/******/ (function(modules) { // webpackBootstrap\n/******/ \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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tangular.module('ui.scroll.grid', []).directive('uiScrollTh', ['$log', '$timeout', function (console, $timeout) {\n\t\n\t function GridAdapter(controller) {\n\t\n\t this.getLayout = function () {\n\t return controller.getLayout();\n\t };\n\t\n\t this.applyLayout = function (layout) {\n\t return controller.applyLayout(layout);\n\t };\n\t\n\t this.columnFromPoint = function (x, y) {\n\t return controller.columnFromPoint(x, y);\n\t };\n\t\n\t Object.defineProperty(this, 'columns', { get: function get() {\n\t return controller.getColumns();\n\t } });\n\t }\n\t\n\t function ColumnAdapter(controller, column) {\n\t\n\t this.css = function () /* attr, value */{\n\t var attr = arguments[0];\n\t var value = arguments[1];\n\t if (arguments.length == 1) {\n\t return column.header.css(attr);\n\t }\n\t if (arguments.length == 2) {\n\t column.header.css(attr, value);\n\t controller.forEachRow(function (row) {\n\t return row[column.id].css(attr, value);\n\t });\n\t column.css[attr] = value;\n\t }\n\t };\n\t\n\t this.moveBefore = function (index) {\n\t return controller.moveBefore(column, index);\n\t };\n\t\n\t this.exchangeWith = function (index) {\n\t return controller.exchangeWith(column, index);\n\t };\n\t\n\t Object.defineProperty(this, 'columnId', { get: function get() {\n\t return column.id;\n\t } });\n\t }\n\t\n\t function ColumnController(controller, columns, header) {\n\t\n\t this.header = header;\n\t this.css = {};\n\t this.mapTo = columns.length;\n\t this.id = columns.length;\n\t\n\t // controller api methods\n\t\n\t this.applyLayout = function (layout) {\n\t this.css = angular.extend({}, layout.css);\n\t this.mapTo = layout.mapTo;\n\t applyCss(this.header, this.css);\n\t };\n\t\n\t this.moveBefore = function (target) {\n\t var _this = this;\n\t\n\t if (target) {\n\t moveBefore(header, target.header);\n\t controller.forEachRow(function (row) {\n\t return moveBefore(row[_this.id], row[target.id]);\n\t });\n\t } else {\n\t moveLast(header);\n\t controller.forEachRow(function (row) {\n\t return moveLast(row[_this.id]);\n\t });\n\t }\n\t };\n\t\n\t this.columnFromPoint = function (x, y) {\n\t var _this2 = this;\n\t\n\t if (insidePoint(header, x, y)) {\n\t return this;\n\t }\n\t var result = null;\n\t controller.forEachRow(function (row) {\n\t return result = insidePoint(row[_this2.id], x, y) ? _this2 : result;\n\t });\n\t return result;\n\t };\n\t\n\t this.applyCss = function (target) {\n\t applyCss(target, this.css);\n\t };\n\t\n\t // function definitions\n\t\n\t function insidePoint(element, x, y) {\n\t var offset = element.offset();\n\t if (x < offset.left || offset.left + element.outerWidth(true) < x) return false;\n\t if (y < offset.top || offset.top + element.outerHeight(true) < y) return false;\n\t return true;\n\t }\n\t\n\t function moveBefore(element, target) {\n\t element.detach();\n\t target.before(element);\n\t }\n\t\n\t function moveLast(element) {\n\t var parent = element.parent();\n\t element.detach();\n\t parent.append(element);\n\t }\n\t\n\t function applyCss(target, css) {\n\t target.removeAttr('style');\n\t for (var attr in css) {\n\t if (css.hasOwnProperty(attr)) {\n\t target.css(attr, css[attr]);\n\t }\n\t }\n\t }\n\t }\n\t\n\t function GridController(scrollViewport) {\n\t var _this3 = this;\n\t\n\t var columns = [];\n\t var rowMap = new Map();\n\t\n\t $timeout(function () {\n\t scrollViewport.adapter.gridAdapter = new GridAdapter(_this3);\n\t scrollViewport.adapter.transform = function (scope, item) {\n\t return transform(rowMap.get(scope), item);\n\t };\n\t });\n\t\n\t this.registerColumn = function (header) {\n\t columns.push(new ColumnController(this, columns, header));\n\t };\n\t\n\t this.registerCell = function (scope, cell) {\n\t var row = rowMap.get(scope);\n\t if (!row) {\n\t row = [];\n\t rowMap.set(scope, row);\n\t }\n\t if (row.length >= columns.length) {\n\t return false;\n\t }\n\t row.push(cell);\n\t return true;\n\t };\n\t\n\t this.unregisterCell = function (scope, cell) {\n\t var row = rowMap.get(scope);\n\t var i = row.indexOf(cell);\n\t row.splice(i, 1);\n\t if (!row.length) {\n\t rowMap.delete(scope);\n\t }\n\t };\n\t\n\t this.forEachRow = function (callback) {\n\t rowMap.forEach(callback);\n\t };\n\t\n\t this.getColumns = function () {\n\t var _this4 = this;\n\t\n\t var result = [];\n\t columns.slice().sort(function (a, b) {\n\t return a.mapTo - b.mapTo;\n\t }).forEach(function (column) {\n\t return result.push(new ColumnAdapter(_this4, column));\n\t });\n\t return result;\n\t };\n\t\n\t this.getLayout = function () {\n\t var result = [];\n\t columns.forEach(function (column, index) {\n\t return result.push({\n\t index: index,\n\t css: angular.extend({}, column.css),\n\t mapTo: column.mapTo\n\t });\n\t });\n\t return result;\n\t };\n\t\n\t this.applyLayout = function (layouts) {\n\t if (!layouts || layouts.length != columns.length) {\n\t throw new Error('Failed to apply layout - number of layouts should match number of columns');\n\t }\n\t layouts.forEach(function (layout, index) {\n\t return columns[index].applyLayout(layout);\n\t });\n\t transform(columns.map(function (column) {\n\t return column.header;\n\t }));\n\t rowMap.forEach(function (row) {\n\t return transform(row);\n\t });\n\t };\n\t\n\t this.moveBefore = function (selected, target) {\n\t var index = target;\n\t\n\t if (target % 1 !== 0) {\n\t index = target ? columns[target.columnId].mapTo : columns.length;\n\t }\n\t if (index < 0 || index > columns.length) {\n\t return; // throw an error?\n\t }\n\t\n\t var mapTo = selected.mapTo,\n\t next = null;\n\t index -= mapTo < index ? 1 : 0;\n\t\n\t columns.forEach(function (c) {\n\t c.mapTo -= c.mapTo > mapTo ? 1 : 0;\n\t c.mapTo += c.mapTo >= index ? 1 : 0;\n\t next = c.mapTo === index + 1 ? c : next;\n\t });\n\t\n\t selected.mapTo = index;\n\t selected.moveBefore(next);\n\t };\n\t\n\t this.exchangeWith = function (selected, index) {\n\t if (index < 0 || index >= columns.length) {\n\t return;\n\t }\n\t columns.find(function (c) {\n\t return c.mapTo === index;\n\t }).mapTo = selected.mapTo;\n\t selected.mapTo = index;\n\t };\n\t\n\t this.columnFromPoint = function (x, y) {\n\t var column = columns.find(function (col) {\n\t return col.columnFromPoint(x, y);\n\t });\n\t return column ? new ColumnAdapter(this, column) : undefined;\n\t };\n\t\n\t // function definitions\n\t\n\t function transform(row) {\n\t var parent = row[0].parent();\n\t var visible = [];\n\t\n\t row.forEach(function (cell, index) {\n\t columns[index].applyCss(cell);\n\t visible[columns[index].mapTo] = row[index];\n\t row[index].detach();\n\t });\n\t\n\t visible.forEach(function (cell) {\n\t return parent.append(cell);\n\t });\n\t }\n\t }\n\t\n\t return {\n\t require: ['^^uiScrollViewport'],\n\t restrict: 'A',\n\t link: function link($scope, element, $attr, controllers) {\n\t controllers[0].gridController = controllers[0].gridController || new GridController(controllers[0]);\n\t controllers[0].gridController.registerColumn(element);\n\t }\n\t };\n\t}]).directive('uiScrollTd', function () {\n\t return {\n\t require: ['?^^uiScrollViewport'],\n\t restrict: 'A',\n\t link: function link($scope, element, $attr, controllers) {\n\t if (controllers[0]) {\n\t (function () {\n\t var gridController = controllers[0].gridController;\n\t if (gridController.registerCell($scope, element)) {\n\t $scope.$on('$destroy', function () {\n\t return gridController.unregisterCell($scope, element);\n\t });\n\t }\n\t })();\n\t }\n\t }\n\t };\n\t});\n\n/***/ }\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// ui-scroll-grid.min.js"," \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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4a3e30973317185735be","angular.module('ui.scroll.grid', [])\n .directive('uiScrollTh', ['$log', '$timeout', function (console, $timeout) {\n\n function GridAdapter(controller) {\n\n this.getLayout = () => controller.getLayout();\n\n this.applyLayout = (layout) => controller.applyLayout(layout);\n\n this.columnFromPoint = (x, y) => controller.columnFromPoint(x, y);\n\n Object.defineProperty(this, 'columns', {get: () => controller.getColumns()});\n }\n\n function ColumnAdapter(controller, column) {\n\n this.css = function (/* attr, value */) {\n var attr = arguments[0];\n var value = arguments[1];\n if (arguments.length == 1) {\n return column.header.css(attr);\n }\n if (arguments.length == 2) {\n column.header.css(attr, value);\n controller.forEachRow((row) => row[column.id].css(attr, value));\n column.css[attr] = value;\n }\n };\n\n this.moveBefore = (index) => controller.moveBefore(column, index);\n\n this.exchangeWith = (index) => controller.exchangeWith(column, index);\n\n Object.defineProperty(this, 'columnId', {get: () => column.id});\n }\n\n function ColumnController(controller, columns, header) {\n\n this.header = header;\n this.css = {};\n this.mapTo = columns.length;\n this.id = columns.length;\n\n // controller api methods\n\n this.applyLayout = function (layout) {\n this.css = angular.extend({}, layout.css);\n this.mapTo = layout.mapTo;\n applyCss(this.header, this.css);\n };\n\n this.moveBefore = function (target) {\n if (target) {\n moveBefore(header, target.header);\n controller.forEachRow((row) => moveBefore(row[this.id], row[target.id]));\n } else {\n moveLast(header);\n controller.forEachRow((row) => moveLast(row[this.id]));\n }\n };\n\n this.columnFromPoint = function (x, y) {\n if (insidePoint(header, x, y)) {\n return this;\n }\n let result = null;\n controller.forEachRow((row) =>\n result = insidePoint(row[this.id], x, y) ? this : result\n );\n return result;\n };\n\n this.applyCss = function (target) {\n applyCss(target, this.css);\n };\n\n // function definitions\n\n function insidePoint(element, x, y) {\n let offset = element.offset();\n if (x < offset.left || offset.left + element.outerWidth(true) < x)\n return false;\n if (y < offset.top || offset.top + element.outerHeight(true) < y)\n return false;\n return true;\n }\n\n function moveBefore(element, target) {\n element.detach();\n target.before(element);\n }\n\n function moveLast(element) {\n let parent = element.parent();\n element.detach();\n parent.append(element);\n }\n\n function applyCss(target, css) {\n target.removeAttr('style');\n for (let attr in css) {\n if (css.hasOwnProperty(attr)) {\n target.css(attr, css[attr]);\n }\n }\n }\n\n }\n\n function GridController(scrollViewport) {\n let columns = [];\n let rowMap = new Map();\n\n $timeout(() => {\n scrollViewport.adapter.gridAdapter = new GridAdapter(this);\n scrollViewport.adapter.transform = (scope, item) => transform(rowMap.get(scope), item);\n });\n\n this.registerColumn = function (header) {\n columns.push(new ColumnController(this, columns, header));\n };\n\n this.registerCell = function (scope, cell) {\n let row = rowMap.get(scope);\n if (!row) {\n row = [];\n rowMap.set(scope, row);\n }\n if (row.length >= columns.length) {\n return false;\n }\n row.push(cell);\n return true;\n };\n\n this.unregisterCell = function (scope, cell) {\n let row = rowMap.get(scope);\n let i = row.indexOf(cell);\n row.splice(i, 1);\n if (!row.length) {\n rowMap.delete(scope);\n }\n };\n\n this.forEachRow = function (callback) {\n rowMap.forEach(callback);\n };\n\n this.getColumns = function () {\n let result = [];\n columns.slice()\n .sort((a, b) => a.mapTo - b.mapTo)\n .forEach((column) => result.push(new ColumnAdapter(this, column)));\n return result;\n };\n\n this.getLayout = function () {\n let result = [];\n columns.forEach((column, index) => result.push({\n index: index,\n css: angular.extend({}, column.css),\n mapTo: column.mapTo\n })\n );\n return result;\n };\n\n this.applyLayout = function (layouts) {\n if (!layouts || layouts.length != columns.length) {\n throw new Error('Failed to apply layout - number of layouts should match number of columns');\n }\n layouts.forEach((layout, index) => columns[index].applyLayout(layout));\n transform(columns.map((column) => column.header));\n rowMap.forEach((row) => transform(row));\n };\n\n this.moveBefore = function (selected, target) {\n let index = target;\n\n if (target % 1 !== 0) {\n index = target ? columns[target.columnId].mapTo : columns.length;\n }\n if (index < 0 || index > columns.length) {\n return; // throw an error?\n }\n\n let mapTo = selected.mapTo, next = null;\n index -= mapTo < index ? 1 : 0;\n\n columns.forEach(c => {\n c.mapTo -= c.mapTo > mapTo ? 1 : 0;\n c.mapTo += c.mapTo >= index ? 1 : 0;\n next = c.mapTo === index + 1 ? c : next;\n });\n\n selected.mapTo = index;\n selected.moveBefore(next);\n };\n\n this.exchangeWith = function (selected, index) {\n if (index < 0 || index >= columns.length) {\n return;\n }\n columns.find(c => c.mapTo === index).mapTo = selected.mapTo;\n selected.mapTo = index;\n };\n\n this.columnFromPoint = function (x, y) {\n let column = columns.find(col => col.columnFromPoint(x, y));\n return column ? new ColumnAdapter(this, column) : undefined;\n };\n\n // function definitions\n\n function transform(row) {\n let parent = row[0].parent();\n let visible = [];\n\n row.forEach((cell, index) => {\n columns[index].applyCss(cell);\n visible[columns[index].mapTo] = row[index];\n row[index].detach();\n });\n\n visible.forEach(cell => parent.append(cell));\n }\n\n }\n\n return {\n require: ['^^uiScrollViewport'],\n restrict: 'A',\n link: ($scope, element, $attr, controllers) => {\n controllers[0].gridController = controllers[0].gridController || new GridController(controllers[0]);\n controllers[0].gridController.registerColumn(element);\n }\n };\n }])\n\n .directive('uiScrollTd', function () {\n return {\n require: ['?^^uiScrollViewport'],\n restrict: 'A',\n link: ($scope, element, $attr, controllers) => {\n if (controllers[0]) {\n let gridController = controllers[0].gridController;\n if (gridController.registerCell($scope, element)) {\n $scope.$on('$destroy', () => gridController.unregisterCell($scope, element));\n }\n }\n }\n };\n });\n\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll-grid.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///ui-scroll-grid.min.js","webpack:///webpack/bootstrap 6fb5c0179465828c8111?4814","webpack:///./src/ui-scroll-grid.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","angular","directive","console","$timeout","GridAdapter","controller","this","getLayout","applyLayout","layout","columnFromPoint","x","y","Object","defineProperty","get","getColumns","ColumnAdapter","column","css","attr","arguments","value","length","header","forEachRow","row","moveBefore","index","exchangeWith","ColumnController","columns","insidePoint","element","offset","left","outerWidth","top","outerHeight","target","detach","before","moveLast","parent","append","applyCss","removeAttr","hasOwnProperty","mapTo","extend","_this","_this2","result","GridController","scrollViewport","transform","visible","forEach","cell","_this3","rowMap","Map","adapter","publicContext","gridAdapter","scope","item","registerColumn","push","registerCell","set","unregisterCell","i","indexOf","splice","delete","callback","_this4","slice","sort","a","b","layouts","Error","map","selected","columnId","next","find","col","undefined","require","restrict","link","$scope","$attr","controllers","gridController","$on"],"mappings":"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","file":"ui-scroll-grid.min.js","sourcesContent":["/*!\r\n * angular-ui-scroll (uncompressed)\r\n * https://github.com/angular-ui/ui-scroll\r\n * Version: 1.6.1 -- 2017-03-03T05:28:34.208Z\r\n * License: MIT\r\n */\n/******/ (function(modules) { // webpackBootstrap\n/******/ \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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tangular.module('ui.scroll.grid', []).directive('uiScrollTh', ['$log', '$timeout', function (console, $timeout) {\n\t\n\t function GridAdapter(controller) {\n\t\n\t this.getLayout = function () {\n\t return controller.getLayout();\n\t };\n\t\n\t this.applyLayout = function (layout) {\n\t return controller.applyLayout(layout);\n\t };\n\t\n\t this.columnFromPoint = function (x, y) {\n\t return controller.columnFromPoint(x, y);\n\t };\n\t\n\t Object.defineProperty(this, 'columns', { get: function get() {\n\t return controller.getColumns();\n\t } });\n\t }\n\t\n\t function ColumnAdapter(controller, column) {\n\t\n\t this.css = function () /* attr, value */{\n\t var attr = arguments[0];\n\t var value = arguments[1];\n\t if (arguments.length == 1) {\n\t return column.header.css(attr);\n\t }\n\t if (arguments.length == 2) {\n\t column.header.css(attr, value);\n\t controller.forEachRow(function (row) {\n\t return row[column.id].css(attr, value);\n\t });\n\t column.css[attr] = value;\n\t }\n\t };\n\t\n\t this.moveBefore = function (index) {\n\t return controller.moveBefore(column, index);\n\t };\n\t\n\t this.exchangeWith = function (index) {\n\t return controller.exchangeWith(column, index);\n\t };\n\t\n\t Object.defineProperty(this, 'columnId', { get: function get() {\n\t return column.id;\n\t } });\n\t }\n\t\n\t function ColumnController(controller, columns, header) {\n\t\n\t this.header = header;\n\t this.css = {};\n\t this.mapTo = columns.length;\n\t this.id = columns.length;\n\t\n\t // controller api methods\n\t\n\t this.applyLayout = function (layout) {\n\t this.css = angular.extend({}, layout.css);\n\t this.mapTo = layout.mapTo;\n\t applyCss(this.header, this.css);\n\t };\n\t\n\t this.moveBefore = function (target) {\n\t var _this = this;\n\t\n\t if (target) {\n\t moveBefore(header, target.header);\n\t controller.forEachRow(function (row) {\n\t return moveBefore(row[_this.id], row[target.id]);\n\t });\n\t } else {\n\t moveLast(header);\n\t controller.forEachRow(function (row) {\n\t return moveLast(row[_this.id]);\n\t });\n\t }\n\t };\n\t\n\t this.columnFromPoint = function (x, y) {\n\t var _this2 = this;\n\t\n\t if (insidePoint(header, x, y)) {\n\t return this;\n\t }\n\t var result = null;\n\t controller.forEachRow(function (row) {\n\t return result = insidePoint(row[_this2.id], x, y) ? _this2 : result;\n\t });\n\t return result;\n\t };\n\t\n\t this.applyCss = function (target) {\n\t applyCss(target, this.css);\n\t };\n\t\n\t // function definitions\n\t\n\t function insidePoint(element, x, y) {\n\t var offset = element.offset();\n\t if (x < offset.left || offset.left + element.outerWidth(true) < x) return false;\n\t if (y < offset.top || offset.top + element.outerHeight(true) < y) return false;\n\t return true;\n\t }\n\t\n\t function moveBefore(element, target) {\n\t element.detach();\n\t target.before(element);\n\t }\n\t\n\t function moveLast(element) {\n\t var parent = element.parent();\n\t element.detach();\n\t parent.append(element);\n\t }\n\t\n\t function applyCss(target, css) {\n\t target.removeAttr('style');\n\t for (var attr in css) {\n\t if (css.hasOwnProperty(attr)) {\n\t target.css(attr, css[attr]);\n\t }\n\t }\n\t }\n\t }\n\t\n\t function GridController(scrollViewport) {\n\t var _this3 = this;\n\t\n\t var columns = [];\n\t var rowMap = new Map();\n\t\n\t $timeout(function () {\n\t scrollViewport.adapter.publicContext.gridAdapter = new GridAdapter(_this3);\n\t scrollViewport.adapter.transform = function (scope, item) {\n\t return transform(rowMap.get(scope), item);\n\t };\n\t });\n\t\n\t this.registerColumn = function (header) {\n\t columns.push(new ColumnController(this, columns, header));\n\t };\n\t\n\t this.registerCell = function (scope, cell) {\n\t var row = rowMap.get(scope);\n\t if (!row) {\n\t row = [];\n\t rowMap.set(scope, row);\n\t }\n\t if (row.length >= columns.length) {\n\t return false;\n\t }\n\t row.push(cell);\n\t return true;\n\t };\n\t\n\t this.unregisterCell = function (scope, cell) {\n\t var row = rowMap.get(scope);\n\t var i = row.indexOf(cell);\n\t row.splice(i, 1);\n\t if (!row.length) {\n\t rowMap.delete(scope);\n\t }\n\t };\n\t\n\t this.forEachRow = function (callback) {\n\t rowMap.forEach(callback);\n\t };\n\t\n\t this.getColumns = function () {\n\t var _this4 = this;\n\t\n\t var result = [];\n\t columns.slice().sort(function (a, b) {\n\t return a.mapTo - b.mapTo;\n\t }).forEach(function (column) {\n\t return result.push(new ColumnAdapter(_this4, column));\n\t });\n\t return result;\n\t };\n\t\n\t this.getLayout = function () {\n\t var result = [];\n\t columns.forEach(function (column, index) {\n\t return result.push({\n\t index: index,\n\t css: angular.extend({}, column.css),\n\t mapTo: column.mapTo\n\t });\n\t });\n\t return result;\n\t };\n\t\n\t this.applyLayout = function (layouts) {\n\t if (!layouts || layouts.length != columns.length) {\n\t throw new Error('Failed to apply layout - number of layouts should match number of columns');\n\t }\n\t layouts.forEach(function (layout, index) {\n\t return columns[index].applyLayout(layout);\n\t });\n\t transform(columns.map(function (column) {\n\t return column.header;\n\t }));\n\t rowMap.forEach(function (row) {\n\t return transform(row);\n\t });\n\t };\n\t\n\t this.moveBefore = function (selected, target) {\n\t var index = target;\n\t\n\t if (target % 1 !== 0) {\n\t index = target ? columns[target.columnId].mapTo : columns.length;\n\t }\n\t if (index < 0 || index > columns.length) {\n\t return; // throw an error?\n\t }\n\t\n\t var mapTo = selected.mapTo,\n\t next = null;\n\t index -= mapTo < index ? 1 : 0;\n\t\n\t columns.forEach(function (c) {\n\t c.mapTo -= c.mapTo > mapTo ? 1 : 0;\n\t c.mapTo += c.mapTo >= index ? 1 : 0;\n\t next = c.mapTo === index + 1 ? c : next;\n\t });\n\t\n\t selected.mapTo = index;\n\t selected.moveBefore(next);\n\t };\n\t\n\t this.exchangeWith = function (selected, index) {\n\t if (index < 0 || index >= columns.length) {\n\t return;\n\t }\n\t columns.find(function (c) {\n\t return c.mapTo === index;\n\t }).mapTo = selected.mapTo;\n\t selected.mapTo = index;\n\t };\n\t\n\t this.columnFromPoint = function (x, y) {\n\t var column = columns.find(function (col) {\n\t return col.columnFromPoint(x, y);\n\t });\n\t return column ? new ColumnAdapter(this, column) : undefined;\n\t };\n\t\n\t // function definitions\n\t\n\t function transform(row) {\n\t var parent = row[0].parent();\n\t var visible = [];\n\t\n\t row.forEach(function (cell, index) {\n\t columns[index].applyCss(cell);\n\t visible[columns[index].mapTo] = row[index];\n\t row[index].detach();\n\t });\n\t\n\t visible.forEach(function (cell) {\n\t return parent.append(cell);\n\t });\n\t }\n\t }\n\t\n\t return {\n\t require: ['^^uiScrollViewport'],\n\t restrict: 'A',\n\t link: function link($scope, element, $attr, controllers) {\n\t controllers[0].gridController = controllers[0].gridController || new GridController(controllers[0]);\n\t controllers[0].gridController.registerColumn(element);\n\t }\n\t };\n\t}]).directive('uiScrollTd', function () {\n\t return {\n\t require: ['?^^uiScrollViewport'],\n\t restrict: 'A',\n\t link: function link($scope, element, $attr, controllers) {\n\t if (controllers[0]) {\n\t (function () {\n\t var gridController = controllers[0].gridController;\n\t if (gridController.registerCell($scope, element)) {\n\t $scope.$on('$destroy', function () {\n\t return gridController.unregisterCell($scope, element);\n\t });\n\t }\n\t })();\n\t }\n\t }\n\t };\n\t});\n\n/***/ }\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// ui-scroll-grid.min.js"," \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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6fb5c0179465828c8111","angular.module('ui.scroll.grid', [])\n .directive('uiScrollTh', ['$log', '$timeout', function (console, $timeout) {\n\n function GridAdapter(controller) {\n\n this.getLayout = () => controller.getLayout();\n\n this.applyLayout = (layout) => controller.applyLayout(layout);\n\n this.columnFromPoint = (x, y) => controller.columnFromPoint(x, y);\n\n Object.defineProperty(this, 'columns', {get: () => controller.getColumns()});\n }\n\n function ColumnAdapter(controller, column) {\n\n this.css = function (/* attr, value */) {\n var attr = arguments[0];\n var value = arguments[1];\n if (arguments.length == 1) {\n return column.header.css(attr);\n }\n if (arguments.length == 2) {\n column.header.css(attr, value);\n controller.forEachRow((row) => row[column.id].css(attr, value));\n column.css[attr] = value;\n }\n };\n\n this.moveBefore = (index) => controller.moveBefore(column, index);\n\n this.exchangeWith = (index) => controller.exchangeWith(column, index);\n\n Object.defineProperty(this, 'columnId', {get: () => column.id});\n }\n\n function ColumnController(controller, columns, header) {\n\n this.header = header;\n this.css = {};\n this.mapTo = columns.length;\n this.id = columns.length;\n\n // controller api methods\n\n this.applyLayout = function (layout) {\n this.css = angular.extend({}, layout.css);\n this.mapTo = layout.mapTo;\n applyCss(this.header, this.css);\n };\n\n this.moveBefore = function (target) {\n if (target) {\n moveBefore(header, target.header);\n controller.forEachRow((row) => moveBefore(row[this.id], row[target.id]));\n } else {\n moveLast(header);\n controller.forEachRow((row) => moveLast(row[this.id]));\n }\n };\n\n this.columnFromPoint = function (x, y) {\n if (insidePoint(header, x, y)) {\n return this;\n }\n let result = null;\n controller.forEachRow((row) =>\n result = insidePoint(row[this.id], x, y) ? this : result\n );\n return result;\n };\n\n this.applyCss = function (target) {\n applyCss(target, this.css);\n };\n\n // function definitions\n\n function insidePoint(element, x, y) {\n let offset = element.offset();\n if (x < offset.left || offset.left + element.outerWidth(true) < x)\n return false;\n if (y < offset.top || offset.top + element.outerHeight(true) < y)\n return false;\n return true;\n }\n\n function moveBefore(element, target) {\n element.detach();\n target.before(element);\n }\n\n function moveLast(element) {\n let parent = element.parent();\n element.detach();\n parent.append(element);\n }\n\n function applyCss(target, css) {\n target.removeAttr('style');\n for (let attr in css) {\n if (css.hasOwnProperty(attr)) {\n target.css(attr, css[attr]);\n }\n }\n }\n\n }\n\n function GridController(scrollViewport) {\n let columns = [];\n let rowMap = new Map();\n\n $timeout(() => {\n scrollViewport.adapter.publicContext.gridAdapter = new GridAdapter(this);\n scrollViewport.adapter.transform = (scope, item) => transform(rowMap.get(scope), item);\n });\n\n this.registerColumn = function (header) {\n columns.push(new ColumnController(this, columns, header));\n };\n\n this.registerCell = function (scope, cell) {\n let row = rowMap.get(scope);\n if (!row) {\n row = [];\n rowMap.set(scope, row);\n }\n if (row.length >= columns.length) {\n return false;\n }\n row.push(cell);\n return true;\n };\n\n this.unregisterCell = function (scope, cell) {\n let row = rowMap.get(scope);\n let i = row.indexOf(cell);\n row.splice(i, 1);\n if (!row.length) {\n rowMap.delete(scope);\n }\n };\n\n this.forEachRow = function (callback) {\n rowMap.forEach(callback);\n };\n\n this.getColumns = function () {\n let result = [];\n columns.slice()\n .sort((a, b) => a.mapTo - b.mapTo)\n .forEach((column) => result.push(new ColumnAdapter(this, column)));\n return result;\n };\n\n this.getLayout = function () {\n let result = [];\n columns.forEach((column, index) => result.push({\n index: index,\n css: angular.extend({}, column.css),\n mapTo: column.mapTo\n })\n );\n return result;\n };\n\n this.applyLayout = function (layouts) {\n if (!layouts || layouts.length != columns.length) {\n throw new Error('Failed to apply layout - number of layouts should match number of columns');\n }\n layouts.forEach((layout, index) => columns[index].applyLayout(layout));\n transform(columns.map((column) => column.header));\n rowMap.forEach((row) => transform(row));\n };\n\n this.moveBefore = function (selected, target) {\n let index = target;\n\n if (target % 1 !== 0) {\n index = target ? columns[target.columnId].mapTo : columns.length;\n }\n if (index < 0 || index > columns.length) {\n return; // throw an error?\n }\n\n let mapTo = selected.mapTo, next = null;\n index -= mapTo < index ? 1 : 0;\n\n columns.forEach(c => {\n c.mapTo -= c.mapTo > mapTo ? 1 : 0;\n c.mapTo += c.mapTo >= index ? 1 : 0;\n next = c.mapTo === index + 1 ? c : next;\n });\n\n selected.mapTo = index;\n selected.moveBefore(next);\n };\n\n this.exchangeWith = function (selected, index) {\n if (index < 0 || index >= columns.length) {\n return;\n }\n columns.find(c => c.mapTo === index).mapTo = selected.mapTo;\n selected.mapTo = index;\n };\n\n this.columnFromPoint = function (x, y) {\n let column = columns.find(col => col.columnFromPoint(x, y));\n return column ? new ColumnAdapter(this, column) : undefined;\n };\n\n // function definitions\n\n function transform(row) {\n let parent = row[0].parent();\n let visible = [];\n\n row.forEach((cell, index) => {\n columns[index].applyCss(cell);\n visible[columns[index].mapTo] = row[index];\n row[index].detach();\n });\n\n visible.forEach(cell => parent.append(cell));\n }\n\n }\n\n return {\n require: ['^^uiScrollViewport'],\n restrict: 'A',\n link: ($scope, element, $attr, controllers) => {\n controllers[0].gridController = controllers[0].gridController || new GridController(controllers[0]);\n controllers[0].gridController.registerColumn(element);\n }\n };\n }])\n\n .directive('uiScrollTd', function () {\n return {\n require: ['?^^uiScrollViewport'],\n restrict: 'A',\n link: ($scope, element, $attr, controllers) => {\n if (controllers[0]) {\n let gridController = controllers[0].gridController;\n if (gridController.registerCell($scope, element)) {\n $scope.$on('$destroy', () => gridController.unregisterCell($scope, element));\n }\n }\n }\n };\n });\n\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll-grid.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/ui-scroll.js b/dist/ui-scroll.js index 844fc6fe..2333ea06 100644 --- a/dist/ui-scroll.js +++ b/dist/ui-scroll.js @@ -1,7 +1,7 @@ /*! * angular-ui-scroll (uncompressed) * https://github.com/angular-ui/ui-scroll - * Version: 1.6.0 -- 2017-02-15T02:04:11.508Z + * Version: 1.6.1 -- 2017-03-03T05:28:34.208Z * License: MIT */ /******/ (function(modules) { // webpackBootstrap @@ -86,6 +86,7 @@ this.container = element; this.viewport = element; + this.scope = scope; angular.forEach(element.children(), function (child) { if (child.tagName.toLowerCase() === 'tbody') { @@ -135,8 +136,8 @@ var elementRoutines = new _elementRoutines2.default($injector, $q); var buffer = new _buffer2.default(elementRoutines, bufferSize); - var viewport = new _viewport2.default(elementRoutines, buffer, element, viewportController, padding); - var adapter = new _adapter2.default($rootScope, $parse, $attr, viewport, buffer, adjustBuffer, element); + var viewport = new _viewport2.default(elementRoutines, buffer, element, viewportController, $rootScope, padding); + var adapter = new _adapter2.default(viewport, buffer, adjustBuffer, reload, $attr, $parse, element); if (viewportController) { viewportController.adapter = adapter; @@ -202,8 +203,6 @@ }, success); }; - adapter.reload = reload; - /** * Build padding elements * @@ -1063,11 +1062,12 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - function Viewport(elementRoutines, buffer, element, viewportController, padding) { + function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) { var topPadding = null; var bottomPadding = null; var viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window); var container = viewportController && viewportController.container ? viewportController.container : undefined; + var scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope; viewport.css({ 'overflow-anchor': 'none', @@ -1080,6 +1080,9 @@ } angular.extend(viewport, { + getScope: function getScope() { + return scope; + }, createPaddingElements: function createPaddingElements(template) { topPadding = new _padding2.default(template); bottomPadding = new _padding2.default(template); @@ -1292,187 +1295,269 @@ Object.defineProperty(exports, "__esModule", { value: true }); - exports.default = Adapter; - function Adapter($rootScope, $parse, $attr, viewport, buffer, adjustBuffer, element) { - var viewportScope = viewport.scope() || $rootScope; - var disabled = false; - var self = this; - - createValueInjector('adapter')(self); - var topVisibleInjector = createValueInjector('topVisible'); - var topVisibleElementInjector = createValueInjector('topVisibleElement'); - var topVisibleScopeInjector = createValueInjector('topVisibleScope'); - var isLoadingInjector = createValueInjector('isLoading'); - - // Adapter API definition - - Object.defineProperty(this, 'disabled', { - get: function get() { - return disabled; - }, - set: function set(value) { - return !(disabled = value) ? adjustBuffer() : null; - } - }); - this.isLoading = false; - this.isBOF = function () { - return buffer.bof; - }; - this.isEOF = function () { - return buffer.eof; - }; - this.isEmpty = function () { - return !buffer.length; - }; + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - this.applyUpdates = function (arg1, arg2) { - if (angular.isFunction(arg1)) { - // arg1 is the updater function, arg2 is ignored - buffer.slice(0).forEach(function (wrapper) { - // we need to do it on the buffer clone, because buffer content - // may change as we iterate through - applyUpdate(wrapper, arg1(wrapper.item, wrapper.scope, wrapper.element)); - }); - } else { - // arg1 is item index, arg2 is the newItems array - if (arg1 % 1 !== 0) { - // checking if it is an integer - throw new Error('applyUpdates - ' + arg1 + ' is not a valid index'); - } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var index = arg1 - buffer.first; - if (index >= 0 && index < buffer.length) { - applyUpdate(buffer[index], arg2); + function findCtrl(scope, ctrl) { + if (!scope) { + return; + } + if (scope.hasOwnProperty(ctrl) && Object.getPrototypeOf(scope[ctrl]).constructor.hasOwnProperty('$inject')) { + return scope[ctrl]; + } + return findCtrl(scope.$parent, ctrl); + } + + function assignAttr(attr, scope, element) { + if (!attr || !(attr = attr.replace(/^\s+|\s+$/gm, ''))) { + return; + } + + var onSyntax = attr.match(/^(.+)(\s+on\s+)(.+)?/); + var asSyntax = attr.match(/^([^.]+)\.(.+)?/); + + if (onSyntax && onSyntax.length === 4) { + // controller on (backward compatibility), deprecated since v1.6.1 + window.console.warn('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.'); + var ctrl = onSyntax[3]; + var tail = onSyntax[1]; + var candidate = element; + while (candidate.length) { + var candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true + var candidateName = (candidate.attr('ng-controller') || '').match(/(\w(?:\w|\d)*)(?:\s+as\s+(\w(?:\w|\d)*))?/); + if (candidateName && candidateName[1] === ctrl) { + return { + target: candidateScope, + source: tail + }; } + candidate = candidate.parent(); + } + throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller "' + ctrl + '" to inject "' + tail + '"'); + } else if (asSyntax && asSyntax.length === 3) { + // controller as + var _ctrl = asSyntax[1]; + var _tail = asSyntax[2]; + var foundCtrl = findCtrl(scope, _ctrl); + if (foundCtrl) { + return { + target: foundCtrl, + source: _tail + }; } + } - adjustBuffer(); + return { + target: scope, + source: attr }; + } - this.append = function (newItems) { - buffer.append(newItems); - adjustBuffer(); - }; + var Adapter = function () { + function Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element) { + _classCallCheck(this, Adapter); - this.prepend = function (newItems) { - buffer.prepend(newItems); - adjustBuffer(); - }; + this.viewport = viewport; + this.buffer = buffer; + this.adjustBuffer = adjustBuffer; + this.reload = reload; - this.loading = function (value) { - isLoadingInjector(value); - }; + this.publicContext = {}; + this.assignAdapter($attr, $parse, element); + this.generatePublicContext($attr, $parse, element); - this.calculateProperties = function () { - var item = void 0, - itemHeight = void 0, - itemTop = void 0, - isNewRow = void 0, - rowTop = null; - var topHeight = 0; - for (var i = 0; i < buffer.length; i++) { - item = buffer[i]; - itemTop = item.element.offset().top; - isNewRow = rowTop !== itemTop; - rowTop = itemTop; - if (isNewRow) { - itemHeight = item.element.outerHeight(true); - } - if (isNewRow && viewport.topDataPos() + topHeight + itemHeight <= viewport.topVisiblePos()) { - topHeight += itemHeight; - } else { - if (isNewRow) { - topVisibleInjector(item.item); - topVisibleElementInjector(item.element); - topVisibleScopeInjector(item.scope); + this.isLoading = false; + this.disabled = false; + } + + _createClass(Adapter, [{ + key: 'assignAdapter', + value: function assignAdapter($attr, $parse, element) { + var data = assignAttr($attr.adapter, this.viewport.getScope(), element); + + if (data) { + try { + $parse(data.source).assign(data.target, {}); + var adapterOnScope = $parse(data.source)(data.target); + + angular.extend(adapterOnScope, this.publicContext); + this.publicContext = adapterOnScope; + } catch (error) { + error.message = 'Angular ui-scroll Adapter assignment exception.\n' + ('Can\'t parse "' + $attr.adapter + '" expression.\n') + error.message; + throw error; } - break; } } - }; + }, { + key: 'generatePublicContext', + value: function generatePublicContext($attr, $parse, element) { + var _this = this; - // private function definitions - - function createValueInjector(attribute) { - var expression = $attr[attribute]; - var scope = viewportScope; - var assign = void 0; - if (expression) { - // it is ok to have relaxed validation for the first part of the 'on' expression. - // additional validation will be done by the $parse service below - var match = expression.match(/^(\S+)(?:\s+on\s+(\w(?:\w|\d)*))?/); - if (!match) throw new Error('Expected injection expression in form of \'target\' or \'target on controller\' but got \'' + expression + '\''); - var target = match[1]; - var onControllerName = match[2]; - - var parseController = function parseController(controllerName, on) { - var candidate = element; - while (candidate.length) { - var candidateScope = candidate.scope(); - // ng-controller's "Controller As" parsing - var candidateName = (candidate.attr('ng-controller') || '').match(/(\w(?:\w|\d)*)(?:\s+as\s+(\w(?:\w|\d)*))?/); - if (candidateName && candidateName[on ? 1 : 2] === controllerName) { - scope = candidateScope; - return true; - } - // directive's/component's "Controller As" parsing - if (!on && candidateScope && candidateScope.hasOwnProperty(controllerName) && Object.getPrototypeOf(candidateScope[controllerName]).constructor.hasOwnProperty('$inject')) { - scope = candidateScope; - return true; - } - candidate = candidate.parent(); + // these methods will be accessible out of ui-scroll via user defined adapter + var publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty']; + for (var i = publicMethods.length - 1; i >= 0; i--) { + this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this); + } + + // these read-only props will be accessible out of ui-scroll via user defined adapter + var publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope']; + + var _loop = function _loop(_i) { + var property = void 0, + assignProp = void 0; + var data = assignAttr($attr[publicProps[_i]], _this.viewport.getScope(), element); + if (data) { + assignProp = $parse(data.source).assign; } + Object.defineProperty(_this, publicProps[_i], { + get: function get() { + return property; + }, + set: function set(value) { + property = value; + if (assignProp) { + assignProp(data.target, value); + } + _this.publicContext[publicProps[_i]] = value; + } + }); }; - if (onControllerName) { - // 'on' syntax DOM parsing (adapter="adapter on ctrl") - scope = null; - parseController(onControllerName, true); - if (!scope) { - throw new Error('Failed to locate target controller \'' + onControllerName + '\' to inject \'' + target + '\''); + for (var _i = publicProps.length - 1; _i >= 0; _i--) { + _loop(_i); + } + + // non-read-only public property + Object.defineProperty(this.publicContext, 'disabled', { + get: function get() { + return _this.disabled; + }, + set: function set(value) { + return !(_this.disabled = value) ? _this.adjustBuffer() : null; } + }); + } + }, { + key: 'loading', + value: function loading(value) { + this['isLoading'] = value; + } + }, { + key: 'isBOF', + value: function isBOF() { + return this.buffer.bof; + } + }, { + key: 'isEOF', + value: function isEOF() { + return this.buffer.eof; + } + }, { + key: 'isEmpty', + value: function isEmpty() { + return !this.buffer.length; + } + }, { + key: 'applyUpdates', + value: function applyUpdates(arg1, arg2) { + var _this2 = this; + + if (angular.isFunction(arg1)) { + // arg1 is the updater function, arg2 is ignored + 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, arg1(wrapper.item, wrapper.scope, wrapper.element)); + }); } else { - // try to parse DOM with 'Controller As' syntax (adapter="ctrl.adapter") - var controllerAsName = void 0; - var dotIndex = target.indexOf('.'); - if (dotIndex > 0) { - controllerAsName = target.substr(0, dotIndex); - parseController(controllerAsName, false); + // arg1 is item index, arg2 is the newItems array + if (arg1 % 1 !== 0) { + // checking if it is an integer + throw new Error('applyUpdates - ' + arg1 + ' is not a valid index'); + } + + var index = arg1 - this.buffer.first; + if (index >= 0 && index < this.buffer.length) { + this.applyUpdate(this.buffer[index], arg2); } } - assign = $parse(target).assign; + this.adjustBuffer(); } - return function (value) { - if (self !== value) // just to avoid injecting adapter reference in the adapter itself. Kludgy, I know. - self[attribute] = value; - if (assign) assign(scope, value); - }; - } - - function applyUpdate(wrapper, newItems) { - if (!angular.isArray(newItems)) { - return; + }, { + key: 'append', + value: function append(newItems) { + this.buffer.append(newItems); + this.adjustBuffer(); } + }, { + key: 'prepend', + value: function prepend(newItems) { + this.buffer.prepend(newItems); + this.adjustBuffer(); + } + }, { + key: 'calculateProperties', + value: function calculateProperties() { + var item = void 0, + itemHeight = void 0, + itemTop = void 0, + isNewRow = void 0, + rowTop = null; + var topHeight = 0; + for (var i = 0; i < this.buffer.length; i++) { + item = this.buffer[i]; + itemTop = item.element.offset().top; + isNewRow = rowTop !== itemTop; + rowTop = itemTop; + if (isNewRow) { + itemHeight = item.element.outerHeight(true); + } + if (isNewRow && this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos()) { + topHeight += itemHeight; + } else { + if (isNewRow) { + this['topVisible'] = item.item; + this['topVisibleElement'] = item.element; + this['topVisibleScope'] = item.scope; + } + break; + } + } + } + }, { + key: 'applyUpdate', + value: function applyUpdate(wrapper, newItems) { + var _this3 = this; - var keepIt = void 0; - var pos = buffer.indexOf(wrapper) + 1; - - newItems.reverse().forEach(function (newItem) { - if (newItem === wrapper.item) { - keepIt = true; - pos--; - } else { - buffer.insert(pos, newItem); + if (!angular.isArray(newItems)) { + return; } - }); - if (!keepIt) { - wrapper.op = 'remove'; + var keepIt = void 0; + var pos = this.buffer.indexOf(wrapper) + 1; + + newItems.reverse().forEach(function (newItem) { + if (newItem === wrapper.item) { + keepIt = true; + pos--; + } else { + _this3.buffer.insert(pos, newItem); + } + }); + + if (!keepIt) { + wrapper.op = 'remove'; + } } - } - } + }]); + + return Adapter; + }(); + + exports.default = Adapter; /***/ } /******/ ]); diff --git a/dist/ui-scroll.js.map b/dist/ui-scroll.js.map index 47e773c3..de3ac127 100644 --- a/dist/ui-scroll.js.map +++ b/dist/ui-scroll.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap b6643770a746e7bf69f1","webpack:///./src/ui-scroll.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/adapter.js"],"names":["angular","module","service","run","jqLiteExtras","window","jQuery","registerFor","element","directive","restrict","controller","scope","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$q","$parse","require","transclude","priority","terminal","link","$scope","$attr","controllers","linker","match","uiScroll","Error","parseNumericAttr","value","defaultValue","result","isNaN","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","datasource","itemName","datasourceName","viewportController","bufferSize","Math","max","padding","startIndex","ridActual","pending","elementRoutines","buffer","adapter","adjustBuffer","isDatasourceValid","isObject","isFunction","get","indexStore","defineProperty","propName","propUserName","descriptor","Object","getOwnPropertyDescriptor","set","length","topPaddingHeightOld","topDataPos","adjustPadding","adjustScrollTopAfterMinIndexSet","fetchNext","success","next","index","append","item","count","fetchPrevious","first","prepend","reload","clone","createPaddingElements","$destroy","remove","$on","unbindEvents","unbind","wheelHandler","bind","applyContainerStyle","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","resetTopPadding","resetBottomPadding","arguments","reset","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","addClass","promises","sibling","undefined","transform","updateDOM","toBePrepended","toBeRemoved","inserted","i","op","unshift","push","concat","insertElementAnimated","$index","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","fetch","loading","shouldLoadTop","w","removeClass","calculateProperties","adjustBufferAfterFetch","adjustScrollTopAfterPrepend","shift","eof","clipTop","bof","clipBottom","$$phase","isLoading","disabled","$apply","event","scrollTop","yMax","scrollHeight","clientHeight","preventDefault","JQLiteExtras","convertToPx","css","getStyle","isWindow","prototype","name","self","elem","nodeType","style","call","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isDefined","documentElement","getComputedStyle","parseFloat","currentStyle","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","width","border","margin","offsetWidth","offsetHeight","getWidthHeight","measurements","outer","outerfull","before","newElem","j","parent","ref","contents","after","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","key","ElementRoutines","$animate","has","isAngularVersionLessThen1_3","version","major","minor","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","ScrollBuffer","create","Array","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","splice","arg1","arg2","indexOf","removeElementAnimated","elements","Number","MAX_VALUE","bottom","MIN_VALUE","Viewport","topPadding","bottomPadding","bufferPadding","template","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","topPaddingHeight","reduce","summ","bottomPaddingHeight","visibleItemsHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","Padding","Cache","table","find","Adapter","viewportScope","createValueInjector","topVisibleInjector","topVisibleElementInjector","topVisibleScopeInjector","isLoadingInjector","isBOF","isEOF","isEmpty","applyUpdates","slice","applyUpdate","newItems","itemTop","isNewRow","rowTop","topHeight","attribute","expression","assign","target","onControllerName","parseController","controllerName","on","candidate","candidateScope","candidateName","attr","hasOwnProperty","getPrototypeOf","constructor","controllerAsName","dotIndex","substr","isArray","keepIt","pos","newItem"],"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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b6643770a746e7bf69f1","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, padding);\n let adapter = new Adapter($rootScope, $parse, $attr, viewport, buffer, adjustBuffer, element);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 adapter.reload = reload;\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","import Padding from './padding';\r\n\r\nexport default function Viewport(elementRoutines, buffer, element, viewportController, 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\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 createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","export default function Adapter($rootScope, $parse, $attr, viewport, buffer, adjustBuffer, element) {\r\n const viewportScope = viewport.scope() || $rootScope;\r\n let disabled = false;\r\n let self = this;\r\n\r\n createValueInjector('adapter')(self);\r\n let topVisibleInjector = createValueInjector('topVisible');\r\n let topVisibleElementInjector = createValueInjector('topVisibleElement');\r\n let topVisibleScopeInjector = createValueInjector('topVisibleScope');\r\n let isLoadingInjector = createValueInjector('isLoading');\r\n\r\n // Adapter API definition\r\n\r\n Object.defineProperty(this, 'disabled', {\r\n get: () => disabled,\r\n set: (value) => (!(disabled = value)) ? adjustBuffer() : null\r\n });\r\n\r\n this.isLoading = false;\r\n this.isBOF = () => buffer.bof;\r\n this.isEOF = () => buffer.eof;\r\n this.isEmpty = () => !buffer.length;\r\n\r\n this.applyUpdates = (arg1, arg2) => {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\r\n 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 applyUpdate(wrapper, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - buffer.first;\r\n if ((index >= 0 && index < buffer.length)) {\r\n applyUpdate(buffer[index], arg2);\r\n }\r\n }\r\n\r\n adjustBuffer();\r\n };\r\n\r\n this.append = (newItems) => {\r\n buffer.append(newItems);\r\n adjustBuffer();\r\n };\r\n\r\n this.prepend = (newItems) => {\r\n buffer.prepend(newItems);\r\n adjustBuffer();\r\n };\r\n\r\n this.loading = (value) => {\r\n isLoadingInjector(value);\r\n };\r\n\r\n this.calculateProperties = () => {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < buffer.length; i++) {\r\n item = buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (viewport.topDataPos() + topHeight + itemHeight <= viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n topVisibleInjector(item.item);\r\n topVisibleElementInjector(item.element);\r\n topVisibleScopeInjector(item.scope);\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n\r\n // private function definitions\r\n\r\n function createValueInjector(attribute) {\r\n let expression = $attr[attribute];\r\n let scope = viewportScope;\r\n let assign;\r\n if (expression) {\r\n // it is ok to have relaxed validation for the first part of the 'on' expression.\r\n // additional validation will be done by the $parse service below\r\n let match = expression.match(/^(\\S+)(?:\\s+on\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (!match)\r\n throw new Error('Expected injection expression in form of \\'target\\' or \\'target on controller\\' but got \\'' + expression + '\\'');\r\n let target = match[1];\r\n let onControllerName = match[2];\r\n\r\n let parseController = (controllerName, on) => {\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope();\r\n // ng-controller's \"Controller As\" parsing\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[on ? 1 : 2] === controllerName) {\r\n scope = candidateScope;\r\n return true;\r\n }\r\n // directive's/component's \"Controller As\" parsing\r\n if (!on && candidateScope && candidateScope.hasOwnProperty(controllerName) && Object.getPrototypeOf(candidateScope[controllerName]).constructor.hasOwnProperty('$inject')) {\r\n scope = candidateScope;\r\n return true;\r\n }\r\n candidate = candidate.parent();\r\n }\r\n };\r\n\r\n if (onControllerName) { // 'on' syntax DOM parsing (adapter=\"adapter on ctrl\")\r\n scope = null;\r\n parseController(onControllerName, true);\r\n if (!scope) {\r\n throw new Error('Failed to locate target controller \\'' + onControllerName + '\\' to inject \\'' + target + '\\'');\r\n }\r\n }\r\n else { // try to parse DOM with 'Controller As' syntax (adapter=\"ctrl.adapter\")\r\n let controllerAsName;\r\n let dotIndex = target.indexOf('.');\r\n if (dotIndex > 0) {\r\n controllerAsName = target.substr(0, dotIndex);\r\n parseController(controllerAsName, false);\r\n }\r\n }\r\n\r\n assign = $parse(target).assign;\r\n }\r\n return (value) => {\r\n if (self !== value) // just to avoid injecting adapter reference in the adapter itself. Kludgy, I know.\r\n self[attribute] = value;\r\n if (assign)\r\n assign(scope, value);\r\n };\r\n }\r\n\r\n function applyUpdate(wrapper, newItems) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n\r\n let keepIt;\r\n let pos = (buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 0a8b101f02aaa0804c9e","webpack:///./src/ui-scroll.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/adapter.js"],"names":["angular","module","service","run","jqLiteExtras","window","jQuery","registerFor","element","directive","restrict","controller","scope","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$q","$parse","require","transclude","priority","terminal","link","$scope","$attr","controllers","linker","match","uiScroll","Error","parseNumericAttr","value","defaultValue","result","isNaN","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","datasource","itemName","datasourceName","viewportController","bufferSize","Math","max","padding","startIndex","ridActual","pending","elementRoutines","buffer","adapter","adjustBuffer","reload","isDatasourceValid","isObject","isFunction","get","indexStore","defineProperty","propName","propUserName","descriptor","Object","getOwnPropertyDescriptor","set","length","topPaddingHeightOld","topDataPos","adjustPadding","adjustScrollTopAfterMinIndexSet","fetchNext","success","next","index","append","item","count","fetchPrevious","first","prepend","clone","createPaddingElements","$destroy","remove","$on","unbindEvents","unbind","wheelHandler","bind","applyContainerStyle","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","resetTopPadding","resetBottomPadding","arguments","reset","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","addClass","promises","sibling","undefined","transform","updateDOM","toBePrepended","toBeRemoved","inserted","i","op","unshift","push","concat","insertElementAnimated","$index","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","fetch","loading","shouldLoadTop","w","removeClass","calculateProperties","adjustBufferAfterFetch","adjustScrollTopAfterPrepend","shift","eof","clipTop","bof","clipBottom","$$phase","isLoading","disabled","$apply","event","scrollTop","yMax","scrollHeight","clientHeight","preventDefault","JQLiteExtras","convertToPx","css","getStyle","isWindow","prototype","name","self","elem","nodeType","style","call","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isDefined","documentElement","getComputedStyle","parseFloat","currentStyle","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","width","border","margin","offsetWidth","offsetHeight","getWidthHeight","measurements","outer","outerfull","before","newElem","j","parent","ref","contents","after","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","key","ElementRoutines","$animate","has","isAngularVersionLessThen1_3","version","major","minor","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","ScrollBuffer","create","Array","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","splice","arg1","arg2","indexOf","removeElementAnimated","elements","Number","MAX_VALUE","bottom","MIN_VALUE","Viewport","topPadding","bottomPadding","bufferPadding","getScope","template","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","topPaddingHeight","reduce","summ","bottomPaddingHeight","visibleItemsHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","Padding","Cache","table","find","findCtrl","ctrl","hasOwnProperty","getPrototypeOf","constructor","$parent","assignAttr","attr","replace","onSyntax","asSyntax","warn","tail","candidate","candidateScope","candidateName","target","foundCtrl","Adapter","publicContext","assignAdapter","generatePublicContext","data","assign","adapterOnScope","error","message","publicMethods","publicProps","property","assignProp","slice","applyUpdate","newItems","itemTop","isNewRow","rowTop","topHeight","isArray","keepIt","pos","newItem"],"mappings":";;;;;;;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;;;ACtCA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEAA,SAAQC,MAAR,CAAe,WAAf,EAA4B,EAA5B,EAEGC,OAFH,CAEW,cAFX,EAE2B;AAAA,UAAM,4BAAN;AAAA,EAF3B,EAGGC,GAHH,CAGO,CAAC,cAAD,EAAiB,UAACC,YAAD;AAAA,UACpB,CAACC,OAAOC,MAAR,GAAiBF,aAAaG,WAAb,CAAyBP,QAAQQ,OAAjC,CAAjB,GAA6D,IADzC;AAAA,EAAjB,CAHP,EAOGC,SAPH,CAOa,kBAPb,EAOiC,YAAY;AACzC,UAAO;AACLC,eAAU,GADL;AAELC,iBAAY,CACV,QADU,EAEV,UAFU,EAGV,UAAUC,KAAV,EAAiBJ,OAAjB,EAA0B;AAAA;;AACxB,YAAKK,SAAL,GAAiBL,OAAjB;AACA,YAAKM,QAAL,GAAgBN,OAAhB;AACA,YAAKI,KAAL,GAAaA,KAAb;;AAEAZ,eAAQe,OAAR,CAAgBP,QAAQQ,QAAR,EAAhB,EAAqC,iBAAS;AAC5C,aAAIC,MAAMC,OAAN,CAAcC,WAAd,OAAgC,OAApC,EAA6C;AAC3C,iBAAKL,QAAL,GAAgBd,QAAQQ,OAAR,CAAgBS,KAAhB,CAAhB;AACD;AACF,QAJD;;AAMA,cAAO,IAAP;AACD,MAfS;AAFP,IAAP;AAoBD,EA5BH,EA8BGR,SA9BH,CA8Ba,UA9Bb,EA8ByB,CACrB,MADqB,EAErB,WAFqB,EAGrB,YAHqB,EAIrB,UAJqB,EAKrB,IALqB,EAMrB,QANqB,EAOrB,UAAUW,OAAV,EAAmBC,SAAnB,EAA8BC,UAA9B,EAA0CC,QAA1C,EAAoDC,EAApD,EAAwDC,MAAxD,EAAgE;;AAE9D,UAAO;AACLC,cAAS,CAAC,oBAAD,CADJ;AAELhB,eAAU,GAFL;AAGLiB,iBAAY,SAHP;AAILC,eAAU,IAJL;AAKLC,eAAU,IALL;AAMLC,WAAMA;AAND,IAAP;;AASA,YAASA,IAAT,CAAcC,MAAd,EAAsBvB,OAAtB,EAA+BwB,KAA/B,EAAsCC,WAAtC,EAAmDC,MAAnD,EAA2D;AACzD,SAAMC,QAAQH,MAAMI,QAAN,CAAeD,KAAf,CAAqB,qCAArB,CAAd;AACA,SAAI,CAACA,KAAL,EAAY;AACV,aAAM,IAAIE,KAAJ,CAAU,uEAAuEL,MAAMI,QAA7E,GAAwF,IAAlG,CAAN;AACD;;AAED,cAASE,gBAAT,CAA0BC,KAA1B,EAAiCC,YAAjC,EAA+C;AAC7C,WAAIC,SAAShB,OAAOc,KAAP,EAAcR,MAAd,CAAb;AACA,cAAOW,MAAMD,MAAN,IAAgBD,YAAhB,GAA+BC,MAAtC;AACD;;AAED,SAAME,aAAa,CAAnB;AACA,SAAMC,iBAAiB,EAAvB;AACA,SAAMC,cAAc,GAApB;AACA,SAAMC,kBAAkB,GAAxB;;AAEA,SAAIC,aAAa,IAAjB;AACA,SAAMC,WAAWb,MAAM,CAAN,CAAjB;AACA,SAAMc,iBAAiBd,MAAM,CAAN,CAAvB;AACA,SAAMe,qBAAqBjB,YAAY,CAAZ,CAA3B;AACA,SAAMkB,aAAaC,KAAKC,GAAL,CAASV,UAAT,EAAqBL,iBAAiBN,MAAMmB,UAAvB,EAAmCP,cAAnC,CAArB,CAAnB;AACA,SAAMU,UAAUF,KAAKC,GAAL,CAASR,WAAT,EAAsBP,iBAAiBN,MAAMsB,OAAvB,EAAgCR,eAAhC,CAAtB,CAAhB;AACA,SAAIS,aAAajB,iBAAiBN,MAAMuB,UAAvB,EAAmC,CAAnC,CAAjB;AACA,SAAIC,YAAY,CAAhB,CAvByD,CAuBvC;AAClB,SAAIC,UAAU,EAAd;;AAEA,SAAIC,kBAAkB,8BAAoBrC,SAApB,EAA+BG,EAA/B,CAAtB;AACA,SAAImC,SAAS,qBAAiBD,eAAjB,EAAkCP,UAAlC,CAAb;AACA,SAAIrC,WAAW,uBAAa4C,eAAb,EAA8BC,MAA9B,EAAsCnD,OAAtC,EAA+C0C,kBAA/C,EAAmE5B,UAAnE,EAA+EgC,OAA/E,CAAf;AACA,SAAIM,UAAU,sBAAY9C,QAAZ,EAAsB6C,MAAtB,EAA8BE,YAA9B,EAA4CC,MAA5C,EAAoD9B,KAApD,EAA2DP,MAA3D,EAAmEjB,OAAnE,CAAd;;AAEA,SAAI0C,kBAAJ,EAAwB;AACtBA,0BAAmBU,OAAnB,GAA6BA,OAA7B;AACD;;AAED,SAAIG,oBAAoB,SAApBA,iBAAoB;AAAA,cAAM/D,QAAQgE,QAAR,CAAiBjB,UAAjB,KAAgC/C,QAAQiE,UAAR,CAAmBlB,WAAWmB,GAA9B,CAAtC;AAAA,MAAxB;AACAnB,kBAAatB,OAAOwB,cAAP,EAAuBlB,MAAvB,CAAb,CApCyD,CAoCZ;AAC7C,SAAI,CAACgC,mBAAL,EAA0B;AACxBhB,oBAAa1B,UAAU6C,GAAV,CAAcjB,cAAd,CAAb,CADwB,CACoB;AAC5C,WAAI,CAACc,mBAAL,EAA0B;AACxB,eAAM,IAAI1B,KAAJ,CAAUY,iBAAiB,4BAA3B,CAAN;AACD;AACF;;AAED,SAAIkB,aAAa,EAAjB;;AAEA,cAASC,cAAT,CAAwBrB,UAAxB,EAAoCsB,QAApC,EAA8CC,YAA9C,EAA4D;AAC1D,WAAIC,aAAaC,OAAOC,wBAAP,CAAgC1B,UAAhC,EAA4CsB,QAA5C,CAAjB;AACA,WAAI,CAACE,UAAD,IAAgB,CAACA,WAAWG,GAAZ,IAAmB,CAACH,WAAWL,GAAnD,EAAyD;AACvDM,gBAAOJ,cAAP,CAAsBrB,UAAtB,EAAkCsB,QAAlC,EAA4C;AAC1CK,gBAAK,aAACnC,KAAD,EAAW;AACd4B,wBAAWE,QAAX,IAAuB9B,KAAvB;AACAhB,sBAAS,YAAM;AACboC,sBAAOW,YAAP,IAAuB/B,KAAvB;AACA,mBAAI,CAACkB,QAAQkB,MAAb,EAAqB;AACnB,qBAAIC,sBAAsB9D,SAAS+D,UAAT,EAA1B;AACA/D,0BAASgE,aAAT;AACA,qBAAIT,aAAa,UAAjB,EAA6B;AAC3BvD,4BAASiE,+BAAT,CAAyCH,mBAAzC;AACD;AACF;AACF,cATD;AAUD,YAbyC;AAc1CV,gBAAK;AAAA,oBAAMC,WAAWE,QAAX,CAAN;AAAA;AAdqC,UAA5C;AAgBD;AACF;;AAEDD,oBAAerB,UAAf,EAA2B,UAA3B,EAAuC,cAAvC;AACAqB,oBAAerB,UAAf,EAA2B,UAA3B,EAAuC,cAAvC;;AAEA,SAAMiC,YAAajC,WAAWmB,GAAX,CAAeS,MAAf,KAA0B,CAA3B,GAAgC,UAACM,OAAD;AAAA,cAAalC,WAAWmB,GAAX,CAAeP,OAAOuB,IAAtB,EAA4B/B,UAA5B,EAAwC8B,OAAxC,CAAb;AAAA,MAAhC,GACd,UAACA,OAAD,EAAa;AACflC,kBAAWmB,GAAX,CAAe;AACbiB,gBAAOxB,OAAOuB,IADD;AAEbE,iBAAQzB,OAAOgB,MAAP,GAAgBhB,OAAOA,OAAOgB,MAAP,GAAgB,CAAvB,EAA0BU,IAA1C,GAAiD,KAAK,CAFjD;AAGbC,gBAAOnC;AAHM,QAAf,EAIG8B,OAJH;AAKD,MAPD;;AASA,SAAMM,gBAAiBxC,WAAWmB,GAAX,CAAeS,MAAf,KAA0B,CAA3B,GAAgC,UAACM,OAAD;AAAA,cAAalC,WAAWmB,GAAX,CAAeP,OAAO6B,KAAP,GAAerC,UAA9B,EAA0CA,UAA1C,EAAsD8B,OAAtD,CAAb;AAAA,MAAhC,GAClB,UAACA,OAAD,EAAa;AACflC,kBAAWmB,GAAX,CAAe;AACbiB,gBAAOxB,OAAO6B,KAAP,GAAerC,UADT;AAEbsC,kBAAS9B,OAAOgB,MAAP,GAAgBhB,OAAO,CAAP,EAAU0B,IAA1B,GAAiC,KAAK,CAFlC;AAGbC,gBAAOnC;AAHM,QAAf,EAIG8B,OAJH;AAKD,MAPD;;AASA;;;;;;;AAOA/C,YAAO,UAACwD,KAAD,EAAQ9E,KAAR,EAAkB;AACvBE,gBAAS6E,qBAAT,CAA+BD,MAAM,CAAN,CAA/B;AACA;AACA;AACA;AACA9E,aAAMgF,QAAN;AACAF,aAAMG,MAAN;AACD,MAPD;;AASA9D,YAAO+D,GAAP,CAAW,UAAX,EAAuB,YAAM;AAC3BC;AACAjF,gBAASkF,MAAT,CAAgB,YAAhB,EAA8BC,YAA9B;AACD,MAHD;;AAKAnF,cAASoF,IAAT,CAAc,YAAd,EAA4BD,YAA5B;;AAEA1E,cAAS,YAAM;AACbT,gBAASqF,mBAAT;AACArC;AACD,MAHD;;AAKA;;AAEA,cAASsC,SAAT,CAAmBC,GAAnB,EAAwB;AACtB,cAAQA,OAAOA,QAAQ7C,SAAhB,IAA8BzB,OAAOuE,WAA5C;AACD;;AAED,cAASC,UAAT,GAAsB;AACpBzF,gBAASoF,IAAT,CAAc,QAAd,EAAwBM,sBAAxB;AACA1F,gBAASoF,IAAT,CAAc,QAAd,EAAwBM,sBAAxB;AACD;;AAED,cAAST,YAAT,GAAwB;AACtBjF,gBAASkF,MAAT,CAAgB,QAAhB,EAA0BQ,sBAA1B;AACA1F,gBAASkF,MAAT,CAAgB,QAAhB,EAA0BQ,sBAA1B;AACD;;AAED,cAAS1C,MAAT,GAAkB;AAChBhD,gBAAS2F,eAAT;AACA3F,gBAAS4F,kBAAT;AACA,WAAIC,UAAUhC,MAAd,EAAsB;AACpBpB,sBAAaoD,UAAU,CAAV,CAAb;AACD;AACDhD,cAAOiD,KAAP,CAAarD,UAAb;AACAM;AACD;;AAED,cAASgD,gBAAT,CAA0BC,OAA1B,EAAmC;AACjC,cAAOA,QAAQtG,OAAR,CAAgBuG,MAAhB,MAA4BD,QAAQtG,OAAR,CAAgB,CAAhB,EAAmBwG,YAAtD;AACD;;AAED,cAASC,iBAAT,CAA2BH,OAA3B,EAAoC;AAClC,WAAID,iBAAiBC,OAAjB,CAAJ,EAA+B;AAC7BnD,gBAAO5C,OAAP,CAAe,UAACsE,IAAD,EAAU;AACvB,eAAIrF,QAAQiE,UAAR,CAAmBoB,KAAK6B,2BAAxB,CAAJ,EAA0D;AACxD7B,kBAAK6B,2BAAL;AACA,oBAAO7B,KAAK6B,2BAAZ;AACD;AACF,UALD;AAMA,aAAI,CAACzD,QAAQkB,MAAb,EAAqB;AACnBd;AACD;AACF;AACF;;AAED,cAASsD,oBAAT,CAA8BL,OAA9B,EAAuCM,WAAvC,EAAoD;AAClDC,qBAAcP,OAAd,EAAuBM,WAAvB,EAAoCtG,SAASwG,aAA7C;AACA,WAAI,CAACT,iBAAiBC,OAAjB,CAAL,EAAgC;AAC9BA,iBAAQI,2BAAR,GAAsCJ,QAAQlG,KAAR,CAAc2G,MAAd,CAAqB;AAAA,kBAAMN,kBAAkBH,OAAlB,CAAN;AAAA,UAArB,CAAtC;AACD;AACDA,eAAQtG,OAAR,CAAgBgH,QAAhB,CAAyB,SAAzB,EALkD,CAKb;AACtC;;AAED,cAASH,aAAT,CAAuBP,OAAvB,EAAgCM,WAAhC,EAA6CE,aAA7C,EAA4D;AAC1D,WAAIG,WAAW,IAAf;AACA,WAAIC,UAAWN,cAAc,CAAf,GAAoBzD,OAAOyD,cAAc,CAArB,EAAwB5G,OAA5C,GAAsDmH,SAApE;AACAzF,cAAO,UAACwD,KAAD,EAAQ9E,KAAR,EAAkB;AACvB6G,oBAAWH,cAAc5B,KAAd,EAAqBgC,OAArB,CAAX;AACAZ,iBAAQtG,OAAR,GAAkBkF,KAAlB;AACAoB,iBAAQlG,KAAR,GAAgBA,KAAhB;AACAA,eAAMoC,QAAN,IAAkB8D,QAAQzB,IAA1B;AACD,QALD;AAMA,WAAIzB,QAAQgE,SAAZ,EACEhE,QAAQgE,SAAR,CAAkBd,QAAQlG,KAA1B,EAAiCkG,QAAQtG,OAAzC;AACF,cAAOiH,QAAP;AACD;;AAED,cAASI,SAAT,GAAqB;AACnB,WAAIJ,WAAW,EAAf;AACA,WAAMK,gBAAgB,EAAtB;AACA,WAAMC,cAAc,EAApB;AACA,WAAMC,WAAW,EAAjB;;AAEArE,cAAO5C,OAAP,CAAe,UAAC+F,OAAD,EAAUmB,CAAV,EAAgB;AAC7B,iBAAQnB,QAAQoB,EAAhB;AACE,gBAAK,SAAL;AACEJ,2BAAcK,OAAd,CAAsBrB,OAAtB;AACA;AACF,gBAAK,QAAL;AACEK,kCAAqBL,OAArB,EAA8BmB,CAA9B;AACAnB,qBAAQoB,EAAR,GAAa,MAAb;AACAF,sBAASI,IAAT,CAActB,OAAd;AACA;AACF,gBAAK,QAAL;AACEW,wBAAWA,SAASY,MAAT,CAAgBhB,cAAcP,OAAd,EAAuBmB,CAAvB,EAA0BnH,SAASwH,qBAAnC,CAAhB,CAAX;AACAxB,qBAAQoB,EAAR,GAAa,MAAb;AACAF,sBAASI,IAAT,CAActB,OAAd;AACA;AACF,gBAAK,QAAL;AACEiB,yBAAYK,IAAZ,CAAiBtB,OAAjB;AAfJ;AAiBD,QAlBD;;AAoBAiB,mBAAYhH,OAAZ,CAAoB,UAAC+F,OAAD;AAAA,gBAAaW,WAAWA,SAASY,MAAT,CAAgB1E,OAAOkC,MAAP,CAAciB,OAAd,CAAhB,CAAxB;AAAA,QAApB;;AAEA,WAAIgB,cAAcnD,MAAlB,EACEmD,cAAc/G,OAAd,CAAsB,UAAC+F,OAAD,EAAa;AACjCK,8BAAqBL,OAArB;AACAA,iBAAQoB,EAAR,GAAa,MAAb;AACD,QAHD;;AAKFvE,cAAO5C,OAAP,CAAe,UAACsE,IAAD,EAAO4C,CAAP;AAAA,gBAAa5C,KAAKzE,KAAL,CAAW2H,MAAX,GAAoB5E,OAAO6B,KAAP,GAAeyC,CAAhD;AAAA,QAAf;;AAEA,cAAO;AACLO,oBAAWV,aADN;AAELW,kBAASV,WAFJ;AAGLC,mBAAUA,QAHL;AAILU,mBAAUjB;AAJL,QAAP;AAOD;;AAED,cAASkB,cAAT,CAAwBtC,GAAxB,EAA6BuC,OAA7B,EAAsC;AACpC;AACA,WAAIA,QAAQF,QAAR,CAAiB/D,MAArB,EAA6B;AAC3BnD,YAAGqH,GAAH,CAAOD,QAAQF,QAAf,EAAyBI,IAAzB,CAA8B,YAAM;AAClChI,oBAASgE,aAAT;AACAjB,wBAAawC,GAAb;AACD,UAHD;AAID,QALD,MAKO;AACLvF,kBAASgE,aAAT;AACD;AACF;;AAED,cAASiE,YAAT,CAAsB1C,GAAtB,EAA2BuC,OAA3B,EAAoC;AAClC,WAAI9H,SAASkI,gBAAT,EAAJ,EAAiC;AAC/B,aAAI,CAACJ,OAAD,IAAYjF,OAAOsF,eAAP,CAAuBL,QAAQZ,QAA/B,IAA2C,CAA3D,EAA8D;AAC5D;AACA,eAAIvE,QAAQ2E,IAAR,CAAa,IAAb,MAAuB,CAA3B,EAA8B;AAC5Bc,mBAAM7C,GAAN;AACAzC,qBAAQuF,OAAR,CAAgB,IAAhB;AACD;AACF;AACF,QARD,MAQO,IAAIrI,SAASsI,aAAT,EAAJ,EAA8B;AACnC,aAAK,CAACR,OAAD,IAAYjF,OAAOsF,eAAP,CAAuBL,QAAQJ,SAA/B,IAA4C,CAAzD,IAA+D/E,QAAQ,CAAR,CAAnE,EAA+E;AAC7E;AACA;AACA;AACA,eAAIA,QAAQ2E,IAAR,CAAa,KAAb,MAAwB,CAA5B,EAA+B;AAC7Bc,mBAAM7C,GAAN;AACAzC,qBAAQuF,OAAR,CAAgB,IAAhB;AACD;AACF;AACF;AACF;;AAED,cAAStF,YAAT,CAAsBwC,GAAtB,EAA2B;AACzB,WAAI,CAACA,GAAL,EAAU;AAAE;AACV5C,mBAAU,EAAV;AACA4C,eAAM,EAAE7C,SAAR;AACD;;AAED,WAAIoF,UAAUf,WAAd;;AAEA;AACAtG,gBAAS,YAAM;;AAEb;AACAqH,iBAAQZ,QAAR,CAAiBjH,OAAjB,CAAyB;AAAA,kBAAKsI,EAAE7I,OAAF,CAAU8I,WAAV,CAAsB,SAAtB,CAAL;AAAA,UAAzB;AACAV,iBAAQJ,SAAR,CAAkBzH,OAAlB,CAA0B;AAAA,kBAAKsI,EAAE7I,OAAF,CAAU8I,WAAV,CAAsB,SAAtB,CAAL;AAAA,UAA1B;;AAEA,aAAIlD,UAAUC,GAAV,CAAJ,EAAoB;AAClB;AACD;;AAEDsC,wBAAetC,GAAf,EAAoBuC,OAApB;AACAG,sBAAa1C,GAAb;;AAEA,aAAI,CAAC5C,QAAQkB,MAAb,EAAqB;AACnBf,mBAAQ2F,mBAAR;AACD;AACF,QAhBD;AAiBD;;AAED,cAASC,sBAAT,CAAgCnD,GAAhC,EAAqC;AACnC,WAAIuC,UAAUf,WAAd;;AAEA;AACAtG,gBAAS,YAAM;;AAEb;AACAqH,iBAAQZ,QAAR,CAAiBjH,OAAjB,CAAyB;AAAA,kBAAKsI,EAAE7I,OAAF,CAAU8I,WAAV,CAAsB,SAAtB,CAAL;AAAA,UAAzB;AACAV,iBAAQJ,SAAR,CAAkBzH,OAAlB,CAA0B;AAAA,kBAAKsI,EAAE7I,OAAF,CAAU8I,WAAV,CAAsB,SAAtB,CAAL;AAAA,UAA1B;;AAEAxI,kBAAS2I,2BAAT,CAAqCb,OAArC;;AAEA,aAAIxC,UAAUC,GAAV,CAAJ,EAAoB;AAClB;AACD;;AAEDsC,wBAAetC,GAAf,EAAoBuC,OAApB;AACAG,sBAAa1C,GAAb,EAAkBuC,OAAlB;AACAnF,iBAAQiG,KAAR;;AAEA,aAAIjG,QAAQkB,MAAZ,EACEuE,MAAM7C,GAAN,EADF,KAEK;AACHzC,mBAAQuF,OAAR,CAAgB,KAAhB;AACA5C;AACA3C,mBAAQ2F,mBAAR;AACD;AACF,QAvBD;AAwBD;;AAED,cAASL,KAAT,CAAe7C,GAAf,EAAoB;AAClB,WAAI5C,QAAQ,CAAR,CAAJ,EAAgB;AAAC;AACf,aAAIE,OAAOgB,MAAP,IAAiB,CAAC7D,SAASkI,gBAAT,EAAtB,EAAmD;AACjDQ,kCAAuBnD,GAAvB;AACD,UAFD,MAEO;AACLrB,qBAAU,UAACvC,MAAD,EAAY;AACpB,iBAAI2D,UAAUC,GAAV,CAAJ,EAAoB;AAClB;AACD;;AAED,iBAAI5D,OAAOkC,MAAP,GAAgBxB,UAApB,EAAgC;AAC9BQ,sBAAOgG,GAAP,GAAa,IAAb;AACD;;AAED,iBAAIlH,OAAOkC,MAAP,GAAgB,CAApB,EAAuB;AACrB7D,wBAAS8I,OAAT;AACAjG,sBAAOyB,MAAP,CAAc3C,MAAd;AACD;;AAED+G,oCAAuBnD,GAAvB;AACD,YAfD;AAgBD;AACF,QArBD,MAqBO;AAAG;AACR,aAAI1C,OAAOgB,MAAP,IAAiB,CAAC7D,SAASsI,aAAT,EAAtB,EAAgD;AAC9CI,kCAAuBnD,GAAvB;AACD,UAFD,MAEO;AACLd,yBAAc,UAAC9C,MAAD,EAAY;AACxB,iBAAI2D,UAAUC,GAAV,CAAJ,EAAoB;AAClB;AACD;;AAED,iBAAI5D,OAAOkC,MAAP,GAAgBxB,UAApB,EAAgC;AAC9BQ,sBAAOkG,GAAP,GAAa,IAAb;AACA;AACD;;AAED,iBAAIpH,OAAOkC,MAAP,GAAgB,CAApB,EAAuB;AACrB,mBAAIhB,OAAOgB,MAAX,EAAmB;AACjB7D,0BAASgJ,UAAT;AACD;AACDnG,sBAAO8B,OAAP,CAAehD,MAAf;AACD;;AAED+G,oCAAuBnD,GAAvB;AACD,YAlBD;AAmBD;AACF;AACF;;AAED,cAASG,sBAAT,GAAkC;AAChC,WAAI,CAAClF,WAAWyI,OAAZ,IAAuB,CAACnG,QAAQoG,SAAhC,IAA6C,CAACpG,QAAQqG,QAA1D,EAAoE;;AAElElB,sBAAavF,SAAb;;AAEA,aAAIC,QAAQkB,MAAZ,EAAoB;AAClBoB;AACD,UAFD,MAEO;AACLnC,mBAAQ2F,mBAAR;AACAxH,kBAAOmI,MAAP;AACD;AACF;AACF;;AAED,cAASjE,YAAT,CAAsBkE,KAAtB,EAA6B;AAC3B,WAAI,CAACvG,QAAQqG,QAAb,EAAuB;AACrB,aAAIG,YAAYtJ,SAAS,CAAT,EAAYsJ,SAA5B;AACA,aAAIC,OAAOvJ,SAAS,CAAT,EAAYwJ,YAAZ,GAA2BxJ,SAAS,CAAT,EAAYyJ,YAAlD;;AAEA,aAAKH,cAAc,CAAd,IAAmB,CAACzG,OAAOkG,GAA5B,IAAqCO,cAAcC,IAAd,IAAsB,CAAC1G,OAAOgG,GAAvE,EAA6E;AAC3EQ,iBAAMK,cAAN;AACD;AACF;AACF;AACF;AAEF,EA7ZoB,CA9BzB,E;;;;;;;;;;;;;;;;;;ACNA;;;;;;;;;;;KAWqBC,Y;;;;;;;iCAEPjK,O,EAAS;AACnB,WAAIkK,oBAAJ;AAAA,WAAiBC,YAAjB;AAAA,WAAsBC,iBAAtB;AAAA,WAAgCC,iBAAhC;AACA;AACAF,aAAM3K,QAAQQ,OAAR,CAAgBsK,SAAhB,CAA0BH,GAAhC;;AAEAnK,eAAQsK,SAAR,CAAkBH,GAAlB,GAAwB,UAAUI,IAAV,EAAgBxI,KAAhB,EAAuB;AAC7C,aAAIyI,OAAO,IAAX;AACA,aAAIC,OAAOD,KAAK,CAAL,CAAX;AACA,aAAI,EAAE,CAACC,IAAD,IAASA,KAAKC,QAAL,KAAkB,CAA3B,IAAgCD,KAAKC,QAAL,KAAkB,CAAlD,IAAuD,CAACD,KAAKE,KAA/D,CAAJ,EAA2E;AACzE,kBAAOR,IAAIS,IAAJ,CAASJ,IAAT,EAAeD,IAAf,EAAqBxI,KAArB,CAAP;AACD;AACF,QAND;;AAQA;AACAsI,kBAAW,kBAACQ,GAAD;AAAA,gBAASA,OAAOA,IAAIC,QAAX,IAAuBD,IAAIE,QAA3B,IAAuCF,IAAIG,KAA3C,IAAoDH,IAAII,WAAjE;AAAA,QAAX;;AAEA,gBAASC,QAAT,CAAkBV,IAAlB,EAAwBW,SAAxB,EAAmCpJ,KAAnC,EAA0C;AACxC,aAAI0I,OAAOD,KAAK,CAAL,CAAX;;AADwC,kDAET;AAC7BY,gBAAK,CACH,WADG,EAEH,aAFG,EAGH,YAHG,CADwB;AAM7BC,iBAAM,CACJ,YADI,EAEJ,aAFI,EAGJ,WAHI;AANuB,WAW7BF,SAX6B,CAFS;AAAA,aAEnCG,MAFmC;AAAA,aAE3BC,IAF2B;AAAA,aAErBC,QAFqB;;AAexC,aAAInB,SAASI,IAAT,CAAJ,EAAoB;AAClB,eAAIjL,QAAQiM,SAAR,CAAkB1J,KAAlB,CAAJ,EAA8B;AAC5B,oBAAO0I,KAAKS,QAAL,CAAcV,KAAKgB,QAAL,EAAeZ,IAAf,CAAoBJ,IAApB,CAAd,EAAyCzI,KAAzC,CAAP;AACD;AACD,kBAAQwJ,QAAQd,IAAT,GAAiBA,KAAKc,IAAL,CAAjB,GAA8Bd,KAAKK,QAAL,CAAcY,eAAd,CAA8BJ,MAA9B,CAArC;AACD,UALD,MAKO;AACL,eAAI9L,QAAQiM,SAAR,CAAkB1J,KAAlB,CAAJ,EAA8B;AAC5B0I,kBAAKa,MAAL,IAAevJ,KAAf;AACD;AACD,kBAAO0I,KAAKa,MAAL,CAAP;AACD;AACF;;AAED,WAAIzL,OAAO8L,gBAAX,EAA6B;AAC3BvB,oBAAW,kBAACK,IAAD;AAAA,kBAAU5K,OAAO8L,gBAAP,CAAwBlB,IAAxB,EAA8B,IAA9B,CAAV;AAAA,UAAX;AACAP,uBAAc,qBAACO,IAAD,EAAO1I,KAAP;AAAA,kBAAiB6J,WAAW7J,KAAX,CAAjB;AAAA,UAAd;AACD,QAHD,MAGO;AACLqI,oBAAW,kBAACK,IAAD;AAAA,kBAAUA,KAAKoB,YAAf;AAAA,UAAX;AACA3B,uBAAc,qBAACO,IAAD,EAAO1I,KAAP,EAAiB;AAC7B,eAAIsJ,aAAJ;AAAA,eAAUpJ,eAAV;AAAA,eAAkB6J,WAAlB;AAAA,eAAsBC,eAAtB;AAAA,eAA8BpB,cAA9B;AACA,eAAIqB,YAAY,sCAAsCC,MAAtD;AACA,eAAIC,YAAY,IAAIC,MAAJ,CAAW,OAAOH,SAAP,GAAmB,iBAA9B,EAAiD,GAAjD,CAAhB;;AAEA,eAAI,CAACE,UAAUE,IAAV,CAAerK,KAAf,CAAL,EAA4B;AAC1B,oBAAO6J,WAAW7J,KAAX,CAAP;AACD;;AAED;AACA4I,mBAAQF,KAAKE,KAAb;AACAU,kBAAOV,MAAMU,IAAb;AACAS,gBAAKrB,KAAK4B,YAAV;AACAN,oBAASD,MAAMA,GAAGT,IAAlB;AACA,eAAIS,EAAJ,EAAQ;AACNA,gBAAGT,IAAH,GAAUV,MAAMU,IAAhB;AACD;AACD;AACAV,iBAAMU,IAAN,GAAatJ,KAAb;AACAE,oBAAS0I,MAAM2B,SAAf;AACA3B,iBAAMU,IAAN,GAAaA,IAAb;AACA,eAAIU,MAAJ,EAAY;AACVD,gBAAGT,IAAH,GAAUU,MAAV;AACD;AACD,kBAAO9J,MAAP;AACD,UAzBD;AA0BD;;AAED,gBAASsK,eAAT,CAAyB9B,IAAzB,EAA+B+B,OAA/B,EAAwC;AACtC,aAAIC,aAAJ;AAAA,aAAUC,gBAAV;AAAA,aAAmBC,gBAAnB;AAAA,aAA4BC,wBAA5B;AAAA,aAA6CC,wBAA7C;AAAA,aAA8DC,sBAA9D;AAAA,aAA6EC,aAA7E;AAAA,aAAmFC,aAAnF;AAAA,aAAyFC,gBAAzF;AAAA,aAAkGC,gBAAlG;AAAA,aAA2GC,iBAA3G;AAAA,aAAqHC,iBAArH;;AAEA,aAAI/C,SAASI,IAAT,CAAJ,EAAoB;AAClBgC,kBAAO3B,SAASY,eAAT,CAAyB,EAACnF,QAAQ,cAAT,EAAyB8G,OAAO,aAAhC,GAA+Cb,OAA/C,CAAzB,CAAP;;AAEA,kBAAO;AACLC,mBAAMA,IADD;AAEL3J,sBAAS,CAFJ;AAGLwK,qBAAQ,CAHH;AAILC,qBAAQ;AAJH,YAAP;AAMD;;AAED;;AAdsC,oDAmBlC;AACFF,kBAAO,CACL5C,KAAK+C,WADA,EAEL,MAFK,EAGL,OAHK,CADL;AAMFjH,mBAAQ,CACNkE,KAAKgD,YADC,EAEN,KAFM,EAGN,QAHM;AANN,WAWFjB,OAXE,CAnBkC;;AAgBpCC,aAhBoC;AAiBpCM,aAjBoC;AAkBpCC,aAlBoC;;;AAgCtCF,yBAAgB1C,SAASK,IAAT,CAAhB;AACA0C,oBAAWjD,YAAYO,IAAZ,EAAkBqC,cAAc,YAAYC,IAA1B,CAAlB,KAAsD,CAAjE;AACAK,oBAAWlD,YAAYO,IAAZ,EAAkBqC,cAAc,YAAYE,IAA1B,CAAlB,KAAsD,CAAjE;AACAN,mBAAUxC,YAAYO,IAAZ,EAAkBqC,cAAc,WAAWC,IAAX,GAAkB,OAAhC,CAAlB,KAA+D,CAAzE;AACAJ,mBAAUzC,YAAYO,IAAZ,EAAkBqC,cAAc,WAAWE,IAAX,GAAkB,OAAhC,CAAlB,KAA+D,CAAzE;AACAJ,2BAAkBE,cAAc,WAAWC,IAAzB,CAAlB;AACAF,2BAAkBC,cAAc,WAAWE,IAAzB,CAAlB;;AAEA;AACA;AACA;AACA;AACAC,mBAAU/C,YAAYO,IAAZ,EAAkBmC,eAAlB,KAAsC,CAAhD;AACAM,mBAAUhD,YAAYO,IAAZ,EAAkBoC,eAAlB,KAAsC,CAAhD;;AAEA,gBAAO;AACLJ,iBAAMA,IADD;AAEL3J,oBAASqK,WAAWC,QAFf;AAGLE,mBAAQZ,UAAUC,OAHb;AAILY,mBAAQN,UAAUC;AAJb,UAAP;AAMD;;AAED,gBAASQ,cAAT,CAAwBjD,IAAxB,EAA8BU,SAA9B,EAAyCqB,OAAzC,EAAkD;AAChD,aAAIM,sBAAJ;AAAA,aAAmB7K,eAAnB;;AAEA,aAAI0L,eAAepB,gBAAgB9B,IAAhB,EAAsBU,SAAtB,CAAnB;;AAEA,aAAIwC,aAAalB,IAAb,GAAoB,CAAxB,EAA2B;AACzB,kBAAO;AACLA,mBAAMkB,aAAalB,IAAb,GAAoBkB,aAAa7K,OAAjC,GAA2C6K,aAAaL,MADzD;AAELM,oBAAOD,aAAalB,IAFf;AAGLoB,wBAAWF,aAAalB,IAAb,GAAoBkB,aAAaJ;AAHvC,aAILf,OAJK,CAAP;AAKD;;AAED;AACAM,yBAAgB1C,SAASK,IAAT,CAAhB;AACAxI,kBAAS6K,cAAc3B,SAAd,CAAT;;AAEA,aAAIlJ,SAAS,CAAT,IAAcA,WAAW,IAA7B,EAAmC;AACjCA,oBAASwI,KAAKE,KAAL,CAAWQ,SAAX,KAAyB,CAAlC;AACD;;AAED;AACAlJ,kBAAS2J,WAAW3J,MAAX,KAAsB,CAA/B;;AAEA,gBAAO;AACLwK,iBAAMxK,SAAS0L,aAAa7K,OAAtB,GAAgC6K,aAAaL,MAD9C;AAELM,kBAAO3L,MAFF;AAGL4L,sBAAW5L,SAAS0L,aAAa7K,OAAtB,GAAgC6K,aAAaL,MAA7C,GAAsDK,aAAaJ;AAHzE,WAILf,OAJK,CAAP;AAKD;;AAED;AACA,cAAOhN,QAAQe,OAAR,CAAgB;AACrBuN,eADqB,kBACdC,OADc,EACL;AACd,eAAIvN,QAAJ,EAAciK,IAAd,EAAoBhD,CAApB,EAAuBuG,CAAvB,EAA0BC,MAA1B,EAAkCC,GAAlC,EAAuC1D,IAAvC;AACAA,kBAAO,IAAP;AACAC,kBAAOD,KAAK,CAAL,CAAP;AACAyD,oBAASzD,KAAKyD,MAAL,EAAT;AACAzN,sBAAWyN,OAAOE,QAAP,EAAX;AACA,eAAI3N,SAAS,CAAT,MAAgBiK,IAApB,EAA0B;AACxB,oBAAOwD,OAAOhJ,OAAP,CAAe8I,OAAf,CAAP;AACD,YAFD,MAEO;AACL,kBAAKtG,IAAIuG,IAAI,CAAR,EAAWE,MAAM1N,SAAS2D,MAAT,GAAkB,CAAxC,EAA2C,KAAK+J,GAAL,GAAWF,KAAKE,GAAhB,GAAsBF,KAAKE,GAAtE,EAA2EzG,IAAI,KAAKyG,GAAL,GAAW,EAAEF,CAAb,GAAiB,EAAEA,CAAlG,EAAqG;AACnG,mBAAIxN,SAASiH,CAAT,MAAgBgD,IAApB,EAA0B;AACxBjL,yBAAQQ,OAAR,CAAgBQ,SAASiH,IAAI,CAAb,CAAhB,EAAiC2G,KAAjC,CAAuCL,OAAvC;AACA;AACD;AACF;AACD,mBAAM,IAAIlM,KAAJ,CAAU,2BAA2B4I,KAAK4D,SAA1C,CAAN;AACD;AACF,UAlBoB;AAmBrB9H,eAnBqB,kBAmBbxE,KAnBa,EAmBP;AACZ,eAAIyI,IAAJ;AACAA,kBAAO,IAAP;AACA,eAAIhL,QAAQiM,SAAR,CAAkB1J,KAAlB,CAAJ,EAA8B;AAC5B,iBAAIvC,QAAQ8O,QAAR,CAAiBvM,KAAjB,CAAJ,EAA6B;AAC3BA,uBAAQA,QAAQ,IAAhB;AACD;AACD,oBAAOoI,IAAIS,IAAJ,CAASJ,IAAT,EAAe,QAAf,EAAyBzI,KAAzB,CAAP;AACD,YALD,MAKO;AACL,oBAAO2L,eAAe,KAAK,CAAL,CAAf,EAAwB,QAAxB,EAAkC,MAAlC,CAAP;AACD;AACF,UA9BoB;AA+BrBa,oBA/BqB,uBA+BTC,MA/BS,EA+BD;AAClB,kBAAOd,eAAe,KAAK,CAAL,CAAf,EAAwB,QAAxB,EAAkCc,SAAS,WAAT,GAAuB,OAAzD,CAAP;AACD,UAjCoB;AAkCrBC,mBAlCqB,sBAkCVD,MAlCU,EAkCF;AACjB,kBAAOd,eAAe,KAAK,CAAL,CAAf,EAAwB,OAAxB,EAAiCc,SAAS,WAAT,GAAuB,OAAxD,CAAP;AACD,UApCoB;;;AAsCrB;;;AAGAE,eAzCqB,kBAyCd3M,KAzCc,EAyCP;AACZ,eAAI4M,gBAAJ;AAAA,eAAaC,YAAb;AACA,eAAIpE,OAAO,IAAX;AACA,eAAIqE,MAAM;AACRzD,kBAAK,CADG;AAERC,mBAAM;AAFE,YAAV;AAIA,eAAIZ,OAAOD,KAAK,CAAL,CAAX;AACA,eAAIsE,MAAMrE,QAAQA,KAAKsE,aAAvB;;AAEA,eAAI5I,UAAUhC,MAAd,EAAsB;AACpB,iBAAIpC,UAAUoF,SAAd,EAAyB;AACvB,sBAAOqD,IAAP;AACD;AACD;AACA,mBAAM,IAAI3I,KAAJ,CAAU,yCAAV,CAAN;AACD;;AAED,eAAI,CAACiN,GAAL,EAAU;AACR;AACD;;AAEDH,qBAAUG,IAAIpD,eAAd;;AAEA;;AAEA,eAAIjB,KAAKuE,qBAAL,IAA8B,IAAlC,EAAwC;AACtCH,mBAAMpE,KAAKuE,qBAAL,EAAN;AACD;;AAEDJ,iBAAME,IAAIG,WAAJ,IAAmBH,IAAII,YAA7B;;AAEA,kBAAO;AACL9D,kBAAKyD,IAAIzD,GAAJ,IAAWwD,IAAIO,WAAJ,IAAmBR,QAAQ/E,SAAtC,KAAoD+E,QAAQS,SAAR,IAAqB,CAAzE,CADA;AAEL/D,mBAAMwD,IAAIxD,IAAJ,IAAYuD,IAAIS,WAAJ,IAAmBV,QAAQW,UAAvC,KAAsDX,QAAQY,UAAR,IAAsB,CAA5E;AAFD,YAAP;AAID,UA7EoB;AA8ErB3F,kBA9EqB,qBA8EX7H,KA9EW,EA8EJ;AACf,kBAAOmJ,SAAS,IAAT,EAAe,KAAf,EAAsBnJ,KAAtB,CAAP;AACD,UAhFoB;AAiFrBuN,mBAjFqB,sBAiFVvN,KAjFU,EAiFH;AAChB,kBAAOmJ,SAAS,IAAT,EAAe,MAAf,EAAuBnJ,KAAvB,CAAP;AACD;AAnFoB,QAAhB,EAoFJ,UAACA,KAAD,EAAQyN,GAAR,EAAgB;AACjB,aAAI,CAACxP,QAAQsK,SAAR,CAAkBkF,GAAlB,CAAL,EAA6B;AAC3B,kBAAOxP,QAAQsK,SAAR,CAAkBkF,GAAlB,IAAyBzN,KAAhC;AACD;AACF,QAxFM,CAAP;AAyFD;;;;;;mBA/PkBkI,Y;;;;;;;;;;;;;;;;;;KCXAwF,e;AAEnB,4BAAY5O,SAAZ,EAAuBG,EAAvB,EAA2B;AAAA;;AACzB,UAAK0O,QAAL,GAAiB7O,UAAU8O,GAAV,IAAiB9O,UAAU8O,GAAV,CAAc,UAAd,CAAlB,GAA+C9O,UAAU6C,GAAV,CAAc,UAAd,CAA/C,GAA2E,IAA3F;AACA,UAAKkM,2BAAL,GAAmCpQ,QAAQqQ,OAAR,CAAgBC,KAAhB,KAA0B,CAA1B,IAA+BtQ,QAAQqQ,OAAR,CAAgBE,KAAhB,GAAwB,CAA1F;AACA,UAAK/O,EAAL,GAAUA,EAAV;AACD;;;;mCAEagP,U,EAAYC,e,EAAiB;AACzCA,uBAAgB7B,KAAhB,CAAsB4B,UAAtB;AACA,cAAO,EAAP;AACD;;;mCAEa1J,O,EAAS;AACrBA,eAAQtG,OAAR,CAAgBqF,MAAhB;AACAiB,eAAQlG,KAAR,CAAcgF,QAAd;AACA,cAAO,EAAP;AACD;;;2CAEqB4K,U,EAAYC,e,EAAiB;AAAA;;AACjD,WAAI,CAAC,KAAKP,QAAV,EAAoB;AAClB,gBAAO,KAAK5I,aAAL,CAAmBkJ,UAAnB,EAA+BC,eAA/B,CAAP;AACD;;AAED,WAAI,KAAKL,2BAAT,EAAsC;AAAA;AACpC,eAAMM,WAAW,MAAKlP,EAAL,CAAQmP,KAAR,EAAjB;AACA;AACA,iBAAKT,QAAL,CAAcU,KAAd,CAAoBJ,UAApB,EAAgC,IAAhC,EAAsCC,eAAtC,EAAuD;AAAA,oBAAMC,SAASG,OAAT,EAAN;AAAA,YAAvD;;AAEA;AAAA,gBAAO,CAACH,SAASI,OAAV;AAAP;AALoC;;AAAA;AAMrC;;AAED;AACA,cAAO,CAAC,KAAKZ,QAAL,CAAcU,KAAd,CAAoBJ,UAApB,EAAgC,IAAhC,EAAsCC,eAAtC,CAAD,CAAP;AACD;;;2CAEqB3J,O,EAAS;AAAA;;AAC7B,WAAI,CAAC,KAAKoJ,QAAV,EAAoB;AAClB,gBAAO,KAAKa,aAAL,CAAmBjK,OAAnB,CAAP;AACD;;AAED,WAAI,KAAKsJ,2BAAT,EAAsC;AAAA;AACpC,eAAMM,WAAW,OAAKlP,EAAL,CAAQmP,KAAR,EAAjB;AACA,kBAAKT,QAAL,CAAcc,KAAd,CAAoBlK,QAAQtG,OAA5B,EAAqC,YAAM;AACzCsG,qBAAQlG,KAAR,CAAcgF,QAAd;AACA,oBAAO8K,SAASG,OAAT,EAAP;AACD,YAHD;;AAKA;AAAA,gBAAO,CAACH,SAASI,OAAV;AAAP;AAPoC;;AAAA;AAQrC;;AAED,cAAO,CAAE,KAAKZ,QAAL,CAAcc,KAAd,CAAoBlK,QAAQtG,OAA5B,CAAD,CAAuCsI,IAAvC,CAA4C;AAAA,gBAAMhC,QAAQlG,KAAR,CAAcgF,QAAd,EAAN;AAAA,QAA5C,CAAD,CAAP;AACD;;;;;;mBApDkBqK,e;;;;;;;;;;;mBCAGgB,Y;AAAT,UAASA,YAAT,CAAsBvN,eAAtB,EAAuCP,UAAvC,EAAmD;AAChE,OAAMQ,SAASa,OAAO0M,MAAP,CAAcC,MAAMrG,SAApB,CAAf;;AAEA9K,WAAQoR,MAAR,CAAezN,MAAf,EAAuB;AACrB0N,WAAMlO,UADe;;AAGrByD,UAHqB,iBAGfrD,UAHe,EAGH;AAChBI,cAAOkC,MAAP,CAAc,CAAd,EAAiBlC,OAAOgB,MAAxB;AACAhB,cAAOgG,GAAP,GAAa,KAAb;AACAhG,cAAOkG,GAAP,GAAa,KAAb;AACAlG,cAAO6B,KAAP,GAAejC,UAAf;AACAI,cAAOuB,IAAP,GAAc3B,UAAd;AACAI,cAAO2N,QAAP,GAAkB/N,UAAlB;AACAI,cAAO4N,QAAP,GAAkBhO,UAAlB;AACAI,cAAO6N,YAAP,GAAsB,IAAtB;AACA7N,cAAO8N,YAAP,GAAsB,IAAtB;AACD,MAboB;AAerBrM,WAfqB,kBAedsM,KAfc,EAeP;AACZA,aAAM3Q,OAAN,CAAc,UAACsE,IAAD,EAAU;AACtB,WAAE1B,OAAOuB,IAAT;AACAvB,gBAAOgO,MAAP,CAAc,QAAd,EAAwBtM,IAAxB;AACD,QAHD;AAIA1B,cAAO4N,QAAP,GAAkB5N,OAAOgG,GAAP,GAAahG,OAAOuB,IAAP,GAAc,CAA3B,GAA+B9B,KAAKC,GAAL,CAASM,OAAOuB,IAAP,GAAc,CAAvB,EAA0BvB,OAAO4N,QAAjC,CAAjD;AACD,MArBoB;AAuBrB9L,YAvBqB,mBAuBbiM,KAvBa,EAuBN;AACbA,aAAME,OAAN,GAAgB7Q,OAAhB,CAAwB,UAACsE,IAAD,EAAU;AAChC,WAAE1B,OAAO6B,KAAT;AACA7B,gBAAOgO,MAAP,CAAc,SAAd,EAAyBtM,IAAzB;AACD,QAHD;AAIA1B,cAAO2N,QAAP,GAAkB3N,OAAOkG,GAAP,GAAalG,OAAO2N,QAAP,GAAkB3N,OAAO6B,KAAtC,GAA8CpC,KAAKyO,GAAL,CAASlO,OAAO6B,KAAhB,EAAuB7B,OAAO2N,QAA9B,CAAhE;AACD,MA7BoB;;;AA+BrB;;;;;;AAMAK,WArCqB,kBAqCdG,SArCc,EAqCHzM,IArCG,EAqCG;AACtB,WAAMyB,UAAU;AACdzB,eAAMA;AADQ,QAAhB;;AAIA,WAAIyM,YAAY,CAAZ,KAAkB,CAAtB,EAAyB;AAAC;AACxBhL,iBAAQoB,EAAR,GAAa,QAAb;AACAvE,gBAAOoO,MAAP,CAAcD,SAAd,EAAyB,CAAzB,EAA4BhL,OAA5B;AACD,QAHD,MAGO;AACLA,iBAAQoB,EAAR,GAAa4J,SAAb;AACA,iBAAQA,SAAR;AACE,gBAAK,QAAL;AACEnO,oBAAOyE,IAAP,CAAYtB,OAAZ;AACA;AACF,gBAAK,SAAL;AACEnD,oBAAOwE,OAAP,CAAerB,OAAf;AACA;AANJ;AAQD;AACF,MAxDoB;;;AA0DrB;AACAjB,WA3DqB,kBA2DdmM,IA3Dc,EA2DRC,IA3DQ,EA2DF;AACjB,WAAIjS,QAAQ8O,QAAR,CAAiBkD,IAAjB,CAAJ,EAA4B;AAC1B;AACA,cAAK,IAAI/J,IAAI+J,IAAb,EAAmB/J,IAAIgK,IAAvB,EAA6BhK,GAA7B,EAAkC;AAChCvE,2BAAgBqN,aAAhB,CAA8BpN,OAAOsE,CAAP,CAA9B;AACD;;AAED,gBAAOtE,OAAOoO,MAAP,CAAcC,IAAd,EAAoBC,OAAOD,IAA3B,CAAP;AACD;AACD;AACArO,cAAOoO,MAAP,CAAcpO,OAAOuO,OAAP,CAAeF,IAAf,CAAd,EAAoC,CAApC;;AAEA,cAAOtO,gBAAgByO,qBAAhB,CAAsCH,IAAtC,CAAP;AACD,MAxEoB;AA0ErB/I,oBA1EqB,2BA0ELmJ,QA1EK,EA0EK;AACxB,WAAI,CAACA,SAASzN,MAAd,EAAsB;AACpB,gBAAO,CAAP;AACD;AACD,WAAIiH,MAAMyG,OAAOC,SAAjB;AACA,WAAIC,SAASF,OAAOG,SAApB;AACAJ,gBAASrR,OAAT,CAAiB,UAAC+F,OAAD,EAAa;AAC5B,aAAIA,QAAQtG,OAAR,CAAgB,CAAhB,EAAmBwG,YAAvB,EAAqC;AACnC;AACA4E,iBAAMxI,KAAKyO,GAAL,CAASjG,GAAT,EAAc9E,QAAQtG,OAAR,CAAgB0O,MAAhB,GAAyBtD,GAAvC,CAAN;AACA2G,oBAASnP,KAAKC,GAAL,CAASkP,MAAT,EAAiBzL,QAAQtG,OAAR,CAAgB0O,MAAhB,GAAyBtD,GAAzB,GAA+B9E,QAAQtG,OAAR,CAAgBuO,WAAhB,CAA4B,IAA5B,CAAhD,CAAT;AACD;AACF,QAND;AAOA,cAAO3L,KAAKC,GAAL,CAAS,CAAT,EAAYkP,SAAS3G,GAArB,CAAP;AACD;AAxFoB,IAAvB;;AA4FA,UAAOjI,MAAP;AACD,E;;;;;;;;;;;mBC9FuB8O,Q;;AAFxB;;;;;;AAEe,UAASA,QAAT,CAAkB/O,eAAlB,EAAmCC,MAAnC,EAA2CnD,OAA3C,EAAoD0C,kBAApD,EAAwE5B,UAAxE,EAAoFgC,OAApF,EAA6F;AAC1G,OAAIoP,aAAa,IAAjB;AACA,OAAIC,gBAAgB,IAApB;AACA,OAAM7R,WAAWoC,sBAAsBA,mBAAmBpC,QAAzC,GAAoDoC,mBAAmBpC,QAAvE,GAAkFd,QAAQQ,OAAR,CAAgBH,MAAhB,CAAnG;AACA,OAAMQ,YAAYqC,sBAAsBA,mBAAmBrC,SAAzC,GAAqDqC,mBAAmBrC,SAAxE,GAAoF8G,SAAtG;AACA,OAAM/G,QAAQsC,sBAAsBA,mBAAmBtC,KAAzC,GAAiDsC,mBAAmBtC,KAApE,GAA4EU,UAA1F;;AAEAR,YAAS6J,GAAT,CAAa;AACX,wBAAmB,MADR;AAEX,mBAAc,MAFH;AAGX,gBAAW;AAHA,IAAb;;AAMA,YAASiI,aAAT,GAAyB;AACvB,YAAO9R,SAASiO,WAAT,KAAyBzL,OAAhC,CADuB,CACkB;AAC1C;;AAEDtD,WAAQoR,MAAR,CAAetQ,QAAf,EAAyB;AACvB+R,aADuB,sBACZ;AACT,cAAOjS,KAAP;AACD,MAHsB;AAKvB+E,0BALuB,iCAKDmN,QALC,EAKS;AAC9BJ,oBAAa,sBAAYI,QAAZ,CAAb;AACAH,uBAAgB,sBAAYG,QAAZ,CAAhB;AACAtS,eAAQ8N,MAAR,CAAeoE,UAAf;AACAlS,eAAQoO,KAAR,CAAc+D,aAAd;AACD,MAVsB;AAYvBxM,wBAZuB,iCAYD;AACpB,WAAItF,aAAaA,cAAcC,QAA/B,EAAyC;AACvCA,kBAAS6J,GAAT,CAAa,QAAb,EAAuBtK,OAAO8L,gBAAP,CAAwBtL,UAAU,CAAV,CAAxB,EAAsCkG,MAA7D;AACD;AACF,MAhBsB;AAkBvBgM,kBAlBuB,2BAkBP;AACd,WAAIzI,eAAexJ,SAAS,CAAT,EAAYwJ,YAA/B;AACAA,sBAAeA,gBAAgB,IAAhB,GAAuBA,YAAvB,GAAsCxJ,SAAS,CAAT,EAAYwK,QAAZ,CAAqBY,eAArB,CAAqC5B,YAA1F;AACA,cAAOA,eAAeqI,cAAc5L,MAAd,EAAtB;AACD,MAtBsB;AAwBvBlC,eAxBuB,wBAwBV;AACX,cAAO6N,WAAW3L,MAAX,EAAP;AACD,MA1BsB;AA4BvBiM,qBA5BuB,8BA4BJ;AACjB,cAAOlS,SAASsJ,SAAT,KAAuBtJ,SAASiO,WAAT,EAA9B;AACD,MA9BsB;AAgCvBkE,kBAhCuB,2BAgCP;AACd,cAAOnS,SAASsJ,SAAT,EAAP;AACD,MAlCsB;AAoCvB9C,kBApCuB,yBAoCT4L,CApCS,EAoCNxL,OApCM,EAoCG;AACxB,cAAOhE,gBAAgB4D,aAAhB,CAA8B4L,CAA9B,EAAiCxL,WAAWgL,UAA5C,CAAP;AACD,MAtCsB;AAwCvBpK,0BAxCuB,iCAwCD4K,CAxCC,EAwCExL,OAxCF,EAwCW;AAChC,cAAOhE,gBAAgB4E,qBAAhB,CAAsC4K,CAAtC,EAAyCxL,WAAWgL,UAApD,CAAP;AACD,MA1CsB;AA4CvB1J,qBA5CuB,8BA4CJ;AACjB,cAAO,CAACrF,OAAOgG,GAAR,IAAe7I,SAASiS,aAAT,KAA2BjS,SAASkS,gBAAT,KAA8BJ,eAA/E;AACD,MA9CsB;AAgDvB9I,eAhDuB,wBAgDV;AACX;AACA,WAAIqJ,UAAU,CAAd;AACA,WAAIC,gBAAgB,CAApB;AACA,WAAIC,aAAa,CAAjB;AACA,WAAIC,mBAAmBxS,SAASiS,aAAT,KAA2BjS,SAASkS,gBAAT,EAA3B,GAAyDJ,eAAhF;;AAEA,YAAK,IAAI3K,IAAItE,OAAOgB,MAAP,GAAgB,CAA7B,EAAgCsD,KAAK,CAArC,EAAwCA,GAAxC,EAA6C;AAC3CoL,sBAAa1P,OAAOsE,CAAP,EAAUzH,OAAV,CAAkBuO,WAAlB,CAA8B,IAA9B,CAAb;AACA,aAAIqE,gBAAgBC,UAAhB,GAA6BC,gBAAjC,EAAmD;AACjD;AACD;AACDX,uBAAcY,KAAd,CAAoBC,GAApB,CAAwB7P,OAAOsE,CAAP,CAAxB;AACAmL,0BAAiBC,UAAjB;AACAF;AACD;;AAED,WAAIA,UAAU,CAAd,EAAiB;AACfxP,gBAAOgG,GAAP,GAAa,KAAb;AACAhG,gBAAOkC,MAAP,CAAclC,OAAOgB,MAAP,GAAgBwO,OAA9B,EAAuCxP,OAAOgB,MAA9C;AACAhB,gBAAOuB,IAAP,IAAeiO,OAAf;AACArS,kBAASgE,aAAT;AACD;AACF,MAvEsB;AAyEvBsE,kBAzEuB,2BAyEP;AACd,cAAO,CAACzF,OAAOkG,GAAR,IAAgB/I,SAAS+D,UAAT,KAAwB/D,SAASmS,aAAT,KAA2BL,eAA1E;AACD,MA3EsB;AA6EvBhJ,YA7EuB,qBA6Eb;AACR;AACA,WAAIuJ,UAAU,CAAd;AACA,WAAIC,gBAAgB,CAApB;AACA,WAAIC,aAAa,CAAjB;AACA,WAAIC,mBAAmBxS,SAASmS,aAAT,KAA2BnS,SAAS+D,UAAT,EAA3B,GAAmD+N,eAA1E;;AAEA,YAAK,IAAI3K,IAAI,CAAb,EAAgBA,IAAItE,OAAOgB,MAA3B,EAAmCsD,GAAnC,EAAwC;AACtCoL,sBAAa1P,OAAOsE,CAAP,EAAUzH,OAAV,CAAkBuO,WAAlB,CAA8B,IAA9B,CAAb;AACA,aAAIqE,gBAAgBC,UAAhB,GAA6BC,gBAAjC,EAAmD;AACjD;AACD;AACDZ,oBAAWa,KAAX,CAAiBC,GAAjB,CAAqB7P,OAAOsE,CAAP,CAArB;AACAmL,0BAAiBC,UAAjB;AACAF;AACD;;AAED,WAAIA,UAAU,CAAd,EAAiB;AACf;AACA;AACAT,oBAAW3L,MAAX,CAAkB2L,WAAW3L,MAAX,KAAsBqM,aAAxC;AACAzP,gBAAOkG,GAAP,GAAa,KAAb;AACAlG,gBAAOkC,MAAP,CAAc,CAAd,EAAiBsN,OAAjB;AACAxP,gBAAO6B,KAAP,IAAgB2N,OAAhB;AACD;AACF,MAtGsB;AAwGvBrO,kBAxGuB,2BAwGP;AACd,WAAI,CAACnB,OAAOgB,MAAZ,EAAoB;AAClB;AACD;;AAED;AACA,WAAI8O,mBAAmBf,WAAWa,KAAX,CAAiBG,MAAjB,CAAwB,UAACC,IAAD,EAAOtO,IAAP;AAAA,gBAAgBsO,QAAQtO,KAAKF,KAAL,GAAaxB,OAAO6B,KAApB,GAA4BH,KAAK0B,MAAjC,GAA0C,CAAlD,CAAhB;AAAA,QAAxB,EAA8F,CAA9F,CAAvB;AACA,WAAI6M,sBAAsBjB,cAAcY,KAAd,CAAoBG,MAApB,CAA2B,UAACC,IAAD,EAAOtO,IAAP;AAAA,gBAAgBsO,QAAQtO,KAAKF,KAAL,IAAcxB,OAAOuB,IAArB,GAA4BG,KAAK0B,MAAjC,GAA0C,CAAlD,CAAhB;AAAA,QAA3B,EAAiG,CAAjG,CAA1B;;AAEA;AACA,WAAI8M,qBAAqBlQ,OAAO+P,MAAP,CAAc,UAACC,IAAD,EAAOtO,IAAP;AAAA,gBAAgBsO,OAAOtO,KAAK7E,OAAL,CAAauO,WAAb,CAAyB,IAAzB,CAAvB;AAAA,QAAd,EAAqE,CAArE,CAAzB;AACA,WAAI+E,oBAAoB,CAACD,qBAAqBJ,gBAArB,GAAwCG,mBAAzC,KAAiEjQ,OAAO4N,QAAP,GAAkB5N,OAAO2N,QAAzB,GAAoC,CAArG,CAAxB;;AAEA;AACA,WAAIyC,mBAAmBpQ,OAAO6N,YAAP,KAAwB,IAAxB,IAAgC7N,OAAO2N,QAAP,GAAkB3N,OAAO6N,YAAhF;AACA,WAAIwC,sBAAsBrQ,OAAO8N,YAAP,KAAwB,IAAxB,IAAgC9N,OAAO4N,QAAP,GAAkB5N,OAAO8N,YAAnF;AACA,WAAIwC,sBAAsBF,mBAAmB,CAACpQ,OAAO2N,QAAP,GAAkB3N,OAAO6N,YAA1B,IAA0CsC,iBAA7D,GAAiF,CAA3G;AACA,WAAII,yBAAyBF,sBAAsB,CAACrQ,OAAO8N,YAAP,GAAsB9N,OAAO4N,QAA9B,IAA0CuC,iBAAhE,GAAoF,CAAjH;;AAEA;AACApB,kBAAW3L,MAAX,CAAkB0M,mBAAmBQ,mBAArC;AACAtB,qBAAc5L,MAAd,CAAqB6M,sBAAsBM,sBAA3C;AACD,MA9HsB;AAgIvBnP,oCAhIuB,2CAgISH,mBAhIT,EAgI8B;AACnD;AACA,WAAIjB,OAAO6N,YAAP,KAAwB,IAAxB,IAAgC7N,OAAO2N,QAAP,GAAkB3N,OAAO6N,YAA7D,EAA2E;AACzE,aAAI2C,OAAOzB,WAAW3L,MAAX,KAAsBnC,mBAAjC;AACA9D,kBAASsJ,SAAT,CAAmBtJ,SAASsJ,SAAT,KAAuB+J,IAA1C;AACD;AACF,MAtIsB;AAwIvB1K,gCAxIuB,uCAwIKb,OAxIL,EAwIc;AACnC,WAAI,CAACA,QAAQJ,SAAR,CAAkB7D,MAAvB,EACE;AACF,WAAMoC,SAASpD,OAAOsF,eAAP,CAAuBL,QAAQJ,SAA/B,CAAf;AACA,WAAM4L,gBAAgB1B,WAAW3L,MAAX,KAAsBA,MAA5C;AACA,WAAIqN,iBAAiB,CAArB,EAAwB;AACtB1B,oBAAW3L,MAAX,CAAkBqN,aAAlB;AACD,QAFD,MAGK;AACH1B,oBAAW3L,MAAX,CAAkB,CAAlB;AACAjG,kBAASsJ,SAAT,CAAmBtJ,SAASsJ,SAAT,KAAuBgK,aAA1C;AACD;AACF,MApJsB;AAsJvB3N,oBAtJuB,6BAsJL;AAChBiM,kBAAW3L,MAAX,CAAkB,CAAlB;AACA2L,kBAAWa,KAAX,CAAiBc,KAAjB;AACD,MAzJsB;AA2JvB3N,uBA3JuB,gCA2JF;AACnBiM,qBAAc5L,MAAd,CAAqB,CAArB;AACA4L,qBAAcY,KAAd,CAAoBc,KAApB;AACD;AA9JsB,IAAzB;;AAiKA,UAAOvT,QAAP;AACD,E;;;;;;;;;;;mBC7JuBwT,O;AAxBxB,UAASC,KAAT,GAAiB;AACf,OAAMhB,QAAQ/O,OAAO0M,MAAP,CAAcC,MAAMrG,SAApB,CAAd;;AAEA9K,WAAQoR,MAAR,CAAemC,KAAf,EAAsB;AACpBC,QADoB,eAChBnO,IADgB,EACV;AACR,YAAK,IAAI4C,IAAIsL,MAAM5O,MAAN,GAAe,CAA5B,EAA+BsD,KAAK,CAApC,EAAuCA,GAAvC,EAA4C;AAC1C,aAAIsL,MAAMtL,CAAN,EAAS9C,KAAT,KAAmBE,KAAKzE,KAAL,CAAW2H,MAAlC,EAA0C;AACxCgL,iBAAMtL,CAAN,EAASlB,MAAT,GAAkB1B,KAAK7E,OAAL,CAAauO,WAAb,EAAlB;AACA;AACD;AACF;AACDwE,aAAMnL,IAAN,CAAW;AACTjD,gBAAOE,KAAKzE,KAAL,CAAW2H,MADT;AAETxB,iBAAQ1B,KAAK7E,OAAL,CAAauO,WAAb;AAFC,QAAX;AAID,MAZmB;AAapBsF,UAboB,mBAaZ;AACNd,aAAM5O,MAAN,GAAe,CAAf;AACD;AAfmB,IAAtB;;AAkBA,UAAO4O,KAAP;AACD;;AAEc,UAASe,OAAT,CAAiBxB,QAAjB,EAA2B;AACxC,OAAIrQ,eAAJ;;AAEA,WAAQqQ,SAAS5R,OAAjB;AACE,UAAK,IAAL;AACE,aAAM,IAAImB,KAAJ,4CAAmDyQ,SAAS5R,OAA5D,8BAA4F4R,SAASjE,SAArG,CAAN;AACF,UAAK,IAAL;AACE,WAAI2F,QAAQxU,QAAQQ,OAAR,CAAgB,8CAAhB,CAAZ;AACAiC,gBAAS+R,MAAMC,IAAN,CAAW,IAAX,CAAT;AACA;AACF,UAAK,IAAL;AACEhS,gBAASzC,QAAQQ,OAAR,CAAgB,WAAhB,CAAT;AACA;AACF;AACEiC,gBAASzC,QAAQQ,OAAR,CAAgB,aAAhB,CAAT;AAXJ;;AAcAiC,UAAO8Q,KAAP,GAAe,IAAIgB,KAAJ,EAAf;;AAEA,UAAO9R,MAAP;AACD,E;;;;;;;;;;;;;;;;AC5CD,UAASiS,QAAT,CAAkB9T,KAAlB,EAAyB+T,IAAzB,EAA+B;AAC7B,OAAI,CAAC/T,KAAL,EAAY;AACV;AACD;AACD,OAAIA,MAAMgU,cAAN,CAAqBD,IAArB,KAA8BnQ,OAAOqQ,cAAP,CAAsBjU,MAAM+T,IAAN,CAAtB,EAAmCG,WAAnC,CAA+CF,cAA/C,CAA8D,SAA9D,CAAlC,EAA4G;AAC1G,YAAOhU,MAAM+T,IAAN,CAAP;AACD;AACD,UAAOD,SAAS9T,MAAMmU,OAAf,EAAwBJ,IAAxB,CAAP;AACD;;AAED,UAASK,UAAT,CAAoBC,IAApB,EAA0BrU,KAA1B,EAAiCJ,OAAjC,EAA0C;AACxC,OAAI,CAACyU,IAAD,IAAS,EAAEA,OAAOA,KAAKC,OAAL,CAAa,aAAb,EAA4B,EAA5B,CAAT,CAAb,EAAwD;AACtD;AACD;;AAED,OAAIC,WAAWF,KAAK9S,KAAL,CAAW,sBAAX,CAAf;AACA,OAAIiT,WAAWH,KAAK9S,KAAL,CAAW,iBAAX,CAAf;;AAEA,OAAIgT,YAAYA,SAASxQ,MAAT,KAAoB,CAApC,EAAuC;AAAE;AACvCtE,YAAOe,OAAP,CAAeiU,IAAf,CAAoB,kHAApB;AACA,SAAIV,OAAOQ,SAAS,CAAT,CAAX;AACA,SAAIG,OAAOH,SAAS,CAAT,CAAX;AACA,SAAII,YAAY/U,OAAhB;AACA,YAAO+U,UAAU5Q,MAAjB,EAAyB;AACvB,WAAI6Q,iBAAiBD,UAAU3U,KAAV,EAArB,CADuB,CACiB;AACxC,WAAI6U,gBAAgB,CAACF,UAAUN,IAAV,CAAe,eAAf,KAAmC,EAApC,EAAwC9S,KAAxC,CAA8C,2CAA9C,CAApB;AACA,WAAIsT,iBAAiBA,cAAc,CAAd,MAAqBd,IAA1C,EAAgD;AAC9C,gBAAO;AACLe,mBAAQF,cADH;AAEL/I,mBAAQ6I;AAFH,UAAP;AAID;AACDC,mBAAYA,UAAU9G,MAAV,EAAZ;AACD;AACD,WAAM,IAAIpM,KAAJ,CAAU,qFAAqFsS,IAArF,GAA4F,eAA5F,GAA8GW,IAA9G,GAAqH,GAA/H,CAAN;AACD,IAjBD,MAkBK,IAAIF,YAAYA,SAASzQ,MAAT,KAAoB,CAApC,EAAuC;AAAE;AAC5C,SAAIgQ,QAAOS,SAAS,CAAT,CAAX;AACA,SAAIE,QAAOF,SAAS,CAAT,CAAX;AACA,SAAIO,YAAYjB,SAAS9T,KAAT,EAAgB+T,KAAhB,CAAhB;AACA,SAAIgB,SAAJ,EAAe;AACb,cAAO;AACLD,iBAAQC,SADH;AAELlJ,iBAAQ6I;AAFH,QAAP;AAID;AACF;;AAED,UAAO;AACLI,aAAQ9U,KADH;AAEL6L,aAAQwI;AAFH,IAAP;AAID;;KAEKW,O;AAEJ,oBAAY9U,QAAZ,EAAsB6C,MAAtB,EAA8BE,YAA9B,EAA4CC,MAA5C,EAAoD9B,KAApD,EAA2DP,MAA3D,EAAmEjB,OAAnE,EAA4E;AAAA;;AAC1E,UAAKM,QAAL,GAAgBA,QAAhB;AACA,UAAK6C,MAAL,GAAcA,MAAd;AACA,UAAKE,YAAL,GAAoBA,YAApB;AACA,UAAKC,MAAL,GAAcA,MAAd;;AAEA,UAAK+R,aAAL,GAAqB,EAArB;AACA,UAAKC,aAAL,CAAmB9T,KAAnB,EAA0BP,MAA1B,EAAkCjB,OAAlC;AACA,UAAKuV,qBAAL,CAA2B/T,KAA3B,EAAkCP,MAAlC,EAA0CjB,OAA1C;;AAEA,UAAKwJ,SAAL,GAAiB,KAAjB;AACA,UAAKC,QAAL,GAAgB,KAAhB;AACD;;;;mCAEajI,K,EAAOP,M,EAAQjB,O,EAAS;AACpC,WAAIwV,OAAOhB,WAAWhT,MAAM4B,OAAjB,EAA0B,KAAK9C,QAAL,CAAc+R,QAAd,EAA1B,EAAoDrS,OAApD,CAAX;;AAEA,WAAIwV,IAAJ,EAAU;AACR,aAAI;AACFvU,kBAAOuU,KAAKvJ,MAAZ,EAAoBwJ,MAApB,CAA2BD,KAAKN,MAAhC,EAAwC,EAAxC;AACA,eAAIQ,iBAAiBzU,OAAOuU,KAAKvJ,MAAZ,EAAoBuJ,KAAKN,MAAzB,CAArB;;AAEA1V,mBAAQoR,MAAR,CAAe8E,cAAf,EAA+B,KAAKL,aAApC;AACA,gBAAKA,aAAL,GAAqBK,cAArB;AACD,UAND,CAOA,OAAOC,KAAP,EAAc;AACZA,iBAAMC,OAAN,GAAgB,0EACEpU,MAAM4B,OADR,wBAEduS,MAAMC,OAFR;AAGA,iBAAMD,KAAN;AACD;AACF;AACF;;;2CAEqBnU,K,EAAOP,M,EAAQjB,O,EAAS;AAAA;;AAC5C;AACA,WAAM6V,gBAAgB,CAAC,QAAD,EAAW,cAAX,EAA2B,QAA3B,EAAqC,SAArC,EAAgD,OAAhD,EAAyD,OAAzD,EAAkE,SAAlE,CAAtB;AACA,YAAK,IAAIpO,IAAIoO,cAAc1R,MAAd,GAAuB,CAApC,EAAuCsD,KAAK,CAA5C,EAA+CA,GAA/C,EAAoD;AAClD,cAAK4N,aAAL,CAAmBQ,cAAcpO,CAAd,CAAnB,IAAuC,KAAKoO,cAAcpO,CAAd,CAAL,EAAuB/B,IAAvB,CAA4B,IAA5B,CAAvC;AACD;;AAED;AACA,WAAMoQ,cAAc,CAAC,WAAD,EAAc,YAAd,EAA4B,mBAA5B,EAAiD,iBAAjD,CAApB;;AAR4C,kCASnCrO,EATmC;AAU1C,aAAIsO,iBAAJ;AAAA,aAAcC,mBAAd;AACA,aAAIR,OAAOhB,WAAWhT,MAAMsU,YAAYrO,EAAZ,CAAN,CAAX,EAAkC,MAAKnH,QAAL,CAAc+R,QAAd,EAAlC,EAA4DrS,OAA5D,CAAX;AACA,aAAIwV,IAAJ,EAAU;AACRQ,wBAAa/U,OAAOuU,KAAKvJ,MAAZ,EAAoBwJ,MAAjC;AACD;AACDzR,gBAAOJ,cAAP,QAA4BkS,YAAYrO,EAAZ,CAA5B,EAA4C;AAC1C/D,gBAAK;AAAA,oBAAMqS,QAAN;AAAA,YADqC;AAE1C7R,gBAAK,aAACnC,KAAD,EAAW;AACdgU,wBAAWhU,KAAX;AACA,iBAAIiU,UAAJ,EAAgB;AACdA,0BAAWR,KAAKN,MAAhB,EAAwBnT,KAAxB;AACD;AACD,mBAAKsT,aAAL,CAAmBS,YAAYrO,EAAZ,CAAnB,IAAqC1F,KAArC;AACD;AARyC,UAA5C;AAf0C;;AAS5C,YAAK,IAAI0F,KAAIqO,YAAY3R,MAAZ,GAAqB,CAAlC,EAAqCsD,MAAK,CAA1C,EAA6CA,IAA7C,EAAkD;AAAA,eAAzCA,EAAyC;AAgBjD;;AAED;AACAzD,cAAOJ,cAAP,CAAsB,KAAKyR,aAA3B,EAA0C,UAA1C,EAAsD;AACpD3R,cAAK;AAAA,kBAAM,MAAK+F,QAAX;AAAA,UAD+C;AAEpDvF,cAAK,aAACnC,KAAD;AAAA,kBAAY,EAAE,MAAK0H,QAAL,GAAgB1H,KAAlB,CAAD,GAA6B,MAAKsB,YAAL,EAA7B,GAAmD,IAA9D;AAAA;AAF+C,QAAtD;AAID;;;6BAEOtB,K,EAAO;AACb,YAAK,WAAL,IAAoBA,KAApB;AACD;;;6BAEO;AACN,cAAO,KAAKoB,MAAL,CAAYkG,GAAnB;AACD;;;6BAEO;AACN,cAAO,KAAKlG,MAAL,CAAYgG,GAAnB;AACD;;;+BAES;AACR,cAAO,CAAC,KAAKhG,MAAL,CAAYgB,MAApB;AACD;;;kCAEYqN,I,EAAMC,I,EAAM;AAAA;;AACvB,WAAIjS,QAAQiE,UAAR,CAAmB+N,IAAnB,CAAJ,EAA8B;AAC5B;AACA,cAAKrO,MAAL,CAAY8S,KAAZ,CAAkB,CAAlB,EAAqB1V,OAArB,CAA6B,UAAC+F,OAAD,EAAa;AACxC;AACA;AACA,kBAAK4P,WAAL,CAAiB5P,OAAjB,EAA0BkL,KAAKlL,QAAQzB,IAAb,EAAmByB,QAAQlG,KAA3B,EAAkCkG,QAAQtG,OAA1C,CAA1B;AACD,UAJD;AAKD,QAPD,MAOO;AACL;AACA,aAAIwR,OAAO,CAAP,KAAa,CAAjB,EAAoB;AAAC;AACnB,iBAAM,IAAI3P,KAAJ,CAAU,oBAAoB2P,IAApB,GAA2B,uBAArC,CAAN;AACD;;AAED,aAAM7M,QAAQ6M,OAAO,KAAKrO,MAAL,CAAY6B,KAAjC;AACA,aAAKL,SAAS,CAAT,IAAcA,QAAQ,KAAKxB,MAAL,CAAYgB,MAAvC,EAAgD;AAC9C,gBAAK+R,WAAL,CAAiB,KAAK/S,MAAL,CAAYwB,KAAZ,CAAjB,EAAqC8M,IAArC;AACD;AACF;;AAED,YAAKpO,YAAL;AACD;;;4BAEM8S,Q,EAAU;AACf,YAAKhT,MAAL,CAAYyB,MAAZ,CAAmBuR,QAAnB;AACA,YAAK9S,YAAL;AACD;;;6BAEO8S,Q,EAAU;AAChB,YAAKhT,MAAL,CAAY8B,OAAZ,CAAoBkR,QAApB;AACA,YAAK9S,YAAL;AACD;;;2CAEqB;AACpB,WAAIwB,aAAJ;AAAA,WAAUgO,mBAAV;AAAA,WAAsBuD,gBAAtB;AAAA,WAA+BC,iBAA/B;AAAA,WAAyCC,SAAS,IAAlD;AACA,WAAIC,YAAY,CAAhB;AACA,YAAK,IAAI9O,IAAI,CAAb,EAAgBA,IAAI,KAAKtE,MAAL,CAAYgB,MAAhC,EAAwCsD,GAAxC,EAA6C;AAC3C5C,gBAAO,KAAK1B,MAAL,CAAYsE,CAAZ,CAAP;AACA2O,mBAAUvR,KAAK7E,OAAL,CAAa0O,MAAb,GAAsBtD,GAAhC;AACAiL,oBAAWC,WAAWF,OAAtB;AACAE,kBAASF,OAAT;AACA,aAAIC,QAAJ,EAAc;AACZxD,wBAAahO,KAAK7E,OAAL,CAAauO,WAAb,CAAyB,IAAzB,CAAb;AACD;AACD,aAAI8H,YAAa,KAAK/V,QAAL,CAAc+D,UAAd,KAA6BkS,SAA7B,GAAyC1D,UAAzC,IAAuD,KAAKvS,QAAL,CAAcmS,aAAd,EAAxE,EAAwG;AACtG8D,wBAAa1D,UAAb;AACD,UAFD,MAEO;AACL,eAAIwD,QAAJ,EAAc;AACZ,kBAAK,YAAL,IAAqBxR,KAAKA,IAA1B;AACA,kBAAK,mBAAL,IAA4BA,KAAK7E,OAAjC;AACA,kBAAK,iBAAL,IAA0B6E,KAAKzE,KAA/B;AACD;AACD;AACD;AACF;AACF;;;iCAEWkG,O,EAAS6P,Q,EAAU;AAAA;;AAC7B,WAAI,CAAC3W,QAAQgX,OAAR,CAAgBL,QAAhB,CAAL,EAAgC;AAC9B;AACD;;AAED,WAAIM,eAAJ;AACA,WAAIC,MAAO,KAAKvT,MAAL,CAAYuO,OAAZ,CAAoBpL,OAApB,CAAD,GAAiC,CAA3C;;AAEA6P,gBAAS/E,OAAT,GAAmB7Q,OAAnB,CAA2B,UAACoW,OAAD,EAAa;AACtC,aAAIA,YAAYrQ,QAAQzB,IAAxB,EAA8B;AAC5B4R,oBAAS,IAAT;AACAC;AACD,UAHD,MAGO;AACL,kBAAKvT,MAAL,CAAYgO,MAAZ,CAAmBuF,GAAnB,EAAwBC,OAAxB;AACD;AACF,QAPD;;AASA,WAAI,CAACF,MAAL,EAAa;AACXnQ,iBAAQoB,EAAR,GAAa,QAAb;AACD;AACF;;;;;;mBAIY0N,O","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0a8b101f02aaa0804c9e","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 /**\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","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);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","function findCtrl(scope, ctrl) {\r\n if (!scope) {\r\n return;\r\n }\r\n if (scope.hasOwnProperty(ctrl) && Object.getPrototypeOf(scope[ctrl]).constructor.hasOwnProperty('$inject')) {\r\n return scope[ctrl];\r\n }\r\n return findCtrl(scope.$parent, ctrl);\r\n}\r\n\r\nfunction assignAttr(attr, scope, element) {\r\n if (!attr || !(attr = attr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n\r\n let onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\r\n let asSyntax = attr.match(/^([^.]+)\\.(.+)?/);\r\n\r\n if (onSyntax && onSyntax.length === 4) { // controller on (backward compatibility), deprecated since v1.6.1\r\n window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\r\n let ctrl = onSyntax[3];\r\n let tail = onSyntax[1];\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[1] === ctrl) {\r\n return {\r\n target: candidateScope,\r\n source: tail\r\n };\r\n }\r\n candidate = candidate.parent();\r\n }\r\n throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\r\n }\r\n else if (asSyntax && asSyntax.length === 3) { // controller as\r\n let ctrl = asSyntax[1];\r\n let tail = asSyntax[2];\r\n let foundCtrl = findCtrl(scope, ctrl);\r\n if (foundCtrl) {\r\n return {\r\n target: foundCtrl,\r\n source: tail\r\n };\r\n }\r\n }\r\n\r\n return {\r\n target: scope,\r\n source: attr\r\n };\r\n}\r\n\r\nclass Adapter {\r\n\r\n constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element) {\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n this.adjustBuffer = adjustBuffer;\r\n this.reload = reload;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr, $parse, element);\r\n this.generatePublicContext($attr, $parse, element);\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n }\r\n\r\n assignAdapter($attr, $parse, element) {\r\n let data = assignAttr($attr.adapter, this.viewport.getScope(), element);\r\n\r\n if (data) {\r\n try {\r\n $parse(data.source).assign(data.target, {});\r\n let adapterOnScope = $parse(data.source)(data.target);\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${$attr.adapter}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n generatePublicContext($attr, $parse, element) {\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'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, assignProp;\r\n let data = assignAttr($attr[publicProps[i]], this.viewport.getScope(), element);\r\n if (data) {\r\n assignProp = $parse(data.source).assign;\r\n }\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n if (assignProp) {\r\n assignProp(data.target, value);\r\n }\r\n this.publicContext[publicProps[i]] = value;\r\n }\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.adjustBuffer() : 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 applyUpdates(arg1, arg2) {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\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, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - this.buffer.first;\r\n if ((index >= 0 && index < this.buffer.length)) {\r\n this.applyUpdate(this.buffer[index], arg2);\r\n }\r\n }\r\n\r\n this.adjustBuffer();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n calculateProperties() {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n item = this.buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n break;\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\r\n let keepIt;\r\n let pos = (this.buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n this.buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/ui-scroll.min.js b/dist/ui-scroll.min.js index 5d0f5d96..7ad3c485 100644 --- a/dist/ui-scroll.min.js +++ b/dist/ui-scroll.min.js @@ -1,8 +1,8 @@ /*! * angular-ui-scroll (compressed) * https://github.com/angular-ui/ui-scroll - * Version: 1.6.0 -- 2017-02-15T02:04:11.552Z + * Version: 1.6.1 -- 2017-03-03T05:28:34.249Z * License: MIT */ -!function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}var i=n(1),o=r(i),a=n(2),u=r(a),l=n(3),c=r(l),s=n(4),f=r(s),d=n(6),h=r(d);angular.module("ui.scroll",[]).service("jqLiteExtras",function(){return new o.default}).run(["jqLiteExtras",function(e){return window.jQuery?null:e.registerFor(angular.element)}]).directive("uiScrollViewport",function(){return{restrict:"A",controller:["$scope","$element",function(e,t){var n=this;return this.container=t,this.viewport=t,angular.forEach(t.children(),function(e){"tbody"===e.tagName.toLowerCase()&&(n.viewport=angular.element(e))}),this}]}}).directive("uiScroll",["$log","$injector","$rootScope","$timeout","$q","$parse",function(e,t,n,r,i,o){function a(e,a,l,s,d){function p(t,n){var r=o(t)(e);return isNaN(r)?n:r}function m(e,t,n){var i=Object.getOwnPropertyDescriptor(e,t);i&&(i.set||i.get)||Object.defineProperty(e,t,{set:function(e){J[t]=e,r(function(){if(X[n]=e,!z.length){var r=Y.topDataPos();Y.adjustPadding(),"minIndex"===t&&Y.adjustScrollTopAfterMinIndexSet(r)}})},get:function(){return J[t]}})}function g(t){return t&&t!==q||e.$$destroyed}function v(){Y.bind("resize",L),Y.bind("scroll",L)}function b(){Y.unbind("resize",L),Y.unbind("scroll",L)}function y(){Y.resetTopPadding(),Y.resetBottomPadding(),arguments.length&&(W=arguments[0]),X.reset(W),T()}function x(e){return e.element.height()&&e.element[0].offsetParent}function w(e){x(e)&&(X.forEach(function(e){angular.isFunction(e.unregisterVisibilityWatcher)&&(e.unregisterVisibilityWatcher(),delete e.unregisterVisibilityWatcher)}),z.length||T())}function E(e,t){P(e,t,Y.insertElement),x(e)||(e.unregisterVisibilityWatcher=e.scope.$watch(function(){return w(e)})),e.element.addClass("ng-hide")}function P(e,t,n){var r=null,i=t>0?X[t-1].element:void 0;return d(function(t,o){r=n(t,i),e.element=t,e.scope=o,o[C]=e.item}),Q.transform&&Q.transform(e.scope,e.element),r}function $(){var e=[],t=[],n=[],r=[];return X.forEach(function(i,o){switch(i.op){case"prepend":t.unshift(i);break;case"append":E(i,o),i.op="none",r.push(i);break;case"insert":e=e.concat(P(i,o,Y.insertElementAnimated)),i.op="none",r.push(i);break;case"remove":n.push(i)}}),n.forEach(function(t){return e=e.concat(X.remove(t))}),t.length&&t.forEach(function(e){E(e),e.op="none"}),X.forEach(function(e,t){return e.scope.$index=X.first+t}),{prepended:t,removed:n,inserted:r,animated:e}}function j(e,t){t.animated.length?i.all(t.animated).then(function(){Y.adjustPadding(),T(e)}):Y.adjustPadding()}function I(e,t){Y.shouldLoadBottom()?(!t||X.effectiveHeight(t.inserted)>0)&&1===z.push(!0)&&(S(e),Q.loading(!0)):Y.shouldLoadTop()&&(!t||X.effectiveHeight(t.prepended)>0||z[0])&&1===z.push(!1)&&(S(e),Q.loading(!0))}function T(e){e||(z=[],e=++q);var t=$();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),g(e)||(j(e,t),I(e),z.length||Q.calculateProperties())})}function O(e){var t=$();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),Y.adjustScrollTopAfterPrepend(t),g(e)||(j(e,t),I(e,t),z.shift(),z.length?S(e):(Q.loading(!1),v(),Q.calculateProperties()))})}function S(e){z[0]?X.length&&!Y.shouldLoadBottom()?O(e):K(function(t){g(e)||(t.length0&&(Y.clipTop(),X.append(t)),O(e))}):X.length&&!Y.shouldLoadTop()?O(e):Z(function(t){g(e)||(t.length0&&(X.length&&Y.clipBottom(),X.prepend(t)),O(e))})}function L(){n.$$phase||Q.isLoading||Q.disabled||(I(q),z.length?b():(Q.calculateProperties(),e.$apply()))}function _(e){if(!Q.disabled){var t=Y[0].scrollTop,n=Y[0].scrollHeight-Y[0].clientHeight;(0===t&&!X.bof||t===n&&!X.eof)&&e.preventDefault()}}var A=l.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!A)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+l.uiScroll+"'");var H=3,M=10,V=.3,k=.5,U=null,C=A[1],D=A[2],B=s[0],F=Math.max(H,p(l.bufferSize,M)),N=Math.max(V,p(l.padding,k)),W=p(l.startIndex,1),q=0,z=[],R=new u.default(t,i),X=new c.default(R,F),Y=new f.default(R,X,a,B,N),Q=new h.default(n,o,l,Y,X,T,a);B&&(B.adapter=Q);var G=function(){return angular.isObject(U)&&angular.isFunction(U.get)};if(U=o(D)(e),!G()&&(U=t.get(D),!G()))throw new Error(D+" is not a valid datasource");var J={};m(U,"minIndex","minIndexUser"),m(U,"maxIndex","maxIndexUser");var K=2!==U.get.length?function(e){return U.get(X.next,F,e)}:function(e){U.get({index:X.next,append:X.length?X[X.length-1].item:void 0,count:F},e)},Z=2!==U.get.length?function(e){return U.get(X.first-F,F,e)}:function(e){U.get({index:X.first-F,prepend:X.length?X[0].item:void 0,count:F},e)};Q.reload=y,d(function(e,t){Y.createPaddingElements(e[0]),t.$destroy(),e.remove()}),e.$on("$destroy",function(){b(),Y.unbind("mousewheel",_)}),Y.bind("mousewheel",_),r(function(){Y.applyContainerStyle(),y()})}return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:a}}])},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(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&&u.return&&u.return()}finally{if(i)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=function(){function e(e,t){for(var n=0;n0?{base:a.base-a.padding-a.border,outer:a.base,outerfull:a.base+a.margin}[r]:(i=u(e),o=i[t],(o<0||null===o)&&(o=e.style[t]||0),o=parseFloat(o)||0,{base:o-a.padding-a.border,outer:o,outerfull:o+a.padding+a.border+a.margin}[r])}var o=void 0,a=void 0,u=void 0,l=void 0;return a=angular.element.prototype.css,e.prototype.css=function(e,t){var n=this,r=n[0];if(r&&3!==r.nodeType&&8!==r.nodeType&&r.style)return a.call(n,e,t)},l=function(e){return e&&e.document&&e.location&&e.alert&&e.setInterval},window.getComputedStyle?(u=function(e){return window.getComputedStyle(e,null)},o=function(e,t){return parseFloat(t)}):(u=function(e){return e.currentStyle},o=function(e,t){var n=void 0,r=void 0,i=void 0,o=void 0,a=void 0,u=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,l=new RegExp("^("+u+")(?!px)[a-z%]+$","i");return l.test(t)?(a=e.style,n=a.left,i=e.runtimeStyle,o=i&&i.left,i&&(i.left=a.left),a.left=t,r=a.pixelLeft,a.left=n,o&&(i.left=o),r):parseFloat(t)}),angular.forEach({before:function(e){var t,n,r,i,o,a,u;if(u=this,n=u[0],o=u.parent(),t=o.contents(),t[0]===n)return o.prepend(e);for(r=i=1,a=t.length-1;1<=a?i<=a:i>=a;r=1<=a?++i:--i)if(t[r]===n)return void angular.element(t[r-1]).after(e);throw new Error("invalid DOM structure "+n.outerHTML)},height:function(e){var t;return t=this,angular.isDefined(e)?(angular.isNumber(e)&&(e+="px"),a.call(t,"height",e)):i(this[0],"height","base")},outerHeight:function(e){return i(this[0],"height",e?"outerfull":"outer")},outerWidth:function(e){return i(this[0],"width",e?"outerfull":"outer")},offset:function(e){var t=void 0,n=void 0,r=this,i={top:0,left:0},o=r[0],a=o&&o.ownerDocument;if(arguments.length){if(void 0===e)return r;throw new Error("offset setter method is not implemented")}if(a)return t=a.documentElement,null!=o.getBoundingClientRect&&(i=o.getBoundingClientRect()),n=a.defaultView||a.parentWindow,{top:i.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:i.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}},scrollTop:function(e){return t(this,"top",e)},scrollLeft:function(e){return t(this,"left",e)}},function(t,n){if(!e.prototype[n])return e.prototype[n]=t})}}]),e}();t.default=o},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(){function e(e,t){for(var n=0;n=0&&(r=t[a].element.outerHeight(!0),!(n+r>i));a--)l.cache.add(t[a]),n+=r,e++;e>0&&(t.eof=!1,t.remove(t.length-e,t.length),t.next-=e,c.adjustPadding())},shouldLoadTop:function(){return!t.bof&&c.topDataPos()>c.topVisiblePos()-o()},clipTop:function(){for(var e=0,n=0,r=0,i=c.topVisiblePos()-c.topDataPos()-o(),a=0;ai));a++)u.cache.add(t[a]),n+=r,e++;e>0&&(u.height(u.height()+n),t.bof=!1,t.remove(0,e),t.first+=e)},adjustPadding:function(){if(t.length){var e=u.cache.reduce(function(e,n){return e+(n.index=t.next?n.height:0)},0),r=t.reduce(function(e,t){return e+t.element.outerHeight(!0)},0),i=(r+e+n)/(t.maxIndex-t.minIndex+1),o=null!==t.minIndexUser&&t.minIndex>t.minIndexUser,a=null!==t.maxIndexUser&&t.maxIndext.minIndexUser){var n=u.height()-e;c.scrollTop(c.scrollTop()+n)}},adjustScrollTopAfterPrepend:function(e){if(e.prepended.length){var n=t.effectiveHeight(e.prepended),r=u.height()-n;r>=0?u.height(r):(u.height(0),c.scrollTop(c.scrollTop()-r))}},resetTopPadding:function(){u.height(0),u.cache.clear()},resetBottomPadding:function(){l.height(0),l.cache.clear()}}),c}Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var o=n(5),a=r(o)},function(e,t){"use strict";function n(){var e=Object.create(Array.prototype);return angular.extend(e,{add:function(t){for(var n=e.length-1;n>=0;n--)if(e[n].index===t.scope.$index)return void(e[n].height=t.element.outerHeight());e.push({index:t.scope.$index,height:t.element.outerHeight()})},clear:function(){e.length=0}}),e}function r(e){var t=void 0;switch(e.tagName){case"dl":throw new Error("ui-scroll directive does not support <"+e.tagName+"> as a repeating tag: "+e.outerHTML);case"tr":var r=angular.element("
    ");t=r.find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t.cache=new n,t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r},function(e,t){"use strict";function n(e,t,n,r,i,o,a){function u(e){var r=n[e],i=c,o=void 0;if(r){var u=r.match(/^(\S+)(?:\s+on\s+(\w(?:\w|\d)*))?/);if(!u)throw new Error("Expected injection expression in form of 'target' or 'target on controller' but got '"+r+"'");var l=u[1],s=u[2],d=function(e,t){for(var n=a;n.length;){var r=n.scope(),o=(n.attr("ng-controller")||"").match(/(\w(?:\w|\d)*)(?:\s+as\s+(\w(?:\w|\d)*))?/);if(o&&o[t?1:2]===e)return i=r,!0;if(!t&&r&&r.hasOwnProperty(e)&&Object.getPrototypeOf(r[e]).constructor.hasOwnProperty("$inject"))return i=r,!0;n=n.parent()}};if(s){if(i=null,d(s,!0),!i)throw new Error("Failed to locate target controller '"+s+"' to inject '"+l+"'")}else{var h=void 0,p=l.indexOf(".");p>0&&(h=l.substr(0,p),d(h,!1))}o=t(l).assign}return function(t){f!==t&&(f[e]=t),o&&o(i,t)}}function l(e,t){if(angular.isArray(t)){var n=void 0,r=i.indexOf(e)+1;t.reverse().forEach(function(t){t===e.item?(n=!0,r--):i.insert(r,t)}),n||(e.op="remove")}}var c=r.scope()||e,s=!1,f=this;u("adapter")(f);var d=u("topVisible"),h=u("topVisibleElement"),p=u("topVisibleScope"),m=u("isLoading");Object.defineProperty(this,"disabled",{get:function(){return s},set:function(e){return(s=e)?null:o()}}),this.isLoading=!1,this.isBOF=function(){return i.bof},this.isEOF=function(){return i.eof},this.isEmpty=function(){return!i.length},this.applyUpdates=function(e,t){if(angular.isFunction(e))i.slice(0).forEach(function(t){l(t,e(t.item,t.scope,t.element))});else{if(e%1!==0)throw new Error("applyUpdates - "+e+" is not a valid index");var n=e-i.first;n>=0&&n0?X[t-1].element:void 0;return d(function(t,o){r=n(t,i),e.element=t,e.scope=o,o[U]=e.item}),Q.transform&&Q.transform(e.scope,e.element),r}function j(){var e=[],t=[],n=[],r=[];return X.forEach(function(i,o){switch(i.op){case"prepend":t.unshift(i);break;case"append":E(i,o),i.op="none",r.push(i);break;case"insert":e=e.concat(P(i,o,Y.insertElementAnimated)),i.op="none",r.push(i);break;case"remove":n.push(i)}}),n.forEach(function(t){return e=e.concat(X.remove(t))}),t.length&&t.forEach(function(e){E(e),e.op="none"}),X.forEach(function(e,t){return e.scope.$index=X.first+t}),{prepended:t,removed:n,inserted:r,animated:e}}function $(e,t){t.animated.length?i.all(t.animated).then(function(){Y.adjustPadding(),I(e)}):Y.adjustPadding()}function T(e,t){Y.shouldLoadBottom()?(!t||X.effectiveHeight(t.inserted)>0)&&1===z.push(!0)&&(S(e),Q.loading(!0)):Y.shouldLoadTop()&&(!t||X.effectiveHeight(t.prepended)>0||z[0])&&1===z.push(!1)&&(S(e),Q.loading(!0))}function I(e){e||(z=[],e=++q);var t=j();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),m(e)||($(e,t),T(e),z.length||Q.calculateProperties())})}function O(e){var t=j();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),Y.adjustScrollTopAfterPrepend(t),m(e)||($(e,t),T(e,t),z.shift(),z.length?S(e):(Q.loading(!1),v(),Q.calculateProperties()))})}function S(e){z[0]?X.length&&!Y.shouldLoadBottom()?O(e):K(function(t){m(e)||(t.length0&&(Y.clipTop(),X.append(t)),O(e))}):X.length&&!Y.shouldLoadTop()?O(e):Z(function(t){m(e)||(t.length0&&(X.length&&Y.clipBottom(),X.prepend(t)),O(e))})}function A(){n.$$phase||Q.isLoading||Q.disabled||(T(q),z.length?b():(Q.calculateProperties(),e.$apply()))}function k(e){if(!Q.disabled){var t=Y[0].scrollTop,n=Y[0].scrollHeight-Y[0].clientHeight;(0===t&&!X.bof||t===n&&!X.eof)&&e.preventDefault()}}var L=l.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!L)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+l.uiScroll+"'");var C=3,V=10,_=.3,H=.5,M=null,U=L[1],B=L[2],D=c[0],F=Math.max(C,h(l.bufferSize,V)),N=Math.max(_,h(l.padding,H)),W=h(l.startIndex,1),q=0,z=[],R=new u.default(t,i),X=new s.default(R,F),Y=new f.default(R,X,a,D,n,N),Q=new p.default(Y,X,I,y,l,o,a);D&&(D.adapter=Q);var G=function(){return angular.isObject(M)&&angular.isFunction(M.get)};if(M=o(B)(e),!G()&&(M=t.get(B),!G()))throw new Error(B+" is not a valid datasource");var J={};g(M,"minIndex","minIndexUser"),g(M,"maxIndex","maxIndexUser");var K=2!==M.get.length?function(e){return M.get(X.next,F,e)}:function(e){M.get({index:X.next,append:X.length?X[X.length-1].item:void 0,count:F},e)},Z=2!==M.get.length?function(e){return M.get(X.first-F,F,e)}:function(e){M.get({index:X.first-F,prepend:X.length?X[0].item:void 0,count:F},e)};d(function(e,t){Y.createPaddingElements(e[0]),t.$destroy(),e.remove()}),e.$on("$destroy",function(){b(),Y.unbind("mousewheel",k)}),Y.bind("mousewheel",k),r(function(){Y.applyContainerStyle(),y()})}return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:a}}])},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(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&&u.return&&u.return()}finally{if(i)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=function(){function e(e,t){for(var n=0;n0?{base:a.base-a.padding-a.border,outer:a.base,outerfull:a.base+a.margin}[r]:(i=u(e),o=i[t],(o<0||null===o)&&(o=e.style[t]||0),o=parseFloat(o)||0,{base:o-a.padding-a.border,outer:o,outerfull:o+a.padding+a.border+a.margin}[r])}var o=void 0,a=void 0,u=void 0,l=void 0;return a=angular.element.prototype.css,e.prototype.css=function(e,t){var n=this,r=n[0];if(r&&3!==r.nodeType&&8!==r.nodeType&&r.style)return a.call(n,e,t)},l=function(e){return e&&e.document&&e.location&&e.alert&&e.setInterval},window.getComputedStyle?(u=function(e){return window.getComputedStyle(e,null)},o=function(e,t){return parseFloat(t)}):(u=function(e){return e.currentStyle},o=function(e,t){var n=void 0,r=void 0,i=void 0,o=void 0,a=void 0,u=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,l=new RegExp("^("+u+")(?!px)[a-z%]+$","i");return l.test(t)?(a=e.style,n=a.left,i=e.runtimeStyle,o=i&&i.left,i&&(i.left=a.left),a.left=t,r=a.pixelLeft,a.left=n,o&&(i.left=o),r):parseFloat(t)}),angular.forEach({before:function(e){var t,n,r,i,o,a,u;if(u=this,n=u[0],o=u.parent(),t=o.contents(),t[0]===n)return o.prepend(e);for(r=i=1,a=t.length-1;1<=a?i<=a:i>=a;r=1<=a?++i:--i)if(t[r]===n)return void angular.element(t[r-1]).after(e);throw new Error("invalid DOM structure "+n.outerHTML)},height:function(e){var t;return t=this,angular.isDefined(e)?(angular.isNumber(e)&&(e+="px"),a.call(t,"height",e)):i(this[0],"height","base")},outerHeight:function(e){return i(this[0],"height",e?"outerfull":"outer")},outerWidth:function(e){return i(this[0],"width",e?"outerfull":"outer")},offset:function(e){var t=void 0,n=void 0,r=this,i={top:0,left:0},o=r[0],a=o&&o.ownerDocument;if(arguments.length){if(void 0===e)return r;throw new Error("offset setter method is not implemented")}if(a)return t=a.documentElement,null!=o.getBoundingClientRect&&(i=o.getBoundingClientRect()),n=a.defaultView||a.parentWindow,{top:i.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:i.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}},scrollTop:function(e){return t(this,"top",e)},scrollLeft:function(e){return t(this,"left",e)}},function(t,n){if(!e.prototype[n])return e.prototype[n]=t})}}]),e}();t.default=o},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(){function e(e,t){for(var n=0;n=0&&(r=t[o].element.outerHeight(!0),!(n+r>i));o--)s.cache.add(t[o]),n+=r,e++;e>0&&(t.eof=!1,t.remove(t.length-e,t.length),t.next-=e,c.adjustPadding())},shouldLoadTop:function(){return!t.bof&&c.topDataPos()>c.topVisiblePos()-u()},clipTop:function(){for(var e=0,n=0,r=0,i=c.topVisiblePos()-c.topDataPos()-u(),o=0;oi));o++)l.cache.add(t[o]),n+=r,e++;e>0&&(l.height(l.height()+n),t.bof=!1,t.remove(0,e),t.first+=e)},adjustPadding:function(){if(t.length){var e=l.cache.reduce(function(e,n){return e+(n.index=t.next?n.height:0)},0),r=t.reduce(function(e,t){return e+t.element.outerHeight(!0)},0),i=(r+e+n)/(t.maxIndex-t.minIndex+1),o=null!==t.minIndexUser&&t.minIndex>t.minIndexUser,a=null!==t.maxIndexUser&&t.maxIndext.minIndexUser){var n=l.height()-e;c.scrollTop(c.scrollTop()+n)}},adjustScrollTopAfterPrepend:function(e){if(e.prepended.length){var n=t.effectiveHeight(e.prepended),r=l.height()-n;r>=0?l.height(r):(l.height(0),c.scrollTop(c.scrollTop()-r))}},resetTopPadding:function(){l.height(0),l.cache.clear()},resetBottomPadding:function(){s.height(0),s.cache.clear()}}),c}Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var o=n(5),a=r(o)},function(e,t){"use strict";function n(){var e=Object.create(Array.prototype);return angular.extend(e,{add:function(t){for(var n=e.length-1;n>=0;n--)if(e[n].index===t.scope.$index)return void(e[n].height=t.element.outerHeight());e.push({index:t.scope.$index,height:t.element.outerHeight()})},clear:function(){e.length=0}}),e}function r(e){var t=void 0;switch(e.tagName){case"dl":throw new Error("ui-scroll directive does not support <"+e.tagName+"> as a repeating tag: "+e.outerHTML);case"tr":var r=angular.element("
    ");t=r.find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t.cache=new n,t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(e)return e.hasOwnProperty(t)&&Object.getPrototypeOf(e[t]).constructor.hasOwnProperty("$inject")?e[t]:r(e.$parent,t)}function i(e,t,n){if(e&&(e=e.replace(/^\s+|\s+$/gm,""))){var i=e.match(/^(.+)(\s+on\s+)(.+)?/),o=e.match(/^([^.]+)\.(.+)?/);if(i&&4===i.length){window.console.warn('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.');for(var a=i[3],u=i[1],l=n;l.length;){var s=l.scope(),c=(l.attr("ng-controller")||"").match(/(\w(?:\w|\d)*)(?:\s+as\s+(\w(?:\w|\d)*))?/);if(c&&c[1]===a)return{target:s,source:u};l=l.parent()}throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller "'+a+'" to inject "'+u+'"')}if(o&&3===o.length){var f=o[1],d=o[2],p=r(t,f);if(p)return{target:p,source:d}}return{target:t,source:e}}}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n=0;a--)this.publicContext[o[a]]=this[o[a]].bind(this);for(var u=["isLoading","topVisible","topVisibleElement","topVisibleScope"],l=function(o){var a=void 0,l=void 0,s=i(e[u[o]],r.viewport.getScope(),n);s&&(l=t(s.source).assign),Object.defineProperty(r,u[o],{get:function(){return a},set:function(e){a=e,l&&l(s.target,e),r.publicContext[u[o]]=e}})},s=u.length-1;s>=0;s--)l(s);Object.defineProperty(this.publicContext,"disabled",{get:function(){return r.disabled},set:function(e){return(r.disabled=e)?null:r.adjustBuffer()}})}},{key:"loading",value:function(e){this.isLoading=e}},{key:"isBOF",value:function(){return this.buffer.bof}},{key:"isEOF",value:function(){return this.buffer.eof}},{key:"isEmpty",value:function(){return!this.buffer.length}},{key:"applyUpdates",value:function(e,t){var n=this;if(angular.isFunction(e))this.buffer.slice(0).forEach(function(t){n.applyUpdate(t,e(t.item,t.scope,t.element))});else{if(e%1!==0)throw new Error("applyUpdates - "+e+" is not a valid index");var r=e-this.buffer.first;r>=0&&r 0 ? buffer[insertAfter - 1].element : undefined;\n\t linker(function (clone, scope) {\n\t promises = insertElement(clone, sibling);\n\t wrapper.element = clone;\n\t wrapper.scope = scope;\n\t scope[itemName] = wrapper.item;\n\t });\n\t if (adapter.transform) adapter.transform(wrapper.scope, wrapper.element);\n\t return promises;\n\t }\n\t\n\t function updateDOM() {\n\t var promises = [];\n\t var toBePrepended = [];\n\t var toBeRemoved = [];\n\t var inserted = [];\n\t\n\t buffer.forEach(function (wrapper, i) {\n\t switch (wrapper.op) {\n\t case 'prepend':\n\t toBePrepended.unshift(wrapper);\n\t break;\n\t case 'append':\n\t insertWrapperContent(wrapper, i);\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'insert':\n\t promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'remove':\n\t toBeRemoved.push(wrapper);\n\t }\n\t });\n\t\n\t toBeRemoved.forEach(function (wrapper) {\n\t return promises = promises.concat(buffer.remove(wrapper));\n\t });\n\t\n\t if (toBePrepended.length) toBePrepended.forEach(function (wrapper) {\n\t insertWrapperContent(wrapper);\n\t wrapper.op = 'none';\n\t });\n\t\n\t buffer.forEach(function (item, i) {\n\t return item.scope.$index = buffer.first + i;\n\t });\n\t\n\t return {\n\t prepended: toBePrepended,\n\t removed: toBeRemoved,\n\t inserted: inserted,\n\t animated: promises\n\t };\n\t }\n\t\n\t function updatePaddings(rid, updates) {\n\t // schedule another adjustBuffer after animation completion\n\t if (updates.animated.length) {\n\t $q.all(updates.animated).then(function () {\n\t viewport.adjustPadding();\n\t adjustBuffer(rid);\n\t });\n\t } else {\n\t viewport.adjustPadding();\n\t }\n\t }\n\t\n\t function enqueueFetch(rid, updates) {\n\t if (viewport.shouldLoadBottom()) {\n\t if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t if (pending.push(true) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t } else if (viewport.shouldLoadTop()) {\n\t if (!updates || buffer.effectiveHeight(updates.prepended) > 0 || pending[0]) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n\t // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n\t if (pending.push(false) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t }\n\t }\n\t\n\t function adjustBuffer(rid) {\n\t if (!rid) {\n\t // dismiss pending requests\n\t pending = [];\n\t rid = ++ridActual;\n\t }\n\t\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid);\n\t\n\t if (!pending.length) {\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function adjustBufferAfterFetch(rid) {\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t viewport.adjustScrollTopAfterPrepend(updates);\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid, updates);\n\t pending.shift();\n\t\n\t if (pending.length) fetch(rid);else {\n\t adapter.loading(false);\n\t bindEvents();\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function fetch(rid) {\n\t if (pending[0]) {\n\t // scrolling down\n\t if (buffer.length && !viewport.shouldLoadBottom()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchNext(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.eof = true;\n\t }\n\t\n\t if (result.length > 0) {\n\t viewport.clipTop();\n\t buffer.append(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t } else {\n\t // scrolling up\n\t if (buffer.length && !viewport.shouldLoadTop()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchPrevious(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.bof = true;\n\t // log 'bof is reached'\n\t }\n\t\n\t if (result.length > 0) {\n\t if (buffer.length) {\n\t viewport.clipBottom();\n\t }\n\t buffer.prepend(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t }\n\t }\n\t\n\t function resizeAndScrollHandler() {\n\t if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\t\n\t enqueueFetch(ridActual);\n\t\n\t if (pending.length) {\n\t unbindEvents();\n\t } else {\n\t adapter.calculateProperties();\n\t $scope.$apply();\n\t }\n\t }\n\t }\n\t\n\t function wheelHandler(event) {\n\t if (!adapter.disabled) {\n\t var scrollTop = viewport[0].scrollTop;\n\t var yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\t\n\t if (scrollTop === 0 && !buffer.bof || scrollTop === yMax && !buffer.eof) {\n\t event.preventDefault();\n\t }\n\t }\n\t }\n\t }\n\t}]);\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*!\r\n\t globals: angular, window\r\n\t List of used element methods available in JQuery but not in JQuery Lite\r\n\t element.before(elem)\r\n\t element.height()\r\n\t element.outerHeight(true)\r\n\t element.height(value) = only for Top/Bottom padding elements\r\n\t element.scrollTop()\r\n\t element.scrollTop(value)\r\n\t */\n\t\n\tvar JQLiteExtras = function () {\n\t function JQLiteExtras() {\n\t _classCallCheck(this, JQLiteExtras);\n\t }\n\t\n\t _createClass(JQLiteExtras, [{\n\t key: 'registerFor',\n\t value: function registerFor(element) {\n\t var convertToPx = void 0,\n\t css = void 0,\n\t getStyle = void 0,\n\t isWindow = void 0;\n\t // angular implementation blows up if elem is the window\n\t css = angular.element.prototype.css;\n\t\n\t element.prototype.css = function (name, value) {\n\t var self = this;\n\t var elem = self[0];\n\t if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\n\t return css.call(self, name, value);\n\t }\n\t };\n\t\n\t // as defined in angularjs v1.0.5\n\t isWindow = function isWindow(obj) {\n\t return obj && obj.document && obj.location && obj.alert && obj.setInterval;\n\t };\n\t\n\t function scrollTo(self, direction, value) {\n\t var elem = self[0];\n\t\n\t var _top$left$direction = _slicedToArray({\n\t top: ['scrollTop', 'pageYOffset', 'scrollLeft'],\n\t left: ['scrollLeft', 'pageXOffset', 'scrollTop']\n\t }[direction], 3),\n\t method = _top$left$direction[0],\n\t prop = _top$left$direction[1],\n\t preserve = _top$left$direction[2];\n\t\n\t if (isWindow(elem)) {\n\t if (angular.isDefined(value)) {\n\t return elem.scrollTo(self[preserve].call(self), value);\n\t }\n\t return prop in elem ? elem[prop] : elem.document.documentElement[method];\n\t } else {\n\t if (angular.isDefined(value)) {\n\t elem[method] = value;\n\t }\n\t return elem[method];\n\t }\n\t }\n\t\n\t if (window.getComputedStyle) {\n\t getStyle = function getStyle(elem) {\n\t return window.getComputedStyle(elem, null);\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t return parseFloat(value);\n\t };\n\t } else {\n\t getStyle = function getStyle(elem) {\n\t return elem.currentStyle;\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t var left = void 0,\n\t result = void 0,\n\t rs = void 0,\n\t rsLeft = void 0,\n\t style = void 0;\n\t var core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\n\t var rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\n\t\n\t if (!rnumnonpx.test(value)) {\n\t return parseFloat(value);\n\t }\n\t\n\t // ported from JQuery\n\t style = elem.style;\n\t left = style.left;\n\t rs = elem.runtimeStyle;\n\t rsLeft = rs && rs.left;\n\t if (rs) {\n\t rs.left = style.left;\n\t }\n\t // put in the new values to get a computed style out\n\t style.left = value;\n\t result = style.pixelLeft;\n\t style.left = left;\n\t if (rsLeft) {\n\t rs.left = rsLeft;\n\t }\n\t return result;\n\t };\n\t }\n\t\n\t function getMeasurements(elem, measure) {\n\t var base = void 0,\n\t borderA = void 0,\n\t borderB = void 0,\n\t computedMarginA = void 0,\n\t computedMarginB = void 0,\n\t computedStyle = void 0,\n\t dirA = void 0,\n\t dirB = void 0,\n\t marginA = void 0,\n\t marginB = void 0,\n\t paddingA = void 0,\n\t paddingB = void 0;\n\t\n\t if (isWindow(elem)) {\n\t base = document.documentElement[{ height: 'clientHeight', width: 'clientWidth' }[measure]];\n\t\n\t return {\n\t base: base,\n\t padding: 0,\n\t border: 0,\n\t margin: 0\n\t };\n\t }\n\t\n\t // Start with offset property\n\t\n\t var _width$height$measure = _slicedToArray({\n\t width: [elem.offsetWidth, 'Left', 'Right'],\n\t height: [elem.offsetHeight, 'Top', 'Bottom']\n\t }[measure], 3);\n\t\n\t base = _width$height$measure[0];\n\t dirA = _width$height$measure[1];\n\t dirB = _width$height$measure[2];\n\t\n\t\n\t computedStyle = getStyle(elem);\n\t paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\n\t paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\n\t borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\n\t borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\n\t computedMarginA = computedStyle['margin' + dirA];\n\t computedMarginB = computedStyle['margin' + dirB];\n\t\n\t // I do not care for width for now, so this hack is irrelevant\n\t // if ( !supportsPercentMargin )\n\t // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\n\t // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\n\t marginA = convertToPx(elem, computedMarginA) || 0;\n\t marginB = convertToPx(elem, computedMarginB) || 0;\n\t\n\t return {\n\t base: base,\n\t padding: paddingA + paddingB,\n\t border: borderA + borderB,\n\t margin: marginA + marginB\n\t };\n\t }\n\t\n\t function getWidthHeight(elem, direction, measure) {\n\t var computedStyle = void 0,\n\t result = void 0;\n\t\n\t var measurements = getMeasurements(elem, direction);\n\t\n\t if (measurements.base > 0) {\n\t return {\n\t base: measurements.base - measurements.padding - measurements.border,\n\t outer: measurements.base,\n\t outerfull: measurements.base + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // Fall back to computed then uncomputed css if necessary\n\t computedStyle = getStyle(elem);\n\t result = computedStyle[direction];\n\t\n\t if (result < 0 || result === null) {\n\t result = elem.style[direction] || 0;\n\t }\n\t\n\t // Normalize \"\", auto, and prepare for extra\n\t result = parseFloat(result) || 0;\n\t\n\t return {\n\t base: result - measurements.padding - measurements.border,\n\t outer: result,\n\t outerfull: result + measurements.padding + measurements.border + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // define missing methods\n\t return angular.forEach({\n\t before: function before(newElem) {\n\t var children, elem, i, j, parent, ref, self;\n\t self = this;\n\t elem = self[0];\n\t parent = self.parent();\n\t children = parent.contents();\n\t if (children[0] === elem) {\n\t return parent.prepend(newElem);\n\t } else {\n\t for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n\t if (children[i] === elem) {\n\t angular.element(children[i - 1]).after(newElem);\n\t return;\n\t }\n\t }\n\t throw new Error('invalid DOM structure ' + elem.outerHTML);\n\t }\n\t },\n\t height: function height(value) {\n\t var self;\n\t self = this;\n\t if (angular.isDefined(value)) {\n\t if (angular.isNumber(value)) {\n\t value = value + 'px';\n\t }\n\t return css.call(self, 'height', value);\n\t } else {\n\t return getWidthHeight(this[0], 'height', 'base');\n\t }\n\t },\n\t outerHeight: function outerHeight(option) {\n\t return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\n\t },\n\t outerWidth: function outerWidth(option) {\n\t return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\n\t },\n\t\n\t\n\t /*\r\n\t The offset setter method is not implemented\r\n\t */\n\t offset: function offset(value) {\n\t var docElem = void 0,\n\t win = void 0;\n\t var self = this;\n\t var box = {\n\t top: 0,\n\t left: 0\n\t };\n\t var elem = self[0];\n\t var doc = elem && elem.ownerDocument;\n\t\n\t if (arguments.length) {\n\t if (value === undefined) {\n\t return self;\n\t }\n\t // TODO: implement setter\n\t throw new Error('offset setter method is not implemented');\n\t }\n\t\n\t if (!doc) {\n\t return;\n\t }\n\t\n\t docElem = doc.documentElement;\n\t\n\t // TODO: Make sure it's not a disconnected DOM node\n\t\n\t if (elem.getBoundingClientRect != null) {\n\t box = elem.getBoundingClientRect();\n\t }\n\t\n\t win = doc.defaultView || doc.parentWindow;\n\t\n\t return {\n\t top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n\t left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n\t };\n\t },\n\t scrollTop: function scrollTop(value) {\n\t return scrollTo(this, 'top', value);\n\t },\n\t scrollLeft: function scrollLeft(value) {\n\t return scrollTo(this, 'left', value);\n\t }\n\t }, function (value, key) {\n\t if (!element.prototype[key]) {\n\t return element.prototype[key] = value;\n\t }\n\t });\n\t }\n\t }]);\n\t\n\t return JQLiteExtras;\n\t}();\n\t\n\texports.default = JQLiteExtras;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar ElementRoutines = function () {\n\t function ElementRoutines($injector, $q) {\n\t _classCallCheck(this, ElementRoutines);\n\t\n\t this.$animate = $injector.has && $injector.has('$animate') ? $injector.get('$animate') : null;\n\t this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\n\t this.$q = $q;\n\t }\n\t\n\t _createClass(ElementRoutines, [{\n\t key: 'insertElement',\n\t value: function insertElement(newElement, previousElement) {\n\t previousElement.after(newElement);\n\t return [];\n\t }\n\t }, {\n\t key: 'removeElement',\n\t value: function removeElement(wrapper) {\n\t wrapper.element.remove();\n\t wrapper.scope.$destroy();\n\t return [];\n\t }\n\t }, {\n\t key: 'insertElementAnimated',\n\t value: function insertElementAnimated(newElement, previousElement) {\n\t var _this = this;\n\t\n\t if (!this.$animate) {\n\t return this.insertElement(newElement, previousElement);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret = function () {\n\t var deferred = _this.$q.defer();\n\t // no need for parent - previous element is never null\n\t _this.$animate.enter(newElement, null, previousElement, function () {\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n\t }\n\t\n\t // no need for parent - previous element is never null\n\t return [this.$animate.enter(newElement, null, previousElement)];\n\t }\n\t }, {\n\t key: 'removeElementAnimated',\n\t value: function removeElementAnimated(wrapper) {\n\t var _this2 = this;\n\t\n\t if (!this.$animate) {\n\t return this.removeElement(wrapper);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret2 = function () {\n\t var deferred = _this2.$q.defer();\n\t _this2.$animate.leave(wrapper.element, function () {\n\t wrapper.scope.$destroy();\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n\t }\n\t\n\t return [this.$animate.leave(wrapper.element).then(function () {\n\t return wrapper.scope.$destroy();\n\t })];\n\t }\n\t }]);\n\t\n\t return ElementRoutines;\n\t}();\n\t\n\texports.default = ElementRoutines;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = ScrollBuffer;\n\tfunction ScrollBuffer(elementRoutines, bufferSize) {\n\t var buffer = Object.create(Array.prototype);\n\t\n\t angular.extend(buffer, {\n\t size: bufferSize,\n\t\n\t reset: function reset(startIndex) {\n\t buffer.remove(0, buffer.length);\n\t buffer.eof = false;\n\t buffer.bof = false;\n\t buffer.first = startIndex;\n\t buffer.next = startIndex;\n\t buffer.minIndex = startIndex;\n\t buffer.maxIndex = startIndex;\n\t buffer.minIndexUser = null;\n\t buffer.maxIndexUser = null;\n\t },\n\t append: function append(items) {\n\t items.forEach(function (item) {\n\t ++buffer.next;\n\t buffer.insert('append', item);\n\t });\n\t buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\n\t },\n\t prepend: function prepend(items) {\n\t items.reverse().forEach(function (item) {\n\t --buffer.first;\n\t buffer.insert('prepend', item);\n\t });\n\t buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\n\t },\n\t\n\t\n\t /**\r\n\t * inserts wrapped element in the buffer\r\n\t * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n\t * for insert the number is the index for the buffer element the new one have to be inserted after\r\n\t * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n\t */\n\t insert: function insert(operation, item) {\n\t var wrapper = {\n\t item: item\n\t };\n\t\n\t if (operation % 1 === 0) {\n\t // it is an insert\n\t wrapper.op = 'insert';\n\t buffer.splice(operation, 0, wrapper);\n\t } else {\n\t wrapper.op = operation;\n\t switch (operation) {\n\t case 'append':\n\t buffer.push(wrapper);\n\t break;\n\t case 'prepend':\n\t buffer.unshift(wrapper);\n\t break;\n\t }\n\t }\n\t },\n\t\n\t\n\t // removes elements from buffer\n\t remove: function remove(arg1, arg2) {\n\t if (angular.isNumber(arg1)) {\n\t // removes items from arg1 (including) through arg2 (excluding)\n\t for (var i = arg1; i < arg2; i++) {\n\t elementRoutines.removeElement(buffer[i]);\n\t }\n\t\n\t return buffer.splice(arg1, arg2 - arg1);\n\t }\n\t // removes single item(wrapper) from the buffer\n\t buffer.splice(buffer.indexOf(arg1), 1);\n\t\n\t return elementRoutines.removeElementAnimated(arg1);\n\t },\n\t effectiveHeight: function effectiveHeight(elements) {\n\t if (!elements.length) {\n\t return 0;\n\t }\n\t var top = Number.MAX_VALUE;\n\t var bottom = Number.MIN_VALUE;\n\t elements.forEach(function (wrapper) {\n\t if (wrapper.element[0].offsetParent) {\n\t // element style is not display:none\n\t top = Math.min(top, wrapper.element.offset().top);\n\t bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\n\t }\n\t });\n\t return Math.max(0, bottom - top);\n\t }\n\t });\n\t\n\t return buffer;\n\t}\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Viewport;\n\t\n\tvar _padding = __webpack_require__(5);\n\t\n\tvar _padding2 = _interopRequireDefault(_padding);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction Viewport(elementRoutines, buffer, element, viewportController, padding) {\n\t var topPadding = null;\n\t var bottomPadding = null;\n\t var viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\n\t var container = viewportController && viewportController.container ? viewportController.container : undefined;\n\t\n\t viewport.css({\n\t 'overflow-anchor': 'none',\n\t 'overflow-y': 'auto',\n\t 'display': 'block'\n\t });\n\t\n\t function bufferPadding() {\n\t return viewport.outerHeight() * padding; // some extra space to initiate preload\n\t }\n\t\n\t angular.extend(viewport, {\n\t createPaddingElements: function createPaddingElements(template) {\n\t topPadding = new _padding2.default(template);\n\t bottomPadding = new _padding2.default(template);\n\t element.before(topPadding);\n\t element.after(bottomPadding);\n\t },\n\t applyContainerStyle: function applyContainerStyle() {\n\t if (container && container !== viewport) {\n\t viewport.css('height', window.getComputedStyle(container[0]).height);\n\t }\n\t },\n\t bottomDataPos: function bottomDataPos() {\n\t var scrollHeight = viewport[0].scrollHeight;\n\t scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\n\t return scrollHeight - bottomPadding.height();\n\t },\n\t topDataPos: function topDataPos() {\n\t return topPadding.height();\n\t },\n\t bottomVisiblePos: function bottomVisiblePos() {\n\t return viewport.scrollTop() + viewport.outerHeight();\n\t },\n\t topVisiblePos: function topVisiblePos() {\n\t return viewport.scrollTop();\n\t },\n\t insertElement: function insertElement(e, sibling) {\n\t return elementRoutines.insertElement(e, sibling || topPadding);\n\t },\n\t insertElementAnimated: function insertElementAnimated(e, sibling) {\n\t return elementRoutines.insertElementAnimated(e, sibling || topPadding);\n\t },\n\t shouldLoadBottom: function shouldLoadBottom() {\n\t return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\n\t },\n\t clipBottom: function clipBottom() {\n\t // clip the invisible items off the bottom\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\n\t\n\t for (var i = buffer.length - 1; i >= 0; i--) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t bottomPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t buffer.eof = false;\n\t buffer.remove(buffer.length - overage, buffer.length);\n\t buffer.next -= overage;\n\t viewport.adjustPadding();\n\t }\n\t },\n\t shouldLoadTop: function shouldLoadTop() {\n\t return !buffer.bof && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding();\n\t },\n\t clipTop: function clipTop() {\n\t // clip the invisible items off the top\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\n\t\n\t for (var i = 0; i < buffer.length; i++) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t topPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t // we need to adjust top padding element before items are removed from top\n\t // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\n\t topPadding.height(topPadding.height() + overageHeight);\n\t buffer.bof = false;\n\t buffer.remove(0, overage);\n\t buffer.first += overage;\n\t }\n\t },\n\t adjustPadding: function adjustPadding() {\n\t if (!buffer.length) {\n\t return;\n\t }\n\t\n\t // precise heights calculation, items that were in buffer once\n\t var topPaddingHeight = topPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index < buffer.first ? item.height : 0);\n\t }, 0);\n\t var bottomPaddingHeight = bottomPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index >= buffer.next ? item.height : 0);\n\t }, 0);\n\t\n\t // average item height based on buffer data\n\t var visibleItemsHeight = buffer.reduce(function (summ, item) {\n\t return summ + item.element.outerHeight(true);\n\t }, 0);\n\t var averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\n\t\n\t // average heights calculation, items that have never been reached\n\t var adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\n\t var adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\n\t var topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\n\t var bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\n\t\n\t // paddings combine adjustment\n\t topPadding.height(topPaddingHeight + topPaddingHeightAdd);\n\t bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\n\t },\n\t adjustScrollTopAfterMinIndexSet: function adjustScrollTopAfterMinIndexSet(topPaddingHeightOld) {\n\t // additional scrollTop adjustment in case of datasource.minIndex external set\n\t if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\n\t var diff = topPadding.height() - topPaddingHeightOld;\n\t viewport.scrollTop(viewport.scrollTop() + diff);\n\t }\n\t },\n\t adjustScrollTopAfterPrepend: function adjustScrollTopAfterPrepend(updates) {\n\t if (!updates.prepended.length) return;\n\t var height = buffer.effectiveHeight(updates.prepended);\n\t var paddingHeight = topPadding.height() - height;\n\t if (paddingHeight >= 0) {\n\t topPadding.height(paddingHeight);\n\t } else {\n\t topPadding.height(0);\n\t viewport.scrollTop(viewport.scrollTop() - paddingHeight);\n\t }\n\t },\n\t resetTopPadding: function resetTopPadding() {\n\t topPadding.height(0);\n\t topPadding.cache.clear();\n\t },\n\t resetBottomPadding: function resetBottomPadding() {\n\t bottomPadding.height(0);\n\t bottomPadding.cache.clear();\n\t }\n\t });\n\t\n\t return viewport;\n\t}\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Padding;\n\tfunction Cache() {\n\t var cache = Object.create(Array.prototype);\n\t\n\t angular.extend(cache, {\n\t add: function add(item) {\n\t for (var i = cache.length - 1; i >= 0; i--) {\n\t if (cache[i].index === item.scope.$index) {\n\t cache[i].height = item.element.outerHeight();\n\t return;\n\t }\n\t }\n\t cache.push({\n\t index: item.scope.$index,\n\t height: item.element.outerHeight()\n\t });\n\t },\n\t clear: function clear() {\n\t cache.length = 0;\n\t }\n\t });\n\t\n\t return cache;\n\t}\n\t\n\tfunction Padding(template) {\n\t var result = void 0;\n\t\n\t switch (template.tagName) {\n\t case 'dl':\n\t throw new Error('ui-scroll directive does not support <' + template.tagName + '> as a repeating tag: ' + template.outerHTML);\n\t case 'tr':\n\t var table = angular.element('
    ');\n\t result = table.find('tr');\n\t break;\n\t case 'li':\n\t result = angular.element('
  • ');\n\t break;\n\t default:\n\t result = angular.element('
    ');\n\t }\n\t\n\t result.cache = new Cache();\n\t\n\t return result;\n\t}\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Adapter;\n\tfunction Adapter($rootScope, $parse, $attr, viewport, buffer, adjustBuffer, element) {\n\t var viewportScope = viewport.scope() || $rootScope;\n\t var disabled = false;\n\t var self = this;\n\t\n\t createValueInjector('adapter')(self);\n\t var topVisibleInjector = createValueInjector('topVisible');\n\t var topVisibleElementInjector = createValueInjector('topVisibleElement');\n\t var topVisibleScopeInjector = createValueInjector('topVisibleScope');\n\t var isLoadingInjector = createValueInjector('isLoading');\n\t\n\t // Adapter API definition\n\t\n\t Object.defineProperty(this, 'disabled', {\n\t get: function get() {\n\t return disabled;\n\t },\n\t set: function set(value) {\n\t return !(disabled = value) ? adjustBuffer() : null;\n\t }\n\t });\n\t\n\t this.isLoading = false;\n\t this.isBOF = function () {\n\t return buffer.bof;\n\t };\n\t this.isEOF = function () {\n\t return buffer.eof;\n\t };\n\t this.isEmpty = function () {\n\t return !buffer.length;\n\t };\n\t\n\t this.applyUpdates = function (arg1, arg2) {\n\t if (angular.isFunction(arg1)) {\n\t // arg1 is the updater function, arg2 is ignored\n\t buffer.slice(0).forEach(function (wrapper) {\n\t // we need to do it on the buffer clone, because buffer content\n\t // may change as we iterate through\n\t applyUpdate(wrapper, arg1(wrapper.item, wrapper.scope, wrapper.element));\n\t });\n\t } else {\n\t // arg1 is item index, arg2 is the newItems array\n\t if (arg1 % 1 !== 0) {\n\t // checking if it is an integer\n\t throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\n\t }\n\t\n\t var index = arg1 - buffer.first;\n\t if (index >= 0 && index < buffer.length) {\n\t applyUpdate(buffer[index], arg2);\n\t }\n\t }\n\t\n\t adjustBuffer();\n\t };\n\t\n\t this.append = function (newItems) {\n\t buffer.append(newItems);\n\t adjustBuffer();\n\t };\n\t\n\t this.prepend = function (newItems) {\n\t buffer.prepend(newItems);\n\t adjustBuffer();\n\t };\n\t\n\t this.loading = function (value) {\n\t isLoadingInjector(value);\n\t };\n\t\n\t this.calculateProperties = function () {\n\t var item = void 0,\n\t itemHeight = void 0,\n\t itemTop = void 0,\n\t isNewRow = void 0,\n\t rowTop = null;\n\t var topHeight = 0;\n\t for (var i = 0; i < buffer.length; i++) {\n\t item = buffer[i];\n\t itemTop = item.element.offset().top;\n\t isNewRow = rowTop !== itemTop;\n\t rowTop = itemTop;\n\t if (isNewRow) {\n\t itemHeight = item.element.outerHeight(true);\n\t }\n\t if (isNewRow && viewport.topDataPos() + topHeight + itemHeight <= viewport.topVisiblePos()) {\n\t topHeight += itemHeight;\n\t } else {\n\t if (isNewRow) {\n\t topVisibleInjector(item.item);\n\t topVisibleElementInjector(item.element);\n\t topVisibleScopeInjector(item.scope);\n\t }\n\t break;\n\t }\n\t }\n\t };\n\t\n\t // private function definitions\n\t\n\t function createValueInjector(attribute) {\n\t var expression = $attr[attribute];\n\t var scope = viewportScope;\n\t var assign = void 0;\n\t if (expression) {\n\t // it is ok to have relaxed validation for the first part of the 'on' expression.\n\t // additional validation will be done by the $parse service below\n\t var match = expression.match(/^(\\S+)(?:\\s+on\\s+(\\w(?:\\w|\\d)*))?/);\n\t if (!match) throw new Error('Expected injection expression in form of \\'target\\' or \\'target on controller\\' but got \\'' + expression + '\\'');\n\t var target = match[1];\n\t var onControllerName = match[2];\n\t\n\t var parseController = function parseController(controllerName, on) {\n\t var candidate = element;\n\t while (candidate.length) {\n\t var candidateScope = candidate.scope();\n\t // ng-controller's \"Controller As\" parsing\n\t var candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\n\t if (candidateName && candidateName[on ? 1 : 2] === controllerName) {\n\t scope = candidateScope;\n\t return true;\n\t }\n\t // directive's/component's \"Controller As\" parsing\n\t if (!on && candidateScope && candidateScope.hasOwnProperty(controllerName) && Object.getPrototypeOf(candidateScope[controllerName]).constructor.hasOwnProperty('$inject')) {\n\t scope = candidateScope;\n\t return true;\n\t }\n\t candidate = candidate.parent();\n\t }\n\t };\n\t\n\t if (onControllerName) {\n\t // 'on' syntax DOM parsing (adapter=\"adapter on ctrl\")\n\t scope = null;\n\t parseController(onControllerName, true);\n\t if (!scope) {\n\t throw new Error('Failed to locate target controller \\'' + onControllerName + '\\' to inject \\'' + target + '\\'');\n\t }\n\t } else {\n\t // try to parse DOM with 'Controller As' syntax (adapter=\"ctrl.adapter\")\n\t var controllerAsName = void 0;\n\t var dotIndex = target.indexOf('.');\n\t if (dotIndex > 0) {\n\t controllerAsName = target.substr(0, dotIndex);\n\t parseController(controllerAsName, false);\n\t }\n\t }\n\t\n\t assign = $parse(target).assign;\n\t }\n\t return function (value) {\n\t if (self !== value) // just to avoid injecting adapter reference in the adapter itself. Kludgy, I know.\n\t self[attribute] = value;\n\t if (assign) assign(scope, value);\n\t };\n\t }\n\t\n\t function applyUpdate(wrapper, newItems) {\n\t if (!angular.isArray(newItems)) {\n\t return;\n\t }\n\t\n\t var keepIt = void 0;\n\t var pos = buffer.indexOf(wrapper) + 1;\n\t\n\t newItems.reverse().forEach(function (newItem) {\n\t if (newItem === wrapper.item) {\n\t keepIt = true;\n\t pos--;\n\t } else {\n\t buffer.insert(pos, newItem);\n\t }\n\t });\n\t\n\t if (!keepIt) {\n\t wrapper.op = 'remove';\n\t }\n\t }\n\t}\n\n/***/ }\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// ui-scroll.min.js"," \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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 02b75f8eacc960e581f4","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, padding);\n let adapter = new Adapter($rootScope, $parse, $attr, viewport, buffer, adjustBuffer, element);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 adapter.reload = reload;\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","import Padding from './padding';\r\n\r\nexport default function Viewport(elementRoutines, buffer, element, viewportController, 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\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 createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","export default function Adapter($rootScope, $parse, $attr, viewport, buffer, adjustBuffer, element) {\r\n const viewportScope = viewport.scope() || $rootScope;\r\n let disabled = false;\r\n let self = this;\r\n\r\n createValueInjector('adapter')(self);\r\n let topVisibleInjector = createValueInjector('topVisible');\r\n let topVisibleElementInjector = createValueInjector('topVisibleElement');\r\n let topVisibleScopeInjector = createValueInjector('topVisibleScope');\r\n let isLoadingInjector = createValueInjector('isLoading');\r\n\r\n // Adapter API definition\r\n\r\n Object.defineProperty(this, 'disabled', {\r\n get: () => disabled,\r\n set: (value) => (!(disabled = value)) ? adjustBuffer() : null\r\n });\r\n\r\n this.isLoading = false;\r\n this.isBOF = () => buffer.bof;\r\n this.isEOF = () => buffer.eof;\r\n this.isEmpty = () => !buffer.length;\r\n\r\n this.applyUpdates = (arg1, arg2) => {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\r\n 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 applyUpdate(wrapper, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - buffer.first;\r\n if ((index >= 0 && index < buffer.length)) {\r\n applyUpdate(buffer[index], arg2);\r\n }\r\n }\r\n\r\n adjustBuffer();\r\n };\r\n\r\n this.append = (newItems) => {\r\n buffer.append(newItems);\r\n adjustBuffer();\r\n };\r\n\r\n this.prepend = (newItems) => {\r\n buffer.prepend(newItems);\r\n adjustBuffer();\r\n };\r\n\r\n this.loading = (value) => {\r\n isLoadingInjector(value);\r\n };\r\n\r\n this.calculateProperties = () => {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < buffer.length; i++) {\r\n item = buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (viewport.topDataPos() + topHeight + itemHeight <= viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n topVisibleInjector(item.item);\r\n topVisibleElementInjector(item.element);\r\n topVisibleScopeInjector(item.scope);\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n\r\n // private function definitions\r\n\r\n function createValueInjector(attribute) {\r\n let expression = $attr[attribute];\r\n let scope = viewportScope;\r\n let assign;\r\n if (expression) {\r\n // it is ok to have relaxed validation for the first part of the 'on' expression.\r\n // additional validation will be done by the $parse service below\r\n let match = expression.match(/^(\\S+)(?:\\s+on\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (!match)\r\n throw new Error('Expected injection expression in form of \\'target\\' or \\'target on controller\\' but got \\'' + expression + '\\'');\r\n let target = match[1];\r\n let onControllerName = match[2];\r\n\r\n let parseController = (controllerName, on) => {\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope();\r\n // ng-controller's \"Controller As\" parsing\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[on ? 1 : 2] === controllerName) {\r\n scope = candidateScope;\r\n return true;\r\n }\r\n // directive's/component's \"Controller As\" parsing\r\n if (!on && candidateScope && candidateScope.hasOwnProperty(controllerName) && Object.getPrototypeOf(candidateScope[controllerName]).constructor.hasOwnProperty('$inject')) {\r\n scope = candidateScope;\r\n return true;\r\n }\r\n candidate = candidate.parent();\r\n }\r\n };\r\n\r\n if (onControllerName) { // 'on' syntax DOM parsing (adapter=\"adapter on ctrl\")\r\n scope = null;\r\n parseController(onControllerName, true);\r\n if (!scope) {\r\n throw new Error('Failed to locate target controller \\'' + onControllerName + '\\' to inject \\'' + target + '\\'');\r\n }\r\n }\r\n else { // try to parse DOM with 'Controller As' syntax (adapter=\"ctrl.adapter\")\r\n let controllerAsName;\r\n let dotIndex = target.indexOf('.');\r\n if (dotIndex > 0) {\r\n controllerAsName = target.substr(0, dotIndex);\r\n parseController(controllerAsName, false);\r\n }\r\n }\r\n\r\n assign = $parse(target).assign;\r\n }\r\n return (value) => {\r\n if (self !== value) // just to avoid injecting adapter reference in the adapter itself. Kludgy, I know.\r\n self[attribute] = value;\r\n if (assign)\r\n assign(scope, value);\r\n };\r\n }\r\n\r\n function applyUpdate(wrapper, newItems) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n\r\n let keepIt;\r\n let pos = (buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///ui-scroll.min.js","webpack:///webpack/bootstrap 6fb5c0179465828c8111","webpack:///./src/ui-scroll.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/adapter.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","_jqLiteExtras","_jqLiteExtras2","_elementRoutines","_elementRoutines2","_buffer","_buffer2","_viewport","_viewport2","_adapter","_adapter2","angular","service","run","jqLiteExtras","window","jQuery","registerFor","element","directive","restrict","controller","scope","_this","this","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$q","$parse","link","$scope","$attr","controllers","linker","parseNumericAttr","value","defaultValue","result","isNaN","defineProperty","datasource","propName","propUserName","descriptor","Object","getOwnPropertyDescriptor","set","get","indexStore","buffer","pending","length","topPaddingHeightOld","topDataPos","adjustPadding","adjustScrollTopAfterMinIndexSet","isInvalid","rid","ridActual","$$destroyed","bindEvents","bind","resizeAndScrollHandler","unbindEvents","unbind","reload","resetTopPadding","resetBottomPadding","arguments","startIndex","reset","adjustBuffer","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","item","isFunction","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","addClass","promises","sibling","undefined","clone","itemName","adapter","transform","updateDOM","toBePrepended","toBeRemoved","inserted","i","op","unshift","push","concat","insertElementAnimated","remove","$index","first","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","fetch","loading","shouldLoadTop","w","removeClass","calculateProperties","adjustBufferAfterFetch","adjustScrollTopAfterPrepend","shift","fetchNext","bufferSize","eof","clipTop","append","fetchPrevious","bof","clipBottom","prepend","$$phase","isLoading","disabled","$apply","wheelHandler","event","scrollTop","yMax","scrollHeight","clientHeight","preventDefault","match","uiScroll","Error","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","datasourceName","viewportController","Math","max","padding","elementRoutines","isDatasourceValid","isObject","success","next","index","count","createPaddingElements","$destroy","$on","applyContainerStyle","require","transclude","priority","terminal","_classCallCheck","instance","Constructor","TypeError","_slicedToArray","sliceIterator","arr","_arr","_n","_d","_e","_s","_i","Symbol","iterator","done","err","Array","isArray","_createClass","defineProperties","target","props","enumerable","configurable","writable","key","protoProps","staticProps","prototype","JQLiteExtras","scrollTo","self","direction","elem","_top$left$direction","top","left","method","prop","preserve","isWindow","isDefined","document","documentElement","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","width","border","margin","_width$height$measure","offsetWidth","offsetHeight","getStyle","convertToPx","getWidthHeight","measurements","outer","outerfull","style","parseFloat","css","name","nodeType","location","alert","setInterval","getComputedStyle","currentStyle","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","before","newElem","j","parent","ref","contents","after","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","_typeof","constructor","ElementRoutines","$animate","has","isAngularVersionLessThen1_3","version","major","minor","newElement","previousElement","_ret","deferred","defer","enter","resolve","v","promise","_this2","removeElement","_ret2","leave","ScrollBuffer","create","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","splice","arg1","arg2","indexOf","removeElementAnimated","elements","Number","MAX_VALUE","bottom","MIN_VALUE","Viewport","bufferPadding","topPadding","bottomPadding","overflow-anchor","overflow-y","display","getScope","template","_padding2","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","topPaddingHeight","reduce","summ","bottomPaddingHeight","visibleItemsHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","_padding","Cache","Padding","table","find","findCtrl","ctrl","hasOwnProperty","getPrototypeOf","$parent","assignAttr","attr","replace","onSyntax","asSyntax","warn","tail","candidate","candidateScope","candidateName","foundCtrl","Adapter","publicContext","assignAdapter","generatePublicContext","data","assign","adapterOnScope","error","message","publicMethods","publicProps","_loop","property","assignProp","slice","applyUpdate","newItems","itemTop","isNewRow","rowTop","topHeight","_this3","keepIt","pos","newItem"],"mappings":"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","file":"ui-scroll.min.js","sourcesContent":["/*!\r\n * angular-ui-scroll (uncompressed)\r\n * https://github.com/angular-ui/ui-scroll\r\n * Version: 1.6.1 -- 2017-03-03T05:28:34.208Z\r\n * License: MIT\r\n */\n/******/ (function(modules) { // webpackBootstrap\n/******/ \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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _jqLiteExtras = __webpack_require__(1);\n\t\n\tvar _jqLiteExtras2 = _interopRequireDefault(_jqLiteExtras);\n\t\n\tvar _elementRoutines = __webpack_require__(2);\n\t\n\tvar _elementRoutines2 = _interopRequireDefault(_elementRoutines);\n\t\n\tvar _buffer = __webpack_require__(3);\n\t\n\tvar _buffer2 = _interopRequireDefault(_buffer);\n\t\n\tvar _viewport = __webpack_require__(4);\n\t\n\tvar _viewport2 = _interopRequireDefault(_viewport);\n\t\n\tvar _adapter = __webpack_require__(6);\n\t\n\tvar _adapter2 = _interopRequireDefault(_adapter);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tangular.module('ui.scroll', []).service('jqLiteExtras', function () {\n\t return new _jqLiteExtras2.default();\n\t}).run(['jqLiteExtras', function (jqLiteExtras) {\n\t return !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null;\n\t}]).directive('uiScrollViewport', function () {\n\t return {\n\t restrict: 'A',\n\t controller: ['$scope', '$element', function (scope, element) {\n\t var _this = this;\n\t\n\t this.container = element;\n\t this.viewport = element;\n\t this.scope = scope;\n\t\n\t angular.forEach(element.children(), function (child) {\n\t if (child.tagName.toLowerCase() === 'tbody') {\n\t _this.viewport = angular.element(child);\n\t }\n\t });\n\t\n\t return this;\n\t }]\n\t };\n\t}).directive('uiScroll', ['$log', '$injector', '$rootScope', '$timeout', '$q', '$parse', function (console, $injector, $rootScope, $timeout, $q, $parse) {\n\t\n\t return {\n\t require: ['?^uiScrollViewport'],\n\t restrict: 'A',\n\t transclude: 'element',\n\t priority: 1000,\n\t terminal: true,\n\t link: link\n\t };\n\t\n\t function link($scope, element, $attr, controllers, linker) {\n\t var match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n\t if (!match) {\n\t throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n\t }\n\t\n\t function parseNumericAttr(value, defaultValue) {\n\t var result = $parse(value)($scope);\n\t return isNaN(result) ? defaultValue : result;\n\t }\n\t\n\t var BUFFER_MIN = 3;\n\t var BUFFER_DEFAULT = 10;\n\t var PADDING_MIN = 0.3;\n\t var PADDING_DEFAULT = 0.5;\n\t\n\t var datasource = null;\n\t var itemName = match[1];\n\t var datasourceName = match[2];\n\t var viewportController = controllers[0];\n\t var bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n\t var padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT));\n\t var startIndex = parseNumericAttr($attr.startIndex, 1);\n\t var ridActual = 0; // current data revision id\n\t var pending = [];\n\t\n\t var elementRoutines = new _elementRoutines2.default($injector, $q);\n\t var buffer = new _buffer2.default(elementRoutines, bufferSize);\n\t var viewport = new _viewport2.default(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n\t var adapter = new _adapter2.default(viewport, buffer, adjustBuffer, reload, $attr, $parse, element);\n\t\n\t if (viewportController) {\n\t viewportController.adapter = adapter;\n\t }\n\t\n\t var isDatasourceValid = function isDatasourceValid() {\n\t return angular.isObject(datasource) && angular.isFunction(datasource.get);\n\t };\n\t datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n\t if (!isDatasourceValid()) {\n\t datasource = $injector.get(datasourceName); // try to inject datasource as service\n\t if (!isDatasourceValid()) {\n\t throw new Error(datasourceName + ' is not a valid datasource');\n\t }\n\t }\n\t\n\t var indexStore = {};\n\t\n\t function defineProperty(datasource, propName, propUserName) {\n\t var descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n\t if (!descriptor || !descriptor.set && !descriptor.get) {\n\t Object.defineProperty(datasource, propName, {\n\t set: function set(value) {\n\t indexStore[propName] = value;\n\t $timeout(function () {\n\t buffer[propUserName] = value;\n\t if (!pending.length) {\n\t var topPaddingHeightOld = viewport.topDataPos();\n\t viewport.adjustPadding();\n\t if (propName === 'minIndex') {\n\t viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n\t }\n\t }\n\t });\n\t },\n\t get: function get() {\n\t return indexStore[propName];\n\t }\n\t });\n\t }\n\t }\n\t\n\t defineProperty(datasource, 'minIndex', 'minIndexUser');\n\t defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\t\n\t var fetchNext = datasource.get.length !== 2 ? function (success) {\n\t return datasource.get(buffer.next, bufferSize, success);\n\t } : function (success) {\n\t datasource.get({\n\t index: buffer.next,\n\t append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n\t count: bufferSize\n\t }, success);\n\t };\n\t\n\t var fetchPrevious = datasource.get.length !== 2 ? function (success) {\n\t return datasource.get(buffer.first - bufferSize, bufferSize, success);\n\t } : function (success) {\n\t datasource.get({\n\t index: buffer.first - bufferSize,\n\t prepend: buffer.length ? buffer[0].item : void 0,\n\t count: bufferSize\n\t }, success);\n\t };\n\t\n\t /**\n\t * Build padding elements\n\t *\n\t * Calling linker is the only way I found to get access to the tag name of the template\n\t * to prevent the directive scope from pollution a new scope is created and destroyed\n\t * right after the builder creation is completed\n\t */\n\t linker(function (clone, scope) {\n\t viewport.createPaddingElements(clone[0]);\n\t // we do not include the clone in the DOM. It means that the nested directives will not\n\t // be able to reach the parent directives, but in this case it is intentional because we\n\t // created the clone to access the template tag name\n\t scope.$destroy();\n\t clone.remove();\n\t });\n\t\n\t $scope.$on('$destroy', function () {\n\t unbindEvents();\n\t viewport.unbind('mousewheel', wheelHandler);\n\t });\n\t\n\t viewport.bind('mousewheel', wheelHandler);\n\t\n\t $timeout(function () {\n\t viewport.applyContainerStyle();\n\t reload();\n\t });\n\t\n\t /* Private function definitions */\n\t\n\t function isInvalid(rid) {\n\t return rid && rid !== ridActual || $scope.$$destroyed;\n\t }\n\t\n\t function bindEvents() {\n\t viewport.bind('resize', resizeAndScrollHandler);\n\t viewport.bind('scroll', resizeAndScrollHandler);\n\t }\n\t\n\t function unbindEvents() {\n\t viewport.unbind('resize', resizeAndScrollHandler);\n\t viewport.unbind('scroll', resizeAndScrollHandler);\n\t }\n\t\n\t function reload() {\n\t viewport.resetTopPadding();\n\t viewport.resetBottomPadding();\n\t if (arguments.length) {\n\t startIndex = arguments[0];\n\t }\n\t buffer.reset(startIndex);\n\t adjustBuffer();\n\t }\n\t\n\t function isElementVisible(wrapper) {\n\t return wrapper.element.height() && wrapper.element[0].offsetParent;\n\t }\n\t\n\t function visibilityWatcher(wrapper) {\n\t if (isElementVisible(wrapper)) {\n\t buffer.forEach(function (item) {\n\t if (angular.isFunction(item.unregisterVisibilityWatcher)) {\n\t item.unregisterVisibilityWatcher();\n\t delete item.unregisterVisibilityWatcher;\n\t }\n\t });\n\t if (!pending.length) {\n\t adjustBuffer();\n\t }\n\t }\n\t }\n\t\n\t function insertWrapperContent(wrapper, insertAfter) {\n\t createElement(wrapper, insertAfter, viewport.insertElement);\n\t if (!isElementVisible(wrapper)) {\n\t wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(function () {\n\t return visibilityWatcher(wrapper);\n\t });\n\t }\n\t wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n\t }\n\t\n\t function createElement(wrapper, insertAfter, insertElement) {\n\t var promises = null;\n\t var sibling = insertAfter > 0 ? buffer[insertAfter - 1].element : undefined;\n\t linker(function (clone, scope) {\n\t promises = insertElement(clone, sibling);\n\t wrapper.element = clone;\n\t wrapper.scope = scope;\n\t scope[itemName] = wrapper.item;\n\t });\n\t if (adapter.transform) adapter.transform(wrapper.scope, wrapper.element);\n\t return promises;\n\t }\n\t\n\t function updateDOM() {\n\t var promises = [];\n\t var toBePrepended = [];\n\t var toBeRemoved = [];\n\t var inserted = [];\n\t\n\t buffer.forEach(function (wrapper, i) {\n\t switch (wrapper.op) {\n\t case 'prepend':\n\t toBePrepended.unshift(wrapper);\n\t break;\n\t case 'append':\n\t insertWrapperContent(wrapper, i);\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'insert':\n\t promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'remove':\n\t toBeRemoved.push(wrapper);\n\t }\n\t });\n\t\n\t toBeRemoved.forEach(function (wrapper) {\n\t return promises = promises.concat(buffer.remove(wrapper));\n\t });\n\t\n\t if (toBePrepended.length) toBePrepended.forEach(function (wrapper) {\n\t insertWrapperContent(wrapper);\n\t wrapper.op = 'none';\n\t });\n\t\n\t buffer.forEach(function (item, i) {\n\t return item.scope.$index = buffer.first + i;\n\t });\n\t\n\t return {\n\t prepended: toBePrepended,\n\t removed: toBeRemoved,\n\t inserted: inserted,\n\t animated: promises\n\t };\n\t }\n\t\n\t function updatePaddings(rid, updates) {\n\t // schedule another adjustBuffer after animation completion\n\t if (updates.animated.length) {\n\t $q.all(updates.animated).then(function () {\n\t viewport.adjustPadding();\n\t adjustBuffer(rid);\n\t });\n\t } else {\n\t viewport.adjustPadding();\n\t }\n\t }\n\t\n\t function enqueueFetch(rid, updates) {\n\t if (viewport.shouldLoadBottom()) {\n\t if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t if (pending.push(true) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t } else if (viewport.shouldLoadTop()) {\n\t if (!updates || buffer.effectiveHeight(updates.prepended) > 0 || pending[0]) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n\t // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n\t if (pending.push(false) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t }\n\t }\n\t\n\t function adjustBuffer(rid) {\n\t if (!rid) {\n\t // dismiss pending requests\n\t pending = [];\n\t rid = ++ridActual;\n\t }\n\t\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid);\n\t\n\t if (!pending.length) {\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function adjustBufferAfterFetch(rid) {\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t viewport.adjustScrollTopAfterPrepend(updates);\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid, updates);\n\t pending.shift();\n\t\n\t if (pending.length) fetch(rid);else {\n\t adapter.loading(false);\n\t bindEvents();\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function fetch(rid) {\n\t if (pending[0]) {\n\t // scrolling down\n\t if (buffer.length && !viewport.shouldLoadBottom()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchNext(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.eof = true;\n\t }\n\t\n\t if (result.length > 0) {\n\t viewport.clipTop();\n\t buffer.append(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t } else {\n\t // scrolling up\n\t if (buffer.length && !viewport.shouldLoadTop()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchPrevious(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.bof = true;\n\t // log 'bof is reached'\n\t }\n\t\n\t if (result.length > 0) {\n\t if (buffer.length) {\n\t viewport.clipBottom();\n\t }\n\t buffer.prepend(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t }\n\t }\n\t\n\t function resizeAndScrollHandler() {\n\t if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\t\n\t enqueueFetch(ridActual);\n\t\n\t if (pending.length) {\n\t unbindEvents();\n\t } else {\n\t adapter.calculateProperties();\n\t $scope.$apply();\n\t }\n\t }\n\t }\n\t\n\t function wheelHandler(event) {\n\t if (!adapter.disabled) {\n\t var scrollTop = viewport[0].scrollTop;\n\t var yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\t\n\t if (scrollTop === 0 && !buffer.bof || scrollTop === yMax && !buffer.eof) {\n\t event.preventDefault();\n\t }\n\t }\n\t }\n\t }\n\t}]);\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*!\r\n\t globals: angular, window\r\n\t List of used element methods available in JQuery but not in JQuery Lite\r\n\t element.before(elem)\r\n\t element.height()\r\n\t element.outerHeight(true)\r\n\t element.height(value) = only for Top/Bottom padding elements\r\n\t element.scrollTop()\r\n\t element.scrollTop(value)\r\n\t */\n\t\n\tvar JQLiteExtras = function () {\n\t function JQLiteExtras() {\n\t _classCallCheck(this, JQLiteExtras);\n\t }\n\t\n\t _createClass(JQLiteExtras, [{\n\t key: 'registerFor',\n\t value: function registerFor(element) {\n\t var convertToPx = void 0,\n\t css = void 0,\n\t getStyle = void 0,\n\t isWindow = void 0;\n\t // angular implementation blows up if elem is the window\n\t css = angular.element.prototype.css;\n\t\n\t element.prototype.css = function (name, value) {\n\t var self = this;\n\t var elem = self[0];\n\t if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\n\t return css.call(self, name, value);\n\t }\n\t };\n\t\n\t // as defined in angularjs v1.0.5\n\t isWindow = function isWindow(obj) {\n\t return obj && obj.document && obj.location && obj.alert && obj.setInterval;\n\t };\n\t\n\t function scrollTo(self, direction, value) {\n\t var elem = self[0];\n\t\n\t var _top$left$direction = _slicedToArray({\n\t top: ['scrollTop', 'pageYOffset', 'scrollLeft'],\n\t left: ['scrollLeft', 'pageXOffset', 'scrollTop']\n\t }[direction], 3),\n\t method = _top$left$direction[0],\n\t prop = _top$left$direction[1],\n\t preserve = _top$left$direction[2];\n\t\n\t if (isWindow(elem)) {\n\t if (angular.isDefined(value)) {\n\t return elem.scrollTo(self[preserve].call(self), value);\n\t }\n\t return prop in elem ? elem[prop] : elem.document.documentElement[method];\n\t } else {\n\t if (angular.isDefined(value)) {\n\t elem[method] = value;\n\t }\n\t return elem[method];\n\t }\n\t }\n\t\n\t if (window.getComputedStyle) {\n\t getStyle = function getStyle(elem) {\n\t return window.getComputedStyle(elem, null);\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t return parseFloat(value);\n\t };\n\t } else {\n\t getStyle = function getStyle(elem) {\n\t return elem.currentStyle;\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t var left = void 0,\n\t result = void 0,\n\t rs = void 0,\n\t rsLeft = void 0,\n\t style = void 0;\n\t var core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\n\t var rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\n\t\n\t if (!rnumnonpx.test(value)) {\n\t return parseFloat(value);\n\t }\n\t\n\t // ported from JQuery\n\t style = elem.style;\n\t left = style.left;\n\t rs = elem.runtimeStyle;\n\t rsLeft = rs && rs.left;\n\t if (rs) {\n\t rs.left = style.left;\n\t }\n\t // put in the new values to get a computed style out\n\t style.left = value;\n\t result = style.pixelLeft;\n\t style.left = left;\n\t if (rsLeft) {\n\t rs.left = rsLeft;\n\t }\n\t return result;\n\t };\n\t }\n\t\n\t function getMeasurements(elem, measure) {\n\t var base = void 0,\n\t borderA = void 0,\n\t borderB = void 0,\n\t computedMarginA = void 0,\n\t computedMarginB = void 0,\n\t computedStyle = void 0,\n\t dirA = void 0,\n\t dirB = void 0,\n\t marginA = void 0,\n\t marginB = void 0,\n\t paddingA = void 0,\n\t paddingB = void 0;\n\t\n\t if (isWindow(elem)) {\n\t base = document.documentElement[{ height: 'clientHeight', width: 'clientWidth' }[measure]];\n\t\n\t return {\n\t base: base,\n\t padding: 0,\n\t border: 0,\n\t margin: 0\n\t };\n\t }\n\t\n\t // Start with offset property\n\t\n\t var _width$height$measure = _slicedToArray({\n\t width: [elem.offsetWidth, 'Left', 'Right'],\n\t height: [elem.offsetHeight, 'Top', 'Bottom']\n\t }[measure], 3);\n\t\n\t base = _width$height$measure[0];\n\t dirA = _width$height$measure[1];\n\t dirB = _width$height$measure[2];\n\t\n\t\n\t computedStyle = getStyle(elem);\n\t paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\n\t paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\n\t borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\n\t borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\n\t computedMarginA = computedStyle['margin' + dirA];\n\t computedMarginB = computedStyle['margin' + dirB];\n\t\n\t // I do not care for width for now, so this hack is irrelevant\n\t // if ( !supportsPercentMargin )\n\t // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\n\t // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\n\t marginA = convertToPx(elem, computedMarginA) || 0;\n\t marginB = convertToPx(elem, computedMarginB) || 0;\n\t\n\t return {\n\t base: base,\n\t padding: paddingA + paddingB,\n\t border: borderA + borderB,\n\t margin: marginA + marginB\n\t };\n\t }\n\t\n\t function getWidthHeight(elem, direction, measure) {\n\t var computedStyle = void 0,\n\t result = void 0;\n\t\n\t var measurements = getMeasurements(elem, direction);\n\t\n\t if (measurements.base > 0) {\n\t return {\n\t base: measurements.base - measurements.padding - measurements.border,\n\t outer: measurements.base,\n\t outerfull: measurements.base + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // Fall back to computed then uncomputed css if necessary\n\t computedStyle = getStyle(elem);\n\t result = computedStyle[direction];\n\t\n\t if (result < 0 || result === null) {\n\t result = elem.style[direction] || 0;\n\t }\n\t\n\t // Normalize \"\", auto, and prepare for extra\n\t result = parseFloat(result) || 0;\n\t\n\t return {\n\t base: result - measurements.padding - measurements.border,\n\t outer: result,\n\t outerfull: result + measurements.padding + measurements.border + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // define missing methods\n\t return angular.forEach({\n\t before: function before(newElem) {\n\t var children, elem, i, j, parent, ref, self;\n\t self = this;\n\t elem = self[0];\n\t parent = self.parent();\n\t children = parent.contents();\n\t if (children[0] === elem) {\n\t return parent.prepend(newElem);\n\t } else {\n\t for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n\t if (children[i] === elem) {\n\t angular.element(children[i - 1]).after(newElem);\n\t return;\n\t }\n\t }\n\t throw new Error('invalid DOM structure ' + elem.outerHTML);\n\t }\n\t },\n\t height: function height(value) {\n\t var self;\n\t self = this;\n\t if (angular.isDefined(value)) {\n\t if (angular.isNumber(value)) {\n\t value = value + 'px';\n\t }\n\t return css.call(self, 'height', value);\n\t } else {\n\t return getWidthHeight(this[0], 'height', 'base');\n\t }\n\t },\n\t outerHeight: function outerHeight(option) {\n\t return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\n\t },\n\t outerWidth: function outerWidth(option) {\n\t return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\n\t },\n\t\n\t\n\t /*\r\n\t The offset setter method is not implemented\r\n\t */\n\t offset: function offset(value) {\n\t var docElem = void 0,\n\t win = void 0;\n\t var self = this;\n\t var box = {\n\t top: 0,\n\t left: 0\n\t };\n\t var elem = self[0];\n\t var doc = elem && elem.ownerDocument;\n\t\n\t if (arguments.length) {\n\t if (value === undefined) {\n\t return self;\n\t }\n\t // TODO: implement setter\n\t throw new Error('offset setter method is not implemented');\n\t }\n\t\n\t if (!doc) {\n\t return;\n\t }\n\t\n\t docElem = doc.documentElement;\n\t\n\t // TODO: Make sure it's not a disconnected DOM node\n\t\n\t if (elem.getBoundingClientRect != null) {\n\t box = elem.getBoundingClientRect();\n\t }\n\t\n\t win = doc.defaultView || doc.parentWindow;\n\t\n\t return {\n\t top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n\t left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n\t };\n\t },\n\t scrollTop: function scrollTop(value) {\n\t return scrollTo(this, 'top', value);\n\t },\n\t scrollLeft: function scrollLeft(value) {\n\t return scrollTo(this, 'left', value);\n\t }\n\t }, function (value, key) {\n\t if (!element.prototype[key]) {\n\t return element.prototype[key] = value;\n\t }\n\t });\n\t }\n\t }]);\n\t\n\t return JQLiteExtras;\n\t}();\n\t\n\texports.default = JQLiteExtras;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar ElementRoutines = function () {\n\t function ElementRoutines($injector, $q) {\n\t _classCallCheck(this, ElementRoutines);\n\t\n\t this.$animate = $injector.has && $injector.has('$animate') ? $injector.get('$animate') : null;\n\t this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\n\t this.$q = $q;\n\t }\n\t\n\t _createClass(ElementRoutines, [{\n\t key: 'insertElement',\n\t value: function insertElement(newElement, previousElement) {\n\t previousElement.after(newElement);\n\t return [];\n\t }\n\t }, {\n\t key: 'removeElement',\n\t value: function removeElement(wrapper) {\n\t wrapper.element.remove();\n\t wrapper.scope.$destroy();\n\t return [];\n\t }\n\t }, {\n\t key: 'insertElementAnimated',\n\t value: function insertElementAnimated(newElement, previousElement) {\n\t var _this = this;\n\t\n\t if (!this.$animate) {\n\t return this.insertElement(newElement, previousElement);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret = function () {\n\t var deferred = _this.$q.defer();\n\t // no need for parent - previous element is never null\n\t _this.$animate.enter(newElement, null, previousElement, function () {\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n\t }\n\t\n\t // no need for parent - previous element is never null\n\t return [this.$animate.enter(newElement, null, previousElement)];\n\t }\n\t }, {\n\t key: 'removeElementAnimated',\n\t value: function removeElementAnimated(wrapper) {\n\t var _this2 = this;\n\t\n\t if (!this.$animate) {\n\t return this.removeElement(wrapper);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret2 = function () {\n\t var deferred = _this2.$q.defer();\n\t _this2.$animate.leave(wrapper.element, function () {\n\t wrapper.scope.$destroy();\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n\t }\n\t\n\t return [this.$animate.leave(wrapper.element).then(function () {\n\t return wrapper.scope.$destroy();\n\t })];\n\t }\n\t }]);\n\t\n\t return ElementRoutines;\n\t}();\n\t\n\texports.default = ElementRoutines;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = ScrollBuffer;\n\tfunction ScrollBuffer(elementRoutines, bufferSize) {\n\t var buffer = Object.create(Array.prototype);\n\t\n\t angular.extend(buffer, {\n\t size: bufferSize,\n\t\n\t reset: function reset(startIndex) {\n\t buffer.remove(0, buffer.length);\n\t buffer.eof = false;\n\t buffer.bof = false;\n\t buffer.first = startIndex;\n\t buffer.next = startIndex;\n\t buffer.minIndex = startIndex;\n\t buffer.maxIndex = startIndex;\n\t buffer.minIndexUser = null;\n\t buffer.maxIndexUser = null;\n\t },\n\t append: function append(items) {\n\t items.forEach(function (item) {\n\t ++buffer.next;\n\t buffer.insert('append', item);\n\t });\n\t buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\n\t },\n\t prepend: function prepend(items) {\n\t items.reverse().forEach(function (item) {\n\t --buffer.first;\n\t buffer.insert('prepend', item);\n\t });\n\t buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\n\t },\n\t\n\t\n\t /**\r\n\t * inserts wrapped element in the buffer\r\n\t * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n\t * for insert the number is the index for the buffer element the new one have to be inserted after\r\n\t * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n\t */\n\t insert: function insert(operation, item) {\n\t var wrapper = {\n\t item: item\n\t };\n\t\n\t if (operation % 1 === 0) {\n\t // it is an insert\n\t wrapper.op = 'insert';\n\t buffer.splice(operation, 0, wrapper);\n\t } else {\n\t wrapper.op = operation;\n\t switch (operation) {\n\t case 'append':\n\t buffer.push(wrapper);\n\t break;\n\t case 'prepend':\n\t buffer.unshift(wrapper);\n\t break;\n\t }\n\t }\n\t },\n\t\n\t\n\t // removes elements from buffer\n\t remove: function remove(arg1, arg2) {\n\t if (angular.isNumber(arg1)) {\n\t // removes items from arg1 (including) through arg2 (excluding)\n\t for (var i = arg1; i < arg2; i++) {\n\t elementRoutines.removeElement(buffer[i]);\n\t }\n\t\n\t return buffer.splice(arg1, arg2 - arg1);\n\t }\n\t // removes single item(wrapper) from the buffer\n\t buffer.splice(buffer.indexOf(arg1), 1);\n\t\n\t return elementRoutines.removeElementAnimated(arg1);\n\t },\n\t effectiveHeight: function effectiveHeight(elements) {\n\t if (!elements.length) {\n\t return 0;\n\t }\n\t var top = Number.MAX_VALUE;\n\t var bottom = Number.MIN_VALUE;\n\t elements.forEach(function (wrapper) {\n\t if (wrapper.element[0].offsetParent) {\n\t // element style is not display:none\n\t top = Math.min(top, wrapper.element.offset().top);\n\t bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\n\t }\n\t });\n\t return Math.max(0, bottom - top);\n\t }\n\t });\n\t\n\t return buffer;\n\t}\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Viewport;\n\t\n\tvar _padding = __webpack_require__(5);\n\t\n\tvar _padding2 = _interopRequireDefault(_padding);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\n\t var topPadding = null;\n\t var bottomPadding = null;\n\t var viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\n\t var container = viewportController && viewportController.container ? viewportController.container : undefined;\n\t var scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\n\t\n\t viewport.css({\n\t 'overflow-anchor': 'none',\n\t 'overflow-y': 'auto',\n\t 'display': 'block'\n\t });\n\t\n\t function bufferPadding() {\n\t return viewport.outerHeight() * padding; // some extra space to initiate preload\n\t }\n\t\n\t angular.extend(viewport, {\n\t getScope: function getScope() {\n\t return scope;\n\t },\n\t createPaddingElements: function createPaddingElements(template) {\n\t topPadding = new _padding2.default(template);\n\t bottomPadding = new _padding2.default(template);\n\t element.before(topPadding);\n\t element.after(bottomPadding);\n\t },\n\t applyContainerStyle: function applyContainerStyle() {\n\t if (container && container !== viewport) {\n\t viewport.css('height', window.getComputedStyle(container[0]).height);\n\t }\n\t },\n\t bottomDataPos: function bottomDataPos() {\n\t var scrollHeight = viewport[0].scrollHeight;\n\t scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\n\t return scrollHeight - bottomPadding.height();\n\t },\n\t topDataPos: function topDataPos() {\n\t return topPadding.height();\n\t },\n\t bottomVisiblePos: function bottomVisiblePos() {\n\t return viewport.scrollTop() + viewport.outerHeight();\n\t },\n\t topVisiblePos: function topVisiblePos() {\n\t return viewport.scrollTop();\n\t },\n\t insertElement: function insertElement(e, sibling) {\n\t return elementRoutines.insertElement(e, sibling || topPadding);\n\t },\n\t insertElementAnimated: function insertElementAnimated(e, sibling) {\n\t return elementRoutines.insertElementAnimated(e, sibling || topPadding);\n\t },\n\t shouldLoadBottom: function shouldLoadBottom() {\n\t return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\n\t },\n\t clipBottom: function clipBottom() {\n\t // clip the invisible items off the bottom\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\n\t\n\t for (var i = buffer.length - 1; i >= 0; i--) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t bottomPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t buffer.eof = false;\n\t buffer.remove(buffer.length - overage, buffer.length);\n\t buffer.next -= overage;\n\t viewport.adjustPadding();\n\t }\n\t },\n\t shouldLoadTop: function shouldLoadTop() {\n\t return !buffer.bof && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding();\n\t },\n\t clipTop: function clipTop() {\n\t // clip the invisible items off the top\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\n\t\n\t for (var i = 0; i < buffer.length; i++) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t topPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t // we need to adjust top padding element before items are removed from top\n\t // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\n\t topPadding.height(topPadding.height() + overageHeight);\n\t buffer.bof = false;\n\t buffer.remove(0, overage);\n\t buffer.first += overage;\n\t }\n\t },\n\t adjustPadding: function adjustPadding() {\n\t if (!buffer.length) {\n\t return;\n\t }\n\t\n\t // precise heights calculation, items that were in buffer once\n\t var topPaddingHeight = topPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index < buffer.first ? item.height : 0);\n\t }, 0);\n\t var bottomPaddingHeight = bottomPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index >= buffer.next ? item.height : 0);\n\t }, 0);\n\t\n\t // average item height based on buffer data\n\t var visibleItemsHeight = buffer.reduce(function (summ, item) {\n\t return summ + item.element.outerHeight(true);\n\t }, 0);\n\t var averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\n\t\n\t // average heights calculation, items that have never been reached\n\t var adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\n\t var adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\n\t var topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\n\t var bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\n\t\n\t // paddings combine adjustment\n\t topPadding.height(topPaddingHeight + topPaddingHeightAdd);\n\t bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\n\t },\n\t adjustScrollTopAfterMinIndexSet: function adjustScrollTopAfterMinIndexSet(topPaddingHeightOld) {\n\t // additional scrollTop adjustment in case of datasource.minIndex external set\n\t if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\n\t var diff = topPadding.height() - topPaddingHeightOld;\n\t viewport.scrollTop(viewport.scrollTop() + diff);\n\t }\n\t },\n\t adjustScrollTopAfterPrepend: function adjustScrollTopAfterPrepend(updates) {\n\t if (!updates.prepended.length) return;\n\t var height = buffer.effectiveHeight(updates.prepended);\n\t var paddingHeight = topPadding.height() - height;\n\t if (paddingHeight >= 0) {\n\t topPadding.height(paddingHeight);\n\t } else {\n\t topPadding.height(0);\n\t viewport.scrollTop(viewport.scrollTop() - paddingHeight);\n\t }\n\t },\n\t resetTopPadding: function resetTopPadding() {\n\t topPadding.height(0);\n\t topPadding.cache.clear();\n\t },\n\t resetBottomPadding: function resetBottomPadding() {\n\t bottomPadding.height(0);\n\t bottomPadding.cache.clear();\n\t }\n\t });\n\t\n\t return viewport;\n\t}\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Padding;\n\tfunction Cache() {\n\t var cache = Object.create(Array.prototype);\n\t\n\t angular.extend(cache, {\n\t add: function add(item) {\n\t for (var i = cache.length - 1; i >= 0; i--) {\n\t if (cache[i].index === item.scope.$index) {\n\t cache[i].height = item.element.outerHeight();\n\t return;\n\t }\n\t }\n\t cache.push({\n\t index: item.scope.$index,\n\t height: item.element.outerHeight()\n\t });\n\t },\n\t clear: function clear() {\n\t cache.length = 0;\n\t }\n\t });\n\t\n\t return cache;\n\t}\n\t\n\tfunction Padding(template) {\n\t var result = void 0;\n\t\n\t switch (template.tagName) {\n\t case 'dl':\n\t throw new Error('ui-scroll directive does not support <' + template.tagName + '> as a repeating tag: ' + template.outerHTML);\n\t case 'tr':\n\t var table = angular.element('
    ');\n\t result = table.find('tr');\n\t break;\n\t case 'li':\n\t result = angular.element('
  • ');\n\t break;\n\t default:\n\t result = angular.element('
    ');\n\t }\n\t\n\t result.cache = new Cache();\n\t\n\t return result;\n\t}\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction findCtrl(scope, ctrl) {\n\t if (!scope) {\n\t return;\n\t }\n\t if (scope.hasOwnProperty(ctrl) && Object.getPrototypeOf(scope[ctrl]).constructor.hasOwnProperty('$inject')) {\n\t return scope[ctrl];\n\t }\n\t return findCtrl(scope.$parent, ctrl);\n\t}\n\t\n\tfunction assignAttr(attr, scope, element) {\n\t if (!attr || !(attr = attr.replace(/^\\s+|\\s+$/gm, ''))) {\n\t return;\n\t }\n\t\n\t var onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\n\t var asSyntax = attr.match(/^([^.]+)\\.(.+)?/);\n\t\n\t if (onSyntax && onSyntax.length === 4) {\n\t // controller on (backward compatibility), deprecated since v1.6.1\n\t window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\n\t var ctrl = onSyntax[3];\n\t var tail = onSyntax[1];\n\t var candidate = element;\n\t while (candidate.length) {\n\t var candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\n\t var candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\n\t if (candidateName && candidateName[1] === ctrl) {\n\t return {\n\t target: candidateScope,\n\t source: tail\n\t };\n\t }\n\t candidate = candidate.parent();\n\t }\n\t throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\n\t } else if (asSyntax && asSyntax.length === 3) {\n\t // controller as\n\t var _ctrl = asSyntax[1];\n\t var _tail = asSyntax[2];\n\t var foundCtrl = findCtrl(scope, _ctrl);\n\t if (foundCtrl) {\n\t return {\n\t target: foundCtrl,\n\t source: _tail\n\t };\n\t }\n\t }\n\t\n\t return {\n\t target: scope,\n\t source: attr\n\t };\n\t}\n\t\n\tvar Adapter = function () {\n\t function Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element) {\n\t _classCallCheck(this, Adapter);\n\t\n\t this.viewport = viewport;\n\t this.buffer = buffer;\n\t this.adjustBuffer = adjustBuffer;\n\t this.reload = reload;\n\t\n\t this.publicContext = {};\n\t this.assignAdapter($attr, $parse, element);\n\t this.generatePublicContext($attr, $parse, element);\n\t\n\t this.isLoading = false;\n\t this.disabled = false;\n\t }\n\t\n\t _createClass(Adapter, [{\n\t key: 'assignAdapter',\n\t value: function assignAdapter($attr, $parse, element) {\n\t var data = assignAttr($attr.adapter, this.viewport.getScope(), element);\n\t\n\t if (data) {\n\t try {\n\t $parse(data.source).assign(data.target, {});\n\t var adapterOnScope = $parse(data.source)(data.target);\n\t\n\t angular.extend(adapterOnScope, this.publicContext);\n\t this.publicContext = adapterOnScope;\n\t } catch (error) {\n\t error.message = 'Angular ui-scroll Adapter assignment exception.\\n' + ('Can\\'t parse \"' + $attr.adapter + '\" expression.\\n') + error.message;\n\t throw error;\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'generatePublicContext',\n\t value: function generatePublicContext($attr, $parse, element) {\n\t var _this = this;\n\t\n\t // these methods will be accessible out of ui-scroll via user defined adapter\n\t var publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\n\t for (var i = publicMethods.length - 1; i >= 0; i--) {\n\t this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\n\t }\n\t\n\t // these read-only props will be accessible out of ui-scroll via user defined adapter\n\t var publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope'];\n\t\n\t var _loop = function _loop(_i) {\n\t var property = void 0,\n\t assignProp = void 0;\n\t var data = assignAttr($attr[publicProps[_i]], _this.viewport.getScope(), element);\n\t if (data) {\n\t assignProp = $parse(data.source).assign;\n\t }\n\t Object.defineProperty(_this, publicProps[_i], {\n\t get: function get() {\n\t return property;\n\t },\n\t set: function set(value) {\n\t property = value;\n\t if (assignProp) {\n\t assignProp(data.target, value);\n\t }\n\t _this.publicContext[publicProps[_i]] = value;\n\t }\n\t });\n\t };\n\t\n\t for (var _i = publicProps.length - 1; _i >= 0; _i--) {\n\t _loop(_i);\n\t }\n\t\n\t // non-read-only public property\n\t Object.defineProperty(this.publicContext, 'disabled', {\n\t get: function get() {\n\t return _this.disabled;\n\t },\n\t set: function set(value) {\n\t return !(_this.disabled = value) ? _this.adjustBuffer() : null;\n\t }\n\t });\n\t }\n\t }, {\n\t key: 'loading',\n\t value: function loading(value) {\n\t this['isLoading'] = value;\n\t }\n\t }, {\n\t key: 'isBOF',\n\t value: function isBOF() {\n\t return this.buffer.bof;\n\t }\n\t }, {\n\t key: 'isEOF',\n\t value: function isEOF() {\n\t return this.buffer.eof;\n\t }\n\t }, {\n\t key: 'isEmpty',\n\t value: function isEmpty() {\n\t return !this.buffer.length;\n\t }\n\t }, {\n\t key: 'applyUpdates',\n\t value: function applyUpdates(arg1, arg2) {\n\t var _this2 = this;\n\t\n\t if (angular.isFunction(arg1)) {\n\t // arg1 is the updater function, arg2 is ignored\n\t this.buffer.slice(0).forEach(function (wrapper) {\n\t // we need to do it on the buffer clone, because buffer content\n\t // may change as we iterate through\n\t _this2.applyUpdate(wrapper, arg1(wrapper.item, wrapper.scope, wrapper.element));\n\t });\n\t } else {\n\t // arg1 is item index, arg2 is the newItems array\n\t if (arg1 % 1 !== 0) {\n\t // checking if it is an integer\n\t throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\n\t }\n\t\n\t var index = arg1 - this.buffer.first;\n\t if (index >= 0 && index < this.buffer.length) {\n\t this.applyUpdate(this.buffer[index], arg2);\n\t }\n\t }\n\t\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'append',\n\t value: function append(newItems) {\n\t this.buffer.append(newItems);\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'prepend',\n\t value: function prepend(newItems) {\n\t this.buffer.prepend(newItems);\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'calculateProperties',\n\t value: function calculateProperties() {\n\t var item = void 0,\n\t itemHeight = void 0,\n\t itemTop = void 0,\n\t isNewRow = void 0,\n\t rowTop = null;\n\t var topHeight = 0;\n\t for (var i = 0; i < this.buffer.length; i++) {\n\t item = this.buffer[i];\n\t itemTop = item.element.offset().top;\n\t isNewRow = rowTop !== itemTop;\n\t rowTop = itemTop;\n\t if (isNewRow) {\n\t itemHeight = item.element.outerHeight(true);\n\t }\n\t if (isNewRow && this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos()) {\n\t topHeight += itemHeight;\n\t } else {\n\t if (isNewRow) {\n\t this['topVisible'] = item.item;\n\t this['topVisibleElement'] = item.element;\n\t this['topVisibleScope'] = item.scope;\n\t }\n\t break;\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'applyUpdate',\n\t value: function applyUpdate(wrapper, newItems) {\n\t var _this3 = this;\n\t\n\t if (!angular.isArray(newItems)) {\n\t return;\n\t }\n\t\n\t var keepIt = void 0;\n\t var pos = this.buffer.indexOf(wrapper) + 1;\n\t\n\t newItems.reverse().forEach(function (newItem) {\n\t if (newItem === wrapper.item) {\n\t keepIt = true;\n\t pos--;\n\t } else {\n\t _this3.buffer.insert(pos, newItem);\n\t }\n\t });\n\t\n\t if (!keepIt) {\n\t wrapper.op = 'remove';\n\t }\n\t }\n\t }]);\n\t\n\t return Adapter;\n\t}();\n\t\n\texports.default = Adapter;\n\n/***/ }\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// ui-scroll.min.js"," \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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6fb5c0179465828c8111","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 /**\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","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);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","function findCtrl(scope, ctrl) {\r\n if (!scope) {\r\n return;\r\n }\r\n if (scope.hasOwnProperty(ctrl) && Object.getPrototypeOf(scope[ctrl]).constructor.hasOwnProperty('$inject')) {\r\n return scope[ctrl];\r\n }\r\n return findCtrl(scope.$parent, ctrl);\r\n}\r\n\r\nfunction assignAttr(attr, scope, element) {\r\n if (!attr || !(attr = attr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n\r\n let onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\r\n let asSyntax = attr.match(/^([^.]+)\\.(.+)?/);\r\n\r\n if (onSyntax && onSyntax.length === 4) { // controller on (backward compatibility), deprecated since v1.6.1\r\n window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\r\n let ctrl = onSyntax[3];\r\n let tail = onSyntax[1];\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[1] === ctrl) {\r\n return {\r\n target: candidateScope,\r\n source: tail\r\n };\r\n }\r\n candidate = candidate.parent();\r\n }\r\n throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\r\n }\r\n else if (asSyntax && asSyntax.length === 3) { // controller as\r\n let ctrl = asSyntax[1];\r\n let tail = asSyntax[2];\r\n let foundCtrl = findCtrl(scope, ctrl);\r\n if (foundCtrl) {\r\n return {\r\n target: foundCtrl,\r\n source: tail\r\n };\r\n }\r\n }\r\n\r\n return {\r\n target: scope,\r\n source: attr\r\n };\r\n}\r\n\r\nclass Adapter {\r\n\r\n constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element) {\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n this.adjustBuffer = adjustBuffer;\r\n this.reload = reload;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr, $parse, element);\r\n this.generatePublicContext($attr, $parse, element);\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n }\r\n\r\n assignAdapter($attr, $parse, element) {\r\n let data = assignAttr($attr.adapter, this.viewport.getScope(), element);\r\n\r\n if (data) {\r\n try {\r\n $parse(data.source).assign(data.target, {});\r\n let adapterOnScope = $parse(data.source)(data.target);\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${$attr.adapter}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n generatePublicContext($attr, $parse, element) {\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'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, assignProp;\r\n let data = assignAttr($attr[publicProps[i]], this.viewport.getScope(), element);\r\n if (data) {\r\n assignProp = $parse(data.source).assign;\r\n }\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n if (assignProp) {\r\n assignProp(data.target, value);\r\n }\r\n this.publicContext[publicProps[i]] = value;\r\n }\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.adjustBuffer() : 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 applyUpdates(arg1, arg2) {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\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, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - this.buffer.first;\r\n if ((index >= 0 && index < this.buffer.length)) {\r\n this.applyUpdate(this.buffer[index], arg2);\r\n }\r\n }\r\n\r\n this.adjustBuffer();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n calculateProperties() {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n item = this.buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n break;\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\r\n let keepIt;\r\n let pos = (this.buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n this.buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index 71971c77..ac2f15ba 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "angular-ui-scroll", "description": "AngularJS infinite scrolling module", - "version": "1.6.0", + "version": "1.6.1", "src": "./src/", - "public": "./public/", + "public": "./dist/", "main": "./dist/ui-scroll.js", "homepage": "https://github.com/angular-ui/ui-scroll", "author": { From 9c7eefa99d3ba045efd5313ad2b3c0452faf8a2a Mon Sep 17 00:00:00 2001 From: dhilt Date: Sat, 4 Mar 2017 09:02:30 +0300 Subject: [PATCH 5/7] Adapter assignments refactoring, specs and readme clarification --- README.md | 15 +++- demo/insideDirective/insideDirective.html | 2 +- dist/ui-scroll.js | 100 ++++++++-------------- dist/ui-scroll.js.map | 2 +- dist/ui-scroll.min.js | 4 +- dist/ui-scroll.min.js.map | 2 +- src/modules/adapter.js | 99 ++++++++------------- src/ui-scroll.js | 2 +- test/AssigningSpec.js | 30 ++----- 9 files changed, 96 insertions(+), 160 deletions(-) diff --git a/README.md b/README.md index 3c9ccadf..95f5ddd7 100644 --- a/README.md +++ b/README.md @@ -148,11 +148,11 @@ It is empty since it was deprecated in v1.6.0. >{{item}}
    ``` -### Parametrs +### Parameters * **uiScroll – scroll expression** – The expression indicating how to enumerate a collection. Only one format is currently supported: `variable in datasource` – where variable is the user defined loop variable and datasource is the name of the data source to enumerate. -* **buffer-size - expression**, optional - number of items requested from the datasource in a single request. The default is 10 and the minimal value is 3 -* **padding - expression**, optional - extra height added to the visible area for the purpose of determining when the items should be created/destroyed. The value is relative to the visible height of the area, the default is 0.5 and the minimal value is 0.3 +* **buffer-size - expression**, optional - number of items requested from the datasource in a single request. The default is 10 and the minimal value is 3. +* **padding - expression**, optional - extra height added to the visible area for the purpose of determining when the items should be created/destroyed. The value is relative to the visible height of the area, the default is 0.5 and the minimal value is 0.3. * **start-index - expression**, optional - index of the first item to be requested from the datasource. The default is 1. * **adapter - assignable expression**, optional - if provided a reference to the adapter object for the scroller instance will be injected in the appropriate scope. If you have multiple scrollers within the same viewport, make sure that every one of them has its unique adapter name. @@ -165,7 +165,14 @@ Some of the properties offered by the adapter can also be accessed directly from The `expression` can be any angular expression (assignable expression where so specified). All expressions are evaluated once at the time when the scroller is initialized. Changes in the expression value after scroller initialization will have no impact on the scroller behavior. -The assignable expressions will be used by scroller to inject the requested value into the target scope. The scope associated with the viewport (the element marked with the [uiScrollViewport](#uiscrollviewport-directive) directive) will be used as the target scope. If the viewport is not defined (window viewport), the $rootScope will be used as the target scope. Also `Controller As` syntax could be used as an alternative way to specify target controller in assignable expressions. +The `assignable expressions` will be used by scroller to inject the requested value into the target scope. +The target scope is being defined in accordance with standard Angular rules (nested scopes and controller As syntax should be taken into account): +the scroller will traverse its parents (from the ui-scroll element's scope up to the $rootScope) to locate the target scope. +If the viewport is presented (the element marked with the [uiScrollViewport](#uiscrollviewport-directive) directive), +then the scope associated with the viewport will be a start point in target scope detecting. +Angular $parse service is being used in `assignable expressions` implementation. + +_Deprecated!_ The format `expression on controller` introduced in v1.5.0 (and deprecated in v1.6.1) can be used to explicitly target the scope associated with the specified controller as the target scope for the injection. In this format `expression` is any angular assignable expression, and `controller` is the name of controller constructor function as specified in the `ng-controller` directive. ### Datasource diff --git a/demo/insideDirective/insideDirective.html b/demo/insideDirective/insideDirective.html index f31f6674..da5021ee 100644 --- a/demo/insideDirective/insideDirective.html +++ b/demo/insideDirective/insideDirective.html @@ -22,7 +22,7 @@

    Scroller inside the directive

    -
    +
    diff --git a/dist/ui-scroll.js b/dist/ui-scroll.js index 2333ea06..6b8a7259 100644 --- a/dist/ui-scroll.js +++ b/dist/ui-scroll.js @@ -1,7 +1,7 @@ /*! * angular-ui-scroll (uncompressed) * https://github.com/angular-ui/ui-scroll - * Version: 1.6.1 -- 2017-03-03T05:28:34.208Z + * Version: 1.6.1 -- 2017-03-04T06:00:38.359Z * License: MIT */ /******/ (function(modules) { // webpackBootstrap @@ -137,7 +137,7 @@ var elementRoutines = new _elementRoutines2.default($injector, $q); var buffer = new _buffer2.default(elementRoutines, bufferSize); var viewport = new _viewport2.default(elementRoutines, buffer, element, viewportController, $rootScope, padding); - var adapter = new _adapter2.default(viewport, buffer, adjustBuffer, reload, $attr, $parse, element); + var adapter = new _adapter2.default(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope); if (viewportController) { viewportController.adapter = adapter; @@ -1300,26 +1300,9 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - function findCtrl(scope, ctrl) { - if (!scope) { - return; - } - if (scope.hasOwnProperty(ctrl) && Object.getPrototypeOf(scope[ctrl]).constructor.hasOwnProperty('$inject')) { - return scope[ctrl]; - } - return findCtrl(scope.$parent, ctrl); - } - - function assignAttr(attr, scope, element) { - if (!attr || !(attr = attr.replace(/^\s+|\s+$/gm, ''))) { - return; - } - + function getCtrlOnData(attr, element) { var onSyntax = attr.match(/^(.+)(\s+on\s+)(.+)?/); - var asSyntax = attr.match(/^([^.]+)\.(.+)?/); - if (onSyntax && onSyntax.length === 4) { - // controller on (backward compatibility), deprecated since v1.6.1 window.console.warn('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.'); var ctrl = onSyntax[3]; var tail = onSyntax[1]; @@ -1336,27 +1319,11 @@ candidate = candidate.parent(); } throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller "' + ctrl + '" to inject "' + tail + '"'); - } else if (asSyntax && asSyntax.length === 3) { - // controller as - var _ctrl = asSyntax[1]; - var _tail = asSyntax[2]; - var foundCtrl = findCtrl(scope, _ctrl); - if (foundCtrl) { - return { - target: foundCtrl, - source: _tail - }; - } } - - return { - target: scope, - source: attr - }; } var Adapter = function () { - function Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element) { + function Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope) { _classCallCheck(this, Adapter); this.viewport = viewport; @@ -1364,35 +1331,46 @@ this.adjustBuffer = adjustBuffer; this.reload = reload; - this.publicContext = {}; - this.assignAdapter($attr, $parse, element); - this.generatePublicContext($attr, $parse, element); - this.isLoading = false; this.disabled = false; + + var viewportScope = viewport.getScope(); + this.startScope = viewportScope.$parent ? viewportScope : $scope; + + this.publicContext = {}; + this.assignAdapter($attr.adapter, $parse, element); + this.generatePublicContext($attr, $parse); } _createClass(Adapter, [{ key: 'assignAdapter', - value: function assignAdapter($attr, $parse, element) { - var data = assignAttr($attr.adapter, this.viewport.getScope(), element); - - if (data) { - try { - $parse(data.source).assign(data.target, {}); - var adapterOnScope = $parse(data.source)(data.target); - - angular.extend(adapterOnScope, this.publicContext); - this.publicContext = adapterOnScope; - } catch (error) { - error.message = 'Angular ui-scroll Adapter assignment exception.\n' + ('Can\'t parse "' + $attr.adapter + '" expression.\n') + error.message; - throw error; + value: function assignAdapter(adapterAttr, $parse, element) { + if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\s+|\s+$/gm, ''))) { + return; + } + var ctrlOnData = getCtrlOnData(adapterAttr, element); + var adapterOnScope = void 0; + + try { + if (ctrlOnData) { + // "Controller On", deprecated since v1.6.1 + $parse(ctrlOnData.source).assign(ctrlOnData.target, {}); + adapterOnScope = $parse(ctrlOnData.source)(ctrlOnData.target); + } else { + $parse(adapterAttr).assign(this.startScope, {}); + adapterOnScope = $parse(adapterAttr)(this.startScope); } + } catch (error) { + error.message = 'Angular ui-scroll Adapter assignment exception.\n' + ('Can\'t parse "' + adapterAttr + '" expression.\n') + error.message; + throw error; } + + angular.extend(adapterOnScope, this.publicContext); + this.publicContext = adapterOnScope; } }, { key: 'generatePublicContext', - value: function generatePublicContext($attr, $parse, element) { + value: function generatePublicContext($attr, $parse) { var _this = this; // these methods will be accessible out of ui-scroll via user defined adapter @@ -1406,21 +1384,17 @@ var _loop = function _loop(_i) { var property = void 0, - assignProp = void 0; - var data = assignAttr($attr[publicProps[_i]], _this.viewport.getScope(), element); - if (data) { - assignProp = $parse(data.source).assign; - } + attr = $attr[publicProps[_i]]; Object.defineProperty(_this, publicProps[_i], { get: function get() { return property; }, set: function set(value) { property = value; - if (assignProp) { - assignProp(data.target, value); - } _this.publicContext[publicProps[_i]] = value; + if (attr) { + $parse(attr).assign(_this.startScope, value); + } } }); }; diff --git a/dist/ui-scroll.js.map b/dist/ui-scroll.js.map index de3ac127..0fdd86cd 100644 --- a/dist/ui-scroll.js.map +++ b/dist/ui-scroll.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 0a8b101f02aaa0804c9e","webpack:///./src/ui-scroll.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/adapter.js"],"names":["angular","module","service","run","jqLiteExtras","window","jQuery","registerFor","element","directive","restrict","controller","scope","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$q","$parse","require","transclude","priority","terminal","link","$scope","$attr","controllers","linker","match","uiScroll","Error","parseNumericAttr","value","defaultValue","result","isNaN","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","datasource","itemName","datasourceName","viewportController","bufferSize","Math","max","padding","startIndex","ridActual","pending","elementRoutines","buffer","adapter","adjustBuffer","reload","isDatasourceValid","isObject","isFunction","get","indexStore","defineProperty","propName","propUserName","descriptor","Object","getOwnPropertyDescriptor","set","length","topPaddingHeightOld","topDataPos","adjustPadding","adjustScrollTopAfterMinIndexSet","fetchNext","success","next","index","append","item","count","fetchPrevious","first","prepend","clone","createPaddingElements","$destroy","remove","$on","unbindEvents","unbind","wheelHandler","bind","applyContainerStyle","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","resetTopPadding","resetBottomPadding","arguments","reset","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","addClass","promises","sibling","undefined","transform","updateDOM","toBePrepended","toBeRemoved","inserted","i","op","unshift","push","concat","insertElementAnimated","$index","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","fetch","loading","shouldLoadTop","w","removeClass","calculateProperties","adjustBufferAfterFetch","adjustScrollTopAfterPrepend","shift","eof","clipTop","bof","clipBottom","$$phase","isLoading","disabled","$apply","event","scrollTop","yMax","scrollHeight","clientHeight","preventDefault","JQLiteExtras","convertToPx","css","getStyle","isWindow","prototype","name","self","elem","nodeType","style","call","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isDefined","documentElement","getComputedStyle","parseFloat","currentStyle","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","width","border","margin","offsetWidth","offsetHeight","getWidthHeight","measurements","outer","outerfull","before","newElem","j","parent","ref","contents","after","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","key","ElementRoutines","$animate","has","isAngularVersionLessThen1_3","version","major","minor","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","ScrollBuffer","create","Array","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","splice","arg1","arg2","indexOf","removeElementAnimated","elements","Number","MAX_VALUE","bottom","MIN_VALUE","Viewport","topPadding","bottomPadding","bufferPadding","getScope","template","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","topPaddingHeight","reduce","summ","bottomPaddingHeight","visibleItemsHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","Padding","Cache","table","find","findCtrl","ctrl","hasOwnProperty","getPrototypeOf","constructor","$parent","assignAttr","attr","replace","onSyntax","asSyntax","warn","tail","candidate","candidateScope","candidateName","target","foundCtrl","Adapter","publicContext","assignAdapter","generatePublicContext","data","assign","adapterOnScope","error","message","publicMethods","publicProps","property","assignProp","slice","applyUpdate","newItems","itemTop","isNewRow","rowTop","topHeight","isArray","keepIt","pos","newItem"],"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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0a8b101f02aaa0804c9e","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 /**\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","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);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","function findCtrl(scope, ctrl) {\r\n if (!scope) {\r\n return;\r\n }\r\n if (scope.hasOwnProperty(ctrl) && Object.getPrototypeOf(scope[ctrl]).constructor.hasOwnProperty('$inject')) {\r\n return scope[ctrl];\r\n }\r\n return findCtrl(scope.$parent, ctrl);\r\n}\r\n\r\nfunction assignAttr(attr, scope, element) {\r\n if (!attr || !(attr = attr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n\r\n let onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\r\n let asSyntax = attr.match(/^([^.]+)\\.(.+)?/);\r\n\r\n if (onSyntax && onSyntax.length === 4) { // controller on (backward compatibility), deprecated since v1.6.1\r\n window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\r\n let ctrl = onSyntax[3];\r\n let tail = onSyntax[1];\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[1] === ctrl) {\r\n return {\r\n target: candidateScope,\r\n source: tail\r\n };\r\n }\r\n candidate = candidate.parent();\r\n }\r\n throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\r\n }\r\n else if (asSyntax && asSyntax.length === 3) { // controller as\r\n let ctrl = asSyntax[1];\r\n let tail = asSyntax[2];\r\n let foundCtrl = findCtrl(scope, ctrl);\r\n if (foundCtrl) {\r\n return {\r\n target: foundCtrl,\r\n source: tail\r\n };\r\n }\r\n }\r\n\r\n return {\r\n target: scope,\r\n source: attr\r\n };\r\n}\r\n\r\nclass Adapter {\r\n\r\n constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element) {\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n this.adjustBuffer = adjustBuffer;\r\n this.reload = reload;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr, $parse, element);\r\n this.generatePublicContext($attr, $parse, element);\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n }\r\n\r\n assignAdapter($attr, $parse, element) {\r\n let data = assignAttr($attr.adapter, this.viewport.getScope(), element);\r\n\r\n if (data) {\r\n try {\r\n $parse(data.source).assign(data.target, {});\r\n let adapterOnScope = $parse(data.source)(data.target);\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${$attr.adapter}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n generatePublicContext($attr, $parse, element) {\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'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, assignProp;\r\n let data = assignAttr($attr[publicProps[i]], this.viewport.getScope(), element);\r\n if (data) {\r\n assignProp = $parse(data.source).assign;\r\n }\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n if (assignProp) {\r\n assignProp(data.target, value);\r\n }\r\n this.publicContext[publicProps[i]] = value;\r\n }\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.adjustBuffer() : 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 applyUpdates(arg1, arg2) {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\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, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - this.buffer.first;\r\n if ((index >= 0 && index < this.buffer.length)) {\r\n this.applyUpdate(this.buffer[index], arg2);\r\n }\r\n }\r\n\r\n this.adjustBuffer();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n calculateProperties() {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n item = this.buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n break;\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\r\n let keepIt;\r\n let pos = (this.buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n this.buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 515fec14d305cb249fba","webpack:///./src/ui-scroll.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/adapter.js"],"names":["angular","module","service","run","jqLiteExtras","window","jQuery","registerFor","element","directive","restrict","controller","scope","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$q","$parse","require","transclude","priority","terminal","link","$scope","$attr","controllers","linker","match","uiScroll","Error","parseNumericAttr","value","defaultValue","result","isNaN","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","datasource","itemName","datasourceName","viewportController","bufferSize","Math","max","padding","startIndex","ridActual","pending","elementRoutines","buffer","adapter","adjustBuffer","reload","isDatasourceValid","isObject","isFunction","get","indexStore","defineProperty","propName","propUserName","descriptor","Object","getOwnPropertyDescriptor","set","length","topPaddingHeightOld","topDataPos","adjustPadding","adjustScrollTopAfterMinIndexSet","fetchNext","success","next","index","append","item","count","fetchPrevious","first","prepend","clone","createPaddingElements","$destroy","remove","$on","unbindEvents","unbind","wheelHandler","bind","applyContainerStyle","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","resetTopPadding","resetBottomPadding","arguments","reset","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","addClass","promises","sibling","undefined","transform","updateDOM","toBePrepended","toBeRemoved","inserted","i","op","unshift","push","concat","insertElementAnimated","$index","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","fetch","loading","shouldLoadTop","w","removeClass","calculateProperties","adjustBufferAfterFetch","adjustScrollTopAfterPrepend","shift","eof","clipTop","bof","clipBottom","$$phase","isLoading","disabled","$apply","event","scrollTop","yMax","scrollHeight","clientHeight","preventDefault","JQLiteExtras","convertToPx","css","getStyle","isWindow","prototype","name","self","elem","nodeType","style","call","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isDefined","documentElement","getComputedStyle","parseFloat","currentStyle","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","width","border","margin","offsetWidth","offsetHeight","getWidthHeight","measurements","outer","outerfull","before","newElem","j","parent","ref","contents","after","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","key","ElementRoutines","$animate","has","isAngularVersionLessThen1_3","version","major","minor","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","ScrollBuffer","create","Array","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","splice","arg1","arg2","indexOf","removeElementAnimated","elements","Number","MAX_VALUE","bottom","MIN_VALUE","Viewport","topPadding","bottomPadding","bufferPadding","getScope","template","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","topPaddingHeight","reduce","summ","bottomPaddingHeight","visibleItemsHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","Padding","Cache","table","find","getCtrlOnData","attr","onSyntax","warn","ctrl","tail","candidate","candidateScope","candidateName","target","Adapter","viewportScope","startScope","$parent","publicContext","assignAdapter","generatePublicContext","adapterAttr","replace","ctrlOnData","adapterOnScope","assign","error","message","publicMethods","publicProps","property","slice","applyUpdate","newItems","itemTop","isNewRow","rowTop","topHeight","isArray","keepIt","pos","newItem"],"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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 515fec14d305cb249fba","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 /**\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","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);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","function getCtrlOnData(attr, element) {\r\n let onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\r\n if (onSyntax && onSyntax.length === 4) {\r\n window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\r\n let ctrl = onSyntax[3];\r\n let tail = onSyntax[1];\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[1] === ctrl) {\r\n return {\r\n target: candidateScope,\r\n source: tail\r\n };\r\n }\r\n candidate = candidate.parent();\r\n }\r\n throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\r\n }\r\n}\r\n\r\nclass Adapter {\r\n\r\n constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope) {\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n this.adjustBuffer = adjustBuffer;\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, $parse, element);\r\n this.generatePublicContext($attr, $parse);\r\n }\r\n\r\n assignAdapter(adapterAttr, $parse, element) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let ctrlOnData = getCtrlOnData(adapterAttr, element);\r\n let adapterOnScope;\r\n\r\n try {\r\n if (ctrlOnData) { // \"Controller On\", deprecated since v1.6.1\r\n $parse(ctrlOnData.source).assign(ctrlOnData.target, {});\r\n adapterOnScope = $parse(ctrlOnData.source)(ctrlOnData.target);\r\n }\r\n else {\r\n $parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = $parse(adapterAttr)(this.startScope);\r\n }\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($attr, $parse) {\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'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = $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 $parse(attr).assign(this.startScope, value);\r\n }\r\n }\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.adjustBuffer() : 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 applyUpdates(arg1, arg2) {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\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, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - this.buffer.first;\r\n if ((index >= 0 && index < this.buffer.length)) {\r\n this.applyUpdate(this.buffer[index], arg2);\r\n }\r\n }\r\n\r\n this.adjustBuffer();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n calculateProperties() {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n item = this.buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n break;\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\r\n let keepIt;\r\n let pos = (this.buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n this.buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/ui-scroll.min.js b/dist/ui-scroll.min.js index 7ad3c485..cf82ea84 100644 --- a/dist/ui-scroll.min.js +++ b/dist/ui-scroll.min.js @@ -1,8 +1,8 @@ /*! * angular-ui-scroll (compressed) * https://github.com/angular-ui/ui-scroll - * Version: 1.6.1 -- 2017-03-03T05:28:34.249Z + * Version: 1.6.1 -- 2017-03-04T06:00:38.399Z * License: MIT */ -!function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}var i=n(1),o=r(i),a=n(2),u=r(a),l=n(3),s=r(l),c=n(4),f=r(c),d=n(6),p=r(d);angular.module("ui.scroll",[]).service("jqLiteExtras",function(){return new o.default}).run(["jqLiteExtras",function(e){return window.jQuery?null:e.registerFor(angular.element)}]).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","$q","$parse",function(e,t,n,r,i,o){function a(e,a,l,c,d){function h(t,n){var r=o(t)(e);return isNaN(r)?n:r}function g(e,t,n){var i=Object.getOwnPropertyDescriptor(e,t);i&&(i.set||i.get)||Object.defineProperty(e,t,{set:function(e){J[t]=e,r(function(){if(X[n]=e,!z.length){var r=Y.topDataPos();Y.adjustPadding(),"minIndex"===t&&Y.adjustScrollTopAfterMinIndexSet(r)}})},get:function(){return J[t]}})}function m(t){return t&&t!==q||e.$$destroyed}function v(){Y.bind("resize",A),Y.bind("scroll",A)}function b(){Y.unbind("resize",A),Y.unbind("scroll",A)}function y(){Y.resetTopPadding(),Y.resetBottomPadding(),arguments.length&&(W=arguments[0]),X.reset(W),I()}function x(e){return e.element.height()&&e.element[0].offsetParent}function w(e){x(e)&&(X.forEach(function(e){angular.isFunction(e.unregisterVisibilityWatcher)&&(e.unregisterVisibilityWatcher(),delete e.unregisterVisibilityWatcher)}),z.length||I())}function E(e,t){P(e,t,Y.insertElement),x(e)||(e.unregisterVisibilityWatcher=e.scope.$watch(function(){return w(e)})),e.element.addClass("ng-hide")}function P(e,t,n){var r=null,i=t>0?X[t-1].element:void 0;return d(function(t,o){r=n(t,i),e.element=t,e.scope=o,o[U]=e.item}),Q.transform&&Q.transform(e.scope,e.element),r}function j(){var e=[],t=[],n=[],r=[];return X.forEach(function(i,o){switch(i.op){case"prepend":t.unshift(i);break;case"append":E(i,o),i.op="none",r.push(i);break;case"insert":e=e.concat(P(i,o,Y.insertElementAnimated)),i.op="none",r.push(i);break;case"remove":n.push(i)}}),n.forEach(function(t){return e=e.concat(X.remove(t))}),t.length&&t.forEach(function(e){E(e),e.op="none"}),X.forEach(function(e,t){return e.scope.$index=X.first+t}),{prepended:t,removed:n,inserted:r,animated:e}}function $(e,t){t.animated.length?i.all(t.animated).then(function(){Y.adjustPadding(),I(e)}):Y.adjustPadding()}function T(e,t){Y.shouldLoadBottom()?(!t||X.effectiveHeight(t.inserted)>0)&&1===z.push(!0)&&(S(e),Q.loading(!0)):Y.shouldLoadTop()&&(!t||X.effectiveHeight(t.prepended)>0||z[0])&&1===z.push(!1)&&(S(e),Q.loading(!0))}function I(e){e||(z=[],e=++q);var t=j();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),m(e)||($(e,t),T(e),z.length||Q.calculateProperties())})}function O(e){var t=j();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),Y.adjustScrollTopAfterPrepend(t),m(e)||($(e,t),T(e,t),z.shift(),z.length?S(e):(Q.loading(!1),v(),Q.calculateProperties()))})}function S(e){z[0]?X.length&&!Y.shouldLoadBottom()?O(e):K(function(t){m(e)||(t.length0&&(Y.clipTop(),X.append(t)),O(e))}):X.length&&!Y.shouldLoadTop()?O(e):Z(function(t){m(e)||(t.length0&&(X.length&&Y.clipBottom(),X.prepend(t)),O(e))})}function A(){n.$$phase||Q.isLoading||Q.disabled||(T(q),z.length?b():(Q.calculateProperties(),e.$apply()))}function k(e){if(!Q.disabled){var t=Y[0].scrollTop,n=Y[0].scrollHeight-Y[0].clientHeight;(0===t&&!X.bof||t===n&&!X.eof)&&e.preventDefault()}}var L=l.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!L)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+l.uiScroll+"'");var C=3,V=10,_=.3,H=.5,M=null,U=L[1],B=L[2],D=c[0],F=Math.max(C,h(l.bufferSize,V)),N=Math.max(_,h(l.padding,H)),W=h(l.startIndex,1),q=0,z=[],R=new u.default(t,i),X=new s.default(R,F),Y=new f.default(R,X,a,D,n,N),Q=new p.default(Y,X,I,y,l,o,a);D&&(D.adapter=Q);var G=function(){return angular.isObject(M)&&angular.isFunction(M.get)};if(M=o(B)(e),!G()&&(M=t.get(B),!G()))throw new Error(B+" is not a valid datasource");var J={};g(M,"minIndex","minIndexUser"),g(M,"maxIndex","maxIndexUser");var K=2!==M.get.length?function(e){return M.get(X.next,F,e)}:function(e){M.get({index:X.next,append:X.length?X[X.length-1].item:void 0,count:F},e)},Z=2!==M.get.length?function(e){return M.get(X.first-F,F,e)}:function(e){M.get({index:X.first-F,prepend:X.length?X[0].item:void 0,count:F},e)};d(function(e,t){Y.createPaddingElements(e[0]),t.$destroy(),e.remove()}),e.$on("$destroy",function(){b(),Y.unbind("mousewheel",k)}),Y.bind("mousewheel",k),r(function(){Y.applyContainerStyle(),y()})}return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:a}}])},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(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&&u.return&&u.return()}finally{if(i)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=function(){function e(e,t){for(var n=0;n0?{base:a.base-a.padding-a.border,outer:a.base,outerfull:a.base+a.margin}[r]:(i=u(e),o=i[t],(o<0||null===o)&&(o=e.style[t]||0),o=parseFloat(o)||0,{base:o-a.padding-a.border,outer:o,outerfull:o+a.padding+a.border+a.margin}[r])}var o=void 0,a=void 0,u=void 0,l=void 0;return a=angular.element.prototype.css,e.prototype.css=function(e,t){var n=this,r=n[0];if(r&&3!==r.nodeType&&8!==r.nodeType&&r.style)return a.call(n,e,t)},l=function(e){return e&&e.document&&e.location&&e.alert&&e.setInterval},window.getComputedStyle?(u=function(e){return window.getComputedStyle(e,null)},o=function(e,t){return parseFloat(t)}):(u=function(e){return e.currentStyle},o=function(e,t){var n=void 0,r=void 0,i=void 0,o=void 0,a=void 0,u=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,l=new RegExp("^("+u+")(?!px)[a-z%]+$","i");return l.test(t)?(a=e.style,n=a.left,i=e.runtimeStyle,o=i&&i.left,i&&(i.left=a.left),a.left=t,r=a.pixelLeft,a.left=n,o&&(i.left=o),r):parseFloat(t)}),angular.forEach({before:function(e){var t,n,r,i,o,a,u;if(u=this,n=u[0],o=u.parent(),t=o.contents(),t[0]===n)return o.prepend(e);for(r=i=1,a=t.length-1;1<=a?i<=a:i>=a;r=1<=a?++i:--i)if(t[r]===n)return void angular.element(t[r-1]).after(e);throw new Error("invalid DOM structure "+n.outerHTML)},height:function(e){var t;return t=this,angular.isDefined(e)?(angular.isNumber(e)&&(e+="px"),a.call(t,"height",e)):i(this[0],"height","base")},outerHeight:function(e){return i(this[0],"height",e?"outerfull":"outer")},outerWidth:function(e){return i(this[0],"width",e?"outerfull":"outer")},offset:function(e){var t=void 0,n=void 0,r=this,i={top:0,left:0},o=r[0],a=o&&o.ownerDocument;if(arguments.length){if(void 0===e)return r;throw new Error("offset setter method is not implemented")}if(a)return t=a.documentElement,null!=o.getBoundingClientRect&&(i=o.getBoundingClientRect()),n=a.defaultView||a.parentWindow,{top:i.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:i.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}},scrollTop:function(e){return t(this,"top",e)},scrollLeft:function(e){return t(this,"left",e)}},function(t,n){if(!e.prototype[n])return e.prototype[n]=t})}}]),e}();t.default=o},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(){function e(e,t){for(var n=0;n=0&&(r=t[o].element.outerHeight(!0),!(n+r>i));o--)s.cache.add(t[o]),n+=r,e++;e>0&&(t.eof=!1,t.remove(t.length-e,t.length),t.next-=e,c.adjustPadding())},shouldLoadTop:function(){return!t.bof&&c.topDataPos()>c.topVisiblePos()-u()},clipTop:function(){for(var e=0,n=0,r=0,i=c.topVisiblePos()-c.topDataPos()-u(),o=0;oi));o++)l.cache.add(t[o]),n+=r,e++;e>0&&(l.height(l.height()+n),t.bof=!1,t.remove(0,e),t.first+=e)},adjustPadding:function(){if(t.length){var e=l.cache.reduce(function(e,n){return e+(n.index=t.next?n.height:0)},0),r=t.reduce(function(e,t){return e+t.element.outerHeight(!0)},0),i=(r+e+n)/(t.maxIndex-t.minIndex+1),o=null!==t.minIndexUser&&t.minIndex>t.minIndexUser,a=null!==t.maxIndexUser&&t.maxIndext.minIndexUser){var n=l.height()-e;c.scrollTop(c.scrollTop()+n)}},adjustScrollTopAfterPrepend:function(e){if(e.prepended.length){var n=t.effectiveHeight(e.prepended),r=l.height()-n;r>=0?l.height(r):(l.height(0),c.scrollTop(c.scrollTop()-r))}},resetTopPadding:function(){l.height(0),l.cache.clear()},resetBottomPadding:function(){s.height(0),s.cache.clear()}}),c}Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var o=n(5),a=r(o)},function(e,t){"use strict";function n(){var e=Object.create(Array.prototype);return angular.extend(e,{add:function(t){for(var n=e.length-1;n>=0;n--)if(e[n].index===t.scope.$index)return void(e[n].height=t.element.outerHeight());e.push({index:t.scope.$index,height:t.element.outerHeight()})},clear:function(){e.length=0}}),e}function r(e){var t=void 0;switch(e.tagName){case"dl":throw new Error("ui-scroll directive does not support <"+e.tagName+"> as a repeating tag: "+e.outerHTML);case"tr":var r=angular.element("
    ");t=r.find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t.cache=new n,t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(e)return e.hasOwnProperty(t)&&Object.getPrototypeOf(e[t]).constructor.hasOwnProperty("$inject")?e[t]:r(e.$parent,t)}function i(e,t,n){if(e&&(e=e.replace(/^\s+|\s+$/gm,""))){var i=e.match(/^(.+)(\s+on\s+)(.+)?/),o=e.match(/^([^.]+)\.(.+)?/);if(i&&4===i.length){window.console.warn('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.');for(var a=i[3],u=i[1],l=n;l.length;){var s=l.scope(),c=(l.attr("ng-controller")||"").match(/(\w(?:\w|\d)*)(?:\s+as\s+(\w(?:\w|\d)*))?/);if(c&&c[1]===a)return{target:s,source:u};l=l.parent()}throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller "'+a+'" to inject "'+u+'"')}if(o&&3===o.length){var f=o[1],d=o[2],p=r(t,f);if(p)return{target:p,source:d}}return{target:t,source:e}}}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n=0;a--)this.publicContext[o[a]]=this[o[a]].bind(this);for(var u=["isLoading","topVisible","topVisibleElement","topVisibleScope"],l=function(o){var a=void 0,l=void 0,s=i(e[u[o]],r.viewport.getScope(),n);s&&(l=t(s.source).assign),Object.defineProperty(r,u[o],{get:function(){return a},set:function(e){a=e,l&&l(s.target,e),r.publicContext[u[o]]=e}})},s=u.length-1;s>=0;s--)l(s);Object.defineProperty(this.publicContext,"disabled",{get:function(){return r.disabled},set:function(e){return(r.disabled=e)?null:r.adjustBuffer()}})}},{key:"loading",value:function(e){this.isLoading=e}},{key:"isBOF",value:function(){return this.buffer.bof}},{key:"isEOF",value:function(){return this.buffer.eof}},{key:"isEmpty",value:function(){return!this.buffer.length}},{key:"applyUpdates",value:function(e,t){var n=this;if(angular.isFunction(e))this.buffer.slice(0).forEach(function(t){n.applyUpdate(t,e(t.item,t.scope,t.element))});else{if(e%1!==0)throw new Error("applyUpdates - "+e+" is not a valid index");var r=e-this.buffer.first;r>=0&&r0?X[t-1].element:void 0;return d(function(t,o){r=n(t,i),e.element=t,e.scope=o,o[U]=e.item}),Q.transform&&Q.transform(e.scope,e.element),r}function $(){var e=[],t=[],n=[],r=[];return X.forEach(function(i,o){switch(i.op){case"prepend":t.unshift(i);break;case"append":E(i,o),i.op="none",r.push(i);break;case"insert":e=e.concat(P(i,o,Y.insertElementAnimated)),i.op="none",r.push(i);break;case"remove":n.push(i)}}),n.forEach(function(t){return e=e.concat(X.remove(t))}),t.length&&t.forEach(function(e){E(e),e.op="none"}),X.forEach(function(e,t){return e.scope.$index=X.first+t}),{prepended:t,removed:n,inserted:r,animated:e}}function j(e,t){t.animated.length?i.all(t.animated).then(function(){Y.adjustPadding(),T(e)}):Y.adjustPadding()}function S(e,t){Y.shouldLoadBottom()?(!t||X.effectiveHeight(t.inserted)>0)&&1===z.push(!0)&&(O(e),Q.loading(!0)):Y.shouldLoadTop()&&(!t||X.effectiveHeight(t.prepended)>0||z[0])&&1===z.push(!1)&&(O(e),Q.loading(!0))}function T(e){e||(z=[],e=++q);var t=$();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),m(e)||(j(e,t),S(e),z.length||Q.calculateProperties())})}function I(e){var t=$();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),Y.adjustScrollTopAfterPrepend(t),m(e)||(j(e,t),S(e,t),z.shift(),z.length?O(e):(Q.loading(!1),v(),Q.calculateProperties()))})}function O(e){z[0]?X.length&&!Y.shouldLoadBottom()?I(e):K(function(t){m(e)||(t.length0&&(Y.clipTop(),X.append(t)),I(e))}):X.length&&!Y.shouldLoadTop()?I(e):Z(function(t){m(e)||(t.length0&&(X.length&&Y.clipBottom(),X.prepend(t)),I(e))})}function A(){n.$$phase||Q.isLoading||Q.disabled||(S(q),z.length?b():(Q.calculateProperties(),e.$apply()))}function k(e){if(!Q.disabled){var t=Y[0].scrollTop,n=Y[0].scrollHeight-Y[0].clientHeight;(0===t&&!X.bof||t===n&&!X.eof)&&e.preventDefault()}}var L=l.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!L)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+l.uiScroll+"'");var C=3,V=10,_=.3,H=.5,M=null,U=L[1],B=L[2],D=c[0],F=Math.max(C,h(l.bufferSize,V)),N=Math.max(_,h(l.padding,H)),W=h(l.startIndex,1),q=0,z=[],R=new u.default(t,i),X=new s.default(R,F),Y=new f.default(R,X,a,D,n,N),Q=new p.default(Y,X,T,y,l,o,a,e);D&&(D.adapter=Q);var G=function(){return angular.isObject(M)&&angular.isFunction(M.get)};if(M=o(B)(e),!G()&&(M=t.get(B),!G()))throw new Error(B+" is not a valid datasource");var J={};g(M,"minIndex","minIndexUser"),g(M,"maxIndex","maxIndexUser");var K=2!==M.get.length?function(e){return M.get(X.next,F,e)}:function(e){M.get({index:X.next,append:X.length?X[X.length-1].item:void 0,count:F},e)},Z=2!==M.get.length?function(e){return M.get(X.first-F,F,e)}:function(e){M.get({index:X.first-F,prepend:X.length?X[0].item:void 0,count:F},e)};d(function(e,t){Y.createPaddingElements(e[0]),t.$destroy(),e.remove()}),e.$on("$destroy",function(){b(),Y.unbind("mousewheel",k)}),Y.bind("mousewheel",k),r(function(){Y.applyContainerStyle(),y()})}return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:a}}])},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(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&&u.return&&u.return()}finally{if(i)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=function(){function e(e,t){for(var n=0;n0?{base:a.base-a.padding-a.border,outer:a.base,outerfull:a.base+a.margin}[r]:(i=u(e),o=i[t],(o<0||null===o)&&(o=e.style[t]||0),o=parseFloat(o)||0,{base:o-a.padding-a.border,outer:o,outerfull:o+a.padding+a.border+a.margin}[r])}var o=void 0,a=void 0,u=void 0,l=void 0;return a=angular.element.prototype.css,e.prototype.css=function(e,t){var n=this,r=n[0];if(r&&3!==r.nodeType&&8!==r.nodeType&&r.style)return a.call(n,e,t)},l=function(e){return e&&e.document&&e.location&&e.alert&&e.setInterval},window.getComputedStyle?(u=function(e){return window.getComputedStyle(e,null)},o=function(e,t){return parseFloat(t)}):(u=function(e){return e.currentStyle},o=function(e,t){var n=void 0,r=void 0,i=void 0,o=void 0,a=void 0,u=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,l=new RegExp("^("+u+")(?!px)[a-z%]+$","i");return l.test(t)?(a=e.style,n=a.left,i=e.runtimeStyle,o=i&&i.left,i&&(i.left=a.left),a.left=t,r=a.pixelLeft,a.left=n,o&&(i.left=o),r):parseFloat(t)}),angular.forEach({before:function(e){var t,n,r,i,o,a,u;if(u=this,n=u[0],o=u.parent(),t=o.contents(),t[0]===n)return o.prepend(e);for(r=i=1,a=t.length-1;1<=a?i<=a:i>=a;r=1<=a?++i:--i)if(t[r]===n)return void angular.element(t[r-1]).after(e);throw new Error("invalid DOM structure "+n.outerHTML)},height:function(e){var t;return t=this,angular.isDefined(e)?(angular.isNumber(e)&&(e+="px"),a.call(t,"height",e)):i(this[0],"height","base")},outerHeight:function(e){return i(this[0],"height",e?"outerfull":"outer")},outerWidth:function(e){return i(this[0],"width",e?"outerfull":"outer")},offset:function(e){var t=void 0,n=void 0,r=this,i={top:0,left:0},o=r[0],a=o&&o.ownerDocument;if(arguments.length){if(void 0===e)return r;throw new Error("offset setter method is not implemented")}if(a)return t=a.documentElement,null!=o.getBoundingClientRect&&(i=o.getBoundingClientRect()),n=a.defaultView||a.parentWindow,{top:i.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:i.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}},scrollTop:function(e){return t(this,"top",e)},scrollLeft:function(e){return t(this,"left",e)}},function(t,n){if(!e.prototype[n])return e.prototype[n]=t})}}]),e}();t.default=o},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(){function e(e,t){for(var n=0;n=0&&(r=t[o].element.outerHeight(!0),!(n+r>i));o--)s.cache.add(t[o]),n+=r,e++;e>0&&(t.eof=!1,t.remove(t.length-e,t.length),t.next-=e,c.adjustPadding())},shouldLoadTop:function(){return!t.bof&&c.topDataPos()>c.topVisiblePos()-u()},clipTop:function(){for(var e=0,n=0,r=0,i=c.topVisiblePos()-c.topDataPos()-u(),o=0;oi));o++)l.cache.add(t[o]),n+=r,e++;e>0&&(l.height(l.height()+n),t.bof=!1,t.remove(0,e),t.first+=e)},adjustPadding:function(){if(t.length){var e=l.cache.reduce(function(e,n){return e+(n.index=t.next?n.height:0)},0),r=t.reduce(function(e,t){return e+t.element.outerHeight(!0)},0),i=(r+e+n)/(t.maxIndex-t.minIndex+1),o=null!==t.minIndexUser&&t.minIndex>t.minIndexUser,a=null!==t.maxIndexUser&&t.maxIndext.minIndexUser){var n=l.height()-e;c.scrollTop(c.scrollTop()+n)}},adjustScrollTopAfterPrepend:function(e){if(e.prepended.length){var n=t.effectiveHeight(e.prepended),r=l.height()-n;r>=0?l.height(r):(l.height(0),c.scrollTop(c.scrollTop()-r))}},resetTopPadding:function(){l.height(0),l.cache.clear()},resetBottomPadding:function(){s.height(0),s.cache.clear()}}),c}Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var o=n(5),a=r(o)},function(e,t){"use strict";function n(){var e=Object.create(Array.prototype);return angular.extend(e,{add:function(t){for(var n=e.length-1;n>=0;n--)if(e[n].index===t.scope.$index)return void(e[n].height=t.element.outerHeight());e.push({index:t.scope.$index,height:t.element.outerHeight()})},clear:function(){e.length=0}}),e}function r(e){var t=void 0;switch(e.tagName){case"dl":throw new Error("ui-scroll directive does not support <"+e.tagName+"> as a repeating tag: "+e.outerHTML);case"tr":var r=angular.element("
    ");t=r.find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t.cache=new n,t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){var n=e.match(/^(.+)(\s+on\s+)(.+)?/);if(n&&4===n.length){window.console.warn('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.');for(var r=n[3],i=n[1],o=t;o.length;){var a=o.scope(),u=(o.attr("ng-controller")||"").match(/(\w(?:\w|\d)*)(?:\s+as\s+(\w(?:\w|\d)*))?/);if(u&&u[1]===r)return{target:a,source:i};o=o.parent()}throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller "'+r+'" to inject "'+i+'"')}}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n=0;i--)this.publicContext[r[i]]=this[r[i]].bind(this);for(var o=["isLoading","topVisible","topVisibleElement","topVisibleScope"],a=function(r){var i=void 0,a=e[o[r]];Object.defineProperty(n,o[r],{get:function(){return i},set:function(e){i=e,n.publicContext[o[r]]=e,a&&t(a).assign(n.startScope,e)}})},u=o.length-1;u>=0;u--)a(u);Object.defineProperty(this.publicContext,"disabled",{get:function(){return n.disabled},set:function(e){return(n.disabled=e)?null:n.adjustBuffer()}})}},{key:"loading",value:function(e){this.isLoading=e}},{key:"isBOF",value:function(){return this.buffer.bof}},{key:"isEOF",value:function(){return this.buffer.eof}},{key:"isEmpty",value:function(){return!this.buffer.length}},{key:"applyUpdates",value:function(e,t){var n=this;if(angular.isFunction(e))this.buffer.slice(0).forEach(function(t){n.applyUpdate(t,e(t.item,t.scope,t.element))});else{if(e%1!==0)throw new Error("applyUpdates - "+e+" is not a valid index");var r=e-this.buffer.first;r>=0&&r 0 ? buffer[insertAfter - 1].element : undefined;\n\t linker(function (clone, scope) {\n\t promises = insertElement(clone, sibling);\n\t wrapper.element = clone;\n\t wrapper.scope = scope;\n\t scope[itemName] = wrapper.item;\n\t });\n\t if (adapter.transform) adapter.transform(wrapper.scope, wrapper.element);\n\t return promises;\n\t }\n\t\n\t function updateDOM() {\n\t var promises = [];\n\t var toBePrepended = [];\n\t var toBeRemoved = [];\n\t var inserted = [];\n\t\n\t buffer.forEach(function (wrapper, i) {\n\t switch (wrapper.op) {\n\t case 'prepend':\n\t toBePrepended.unshift(wrapper);\n\t break;\n\t case 'append':\n\t insertWrapperContent(wrapper, i);\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'insert':\n\t promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'remove':\n\t toBeRemoved.push(wrapper);\n\t }\n\t });\n\t\n\t toBeRemoved.forEach(function (wrapper) {\n\t return promises = promises.concat(buffer.remove(wrapper));\n\t });\n\t\n\t if (toBePrepended.length) toBePrepended.forEach(function (wrapper) {\n\t insertWrapperContent(wrapper);\n\t wrapper.op = 'none';\n\t });\n\t\n\t buffer.forEach(function (item, i) {\n\t return item.scope.$index = buffer.first + i;\n\t });\n\t\n\t return {\n\t prepended: toBePrepended,\n\t removed: toBeRemoved,\n\t inserted: inserted,\n\t animated: promises\n\t };\n\t }\n\t\n\t function updatePaddings(rid, updates) {\n\t // schedule another adjustBuffer after animation completion\n\t if (updates.animated.length) {\n\t $q.all(updates.animated).then(function () {\n\t viewport.adjustPadding();\n\t adjustBuffer(rid);\n\t });\n\t } else {\n\t viewport.adjustPadding();\n\t }\n\t }\n\t\n\t function enqueueFetch(rid, updates) {\n\t if (viewport.shouldLoadBottom()) {\n\t if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t if (pending.push(true) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t } else if (viewport.shouldLoadTop()) {\n\t if (!updates || buffer.effectiveHeight(updates.prepended) > 0 || pending[0]) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n\t // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n\t if (pending.push(false) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t }\n\t }\n\t\n\t function adjustBuffer(rid) {\n\t if (!rid) {\n\t // dismiss pending requests\n\t pending = [];\n\t rid = ++ridActual;\n\t }\n\t\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid);\n\t\n\t if (!pending.length) {\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function adjustBufferAfterFetch(rid) {\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t viewport.adjustScrollTopAfterPrepend(updates);\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid, updates);\n\t pending.shift();\n\t\n\t if (pending.length) fetch(rid);else {\n\t adapter.loading(false);\n\t bindEvents();\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function fetch(rid) {\n\t if (pending[0]) {\n\t // scrolling down\n\t if (buffer.length && !viewport.shouldLoadBottom()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchNext(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.eof = true;\n\t }\n\t\n\t if (result.length > 0) {\n\t viewport.clipTop();\n\t buffer.append(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t } else {\n\t // scrolling up\n\t if (buffer.length && !viewport.shouldLoadTop()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchPrevious(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.bof = true;\n\t // log 'bof is reached'\n\t }\n\t\n\t if (result.length > 0) {\n\t if (buffer.length) {\n\t viewport.clipBottom();\n\t }\n\t buffer.prepend(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t }\n\t }\n\t\n\t function resizeAndScrollHandler() {\n\t if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\t\n\t enqueueFetch(ridActual);\n\t\n\t if (pending.length) {\n\t unbindEvents();\n\t } else {\n\t adapter.calculateProperties();\n\t $scope.$apply();\n\t }\n\t }\n\t }\n\t\n\t function wheelHandler(event) {\n\t if (!adapter.disabled) {\n\t var scrollTop = viewport[0].scrollTop;\n\t var yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\t\n\t if (scrollTop === 0 && !buffer.bof || scrollTop === yMax && !buffer.eof) {\n\t event.preventDefault();\n\t }\n\t }\n\t }\n\t }\n\t}]);\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*!\r\n\t globals: angular, window\r\n\t List of used element methods available in JQuery but not in JQuery Lite\r\n\t element.before(elem)\r\n\t element.height()\r\n\t element.outerHeight(true)\r\n\t element.height(value) = only for Top/Bottom padding elements\r\n\t element.scrollTop()\r\n\t element.scrollTop(value)\r\n\t */\n\t\n\tvar JQLiteExtras = function () {\n\t function JQLiteExtras() {\n\t _classCallCheck(this, JQLiteExtras);\n\t }\n\t\n\t _createClass(JQLiteExtras, [{\n\t key: 'registerFor',\n\t value: function registerFor(element) {\n\t var convertToPx = void 0,\n\t css = void 0,\n\t getStyle = void 0,\n\t isWindow = void 0;\n\t // angular implementation blows up if elem is the window\n\t css = angular.element.prototype.css;\n\t\n\t element.prototype.css = function (name, value) {\n\t var self = this;\n\t var elem = self[0];\n\t if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\n\t return css.call(self, name, value);\n\t }\n\t };\n\t\n\t // as defined in angularjs v1.0.5\n\t isWindow = function isWindow(obj) {\n\t return obj && obj.document && obj.location && obj.alert && obj.setInterval;\n\t };\n\t\n\t function scrollTo(self, direction, value) {\n\t var elem = self[0];\n\t\n\t var _top$left$direction = _slicedToArray({\n\t top: ['scrollTop', 'pageYOffset', 'scrollLeft'],\n\t left: ['scrollLeft', 'pageXOffset', 'scrollTop']\n\t }[direction], 3),\n\t method = _top$left$direction[0],\n\t prop = _top$left$direction[1],\n\t preserve = _top$left$direction[2];\n\t\n\t if (isWindow(elem)) {\n\t if (angular.isDefined(value)) {\n\t return elem.scrollTo(self[preserve].call(self), value);\n\t }\n\t return prop in elem ? elem[prop] : elem.document.documentElement[method];\n\t } else {\n\t if (angular.isDefined(value)) {\n\t elem[method] = value;\n\t }\n\t return elem[method];\n\t }\n\t }\n\t\n\t if (window.getComputedStyle) {\n\t getStyle = function getStyle(elem) {\n\t return window.getComputedStyle(elem, null);\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t return parseFloat(value);\n\t };\n\t } else {\n\t getStyle = function getStyle(elem) {\n\t return elem.currentStyle;\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t var left = void 0,\n\t result = void 0,\n\t rs = void 0,\n\t rsLeft = void 0,\n\t style = void 0;\n\t var core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\n\t var rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\n\t\n\t if (!rnumnonpx.test(value)) {\n\t return parseFloat(value);\n\t }\n\t\n\t // ported from JQuery\n\t style = elem.style;\n\t left = style.left;\n\t rs = elem.runtimeStyle;\n\t rsLeft = rs && rs.left;\n\t if (rs) {\n\t rs.left = style.left;\n\t }\n\t // put in the new values to get a computed style out\n\t style.left = value;\n\t result = style.pixelLeft;\n\t style.left = left;\n\t if (rsLeft) {\n\t rs.left = rsLeft;\n\t }\n\t return result;\n\t };\n\t }\n\t\n\t function getMeasurements(elem, measure) {\n\t var base = void 0,\n\t borderA = void 0,\n\t borderB = void 0,\n\t computedMarginA = void 0,\n\t computedMarginB = void 0,\n\t computedStyle = void 0,\n\t dirA = void 0,\n\t dirB = void 0,\n\t marginA = void 0,\n\t marginB = void 0,\n\t paddingA = void 0,\n\t paddingB = void 0;\n\t\n\t if (isWindow(elem)) {\n\t base = document.documentElement[{ height: 'clientHeight', width: 'clientWidth' }[measure]];\n\t\n\t return {\n\t base: base,\n\t padding: 0,\n\t border: 0,\n\t margin: 0\n\t };\n\t }\n\t\n\t // Start with offset property\n\t\n\t var _width$height$measure = _slicedToArray({\n\t width: [elem.offsetWidth, 'Left', 'Right'],\n\t height: [elem.offsetHeight, 'Top', 'Bottom']\n\t }[measure], 3);\n\t\n\t base = _width$height$measure[0];\n\t dirA = _width$height$measure[1];\n\t dirB = _width$height$measure[2];\n\t\n\t\n\t computedStyle = getStyle(elem);\n\t paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\n\t paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\n\t borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\n\t borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\n\t computedMarginA = computedStyle['margin' + dirA];\n\t computedMarginB = computedStyle['margin' + dirB];\n\t\n\t // I do not care for width for now, so this hack is irrelevant\n\t // if ( !supportsPercentMargin )\n\t // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\n\t // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\n\t marginA = convertToPx(elem, computedMarginA) || 0;\n\t marginB = convertToPx(elem, computedMarginB) || 0;\n\t\n\t return {\n\t base: base,\n\t padding: paddingA + paddingB,\n\t border: borderA + borderB,\n\t margin: marginA + marginB\n\t };\n\t }\n\t\n\t function getWidthHeight(elem, direction, measure) {\n\t var computedStyle = void 0,\n\t result = void 0;\n\t\n\t var measurements = getMeasurements(elem, direction);\n\t\n\t if (measurements.base > 0) {\n\t return {\n\t base: measurements.base - measurements.padding - measurements.border,\n\t outer: measurements.base,\n\t outerfull: measurements.base + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // Fall back to computed then uncomputed css if necessary\n\t computedStyle = getStyle(elem);\n\t result = computedStyle[direction];\n\t\n\t if (result < 0 || result === null) {\n\t result = elem.style[direction] || 0;\n\t }\n\t\n\t // Normalize \"\", auto, and prepare for extra\n\t result = parseFloat(result) || 0;\n\t\n\t return {\n\t base: result - measurements.padding - measurements.border,\n\t outer: result,\n\t outerfull: result + measurements.padding + measurements.border + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // define missing methods\n\t return angular.forEach({\n\t before: function before(newElem) {\n\t var children, elem, i, j, parent, ref, self;\n\t self = this;\n\t elem = self[0];\n\t parent = self.parent();\n\t children = parent.contents();\n\t if (children[0] === elem) {\n\t return parent.prepend(newElem);\n\t } else {\n\t for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n\t if (children[i] === elem) {\n\t angular.element(children[i - 1]).after(newElem);\n\t return;\n\t }\n\t }\n\t throw new Error('invalid DOM structure ' + elem.outerHTML);\n\t }\n\t },\n\t height: function height(value) {\n\t var self;\n\t self = this;\n\t if (angular.isDefined(value)) {\n\t if (angular.isNumber(value)) {\n\t value = value + 'px';\n\t }\n\t return css.call(self, 'height', value);\n\t } else {\n\t return getWidthHeight(this[0], 'height', 'base');\n\t }\n\t },\n\t outerHeight: function outerHeight(option) {\n\t return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\n\t },\n\t outerWidth: function outerWidth(option) {\n\t return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\n\t },\n\t\n\t\n\t /*\r\n\t The offset setter method is not implemented\r\n\t */\n\t offset: function offset(value) {\n\t var docElem = void 0,\n\t win = void 0;\n\t var self = this;\n\t var box = {\n\t top: 0,\n\t left: 0\n\t };\n\t var elem = self[0];\n\t var doc = elem && elem.ownerDocument;\n\t\n\t if (arguments.length) {\n\t if (value === undefined) {\n\t return self;\n\t }\n\t // TODO: implement setter\n\t throw new Error('offset setter method is not implemented');\n\t }\n\t\n\t if (!doc) {\n\t return;\n\t }\n\t\n\t docElem = doc.documentElement;\n\t\n\t // TODO: Make sure it's not a disconnected DOM node\n\t\n\t if (elem.getBoundingClientRect != null) {\n\t box = elem.getBoundingClientRect();\n\t }\n\t\n\t win = doc.defaultView || doc.parentWindow;\n\t\n\t return {\n\t top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n\t left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n\t };\n\t },\n\t scrollTop: function scrollTop(value) {\n\t return scrollTo(this, 'top', value);\n\t },\n\t scrollLeft: function scrollLeft(value) {\n\t return scrollTo(this, 'left', value);\n\t }\n\t }, function (value, key) {\n\t if (!element.prototype[key]) {\n\t return element.prototype[key] = value;\n\t }\n\t });\n\t }\n\t }]);\n\t\n\t return JQLiteExtras;\n\t}();\n\t\n\texports.default = JQLiteExtras;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar ElementRoutines = function () {\n\t function ElementRoutines($injector, $q) {\n\t _classCallCheck(this, ElementRoutines);\n\t\n\t this.$animate = $injector.has && $injector.has('$animate') ? $injector.get('$animate') : null;\n\t this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\n\t this.$q = $q;\n\t }\n\t\n\t _createClass(ElementRoutines, [{\n\t key: 'insertElement',\n\t value: function insertElement(newElement, previousElement) {\n\t previousElement.after(newElement);\n\t return [];\n\t }\n\t }, {\n\t key: 'removeElement',\n\t value: function removeElement(wrapper) {\n\t wrapper.element.remove();\n\t wrapper.scope.$destroy();\n\t return [];\n\t }\n\t }, {\n\t key: 'insertElementAnimated',\n\t value: function insertElementAnimated(newElement, previousElement) {\n\t var _this = this;\n\t\n\t if (!this.$animate) {\n\t return this.insertElement(newElement, previousElement);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret = function () {\n\t var deferred = _this.$q.defer();\n\t // no need for parent - previous element is never null\n\t _this.$animate.enter(newElement, null, previousElement, function () {\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n\t }\n\t\n\t // no need for parent - previous element is never null\n\t return [this.$animate.enter(newElement, null, previousElement)];\n\t }\n\t }, {\n\t key: 'removeElementAnimated',\n\t value: function removeElementAnimated(wrapper) {\n\t var _this2 = this;\n\t\n\t if (!this.$animate) {\n\t return this.removeElement(wrapper);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret2 = function () {\n\t var deferred = _this2.$q.defer();\n\t _this2.$animate.leave(wrapper.element, function () {\n\t wrapper.scope.$destroy();\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n\t }\n\t\n\t return [this.$animate.leave(wrapper.element).then(function () {\n\t return wrapper.scope.$destroy();\n\t })];\n\t }\n\t }]);\n\t\n\t return ElementRoutines;\n\t}();\n\t\n\texports.default = ElementRoutines;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = ScrollBuffer;\n\tfunction ScrollBuffer(elementRoutines, bufferSize) {\n\t var buffer = Object.create(Array.prototype);\n\t\n\t angular.extend(buffer, {\n\t size: bufferSize,\n\t\n\t reset: function reset(startIndex) {\n\t buffer.remove(0, buffer.length);\n\t buffer.eof = false;\n\t buffer.bof = false;\n\t buffer.first = startIndex;\n\t buffer.next = startIndex;\n\t buffer.minIndex = startIndex;\n\t buffer.maxIndex = startIndex;\n\t buffer.minIndexUser = null;\n\t buffer.maxIndexUser = null;\n\t },\n\t append: function append(items) {\n\t items.forEach(function (item) {\n\t ++buffer.next;\n\t buffer.insert('append', item);\n\t });\n\t buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\n\t },\n\t prepend: function prepend(items) {\n\t items.reverse().forEach(function (item) {\n\t --buffer.first;\n\t buffer.insert('prepend', item);\n\t });\n\t buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\n\t },\n\t\n\t\n\t /**\r\n\t * inserts wrapped element in the buffer\r\n\t * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n\t * for insert the number is the index for the buffer element the new one have to be inserted after\r\n\t * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n\t */\n\t insert: function insert(operation, item) {\n\t var wrapper = {\n\t item: item\n\t };\n\t\n\t if (operation % 1 === 0) {\n\t // it is an insert\n\t wrapper.op = 'insert';\n\t buffer.splice(operation, 0, wrapper);\n\t } else {\n\t wrapper.op = operation;\n\t switch (operation) {\n\t case 'append':\n\t buffer.push(wrapper);\n\t break;\n\t case 'prepend':\n\t buffer.unshift(wrapper);\n\t break;\n\t }\n\t }\n\t },\n\t\n\t\n\t // removes elements from buffer\n\t remove: function remove(arg1, arg2) {\n\t if (angular.isNumber(arg1)) {\n\t // removes items from arg1 (including) through arg2 (excluding)\n\t for (var i = arg1; i < arg2; i++) {\n\t elementRoutines.removeElement(buffer[i]);\n\t }\n\t\n\t return buffer.splice(arg1, arg2 - arg1);\n\t }\n\t // removes single item(wrapper) from the buffer\n\t buffer.splice(buffer.indexOf(arg1), 1);\n\t\n\t return elementRoutines.removeElementAnimated(arg1);\n\t },\n\t effectiveHeight: function effectiveHeight(elements) {\n\t if (!elements.length) {\n\t return 0;\n\t }\n\t var top = Number.MAX_VALUE;\n\t var bottom = Number.MIN_VALUE;\n\t elements.forEach(function (wrapper) {\n\t if (wrapper.element[0].offsetParent) {\n\t // element style is not display:none\n\t top = Math.min(top, wrapper.element.offset().top);\n\t bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\n\t }\n\t });\n\t return Math.max(0, bottom - top);\n\t }\n\t });\n\t\n\t return buffer;\n\t}\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Viewport;\n\t\n\tvar _padding = __webpack_require__(5);\n\t\n\tvar _padding2 = _interopRequireDefault(_padding);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\n\t var topPadding = null;\n\t var bottomPadding = null;\n\t var viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\n\t var container = viewportController && viewportController.container ? viewportController.container : undefined;\n\t var scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\n\t\n\t viewport.css({\n\t 'overflow-anchor': 'none',\n\t 'overflow-y': 'auto',\n\t 'display': 'block'\n\t });\n\t\n\t function bufferPadding() {\n\t return viewport.outerHeight() * padding; // some extra space to initiate preload\n\t }\n\t\n\t angular.extend(viewport, {\n\t getScope: function getScope() {\n\t return scope;\n\t },\n\t createPaddingElements: function createPaddingElements(template) {\n\t topPadding = new _padding2.default(template);\n\t bottomPadding = new _padding2.default(template);\n\t element.before(topPadding);\n\t element.after(bottomPadding);\n\t },\n\t applyContainerStyle: function applyContainerStyle() {\n\t if (container && container !== viewport) {\n\t viewport.css('height', window.getComputedStyle(container[0]).height);\n\t }\n\t },\n\t bottomDataPos: function bottomDataPos() {\n\t var scrollHeight = viewport[0].scrollHeight;\n\t scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\n\t return scrollHeight - bottomPadding.height();\n\t },\n\t topDataPos: function topDataPos() {\n\t return topPadding.height();\n\t },\n\t bottomVisiblePos: function bottomVisiblePos() {\n\t return viewport.scrollTop() + viewport.outerHeight();\n\t },\n\t topVisiblePos: function topVisiblePos() {\n\t return viewport.scrollTop();\n\t },\n\t insertElement: function insertElement(e, sibling) {\n\t return elementRoutines.insertElement(e, sibling || topPadding);\n\t },\n\t insertElementAnimated: function insertElementAnimated(e, sibling) {\n\t return elementRoutines.insertElementAnimated(e, sibling || topPadding);\n\t },\n\t shouldLoadBottom: function shouldLoadBottom() {\n\t return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\n\t },\n\t clipBottom: function clipBottom() {\n\t // clip the invisible items off the bottom\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\n\t\n\t for (var i = buffer.length - 1; i >= 0; i--) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t bottomPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t buffer.eof = false;\n\t buffer.remove(buffer.length - overage, buffer.length);\n\t buffer.next -= overage;\n\t viewport.adjustPadding();\n\t }\n\t },\n\t shouldLoadTop: function shouldLoadTop() {\n\t return !buffer.bof && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding();\n\t },\n\t clipTop: function clipTop() {\n\t // clip the invisible items off the top\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\n\t\n\t for (var i = 0; i < buffer.length; i++) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t topPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t // we need to adjust top padding element before items are removed from top\n\t // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\n\t topPadding.height(topPadding.height() + overageHeight);\n\t buffer.bof = false;\n\t buffer.remove(0, overage);\n\t buffer.first += overage;\n\t }\n\t },\n\t adjustPadding: function adjustPadding() {\n\t if (!buffer.length) {\n\t return;\n\t }\n\t\n\t // precise heights calculation, items that were in buffer once\n\t var topPaddingHeight = topPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index < buffer.first ? item.height : 0);\n\t }, 0);\n\t var bottomPaddingHeight = bottomPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index >= buffer.next ? item.height : 0);\n\t }, 0);\n\t\n\t // average item height based on buffer data\n\t var visibleItemsHeight = buffer.reduce(function (summ, item) {\n\t return summ + item.element.outerHeight(true);\n\t }, 0);\n\t var averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\n\t\n\t // average heights calculation, items that have never been reached\n\t var adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\n\t var adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\n\t var topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\n\t var bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\n\t\n\t // paddings combine adjustment\n\t topPadding.height(topPaddingHeight + topPaddingHeightAdd);\n\t bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\n\t },\n\t adjustScrollTopAfterMinIndexSet: function adjustScrollTopAfterMinIndexSet(topPaddingHeightOld) {\n\t // additional scrollTop adjustment in case of datasource.minIndex external set\n\t if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\n\t var diff = topPadding.height() - topPaddingHeightOld;\n\t viewport.scrollTop(viewport.scrollTop() + diff);\n\t }\n\t },\n\t adjustScrollTopAfterPrepend: function adjustScrollTopAfterPrepend(updates) {\n\t if (!updates.prepended.length) return;\n\t var height = buffer.effectiveHeight(updates.prepended);\n\t var paddingHeight = topPadding.height() - height;\n\t if (paddingHeight >= 0) {\n\t topPadding.height(paddingHeight);\n\t } else {\n\t topPadding.height(0);\n\t viewport.scrollTop(viewport.scrollTop() - paddingHeight);\n\t }\n\t },\n\t resetTopPadding: function resetTopPadding() {\n\t topPadding.height(0);\n\t topPadding.cache.clear();\n\t },\n\t resetBottomPadding: function resetBottomPadding() {\n\t bottomPadding.height(0);\n\t bottomPadding.cache.clear();\n\t }\n\t });\n\t\n\t return viewport;\n\t}\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Padding;\n\tfunction Cache() {\n\t var cache = Object.create(Array.prototype);\n\t\n\t angular.extend(cache, {\n\t add: function add(item) {\n\t for (var i = cache.length - 1; i >= 0; i--) {\n\t if (cache[i].index === item.scope.$index) {\n\t cache[i].height = item.element.outerHeight();\n\t return;\n\t }\n\t }\n\t cache.push({\n\t index: item.scope.$index,\n\t height: item.element.outerHeight()\n\t });\n\t },\n\t clear: function clear() {\n\t cache.length = 0;\n\t }\n\t });\n\t\n\t return cache;\n\t}\n\t\n\tfunction Padding(template) {\n\t var result = void 0;\n\t\n\t switch (template.tagName) {\n\t case 'dl':\n\t throw new Error('ui-scroll directive does not support <' + template.tagName + '> as a repeating tag: ' + template.outerHTML);\n\t case 'tr':\n\t var table = angular.element('
    ');\n\t result = table.find('tr');\n\t break;\n\t case 'li':\n\t result = angular.element('
  • ');\n\t break;\n\t default:\n\t result = angular.element('
    ');\n\t }\n\t\n\t result.cache = new Cache();\n\t\n\t return result;\n\t}\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction findCtrl(scope, ctrl) {\n\t if (!scope) {\n\t return;\n\t }\n\t if (scope.hasOwnProperty(ctrl) && Object.getPrototypeOf(scope[ctrl]).constructor.hasOwnProperty('$inject')) {\n\t return scope[ctrl];\n\t }\n\t return findCtrl(scope.$parent, ctrl);\n\t}\n\t\n\tfunction assignAttr(attr, scope, element) {\n\t if (!attr || !(attr = attr.replace(/^\\s+|\\s+$/gm, ''))) {\n\t return;\n\t }\n\t\n\t var onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\n\t var asSyntax = attr.match(/^([^.]+)\\.(.+)?/);\n\t\n\t if (onSyntax && onSyntax.length === 4) {\n\t // controller on (backward compatibility), deprecated since v1.6.1\n\t window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\n\t var ctrl = onSyntax[3];\n\t var tail = onSyntax[1];\n\t var candidate = element;\n\t while (candidate.length) {\n\t var candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\n\t var candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\n\t if (candidateName && candidateName[1] === ctrl) {\n\t return {\n\t target: candidateScope,\n\t source: tail\n\t };\n\t }\n\t candidate = candidate.parent();\n\t }\n\t throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\n\t } else if (asSyntax && asSyntax.length === 3) {\n\t // controller as\n\t var _ctrl = asSyntax[1];\n\t var _tail = asSyntax[2];\n\t var foundCtrl = findCtrl(scope, _ctrl);\n\t if (foundCtrl) {\n\t return {\n\t target: foundCtrl,\n\t source: _tail\n\t };\n\t }\n\t }\n\t\n\t return {\n\t target: scope,\n\t source: attr\n\t };\n\t}\n\t\n\tvar Adapter = function () {\n\t function Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element) {\n\t _classCallCheck(this, Adapter);\n\t\n\t this.viewport = viewport;\n\t this.buffer = buffer;\n\t this.adjustBuffer = adjustBuffer;\n\t this.reload = reload;\n\t\n\t this.publicContext = {};\n\t this.assignAdapter($attr, $parse, element);\n\t this.generatePublicContext($attr, $parse, element);\n\t\n\t this.isLoading = false;\n\t this.disabled = false;\n\t }\n\t\n\t _createClass(Adapter, [{\n\t key: 'assignAdapter',\n\t value: function assignAdapter($attr, $parse, element) {\n\t var data = assignAttr($attr.adapter, this.viewport.getScope(), element);\n\t\n\t if (data) {\n\t try {\n\t $parse(data.source).assign(data.target, {});\n\t var adapterOnScope = $parse(data.source)(data.target);\n\t\n\t angular.extend(adapterOnScope, this.publicContext);\n\t this.publicContext = adapterOnScope;\n\t } catch (error) {\n\t error.message = 'Angular ui-scroll Adapter assignment exception.\\n' + ('Can\\'t parse \"' + $attr.adapter + '\" expression.\\n') + error.message;\n\t throw error;\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'generatePublicContext',\n\t value: function generatePublicContext($attr, $parse, element) {\n\t var _this = this;\n\t\n\t // these methods will be accessible out of ui-scroll via user defined adapter\n\t var publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\n\t for (var i = publicMethods.length - 1; i >= 0; i--) {\n\t this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\n\t }\n\t\n\t // these read-only props will be accessible out of ui-scroll via user defined adapter\n\t var publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope'];\n\t\n\t var _loop = function _loop(_i) {\n\t var property = void 0,\n\t assignProp = void 0;\n\t var data = assignAttr($attr[publicProps[_i]], _this.viewport.getScope(), element);\n\t if (data) {\n\t assignProp = $parse(data.source).assign;\n\t }\n\t Object.defineProperty(_this, publicProps[_i], {\n\t get: function get() {\n\t return property;\n\t },\n\t set: function set(value) {\n\t property = value;\n\t if (assignProp) {\n\t assignProp(data.target, value);\n\t }\n\t _this.publicContext[publicProps[_i]] = value;\n\t }\n\t });\n\t };\n\t\n\t for (var _i = publicProps.length - 1; _i >= 0; _i--) {\n\t _loop(_i);\n\t }\n\t\n\t // non-read-only public property\n\t Object.defineProperty(this.publicContext, 'disabled', {\n\t get: function get() {\n\t return _this.disabled;\n\t },\n\t set: function set(value) {\n\t return !(_this.disabled = value) ? _this.adjustBuffer() : null;\n\t }\n\t });\n\t }\n\t }, {\n\t key: 'loading',\n\t value: function loading(value) {\n\t this['isLoading'] = value;\n\t }\n\t }, {\n\t key: 'isBOF',\n\t value: function isBOF() {\n\t return this.buffer.bof;\n\t }\n\t }, {\n\t key: 'isEOF',\n\t value: function isEOF() {\n\t return this.buffer.eof;\n\t }\n\t }, {\n\t key: 'isEmpty',\n\t value: function isEmpty() {\n\t return !this.buffer.length;\n\t }\n\t }, {\n\t key: 'applyUpdates',\n\t value: function applyUpdates(arg1, arg2) {\n\t var _this2 = this;\n\t\n\t if (angular.isFunction(arg1)) {\n\t // arg1 is the updater function, arg2 is ignored\n\t this.buffer.slice(0).forEach(function (wrapper) {\n\t // we need to do it on the buffer clone, because buffer content\n\t // may change as we iterate through\n\t _this2.applyUpdate(wrapper, arg1(wrapper.item, wrapper.scope, wrapper.element));\n\t });\n\t } else {\n\t // arg1 is item index, arg2 is the newItems array\n\t if (arg1 % 1 !== 0) {\n\t // checking if it is an integer\n\t throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\n\t }\n\t\n\t var index = arg1 - this.buffer.first;\n\t if (index >= 0 && index < this.buffer.length) {\n\t this.applyUpdate(this.buffer[index], arg2);\n\t }\n\t }\n\t\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'append',\n\t value: function append(newItems) {\n\t this.buffer.append(newItems);\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'prepend',\n\t value: function prepend(newItems) {\n\t this.buffer.prepend(newItems);\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'calculateProperties',\n\t value: function calculateProperties() {\n\t var item = void 0,\n\t itemHeight = void 0,\n\t itemTop = void 0,\n\t isNewRow = void 0,\n\t rowTop = null;\n\t var topHeight = 0;\n\t for (var i = 0; i < this.buffer.length; i++) {\n\t item = this.buffer[i];\n\t itemTop = item.element.offset().top;\n\t isNewRow = rowTop !== itemTop;\n\t rowTop = itemTop;\n\t if (isNewRow) {\n\t itemHeight = item.element.outerHeight(true);\n\t }\n\t if (isNewRow && this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos()) {\n\t topHeight += itemHeight;\n\t } else {\n\t if (isNewRow) {\n\t this['topVisible'] = item.item;\n\t this['topVisibleElement'] = item.element;\n\t this['topVisibleScope'] = item.scope;\n\t }\n\t break;\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'applyUpdate',\n\t value: function applyUpdate(wrapper, newItems) {\n\t var _this3 = this;\n\t\n\t if (!angular.isArray(newItems)) {\n\t return;\n\t }\n\t\n\t var keepIt = void 0;\n\t var pos = this.buffer.indexOf(wrapper) + 1;\n\t\n\t newItems.reverse().forEach(function (newItem) {\n\t if (newItem === wrapper.item) {\n\t keepIt = true;\n\t pos--;\n\t } else {\n\t _this3.buffer.insert(pos, newItem);\n\t }\n\t });\n\t\n\t if (!keepIt) {\n\t wrapper.op = 'remove';\n\t }\n\t }\n\t }]);\n\t\n\t return Adapter;\n\t}();\n\t\n\texports.default = Adapter;\n\n/***/ }\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// ui-scroll.min.js"," \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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6fb5c0179465828c8111","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 /**\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","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);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","function findCtrl(scope, ctrl) {\r\n if (!scope) {\r\n return;\r\n }\r\n if (scope.hasOwnProperty(ctrl) && Object.getPrototypeOf(scope[ctrl]).constructor.hasOwnProperty('$inject')) {\r\n return scope[ctrl];\r\n }\r\n return findCtrl(scope.$parent, ctrl);\r\n}\r\n\r\nfunction assignAttr(attr, scope, element) {\r\n if (!attr || !(attr = attr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n\r\n let onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\r\n let asSyntax = attr.match(/^([^.]+)\\.(.+)?/);\r\n\r\n if (onSyntax && onSyntax.length === 4) { // controller on (backward compatibility), deprecated since v1.6.1\r\n window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\r\n let ctrl = onSyntax[3];\r\n let tail = onSyntax[1];\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[1] === ctrl) {\r\n return {\r\n target: candidateScope,\r\n source: tail\r\n };\r\n }\r\n candidate = candidate.parent();\r\n }\r\n throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\r\n }\r\n else if (asSyntax && asSyntax.length === 3) { // controller as\r\n let ctrl = asSyntax[1];\r\n let tail = asSyntax[2];\r\n let foundCtrl = findCtrl(scope, ctrl);\r\n if (foundCtrl) {\r\n return {\r\n target: foundCtrl,\r\n source: tail\r\n };\r\n }\r\n }\r\n\r\n return {\r\n target: scope,\r\n source: attr\r\n };\r\n}\r\n\r\nclass Adapter {\r\n\r\n constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element) {\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n this.adjustBuffer = adjustBuffer;\r\n this.reload = reload;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr, $parse, element);\r\n this.generatePublicContext($attr, $parse, element);\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n }\r\n\r\n assignAdapter($attr, $parse, element) {\r\n let data = assignAttr($attr.adapter, this.viewport.getScope(), element);\r\n\r\n if (data) {\r\n try {\r\n $parse(data.source).assign(data.target, {});\r\n let adapterOnScope = $parse(data.source)(data.target);\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${$attr.adapter}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n generatePublicContext($attr, $parse, element) {\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'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, assignProp;\r\n let data = assignAttr($attr[publicProps[i]], this.viewport.getScope(), element);\r\n if (data) {\r\n assignProp = $parse(data.source).assign;\r\n }\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n if (assignProp) {\r\n assignProp(data.target, value);\r\n }\r\n this.publicContext[publicProps[i]] = value;\r\n }\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.adjustBuffer() : 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 applyUpdates(arg1, arg2) {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\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, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - this.buffer.first;\r\n if ((index >= 0 && index < this.buffer.length)) {\r\n this.applyUpdate(this.buffer[index], arg2);\r\n }\r\n }\r\n\r\n this.adjustBuffer();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n calculateProperties() {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n item = this.buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n break;\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\r\n let keepIt;\r\n let pos = (this.buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n this.buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///ui-scroll.min.js","webpack:///webpack/bootstrap 171ff513de35bc561c8f","webpack:///./src/ui-scroll.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/adapter.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","_jqLiteExtras","_jqLiteExtras2","_elementRoutines","_elementRoutines2","_buffer","_buffer2","_viewport","_viewport2","_adapter","_adapter2","angular","service","run","jqLiteExtras","window","jQuery","registerFor","element","directive","restrict","controller","scope","_this","this","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$q","$parse","link","$scope","$attr","controllers","linker","parseNumericAttr","value","defaultValue","result","isNaN","defineProperty","datasource","propName","propUserName","descriptor","Object","getOwnPropertyDescriptor","set","get","indexStore","buffer","pending","length","topPaddingHeightOld","topDataPos","adjustPadding","adjustScrollTopAfterMinIndexSet","isInvalid","rid","ridActual","$$destroyed","bindEvents","bind","resizeAndScrollHandler","unbindEvents","unbind","reload","resetTopPadding","resetBottomPadding","arguments","startIndex","reset","adjustBuffer","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","item","isFunction","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","addClass","promises","sibling","undefined","clone","itemName","adapter","transform","updateDOM","toBePrepended","toBeRemoved","inserted","i","op","unshift","push","concat","insertElementAnimated","remove","$index","first","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","fetch","loading","shouldLoadTop","w","removeClass","calculateProperties","adjustBufferAfterFetch","adjustScrollTopAfterPrepend","shift","fetchNext","bufferSize","eof","clipTop","append","fetchPrevious","bof","clipBottom","prepend","$$phase","isLoading","disabled","$apply","wheelHandler","event","scrollTop","yMax","scrollHeight","clientHeight","preventDefault","match","uiScroll","Error","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","datasourceName","viewportController","Math","max","padding","elementRoutines","isDatasourceValid","isObject","success","next","index","count","createPaddingElements","$destroy","$on","applyContainerStyle","require","transclude","priority","terminal","_classCallCheck","instance","Constructor","TypeError","_slicedToArray","sliceIterator","arr","_arr","_n","_d","_e","_s","_i","Symbol","iterator","done","err","Array","isArray","_createClass","defineProperties","target","props","enumerable","configurable","writable","key","protoProps","staticProps","prototype","JQLiteExtras","scrollTo","self","direction","elem","_top$left$direction","top","left","method","prop","preserve","isWindow","isDefined","document","documentElement","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","width","border","margin","_width$height$measure","offsetWidth","offsetHeight","getStyle","convertToPx","getWidthHeight","measurements","outer","outerfull","style","parseFloat","css","name","nodeType","location","alert","setInterval","getComputedStyle","currentStyle","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","before","newElem","j","parent","ref","contents","after","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","_typeof","constructor","ElementRoutines","$animate","has","isAngularVersionLessThen1_3","version","major","minor","newElement","previousElement","_ret","deferred","defer","enter","resolve","v","promise","_this2","removeElement","_ret2","leave","ScrollBuffer","create","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","splice","arg1","arg2","indexOf","removeElementAnimated","elements","Number","MAX_VALUE","bottom","MIN_VALUE","Viewport","bufferPadding","topPadding","bottomPadding","overflow-anchor","overflow-y","display","getScope","template","_padding2","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","topPaddingHeight","reduce","summ","bottomPaddingHeight","visibleItemsHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","_padding","Cache","Padding","table","find","getCtrlOnData","attr","onSyntax","warn","ctrl","tail","candidate","candidateScope","candidateName","Adapter","viewportScope","startScope","$parent","publicContext","assignAdapter","generatePublicContext","adapterAttr","replace","ctrlOnData","adapterOnScope","assign","error","message","publicMethods","publicProps","_loop","property","slice","applyUpdate","newItems","itemTop","isNewRow","rowTop","topHeight","_this3","keepIt","pos","newItem"],"mappings":"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","file":"ui-scroll.min.js","sourcesContent":["/*!\r\n * angular-ui-scroll (uncompressed)\r\n * https://github.com/angular-ui/ui-scroll\r\n * Version: 1.6.1 -- 2017-03-04T06:00:38.359Z\r\n * License: MIT\r\n */\n/******/ (function(modules) { // webpackBootstrap\n/******/ \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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _jqLiteExtras = __webpack_require__(1);\n\t\n\tvar _jqLiteExtras2 = _interopRequireDefault(_jqLiteExtras);\n\t\n\tvar _elementRoutines = __webpack_require__(2);\n\t\n\tvar _elementRoutines2 = _interopRequireDefault(_elementRoutines);\n\t\n\tvar _buffer = __webpack_require__(3);\n\t\n\tvar _buffer2 = _interopRequireDefault(_buffer);\n\t\n\tvar _viewport = __webpack_require__(4);\n\t\n\tvar _viewport2 = _interopRequireDefault(_viewport);\n\t\n\tvar _adapter = __webpack_require__(6);\n\t\n\tvar _adapter2 = _interopRequireDefault(_adapter);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tangular.module('ui.scroll', []).service('jqLiteExtras', function () {\n\t return new _jqLiteExtras2.default();\n\t}).run(['jqLiteExtras', function (jqLiteExtras) {\n\t return !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null;\n\t}]).directive('uiScrollViewport', function () {\n\t return {\n\t restrict: 'A',\n\t controller: ['$scope', '$element', function (scope, element) {\n\t var _this = this;\n\t\n\t this.container = element;\n\t this.viewport = element;\n\t this.scope = scope;\n\t\n\t angular.forEach(element.children(), function (child) {\n\t if (child.tagName.toLowerCase() === 'tbody') {\n\t _this.viewport = angular.element(child);\n\t }\n\t });\n\t\n\t return this;\n\t }]\n\t };\n\t}).directive('uiScroll', ['$log', '$injector', '$rootScope', '$timeout', '$q', '$parse', function (console, $injector, $rootScope, $timeout, $q, $parse) {\n\t\n\t return {\n\t require: ['?^uiScrollViewport'],\n\t restrict: 'A',\n\t transclude: 'element',\n\t priority: 1000,\n\t terminal: true,\n\t link: link\n\t };\n\t\n\t function link($scope, element, $attr, controllers, linker) {\n\t var match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n\t if (!match) {\n\t throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n\t }\n\t\n\t function parseNumericAttr(value, defaultValue) {\n\t var result = $parse(value)($scope);\n\t return isNaN(result) ? defaultValue : result;\n\t }\n\t\n\t var BUFFER_MIN = 3;\n\t var BUFFER_DEFAULT = 10;\n\t var PADDING_MIN = 0.3;\n\t var PADDING_DEFAULT = 0.5;\n\t\n\t var datasource = null;\n\t var itemName = match[1];\n\t var datasourceName = match[2];\n\t var viewportController = controllers[0];\n\t var bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n\t var padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT));\n\t var startIndex = parseNumericAttr($attr.startIndex, 1);\n\t var ridActual = 0; // current data revision id\n\t var pending = [];\n\t\n\t var elementRoutines = new _elementRoutines2.default($injector, $q);\n\t var buffer = new _buffer2.default(elementRoutines, bufferSize);\n\t var viewport = new _viewport2.default(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n\t var adapter = new _adapter2.default(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope);\n\t\n\t if (viewportController) {\n\t viewportController.adapter = adapter;\n\t }\n\t\n\t var isDatasourceValid = function isDatasourceValid() {\n\t return angular.isObject(datasource) && angular.isFunction(datasource.get);\n\t };\n\t datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n\t if (!isDatasourceValid()) {\n\t datasource = $injector.get(datasourceName); // try to inject datasource as service\n\t if (!isDatasourceValid()) {\n\t throw new Error(datasourceName + ' is not a valid datasource');\n\t }\n\t }\n\t\n\t var indexStore = {};\n\t\n\t function defineProperty(datasource, propName, propUserName) {\n\t var descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n\t if (!descriptor || !descriptor.set && !descriptor.get) {\n\t Object.defineProperty(datasource, propName, {\n\t set: function set(value) {\n\t indexStore[propName] = value;\n\t $timeout(function () {\n\t buffer[propUserName] = value;\n\t if (!pending.length) {\n\t var topPaddingHeightOld = viewport.topDataPos();\n\t viewport.adjustPadding();\n\t if (propName === 'minIndex') {\n\t viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n\t }\n\t }\n\t });\n\t },\n\t get: function get() {\n\t return indexStore[propName];\n\t }\n\t });\n\t }\n\t }\n\t\n\t defineProperty(datasource, 'minIndex', 'minIndexUser');\n\t defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\t\n\t var fetchNext = datasource.get.length !== 2 ? function (success) {\n\t return datasource.get(buffer.next, bufferSize, success);\n\t } : function (success) {\n\t datasource.get({\n\t index: buffer.next,\n\t append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n\t count: bufferSize\n\t }, success);\n\t };\n\t\n\t var fetchPrevious = datasource.get.length !== 2 ? function (success) {\n\t return datasource.get(buffer.first - bufferSize, bufferSize, success);\n\t } : function (success) {\n\t datasource.get({\n\t index: buffer.first - bufferSize,\n\t prepend: buffer.length ? buffer[0].item : void 0,\n\t count: bufferSize\n\t }, success);\n\t };\n\t\n\t /**\n\t * Build padding elements\n\t *\n\t * Calling linker is the only way I found to get access to the tag name of the template\n\t * to prevent the directive scope from pollution a new scope is created and destroyed\n\t * right after the builder creation is completed\n\t */\n\t linker(function (clone, scope) {\n\t viewport.createPaddingElements(clone[0]);\n\t // we do not include the clone in the DOM. It means that the nested directives will not\n\t // be able to reach the parent directives, but in this case it is intentional because we\n\t // created the clone to access the template tag name\n\t scope.$destroy();\n\t clone.remove();\n\t });\n\t\n\t $scope.$on('$destroy', function () {\n\t unbindEvents();\n\t viewport.unbind('mousewheel', wheelHandler);\n\t });\n\t\n\t viewport.bind('mousewheel', wheelHandler);\n\t\n\t $timeout(function () {\n\t viewport.applyContainerStyle();\n\t reload();\n\t });\n\t\n\t /* Private function definitions */\n\t\n\t function isInvalid(rid) {\n\t return rid && rid !== ridActual || $scope.$$destroyed;\n\t }\n\t\n\t function bindEvents() {\n\t viewport.bind('resize', resizeAndScrollHandler);\n\t viewport.bind('scroll', resizeAndScrollHandler);\n\t }\n\t\n\t function unbindEvents() {\n\t viewport.unbind('resize', resizeAndScrollHandler);\n\t viewport.unbind('scroll', resizeAndScrollHandler);\n\t }\n\t\n\t function reload() {\n\t viewport.resetTopPadding();\n\t viewport.resetBottomPadding();\n\t if (arguments.length) {\n\t startIndex = arguments[0];\n\t }\n\t buffer.reset(startIndex);\n\t adjustBuffer();\n\t }\n\t\n\t function isElementVisible(wrapper) {\n\t return wrapper.element.height() && wrapper.element[0].offsetParent;\n\t }\n\t\n\t function visibilityWatcher(wrapper) {\n\t if (isElementVisible(wrapper)) {\n\t buffer.forEach(function (item) {\n\t if (angular.isFunction(item.unregisterVisibilityWatcher)) {\n\t item.unregisterVisibilityWatcher();\n\t delete item.unregisterVisibilityWatcher;\n\t }\n\t });\n\t if (!pending.length) {\n\t adjustBuffer();\n\t }\n\t }\n\t }\n\t\n\t function insertWrapperContent(wrapper, insertAfter) {\n\t createElement(wrapper, insertAfter, viewport.insertElement);\n\t if (!isElementVisible(wrapper)) {\n\t wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(function () {\n\t return visibilityWatcher(wrapper);\n\t });\n\t }\n\t wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n\t }\n\t\n\t function createElement(wrapper, insertAfter, insertElement) {\n\t var promises = null;\n\t var sibling = insertAfter > 0 ? buffer[insertAfter - 1].element : undefined;\n\t linker(function (clone, scope) {\n\t promises = insertElement(clone, sibling);\n\t wrapper.element = clone;\n\t wrapper.scope = scope;\n\t scope[itemName] = wrapper.item;\n\t });\n\t if (adapter.transform) adapter.transform(wrapper.scope, wrapper.element);\n\t return promises;\n\t }\n\t\n\t function updateDOM() {\n\t var promises = [];\n\t var toBePrepended = [];\n\t var toBeRemoved = [];\n\t var inserted = [];\n\t\n\t buffer.forEach(function (wrapper, i) {\n\t switch (wrapper.op) {\n\t case 'prepend':\n\t toBePrepended.unshift(wrapper);\n\t break;\n\t case 'append':\n\t insertWrapperContent(wrapper, i);\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'insert':\n\t promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'remove':\n\t toBeRemoved.push(wrapper);\n\t }\n\t });\n\t\n\t toBeRemoved.forEach(function (wrapper) {\n\t return promises = promises.concat(buffer.remove(wrapper));\n\t });\n\t\n\t if (toBePrepended.length) toBePrepended.forEach(function (wrapper) {\n\t insertWrapperContent(wrapper);\n\t wrapper.op = 'none';\n\t });\n\t\n\t buffer.forEach(function (item, i) {\n\t return item.scope.$index = buffer.first + i;\n\t });\n\t\n\t return {\n\t prepended: toBePrepended,\n\t removed: toBeRemoved,\n\t inserted: inserted,\n\t animated: promises\n\t };\n\t }\n\t\n\t function updatePaddings(rid, updates) {\n\t // schedule another adjustBuffer after animation completion\n\t if (updates.animated.length) {\n\t $q.all(updates.animated).then(function () {\n\t viewport.adjustPadding();\n\t adjustBuffer(rid);\n\t });\n\t } else {\n\t viewport.adjustPadding();\n\t }\n\t }\n\t\n\t function enqueueFetch(rid, updates) {\n\t if (viewport.shouldLoadBottom()) {\n\t if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t if (pending.push(true) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t } else if (viewport.shouldLoadTop()) {\n\t if (!updates || buffer.effectiveHeight(updates.prepended) > 0 || pending[0]) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n\t // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n\t if (pending.push(false) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t }\n\t }\n\t\n\t function adjustBuffer(rid) {\n\t if (!rid) {\n\t // dismiss pending requests\n\t pending = [];\n\t rid = ++ridActual;\n\t }\n\t\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid);\n\t\n\t if (!pending.length) {\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function adjustBufferAfterFetch(rid) {\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t viewport.adjustScrollTopAfterPrepend(updates);\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid, updates);\n\t pending.shift();\n\t\n\t if (pending.length) fetch(rid);else {\n\t adapter.loading(false);\n\t bindEvents();\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function fetch(rid) {\n\t if (pending[0]) {\n\t // scrolling down\n\t if (buffer.length && !viewport.shouldLoadBottom()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchNext(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.eof = true;\n\t }\n\t\n\t if (result.length > 0) {\n\t viewport.clipTop();\n\t buffer.append(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t } else {\n\t // scrolling up\n\t if (buffer.length && !viewport.shouldLoadTop()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchPrevious(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.bof = true;\n\t // log 'bof is reached'\n\t }\n\t\n\t if (result.length > 0) {\n\t if (buffer.length) {\n\t viewport.clipBottom();\n\t }\n\t buffer.prepend(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t }\n\t }\n\t\n\t function resizeAndScrollHandler() {\n\t if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\t\n\t enqueueFetch(ridActual);\n\t\n\t if (pending.length) {\n\t unbindEvents();\n\t } else {\n\t adapter.calculateProperties();\n\t $scope.$apply();\n\t }\n\t }\n\t }\n\t\n\t function wheelHandler(event) {\n\t if (!adapter.disabled) {\n\t var scrollTop = viewport[0].scrollTop;\n\t var yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\t\n\t if (scrollTop === 0 && !buffer.bof || scrollTop === yMax && !buffer.eof) {\n\t event.preventDefault();\n\t }\n\t }\n\t }\n\t }\n\t}]);\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*!\r\n\t globals: angular, window\r\n\t List of used element methods available in JQuery but not in JQuery Lite\r\n\t element.before(elem)\r\n\t element.height()\r\n\t element.outerHeight(true)\r\n\t element.height(value) = only for Top/Bottom padding elements\r\n\t element.scrollTop()\r\n\t element.scrollTop(value)\r\n\t */\n\t\n\tvar JQLiteExtras = function () {\n\t function JQLiteExtras() {\n\t _classCallCheck(this, JQLiteExtras);\n\t }\n\t\n\t _createClass(JQLiteExtras, [{\n\t key: 'registerFor',\n\t value: function registerFor(element) {\n\t var convertToPx = void 0,\n\t css = void 0,\n\t getStyle = void 0,\n\t isWindow = void 0;\n\t // angular implementation blows up if elem is the window\n\t css = angular.element.prototype.css;\n\t\n\t element.prototype.css = function (name, value) {\n\t var self = this;\n\t var elem = self[0];\n\t if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\n\t return css.call(self, name, value);\n\t }\n\t };\n\t\n\t // as defined in angularjs v1.0.5\n\t isWindow = function isWindow(obj) {\n\t return obj && obj.document && obj.location && obj.alert && obj.setInterval;\n\t };\n\t\n\t function scrollTo(self, direction, value) {\n\t var elem = self[0];\n\t\n\t var _top$left$direction = _slicedToArray({\n\t top: ['scrollTop', 'pageYOffset', 'scrollLeft'],\n\t left: ['scrollLeft', 'pageXOffset', 'scrollTop']\n\t }[direction], 3),\n\t method = _top$left$direction[0],\n\t prop = _top$left$direction[1],\n\t preserve = _top$left$direction[2];\n\t\n\t if (isWindow(elem)) {\n\t if (angular.isDefined(value)) {\n\t return elem.scrollTo(self[preserve].call(self), value);\n\t }\n\t return prop in elem ? elem[prop] : elem.document.documentElement[method];\n\t } else {\n\t if (angular.isDefined(value)) {\n\t elem[method] = value;\n\t }\n\t return elem[method];\n\t }\n\t }\n\t\n\t if (window.getComputedStyle) {\n\t getStyle = function getStyle(elem) {\n\t return window.getComputedStyle(elem, null);\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t return parseFloat(value);\n\t };\n\t } else {\n\t getStyle = function getStyle(elem) {\n\t return elem.currentStyle;\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t var left = void 0,\n\t result = void 0,\n\t rs = void 0,\n\t rsLeft = void 0,\n\t style = void 0;\n\t var core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\n\t var rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\n\t\n\t if (!rnumnonpx.test(value)) {\n\t return parseFloat(value);\n\t }\n\t\n\t // ported from JQuery\n\t style = elem.style;\n\t left = style.left;\n\t rs = elem.runtimeStyle;\n\t rsLeft = rs && rs.left;\n\t if (rs) {\n\t rs.left = style.left;\n\t }\n\t // put in the new values to get a computed style out\n\t style.left = value;\n\t result = style.pixelLeft;\n\t style.left = left;\n\t if (rsLeft) {\n\t rs.left = rsLeft;\n\t }\n\t return result;\n\t };\n\t }\n\t\n\t function getMeasurements(elem, measure) {\n\t var base = void 0,\n\t borderA = void 0,\n\t borderB = void 0,\n\t computedMarginA = void 0,\n\t computedMarginB = void 0,\n\t computedStyle = void 0,\n\t dirA = void 0,\n\t dirB = void 0,\n\t marginA = void 0,\n\t marginB = void 0,\n\t paddingA = void 0,\n\t paddingB = void 0;\n\t\n\t if (isWindow(elem)) {\n\t base = document.documentElement[{ height: 'clientHeight', width: 'clientWidth' }[measure]];\n\t\n\t return {\n\t base: base,\n\t padding: 0,\n\t border: 0,\n\t margin: 0\n\t };\n\t }\n\t\n\t // Start with offset property\n\t\n\t var _width$height$measure = _slicedToArray({\n\t width: [elem.offsetWidth, 'Left', 'Right'],\n\t height: [elem.offsetHeight, 'Top', 'Bottom']\n\t }[measure], 3);\n\t\n\t base = _width$height$measure[0];\n\t dirA = _width$height$measure[1];\n\t dirB = _width$height$measure[2];\n\t\n\t\n\t computedStyle = getStyle(elem);\n\t paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\n\t paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\n\t borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\n\t borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\n\t computedMarginA = computedStyle['margin' + dirA];\n\t computedMarginB = computedStyle['margin' + dirB];\n\t\n\t // I do not care for width for now, so this hack is irrelevant\n\t // if ( !supportsPercentMargin )\n\t // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\n\t // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\n\t marginA = convertToPx(elem, computedMarginA) || 0;\n\t marginB = convertToPx(elem, computedMarginB) || 0;\n\t\n\t return {\n\t base: base,\n\t padding: paddingA + paddingB,\n\t border: borderA + borderB,\n\t margin: marginA + marginB\n\t };\n\t }\n\t\n\t function getWidthHeight(elem, direction, measure) {\n\t var computedStyle = void 0,\n\t result = void 0;\n\t\n\t var measurements = getMeasurements(elem, direction);\n\t\n\t if (measurements.base > 0) {\n\t return {\n\t base: measurements.base - measurements.padding - measurements.border,\n\t outer: measurements.base,\n\t outerfull: measurements.base + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // Fall back to computed then uncomputed css if necessary\n\t computedStyle = getStyle(elem);\n\t result = computedStyle[direction];\n\t\n\t if (result < 0 || result === null) {\n\t result = elem.style[direction] || 0;\n\t }\n\t\n\t // Normalize \"\", auto, and prepare for extra\n\t result = parseFloat(result) || 0;\n\t\n\t return {\n\t base: result - measurements.padding - measurements.border,\n\t outer: result,\n\t outerfull: result + measurements.padding + measurements.border + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // define missing methods\n\t return angular.forEach({\n\t before: function before(newElem) {\n\t var children, elem, i, j, parent, ref, self;\n\t self = this;\n\t elem = self[0];\n\t parent = self.parent();\n\t children = parent.contents();\n\t if (children[0] === elem) {\n\t return parent.prepend(newElem);\n\t } else {\n\t for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n\t if (children[i] === elem) {\n\t angular.element(children[i - 1]).after(newElem);\n\t return;\n\t }\n\t }\n\t throw new Error('invalid DOM structure ' + elem.outerHTML);\n\t }\n\t },\n\t height: function height(value) {\n\t var self;\n\t self = this;\n\t if (angular.isDefined(value)) {\n\t if (angular.isNumber(value)) {\n\t value = value + 'px';\n\t }\n\t return css.call(self, 'height', value);\n\t } else {\n\t return getWidthHeight(this[0], 'height', 'base');\n\t }\n\t },\n\t outerHeight: function outerHeight(option) {\n\t return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\n\t },\n\t outerWidth: function outerWidth(option) {\n\t return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\n\t },\n\t\n\t\n\t /*\r\n\t The offset setter method is not implemented\r\n\t */\n\t offset: function offset(value) {\n\t var docElem = void 0,\n\t win = void 0;\n\t var self = this;\n\t var box = {\n\t top: 0,\n\t left: 0\n\t };\n\t var elem = self[0];\n\t var doc = elem && elem.ownerDocument;\n\t\n\t if (arguments.length) {\n\t if (value === undefined) {\n\t return self;\n\t }\n\t // TODO: implement setter\n\t throw new Error('offset setter method is not implemented');\n\t }\n\t\n\t if (!doc) {\n\t return;\n\t }\n\t\n\t docElem = doc.documentElement;\n\t\n\t // TODO: Make sure it's not a disconnected DOM node\n\t\n\t if (elem.getBoundingClientRect != null) {\n\t box = elem.getBoundingClientRect();\n\t }\n\t\n\t win = doc.defaultView || doc.parentWindow;\n\t\n\t return {\n\t top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n\t left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n\t };\n\t },\n\t scrollTop: function scrollTop(value) {\n\t return scrollTo(this, 'top', value);\n\t },\n\t scrollLeft: function scrollLeft(value) {\n\t return scrollTo(this, 'left', value);\n\t }\n\t }, function (value, key) {\n\t if (!element.prototype[key]) {\n\t return element.prototype[key] = value;\n\t }\n\t });\n\t }\n\t }]);\n\t\n\t return JQLiteExtras;\n\t}();\n\t\n\texports.default = JQLiteExtras;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar ElementRoutines = function () {\n\t function ElementRoutines($injector, $q) {\n\t _classCallCheck(this, ElementRoutines);\n\t\n\t this.$animate = $injector.has && $injector.has('$animate') ? $injector.get('$animate') : null;\n\t this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\n\t this.$q = $q;\n\t }\n\t\n\t _createClass(ElementRoutines, [{\n\t key: 'insertElement',\n\t value: function insertElement(newElement, previousElement) {\n\t previousElement.after(newElement);\n\t return [];\n\t }\n\t }, {\n\t key: 'removeElement',\n\t value: function removeElement(wrapper) {\n\t wrapper.element.remove();\n\t wrapper.scope.$destroy();\n\t return [];\n\t }\n\t }, {\n\t key: 'insertElementAnimated',\n\t value: function insertElementAnimated(newElement, previousElement) {\n\t var _this = this;\n\t\n\t if (!this.$animate) {\n\t return this.insertElement(newElement, previousElement);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret = function () {\n\t var deferred = _this.$q.defer();\n\t // no need for parent - previous element is never null\n\t _this.$animate.enter(newElement, null, previousElement, function () {\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n\t }\n\t\n\t // no need for parent - previous element is never null\n\t return [this.$animate.enter(newElement, null, previousElement)];\n\t }\n\t }, {\n\t key: 'removeElementAnimated',\n\t value: function removeElementAnimated(wrapper) {\n\t var _this2 = this;\n\t\n\t if (!this.$animate) {\n\t return this.removeElement(wrapper);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret2 = function () {\n\t var deferred = _this2.$q.defer();\n\t _this2.$animate.leave(wrapper.element, function () {\n\t wrapper.scope.$destroy();\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n\t }\n\t\n\t return [this.$animate.leave(wrapper.element).then(function () {\n\t return wrapper.scope.$destroy();\n\t })];\n\t }\n\t }]);\n\t\n\t return ElementRoutines;\n\t}();\n\t\n\texports.default = ElementRoutines;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = ScrollBuffer;\n\tfunction ScrollBuffer(elementRoutines, bufferSize) {\n\t var buffer = Object.create(Array.prototype);\n\t\n\t angular.extend(buffer, {\n\t size: bufferSize,\n\t\n\t reset: function reset(startIndex) {\n\t buffer.remove(0, buffer.length);\n\t buffer.eof = false;\n\t buffer.bof = false;\n\t buffer.first = startIndex;\n\t buffer.next = startIndex;\n\t buffer.minIndex = startIndex;\n\t buffer.maxIndex = startIndex;\n\t buffer.minIndexUser = null;\n\t buffer.maxIndexUser = null;\n\t },\n\t append: function append(items) {\n\t items.forEach(function (item) {\n\t ++buffer.next;\n\t buffer.insert('append', item);\n\t });\n\t buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\n\t },\n\t prepend: function prepend(items) {\n\t items.reverse().forEach(function (item) {\n\t --buffer.first;\n\t buffer.insert('prepend', item);\n\t });\n\t buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\n\t },\n\t\n\t\n\t /**\r\n\t * inserts wrapped element in the buffer\r\n\t * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n\t * for insert the number is the index for the buffer element the new one have to be inserted after\r\n\t * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n\t */\n\t insert: function insert(operation, item) {\n\t var wrapper = {\n\t item: item\n\t };\n\t\n\t if (operation % 1 === 0) {\n\t // it is an insert\n\t wrapper.op = 'insert';\n\t buffer.splice(operation, 0, wrapper);\n\t } else {\n\t wrapper.op = operation;\n\t switch (operation) {\n\t case 'append':\n\t buffer.push(wrapper);\n\t break;\n\t case 'prepend':\n\t buffer.unshift(wrapper);\n\t break;\n\t }\n\t }\n\t },\n\t\n\t\n\t // removes elements from buffer\n\t remove: function remove(arg1, arg2) {\n\t if (angular.isNumber(arg1)) {\n\t // removes items from arg1 (including) through arg2 (excluding)\n\t for (var i = arg1; i < arg2; i++) {\n\t elementRoutines.removeElement(buffer[i]);\n\t }\n\t\n\t return buffer.splice(arg1, arg2 - arg1);\n\t }\n\t // removes single item(wrapper) from the buffer\n\t buffer.splice(buffer.indexOf(arg1), 1);\n\t\n\t return elementRoutines.removeElementAnimated(arg1);\n\t },\n\t effectiveHeight: function effectiveHeight(elements) {\n\t if (!elements.length) {\n\t return 0;\n\t }\n\t var top = Number.MAX_VALUE;\n\t var bottom = Number.MIN_VALUE;\n\t elements.forEach(function (wrapper) {\n\t if (wrapper.element[0].offsetParent) {\n\t // element style is not display:none\n\t top = Math.min(top, wrapper.element.offset().top);\n\t bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\n\t }\n\t });\n\t return Math.max(0, bottom - top);\n\t }\n\t });\n\t\n\t return buffer;\n\t}\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Viewport;\n\t\n\tvar _padding = __webpack_require__(5);\n\t\n\tvar _padding2 = _interopRequireDefault(_padding);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\n\t var topPadding = null;\n\t var bottomPadding = null;\n\t var viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\n\t var container = viewportController && viewportController.container ? viewportController.container : undefined;\n\t var scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\n\t\n\t viewport.css({\n\t 'overflow-anchor': 'none',\n\t 'overflow-y': 'auto',\n\t 'display': 'block'\n\t });\n\t\n\t function bufferPadding() {\n\t return viewport.outerHeight() * padding; // some extra space to initiate preload\n\t }\n\t\n\t angular.extend(viewport, {\n\t getScope: function getScope() {\n\t return scope;\n\t },\n\t createPaddingElements: function createPaddingElements(template) {\n\t topPadding = new _padding2.default(template);\n\t bottomPadding = new _padding2.default(template);\n\t element.before(topPadding);\n\t element.after(bottomPadding);\n\t },\n\t applyContainerStyle: function applyContainerStyle() {\n\t if (container && container !== viewport) {\n\t viewport.css('height', window.getComputedStyle(container[0]).height);\n\t }\n\t },\n\t bottomDataPos: function bottomDataPos() {\n\t var scrollHeight = viewport[0].scrollHeight;\n\t scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\n\t return scrollHeight - bottomPadding.height();\n\t },\n\t topDataPos: function topDataPos() {\n\t return topPadding.height();\n\t },\n\t bottomVisiblePos: function bottomVisiblePos() {\n\t return viewport.scrollTop() + viewport.outerHeight();\n\t },\n\t topVisiblePos: function topVisiblePos() {\n\t return viewport.scrollTop();\n\t },\n\t insertElement: function insertElement(e, sibling) {\n\t return elementRoutines.insertElement(e, sibling || topPadding);\n\t },\n\t insertElementAnimated: function insertElementAnimated(e, sibling) {\n\t return elementRoutines.insertElementAnimated(e, sibling || topPadding);\n\t },\n\t shouldLoadBottom: function shouldLoadBottom() {\n\t return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\n\t },\n\t clipBottom: function clipBottom() {\n\t // clip the invisible items off the bottom\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\n\t\n\t for (var i = buffer.length - 1; i >= 0; i--) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t bottomPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t buffer.eof = false;\n\t buffer.remove(buffer.length - overage, buffer.length);\n\t buffer.next -= overage;\n\t viewport.adjustPadding();\n\t }\n\t },\n\t shouldLoadTop: function shouldLoadTop() {\n\t return !buffer.bof && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding();\n\t },\n\t clipTop: function clipTop() {\n\t // clip the invisible items off the top\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\n\t\n\t for (var i = 0; i < buffer.length; i++) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t topPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t // we need to adjust top padding element before items are removed from top\n\t // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\n\t topPadding.height(topPadding.height() + overageHeight);\n\t buffer.bof = false;\n\t buffer.remove(0, overage);\n\t buffer.first += overage;\n\t }\n\t },\n\t adjustPadding: function adjustPadding() {\n\t if (!buffer.length) {\n\t return;\n\t }\n\t\n\t // precise heights calculation, items that were in buffer once\n\t var topPaddingHeight = topPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index < buffer.first ? item.height : 0);\n\t }, 0);\n\t var bottomPaddingHeight = bottomPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index >= buffer.next ? item.height : 0);\n\t }, 0);\n\t\n\t // average item height based on buffer data\n\t var visibleItemsHeight = buffer.reduce(function (summ, item) {\n\t return summ + item.element.outerHeight(true);\n\t }, 0);\n\t var averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\n\t\n\t // average heights calculation, items that have never been reached\n\t var adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\n\t var adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\n\t var topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\n\t var bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\n\t\n\t // paddings combine adjustment\n\t topPadding.height(topPaddingHeight + topPaddingHeightAdd);\n\t bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\n\t },\n\t adjustScrollTopAfterMinIndexSet: function adjustScrollTopAfterMinIndexSet(topPaddingHeightOld) {\n\t // additional scrollTop adjustment in case of datasource.minIndex external set\n\t if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\n\t var diff = topPadding.height() - topPaddingHeightOld;\n\t viewport.scrollTop(viewport.scrollTop() + diff);\n\t }\n\t },\n\t adjustScrollTopAfterPrepend: function adjustScrollTopAfterPrepend(updates) {\n\t if (!updates.prepended.length) return;\n\t var height = buffer.effectiveHeight(updates.prepended);\n\t var paddingHeight = topPadding.height() - height;\n\t if (paddingHeight >= 0) {\n\t topPadding.height(paddingHeight);\n\t } else {\n\t topPadding.height(0);\n\t viewport.scrollTop(viewport.scrollTop() - paddingHeight);\n\t }\n\t },\n\t resetTopPadding: function resetTopPadding() {\n\t topPadding.height(0);\n\t topPadding.cache.clear();\n\t },\n\t resetBottomPadding: function resetBottomPadding() {\n\t bottomPadding.height(0);\n\t bottomPadding.cache.clear();\n\t }\n\t });\n\t\n\t return viewport;\n\t}\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Padding;\n\tfunction Cache() {\n\t var cache = Object.create(Array.prototype);\n\t\n\t angular.extend(cache, {\n\t add: function add(item) {\n\t for (var i = cache.length - 1; i >= 0; i--) {\n\t if (cache[i].index === item.scope.$index) {\n\t cache[i].height = item.element.outerHeight();\n\t return;\n\t }\n\t }\n\t cache.push({\n\t index: item.scope.$index,\n\t height: item.element.outerHeight()\n\t });\n\t },\n\t clear: function clear() {\n\t cache.length = 0;\n\t }\n\t });\n\t\n\t return cache;\n\t}\n\t\n\tfunction Padding(template) {\n\t var result = void 0;\n\t\n\t switch (template.tagName) {\n\t case 'dl':\n\t throw new Error('ui-scroll directive does not support <' + template.tagName + '> as a repeating tag: ' + template.outerHTML);\n\t case 'tr':\n\t var table = angular.element('
    ');\n\t result = table.find('tr');\n\t break;\n\t case 'li':\n\t result = angular.element('
  • ');\n\t break;\n\t default:\n\t result = angular.element('
    ');\n\t }\n\t\n\t result.cache = new Cache();\n\t\n\t return result;\n\t}\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction getCtrlOnData(attr, element) {\n\t var onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\n\t if (onSyntax && onSyntax.length === 4) {\n\t window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\n\t var ctrl = onSyntax[3];\n\t var tail = onSyntax[1];\n\t var candidate = element;\n\t while (candidate.length) {\n\t var candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\n\t var candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\n\t if (candidateName && candidateName[1] === ctrl) {\n\t return {\n\t target: candidateScope,\n\t source: tail\n\t };\n\t }\n\t candidate = candidate.parent();\n\t }\n\t throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\n\t }\n\t}\n\t\n\tvar Adapter = function () {\n\t function Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope) {\n\t _classCallCheck(this, Adapter);\n\t\n\t this.viewport = viewport;\n\t this.buffer = buffer;\n\t this.adjustBuffer = adjustBuffer;\n\t this.reload = reload;\n\t\n\t this.isLoading = false;\n\t this.disabled = false;\n\t\n\t var viewportScope = viewport.getScope();\n\t this.startScope = viewportScope.$parent ? viewportScope : $scope;\n\t\n\t this.publicContext = {};\n\t this.assignAdapter($attr.adapter, $parse, element);\n\t this.generatePublicContext($attr, $parse);\n\t }\n\t\n\t _createClass(Adapter, [{\n\t key: 'assignAdapter',\n\t value: function assignAdapter(adapterAttr, $parse, element) {\n\t if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\n\t return;\n\t }\n\t var ctrlOnData = getCtrlOnData(adapterAttr, element);\n\t var adapterOnScope = void 0;\n\t\n\t try {\n\t if (ctrlOnData) {\n\t // \"Controller On\", deprecated since v1.6.1\n\t $parse(ctrlOnData.source).assign(ctrlOnData.target, {});\n\t adapterOnScope = $parse(ctrlOnData.source)(ctrlOnData.target);\n\t } else {\n\t $parse(adapterAttr).assign(this.startScope, {});\n\t adapterOnScope = $parse(adapterAttr)(this.startScope);\n\t }\n\t } catch (error) {\n\t error.message = 'Angular ui-scroll Adapter assignment exception.\\n' + ('Can\\'t parse \"' + adapterAttr + '\" expression.\\n') + error.message;\n\t throw error;\n\t }\n\t\n\t angular.extend(adapterOnScope, this.publicContext);\n\t this.publicContext = adapterOnScope;\n\t }\n\t }, {\n\t key: 'generatePublicContext',\n\t value: function generatePublicContext($attr, $parse) {\n\t var _this = this;\n\t\n\t // these methods will be accessible out of ui-scroll via user defined adapter\n\t var publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\n\t for (var i = publicMethods.length - 1; i >= 0; i--) {\n\t this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\n\t }\n\t\n\t // these read-only props will be accessible out of ui-scroll via user defined adapter\n\t var publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope'];\n\t\n\t var _loop = function _loop(_i) {\n\t var property = void 0,\n\t attr = $attr[publicProps[_i]];\n\t Object.defineProperty(_this, publicProps[_i], {\n\t get: function get() {\n\t return property;\n\t },\n\t set: function set(value) {\n\t property = value;\n\t _this.publicContext[publicProps[_i]] = value;\n\t if (attr) {\n\t $parse(attr).assign(_this.startScope, value);\n\t }\n\t }\n\t });\n\t };\n\t\n\t for (var _i = publicProps.length - 1; _i >= 0; _i--) {\n\t _loop(_i);\n\t }\n\t\n\t // non-read-only public property\n\t Object.defineProperty(this.publicContext, 'disabled', {\n\t get: function get() {\n\t return _this.disabled;\n\t },\n\t set: function set(value) {\n\t return !(_this.disabled = value) ? _this.adjustBuffer() : null;\n\t }\n\t });\n\t }\n\t }, {\n\t key: 'loading',\n\t value: function loading(value) {\n\t this['isLoading'] = value;\n\t }\n\t }, {\n\t key: 'isBOF',\n\t value: function isBOF() {\n\t return this.buffer.bof;\n\t }\n\t }, {\n\t key: 'isEOF',\n\t value: function isEOF() {\n\t return this.buffer.eof;\n\t }\n\t }, {\n\t key: 'isEmpty',\n\t value: function isEmpty() {\n\t return !this.buffer.length;\n\t }\n\t }, {\n\t key: 'applyUpdates',\n\t value: function applyUpdates(arg1, arg2) {\n\t var _this2 = this;\n\t\n\t if (angular.isFunction(arg1)) {\n\t // arg1 is the updater function, arg2 is ignored\n\t this.buffer.slice(0).forEach(function (wrapper) {\n\t // we need to do it on the buffer clone, because buffer content\n\t // may change as we iterate through\n\t _this2.applyUpdate(wrapper, arg1(wrapper.item, wrapper.scope, wrapper.element));\n\t });\n\t } else {\n\t // arg1 is item index, arg2 is the newItems array\n\t if (arg1 % 1 !== 0) {\n\t // checking if it is an integer\n\t throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\n\t }\n\t\n\t var index = arg1 - this.buffer.first;\n\t if (index >= 0 && index < this.buffer.length) {\n\t this.applyUpdate(this.buffer[index], arg2);\n\t }\n\t }\n\t\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'append',\n\t value: function append(newItems) {\n\t this.buffer.append(newItems);\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'prepend',\n\t value: function prepend(newItems) {\n\t this.buffer.prepend(newItems);\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'calculateProperties',\n\t value: function calculateProperties() {\n\t var item = void 0,\n\t itemHeight = void 0,\n\t itemTop = void 0,\n\t isNewRow = void 0,\n\t rowTop = null;\n\t var topHeight = 0;\n\t for (var i = 0; i < this.buffer.length; i++) {\n\t item = this.buffer[i];\n\t itemTop = item.element.offset().top;\n\t isNewRow = rowTop !== itemTop;\n\t rowTop = itemTop;\n\t if (isNewRow) {\n\t itemHeight = item.element.outerHeight(true);\n\t }\n\t if (isNewRow && this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos()) {\n\t topHeight += itemHeight;\n\t } else {\n\t if (isNewRow) {\n\t this['topVisible'] = item.item;\n\t this['topVisibleElement'] = item.element;\n\t this['topVisibleScope'] = item.scope;\n\t }\n\t break;\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'applyUpdate',\n\t value: function applyUpdate(wrapper, newItems) {\n\t var _this3 = this;\n\t\n\t if (!angular.isArray(newItems)) {\n\t return;\n\t }\n\t\n\t var keepIt = void 0;\n\t var pos = this.buffer.indexOf(wrapper) + 1;\n\t\n\t newItems.reverse().forEach(function (newItem) {\n\t if (newItem === wrapper.item) {\n\t keepIt = true;\n\t pos--;\n\t } else {\n\t _this3.buffer.insert(pos, newItem);\n\t }\n\t });\n\t\n\t if (!keepIt) {\n\t wrapper.op = 'remove';\n\t }\n\t }\n\t }]);\n\t\n\t return Adapter;\n\t}();\n\t\n\texports.default = Adapter;\n\n/***/ }\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// ui-scroll.min.js"," \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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 171ff513de35bc561c8f","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 /**\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","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);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","function getCtrlOnData(attr, element) {\r\n let onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\r\n if (onSyntax && onSyntax.length === 4) {\r\n window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\r\n let ctrl = onSyntax[3];\r\n let tail = onSyntax[1];\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[1] === ctrl) {\r\n return {\r\n target: candidateScope,\r\n source: tail\r\n };\r\n }\r\n candidate = candidate.parent();\r\n }\r\n throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\r\n }\r\n}\r\n\r\nclass Adapter {\r\n\r\n constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope) {\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n this.adjustBuffer = adjustBuffer;\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, $parse, element);\r\n this.generatePublicContext($attr, $parse);\r\n }\r\n\r\n assignAdapter(adapterAttr, $parse, element) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let ctrlOnData = getCtrlOnData(adapterAttr, element);\r\n let adapterOnScope;\r\n\r\n try {\r\n if (ctrlOnData) { // \"Controller On\", deprecated since v1.6.1\r\n $parse(ctrlOnData.source).assign(ctrlOnData.target, {});\r\n adapterOnScope = $parse(ctrlOnData.source)(ctrlOnData.target);\r\n }\r\n else {\r\n $parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = $parse(adapterAttr)(this.startScope);\r\n }\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($attr, $parse) {\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'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = $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 $parse(attr).assign(this.startScope, value);\r\n }\r\n }\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.adjustBuffer() : 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 applyUpdates(arg1, arg2) {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\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, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - this.buffer.first;\r\n if ((index >= 0 && index < this.buffer.length)) {\r\n this.applyUpdate(this.buffer[index], arg2);\r\n }\r\n }\r\n\r\n this.adjustBuffer();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n calculateProperties() {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n item = this.buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n break;\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\r\n let keepIt;\r\n let pos = (this.buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n this.buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file diff --git a/src/modules/adapter.js b/src/modules/adapter.js index b6dddfd6..3dfb6003 100644 --- a/src/modules/adapter.js +++ b/src/modules/adapter.js @@ -1,22 +1,6 @@ -function findCtrl(scope, ctrl) { - if (!scope) { - return; - } - if (scope.hasOwnProperty(ctrl) && Object.getPrototypeOf(scope[ctrl]).constructor.hasOwnProperty('$inject')) { - return scope[ctrl]; - } - return findCtrl(scope.$parent, ctrl); -} - -function assignAttr(attr, scope, element) { - if (!attr || !(attr = attr.replace(/^\s+|\s+$/gm, ''))) { - return; - } - +function getCtrlOnData(attr, element) { let onSyntax = attr.match(/^(.+)(\s+on\s+)(.+)?/); - let asSyntax = attr.match(/^([^.]+)\.(.+)?/); - - if (onSyntax && onSyntax.length === 4) { // controller on (backward compatibility), deprecated since v1.6.1 + if (onSyntax && onSyntax.length === 4) { window.console.warn('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.'); let ctrl = onSyntax[3]; let tail = onSyntax[1]; @@ -34,61 +18,56 @@ function assignAttr(attr, scope, element) { } throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller "' + ctrl + '" to inject "' + tail + '"'); } - else if (asSyntax && asSyntax.length === 3) { // controller as - let ctrl = asSyntax[1]; - let tail = asSyntax[2]; - let foundCtrl = findCtrl(scope, ctrl); - if (foundCtrl) { - return { - target: foundCtrl, - source: tail - }; - } - } - - return { - target: scope, - source: attr - }; } class Adapter { - constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element) { + constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope) { this.viewport = viewport; this.buffer = buffer; this.adjustBuffer = adjustBuffer; this.reload = reload; - this.publicContext = {}; - this.assignAdapter($attr, $parse, element); - this.generatePublicContext($attr, $parse, element); - this.isLoading = false; this.disabled = false; - } - assignAdapter($attr, $parse, element) { - let data = assignAttr($attr.adapter, this.viewport.getScope(), element); + const viewportScope = viewport.getScope(); + this.startScope = viewportScope.$parent ? viewportScope : $scope; + + this.publicContext = {}; + this.assignAdapter($attr.adapter, $parse, element); + this.generatePublicContext($attr, $parse); + } - if (data) { - try { - $parse(data.source).assign(data.target, {}); - let adapterOnScope = $parse(data.source)(data.target); + assignAdapter(adapterAttr, $parse, element) { + if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\s+|\s+$/gm, ''))) { + return; + } + let ctrlOnData = getCtrlOnData(adapterAttr, element); + let adapterOnScope; - angular.extend(adapterOnScope, this.publicContext); - this.publicContext = adapterOnScope; + try { + if (ctrlOnData) { // "Controller On", deprecated since v1.6.1 + $parse(ctrlOnData.source).assign(ctrlOnData.target, {}); + adapterOnScope = $parse(ctrlOnData.source)(ctrlOnData.target); } - catch (error) { - error.message = `Angular ui-scroll Adapter assignment exception.\n` + - `Can't parse "${$attr.adapter}" expression.\n` + - error.message; - throw error; + else { + $parse(adapterAttr).assign(this.startScope, {}); + adapterOnScope = $parse(adapterAttr)(this.startScope); } } + catch (error) { + error.message = `Angular ui-scroll Adapter assignment exception.\n` + + `Can't parse "${adapterAttr}" expression.\n` + + error.message; + throw error; + } + + angular.extend(adapterOnScope, this.publicContext); + this.publicContext = adapterOnScope; } - generatePublicContext($attr, $parse, element) { + generatePublicContext($attr, $parse) { // these methods will be accessible out of ui-scroll via user defined adapter const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty']; for (let i = publicMethods.length - 1; i >= 0; i--) { @@ -98,19 +77,15 @@ class Adapter { // these read-only props will be accessible out of ui-scroll via user defined adapter const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope']; for (let i = publicProps.length - 1; i >= 0; i--) { - let property, assignProp; - let data = assignAttr($attr[publicProps[i]], this.viewport.getScope(), element); - if (data) { - assignProp = $parse(data.source).assign; - } + let property, attr = $attr[publicProps[i]]; Object.defineProperty(this, publicProps[i], { get: () => property, set: (value) => { property = value; - if (assignProp) { - assignProp(data.target, value); - } this.publicContext[publicProps[i]] = value; + if (attr) { + $parse(attr).assign(this.startScope, value); + } } }); } diff --git a/src/ui-scroll.js b/src/ui-scroll.js index 3f510ae1..23541bee 100644 --- a/src/ui-scroll.js +++ b/src/ui-scroll.js @@ -81,7 +81,7 @@ angular.module('ui.scroll', []) let elementRoutines = new ElementRoutines($injector, $q); let buffer = new ScrollBuffer(elementRoutines, bufferSize); let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding); - let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element); + let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope); if (viewportController) { viewportController.adapter = adapter; diff --git a/test/AssigningSpec.js b/test/AssigningSpec.js index e756b8ab..72058439 100644 --- a/test/AssigningSpec.js +++ b/test/AssigningSpec.js @@ -11,6 +11,7 @@ describe('uiScroll', function () { }); myApp.controller('MyInnerController', function($scope) { $scope.name = 'MyInnerController'; + $scope.container = {}; }); myApp.controller('MyBottomController', function($scope) { $scope.name = 'MyBottomController'; @@ -105,7 +106,7 @@ describe('uiScroll', function () { '
    ' + '
    ' + '
    '; - executeTest(template); + executeTest(template, 'MyBottomController'); }); it('should work with additional container (viewport)', function () { @@ -135,7 +136,7 @@ describe('uiScroll', function () { '
    ' + '' + ''; - executeTest(template, null, 'ctrl'); + executeTest(template, 'MyBottomController', 'ctrl'); }); it('should work for "on" syntax (viewport)', function () { @@ -195,7 +196,7 @@ describe('uiScroll', function () { '' + '' + ''; - executeTest(template, null, 'ctrl'); + executeTest(template, 'MyInnerController as ctrl', 'ctrl'); }); it('should work for custom directive with "Controller As" syntax (viewport)', function () { @@ -237,7 +238,7 @@ describe('uiScroll', function () { '' + '' + ''; - executeTest(template, null, 'ctrl'); + executeTest(template, 2, 'ctrl'); }); it('should work for custom directive with the adapter defined on some external controller', function () { @@ -260,27 +261,6 @@ describe('uiScroll', function () { ''; executeTest(template, 'MyInnerController as ctrl', 'ctrl'); }); - - it('should work with "Controller As" and ingnore intermediate containers which are not controllers', function () { - myApp.directive('myDir4', setDirective({ - ctrlAs: 'ctrl2', - template: -'
    ' + - '
    ' + - '{{$index}}: {{item}}' + - '
    ' + -'
    ' - })); - var template = -'
    ' + - '
    ' + - '
    ' + - '' + - '
    ' + - '
    ' + -'
    '; // here Directive and MyBottomController have a container object - executeTest(template, 'MyInnerController as container', 'container'); - }); }); }); From 632629f6bdd3c62b50d68adae1696e343a0e2f91 Mon Sep 17 00:00:00 2001 From: dhilt Date: Mon, 6 Mar 2017 11:30:38 +0300 Subject: [PATCH 6/7] v1.6.1 cleanup --- README.md | 12 ++++++------ dist/ui-scroll.js | 4 ++-- dist/ui-scroll.js.map | 2 +- dist/ui-scroll.min.js | 4 ++-- dist/ui-scroll.min.js.map | 2 +- src/modules/adapter.js | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 95f5ddd7..62d433d2 100644 --- a/README.md +++ b/README.md @@ -169,7 +169,7 @@ The `assignable expressions` will be used by scroller to inject the requested va The target scope is being defined in accordance with standard Angular rules (nested scopes and controller As syntax should be taken into account): the scroller will traverse its parents (from the ui-scroll element's scope up to the $rootScope) to locate the target scope. If the viewport is presented (the element marked with the [uiScrollViewport](#uiscrollviewport-directive) directive), -then the scope associated with the viewport will be a start point in target scope detecting. +then the scope associated with the viewport will be a start point in the target scope locating. Angular $parse service is being used in `assignable expressions` implementation. _Deprecated!_ The format `expression on controller` introduced in v1.5.0 (and deprecated in v1.6.1) can be used to explicitly target the scope associated with the specified controller as the target scope for the injection. In this format `expression` is any angular assignable expression, and `controller` is the name of controller constructor function as specified in the `ng-controller` directive. @@ -423,8 +423,8 @@ npm test ``` This runs karma testing against temporary distributive files (./temp). We created a number of specifications which consist of more - than 160 tests. They are living at [./test](https://github.com/angular-ui/ui-scroll/tree/master/test) folder. Karma watches for temp - and test folders changes and automatically re-run tests. + than 160 tests. They are living at the [./test](https://github.com/angular-ui/ui-scroll/tree/master/test) folder. Karma watches for temp + and test folders changes and automatically re-runs tests. __3__. To run full build use @@ -432,13 +432,13 @@ npm test npm run build ``` - After developing and testing complete the build process should be run to + After developing and testing complete, the build process should be run to a) pass through jshint, b) generate minified versions of distributive, c) run tests with minified distributive files, - d) obtain all necessary files in [./dist](https://github.com/angular-ui/ui-scroll/tree/master/dist) folder. + d) obtain all necessary files in the [./dist](https://github.com/angular-ui/ui-scroll/tree/master/dist) folder. -PR should include source code (./scr) and tests (./test) changes and may not include public distributive (./dist) changes. +PR should include source code (./scr) changes, may include tests (./test) changes and may not include public distributive (./dist) changes. ------------------- diff --git a/dist/ui-scroll.js b/dist/ui-scroll.js index 6b8a7259..b786b279 100644 --- a/dist/ui-scroll.js +++ b/dist/ui-scroll.js @@ -1,7 +1,7 @@ /*! * angular-ui-scroll (uncompressed) * https://github.com/angular-ui/ui-scroll - * Version: 1.6.1 -- 2017-03-04T06:00:38.359Z + * Version: 1.6.1 -- 2017-03-06T07:25:29.944Z * License: MIT */ /******/ (function(modules) { // webpackBootstrap @@ -1303,7 +1303,7 @@ function getCtrlOnData(attr, element) { var onSyntax = attr.match(/^(.+)(\s+on\s+)(.+)?/); if (onSyntax && onSyntax.length === 4) { - window.console.warn('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.'); + window.console.log('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.'); var ctrl = onSyntax[3]; var tail = onSyntax[1]; var candidate = element; diff --git a/dist/ui-scroll.js.map b/dist/ui-scroll.js.map index 0fdd86cd..c41a09cc 100644 --- a/dist/ui-scroll.js.map +++ b/dist/ui-scroll.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 515fec14d305cb249fba","webpack:///./src/ui-scroll.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/adapter.js"],"names":["angular","module","service","run","jqLiteExtras","window","jQuery","registerFor","element","directive","restrict","controller","scope","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$q","$parse","require","transclude","priority","terminal","link","$scope","$attr","controllers","linker","match","uiScroll","Error","parseNumericAttr","value","defaultValue","result","isNaN","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","datasource","itemName","datasourceName","viewportController","bufferSize","Math","max","padding","startIndex","ridActual","pending","elementRoutines","buffer","adapter","adjustBuffer","reload","isDatasourceValid","isObject","isFunction","get","indexStore","defineProperty","propName","propUserName","descriptor","Object","getOwnPropertyDescriptor","set","length","topPaddingHeightOld","topDataPos","adjustPadding","adjustScrollTopAfterMinIndexSet","fetchNext","success","next","index","append","item","count","fetchPrevious","first","prepend","clone","createPaddingElements","$destroy","remove","$on","unbindEvents","unbind","wheelHandler","bind","applyContainerStyle","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","resetTopPadding","resetBottomPadding","arguments","reset","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","addClass","promises","sibling","undefined","transform","updateDOM","toBePrepended","toBeRemoved","inserted","i","op","unshift","push","concat","insertElementAnimated","$index","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","fetch","loading","shouldLoadTop","w","removeClass","calculateProperties","adjustBufferAfterFetch","adjustScrollTopAfterPrepend","shift","eof","clipTop","bof","clipBottom","$$phase","isLoading","disabled","$apply","event","scrollTop","yMax","scrollHeight","clientHeight","preventDefault","JQLiteExtras","convertToPx","css","getStyle","isWindow","prototype","name","self","elem","nodeType","style","call","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isDefined","documentElement","getComputedStyle","parseFloat","currentStyle","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","width","border","margin","offsetWidth","offsetHeight","getWidthHeight","measurements","outer","outerfull","before","newElem","j","parent","ref","contents","after","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","key","ElementRoutines","$animate","has","isAngularVersionLessThen1_3","version","major","minor","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","ScrollBuffer","create","Array","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","splice","arg1","arg2","indexOf","removeElementAnimated","elements","Number","MAX_VALUE","bottom","MIN_VALUE","Viewport","topPadding","bottomPadding","bufferPadding","getScope","template","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","topPaddingHeight","reduce","summ","bottomPaddingHeight","visibleItemsHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","Padding","Cache","table","find","getCtrlOnData","attr","onSyntax","warn","ctrl","tail","candidate","candidateScope","candidateName","target","Adapter","viewportScope","startScope","$parent","publicContext","assignAdapter","generatePublicContext","adapterAttr","replace","ctrlOnData","adapterOnScope","assign","error","message","publicMethods","publicProps","property","slice","applyUpdate","newItems","itemTop","isNewRow","rowTop","topHeight","isArray","keepIt","pos","newItem"],"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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 515fec14d305cb249fba","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 /**\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","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);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","function getCtrlOnData(attr, element) {\r\n let onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\r\n if (onSyntax && onSyntax.length === 4) {\r\n window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\r\n let ctrl = onSyntax[3];\r\n let tail = onSyntax[1];\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[1] === ctrl) {\r\n return {\r\n target: candidateScope,\r\n source: tail\r\n };\r\n }\r\n candidate = candidate.parent();\r\n }\r\n throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\r\n }\r\n}\r\n\r\nclass Adapter {\r\n\r\n constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope) {\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n this.adjustBuffer = adjustBuffer;\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, $parse, element);\r\n this.generatePublicContext($attr, $parse);\r\n }\r\n\r\n assignAdapter(adapterAttr, $parse, element) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let ctrlOnData = getCtrlOnData(adapterAttr, element);\r\n let adapterOnScope;\r\n\r\n try {\r\n if (ctrlOnData) { // \"Controller On\", deprecated since v1.6.1\r\n $parse(ctrlOnData.source).assign(ctrlOnData.target, {});\r\n adapterOnScope = $parse(ctrlOnData.source)(ctrlOnData.target);\r\n }\r\n else {\r\n $parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = $parse(adapterAttr)(this.startScope);\r\n }\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($attr, $parse) {\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'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = $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 $parse(attr).assign(this.startScope, value);\r\n }\r\n }\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.adjustBuffer() : 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 applyUpdates(arg1, arg2) {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\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, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - this.buffer.first;\r\n if ((index >= 0 && index < this.buffer.length)) {\r\n this.applyUpdate(this.buffer[index], arg2);\r\n }\r\n }\r\n\r\n this.adjustBuffer();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n calculateProperties() {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n item = this.buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n break;\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\r\n let keepIt;\r\n let pos = (this.buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n this.buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 0370a9e7dd5709818ee5","webpack:///./src/ui-scroll.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/adapter.js"],"names":["angular","module","service","run","jqLiteExtras","window","jQuery","registerFor","element","directive","restrict","controller","scope","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$q","$parse","require","transclude","priority","terminal","link","$scope","$attr","controllers","linker","match","uiScroll","Error","parseNumericAttr","value","defaultValue","result","isNaN","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","datasource","itemName","datasourceName","viewportController","bufferSize","Math","max","padding","startIndex","ridActual","pending","elementRoutines","buffer","adapter","adjustBuffer","reload","isDatasourceValid","isObject","isFunction","get","indexStore","defineProperty","propName","propUserName","descriptor","Object","getOwnPropertyDescriptor","set","length","topPaddingHeightOld","topDataPos","adjustPadding","adjustScrollTopAfterMinIndexSet","fetchNext","success","next","index","append","item","count","fetchPrevious","first","prepend","clone","createPaddingElements","$destroy","remove","$on","unbindEvents","unbind","wheelHandler","bind","applyContainerStyle","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","resetTopPadding","resetBottomPadding","arguments","reset","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","addClass","promises","sibling","undefined","transform","updateDOM","toBePrepended","toBeRemoved","inserted","i","op","unshift","push","concat","insertElementAnimated","$index","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","fetch","loading","shouldLoadTop","w","removeClass","calculateProperties","adjustBufferAfterFetch","adjustScrollTopAfterPrepend","shift","eof","clipTop","bof","clipBottom","$$phase","isLoading","disabled","$apply","event","scrollTop","yMax","scrollHeight","clientHeight","preventDefault","JQLiteExtras","convertToPx","css","getStyle","isWindow","prototype","name","self","elem","nodeType","style","call","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isDefined","documentElement","getComputedStyle","parseFloat","currentStyle","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","width","border","margin","offsetWidth","offsetHeight","getWidthHeight","measurements","outer","outerfull","before","newElem","j","parent","ref","contents","after","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","key","ElementRoutines","$animate","has","isAngularVersionLessThen1_3","version","major","minor","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","ScrollBuffer","create","Array","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","splice","arg1","arg2","indexOf","removeElementAnimated","elements","Number","MAX_VALUE","bottom","MIN_VALUE","Viewport","topPadding","bottomPadding","bufferPadding","getScope","template","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","topPaddingHeight","reduce","summ","bottomPaddingHeight","visibleItemsHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","Padding","Cache","table","find","getCtrlOnData","attr","onSyntax","log","ctrl","tail","candidate","candidateScope","candidateName","target","Adapter","viewportScope","startScope","$parent","publicContext","assignAdapter","generatePublicContext","adapterAttr","replace","ctrlOnData","adapterOnScope","assign","error","message","publicMethods","publicProps","property","slice","applyUpdate","newItems","itemTop","isNewRow","rowTop","topHeight","isArray","keepIt","pos","newItem"],"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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0370a9e7dd5709818ee5","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 /**\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","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);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","function getCtrlOnData(attr, element) {\r\n let onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\r\n if (onSyntax && onSyntax.length === 4) {\r\n window.console.log('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\r\n let ctrl = onSyntax[3];\r\n let tail = onSyntax[1];\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[1] === ctrl) {\r\n return {\r\n target: candidateScope,\r\n source: tail\r\n };\r\n }\r\n candidate = candidate.parent();\r\n }\r\n throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\r\n }\r\n}\r\n\r\nclass Adapter {\r\n\r\n constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope) {\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n this.adjustBuffer = adjustBuffer;\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, $parse, element);\r\n this.generatePublicContext($attr, $parse);\r\n }\r\n\r\n assignAdapter(adapterAttr, $parse, element) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let ctrlOnData = getCtrlOnData(adapterAttr, element);\r\n let adapterOnScope;\r\n\r\n try {\r\n if (ctrlOnData) { // \"Controller On\", deprecated since v1.6.1\r\n $parse(ctrlOnData.source).assign(ctrlOnData.target, {});\r\n adapterOnScope = $parse(ctrlOnData.source)(ctrlOnData.target);\r\n }\r\n else {\r\n $parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = $parse(adapterAttr)(this.startScope);\r\n }\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($attr, $parse) {\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'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = $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 $parse(attr).assign(this.startScope, value);\r\n }\r\n }\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.adjustBuffer() : 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 applyUpdates(arg1, arg2) {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\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, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - this.buffer.first;\r\n if ((index >= 0 && index < this.buffer.length)) {\r\n this.applyUpdate(this.buffer[index], arg2);\r\n }\r\n }\r\n\r\n this.adjustBuffer();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n calculateProperties() {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n item = this.buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n break;\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\r\n let keepIt;\r\n let pos = (this.buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n this.buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/ui-scroll.min.js b/dist/ui-scroll.min.js index cf82ea84..3ad87283 100644 --- a/dist/ui-scroll.min.js +++ b/dist/ui-scroll.min.js @@ -1,8 +1,8 @@ /*! * angular-ui-scroll (compressed) * https://github.com/angular-ui/ui-scroll - * Version: 1.6.1 -- 2017-03-04T06:00:38.399Z + * Version: 1.6.1 -- 2017-03-06T07:25:30.385Z * License: MIT */ -!function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}var i=n(1),o=r(i),a=n(2),u=r(a),l=n(3),s=r(l),c=n(4),f=r(c),d=n(6),p=r(d);angular.module("ui.scroll",[]).service("jqLiteExtras",function(){return new o.default}).run(["jqLiteExtras",function(e){return window.jQuery?null:e.registerFor(angular.element)}]).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","$q","$parse",function(e,t,n,r,i,o){function a(e,a,l,c,d){function h(t,n){var r=o(t)(e);return isNaN(r)?n:r}function g(e,t,n){var i=Object.getOwnPropertyDescriptor(e,t);i&&(i.set||i.get)||Object.defineProperty(e,t,{set:function(e){J[t]=e,r(function(){if(X[n]=e,!z.length){var r=Y.topDataPos();Y.adjustPadding(),"minIndex"===t&&Y.adjustScrollTopAfterMinIndexSet(r)}})},get:function(){return J[t]}})}function m(t){return t&&t!==q||e.$$destroyed}function v(){Y.bind("resize",A),Y.bind("scroll",A)}function b(){Y.unbind("resize",A),Y.unbind("scroll",A)}function y(){Y.resetTopPadding(),Y.resetBottomPadding(),arguments.length&&(W=arguments[0]),X.reset(W),T()}function x(e){return e.element.height()&&e.element[0].offsetParent}function w(e){x(e)&&(X.forEach(function(e){angular.isFunction(e.unregisterVisibilityWatcher)&&(e.unregisterVisibilityWatcher(),delete e.unregisterVisibilityWatcher)}),z.length||T())}function E(e,t){P(e,t,Y.insertElement),x(e)||(e.unregisterVisibilityWatcher=e.scope.$watch(function(){return w(e)})),e.element.addClass("ng-hide")}function P(e,t,n){var r=null,i=t>0?X[t-1].element:void 0;return d(function(t,o){r=n(t,i),e.element=t,e.scope=o,o[U]=e.item}),Q.transform&&Q.transform(e.scope,e.element),r}function $(){var e=[],t=[],n=[],r=[];return X.forEach(function(i,o){switch(i.op){case"prepend":t.unshift(i);break;case"append":E(i,o),i.op="none",r.push(i);break;case"insert":e=e.concat(P(i,o,Y.insertElementAnimated)),i.op="none",r.push(i);break;case"remove":n.push(i)}}),n.forEach(function(t){return e=e.concat(X.remove(t))}),t.length&&t.forEach(function(e){E(e),e.op="none"}),X.forEach(function(e,t){return e.scope.$index=X.first+t}),{prepended:t,removed:n,inserted:r,animated:e}}function j(e,t){t.animated.length?i.all(t.animated).then(function(){Y.adjustPadding(),T(e)}):Y.adjustPadding()}function S(e,t){Y.shouldLoadBottom()?(!t||X.effectiveHeight(t.inserted)>0)&&1===z.push(!0)&&(O(e),Q.loading(!0)):Y.shouldLoadTop()&&(!t||X.effectiveHeight(t.prepended)>0||z[0])&&1===z.push(!1)&&(O(e),Q.loading(!0))}function T(e){e||(z=[],e=++q);var t=$();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),m(e)||(j(e,t),S(e),z.length||Q.calculateProperties())})}function I(e){var t=$();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),Y.adjustScrollTopAfterPrepend(t),m(e)||(j(e,t),S(e,t),z.shift(),z.length?O(e):(Q.loading(!1),v(),Q.calculateProperties()))})}function O(e){z[0]?X.length&&!Y.shouldLoadBottom()?I(e):K(function(t){m(e)||(t.length0&&(Y.clipTop(),X.append(t)),I(e))}):X.length&&!Y.shouldLoadTop()?I(e):Z(function(t){m(e)||(t.length0&&(X.length&&Y.clipBottom(),X.prepend(t)),I(e))})}function A(){n.$$phase||Q.isLoading||Q.disabled||(S(q),z.length?b():(Q.calculateProperties(),e.$apply()))}function k(e){if(!Q.disabled){var t=Y[0].scrollTop,n=Y[0].scrollHeight-Y[0].clientHeight;(0===t&&!X.bof||t===n&&!X.eof)&&e.preventDefault()}}var L=l.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!L)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+l.uiScroll+"'");var C=3,V=10,_=.3,H=.5,M=null,U=L[1],B=L[2],D=c[0],F=Math.max(C,h(l.bufferSize,V)),N=Math.max(_,h(l.padding,H)),W=h(l.startIndex,1),q=0,z=[],R=new u.default(t,i),X=new s.default(R,F),Y=new f.default(R,X,a,D,n,N),Q=new p.default(Y,X,T,y,l,o,a,e);D&&(D.adapter=Q);var G=function(){return angular.isObject(M)&&angular.isFunction(M.get)};if(M=o(B)(e),!G()&&(M=t.get(B),!G()))throw new Error(B+" is not a valid datasource");var J={};g(M,"minIndex","minIndexUser"),g(M,"maxIndex","maxIndexUser");var K=2!==M.get.length?function(e){return M.get(X.next,F,e)}:function(e){M.get({index:X.next,append:X.length?X[X.length-1].item:void 0,count:F},e)},Z=2!==M.get.length?function(e){return M.get(X.first-F,F,e)}:function(e){M.get({index:X.first-F,prepend:X.length?X[0].item:void 0,count:F},e)};d(function(e,t){Y.createPaddingElements(e[0]),t.$destroy(),e.remove()}),e.$on("$destroy",function(){b(),Y.unbind("mousewheel",k)}),Y.bind("mousewheel",k),r(function(){Y.applyContainerStyle(),y()})}return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:a}}])},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(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&&u.return&&u.return()}finally{if(i)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=function(){function e(e,t){for(var n=0;n0?{base:a.base-a.padding-a.border,outer:a.base,outerfull:a.base+a.margin}[r]:(i=u(e),o=i[t],(o<0||null===o)&&(o=e.style[t]||0),o=parseFloat(o)||0,{base:o-a.padding-a.border,outer:o,outerfull:o+a.padding+a.border+a.margin}[r])}var o=void 0,a=void 0,u=void 0,l=void 0;return a=angular.element.prototype.css,e.prototype.css=function(e,t){var n=this,r=n[0];if(r&&3!==r.nodeType&&8!==r.nodeType&&r.style)return a.call(n,e,t)},l=function(e){return e&&e.document&&e.location&&e.alert&&e.setInterval},window.getComputedStyle?(u=function(e){return window.getComputedStyle(e,null)},o=function(e,t){return parseFloat(t)}):(u=function(e){return e.currentStyle},o=function(e,t){var n=void 0,r=void 0,i=void 0,o=void 0,a=void 0,u=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,l=new RegExp("^("+u+")(?!px)[a-z%]+$","i");return l.test(t)?(a=e.style,n=a.left,i=e.runtimeStyle,o=i&&i.left,i&&(i.left=a.left),a.left=t,r=a.pixelLeft,a.left=n,o&&(i.left=o),r):parseFloat(t)}),angular.forEach({before:function(e){var t,n,r,i,o,a,u;if(u=this,n=u[0],o=u.parent(),t=o.contents(),t[0]===n)return o.prepend(e);for(r=i=1,a=t.length-1;1<=a?i<=a:i>=a;r=1<=a?++i:--i)if(t[r]===n)return void angular.element(t[r-1]).after(e);throw new Error("invalid DOM structure "+n.outerHTML)},height:function(e){var t;return t=this,angular.isDefined(e)?(angular.isNumber(e)&&(e+="px"),a.call(t,"height",e)):i(this[0],"height","base")},outerHeight:function(e){return i(this[0],"height",e?"outerfull":"outer")},outerWidth:function(e){return i(this[0],"width",e?"outerfull":"outer")},offset:function(e){var t=void 0,n=void 0,r=this,i={top:0,left:0},o=r[0],a=o&&o.ownerDocument;if(arguments.length){if(void 0===e)return r;throw new Error("offset setter method is not implemented")}if(a)return t=a.documentElement,null!=o.getBoundingClientRect&&(i=o.getBoundingClientRect()),n=a.defaultView||a.parentWindow,{top:i.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:i.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}},scrollTop:function(e){return t(this,"top",e)},scrollLeft:function(e){return t(this,"left",e)}},function(t,n){if(!e.prototype[n])return e.prototype[n]=t})}}]),e}();t.default=o},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(){function e(e,t){for(var n=0;n=0&&(r=t[o].element.outerHeight(!0),!(n+r>i));o--)s.cache.add(t[o]),n+=r,e++;e>0&&(t.eof=!1,t.remove(t.length-e,t.length),t.next-=e,c.adjustPadding())},shouldLoadTop:function(){return!t.bof&&c.topDataPos()>c.topVisiblePos()-u()},clipTop:function(){for(var e=0,n=0,r=0,i=c.topVisiblePos()-c.topDataPos()-u(),o=0;oi));o++)l.cache.add(t[o]),n+=r,e++;e>0&&(l.height(l.height()+n),t.bof=!1,t.remove(0,e),t.first+=e)},adjustPadding:function(){if(t.length){var e=l.cache.reduce(function(e,n){return e+(n.index=t.next?n.height:0)},0),r=t.reduce(function(e,t){return e+t.element.outerHeight(!0)},0),i=(r+e+n)/(t.maxIndex-t.minIndex+1),o=null!==t.minIndexUser&&t.minIndex>t.minIndexUser,a=null!==t.maxIndexUser&&t.maxIndext.minIndexUser){var n=l.height()-e;c.scrollTop(c.scrollTop()+n)}},adjustScrollTopAfterPrepend:function(e){if(e.prepended.length){var n=t.effectiveHeight(e.prepended),r=l.height()-n;r>=0?l.height(r):(l.height(0),c.scrollTop(c.scrollTop()-r))}},resetTopPadding:function(){l.height(0),l.cache.clear()},resetBottomPadding:function(){s.height(0),s.cache.clear()}}),c}Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var o=n(5),a=r(o)},function(e,t){"use strict";function n(){var e=Object.create(Array.prototype);return angular.extend(e,{add:function(t){for(var n=e.length-1;n>=0;n--)if(e[n].index===t.scope.$index)return void(e[n].height=t.element.outerHeight());e.push({index:t.scope.$index,height:t.element.outerHeight()})},clear:function(){e.length=0}}),e}function r(e){var t=void 0;switch(e.tagName){case"dl":throw new Error("ui-scroll directive does not support <"+e.tagName+"> as a repeating tag: "+e.outerHTML);case"tr":var r=angular.element("
    ");t=r.find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t.cache=new n,t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){var n=e.match(/^(.+)(\s+on\s+)(.+)?/);if(n&&4===n.length){window.console.warn('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.');for(var r=n[3],i=n[1],o=t;o.length;){var a=o.scope(),u=(o.attr("ng-controller")||"").match(/(\w(?:\w|\d)*)(?:\s+as\s+(\w(?:\w|\d)*))?/);if(u&&u[1]===r)return{target:a,source:i};o=o.parent()}throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller "'+r+'" to inject "'+i+'"')}}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n=0;i--)this.publicContext[r[i]]=this[r[i]].bind(this);for(var o=["isLoading","topVisible","topVisibleElement","topVisibleScope"],a=function(r){var i=void 0,a=e[o[r]];Object.defineProperty(n,o[r],{get:function(){return i},set:function(e){i=e,n.publicContext[o[r]]=e,a&&t(a).assign(n.startScope,e)}})},u=o.length-1;u>=0;u--)a(u);Object.defineProperty(this.publicContext,"disabled",{get:function(){return n.disabled},set:function(e){return(n.disabled=e)?null:n.adjustBuffer()}})}},{key:"loading",value:function(e){this.isLoading=e}},{key:"isBOF",value:function(){return this.buffer.bof}},{key:"isEOF",value:function(){return this.buffer.eof}},{key:"isEmpty",value:function(){return!this.buffer.length}},{key:"applyUpdates",value:function(e,t){var n=this;if(angular.isFunction(e))this.buffer.slice(0).forEach(function(t){n.applyUpdate(t,e(t.item,t.scope,t.element))});else{if(e%1!==0)throw new Error("applyUpdates - "+e+" is not a valid index");var r=e-this.buffer.first;r>=0&&r0?X[t-1].element:void 0;return d(function(t,o){r=n(t,i),e.element=t,e.scope=o,o[U]=e.item}),Q.transform&&Q.transform(e.scope,e.element),r}function $(){var e=[],t=[],n=[],r=[];return X.forEach(function(i,o){switch(i.op){case"prepend":t.unshift(i);break;case"append":E(i,o),i.op="none",r.push(i);break;case"insert":e=e.concat(P(i,o,Y.insertElementAnimated)),i.op="none",r.push(i);break;case"remove":n.push(i)}}),n.forEach(function(t){return e=e.concat(X.remove(t))}),t.length&&t.forEach(function(e){E(e),e.op="none"}),X.forEach(function(e,t){return e.scope.$index=X.first+t}),{prepended:t,removed:n,inserted:r,animated:e}}function j(e,t){t.animated.length?i.all(t.animated).then(function(){Y.adjustPadding(),T(e)}):Y.adjustPadding()}function S(e,t){Y.shouldLoadBottom()?(!t||X.effectiveHeight(t.inserted)>0)&&1===z.push(!0)&&(O(e),Q.loading(!0)):Y.shouldLoadTop()&&(!t||X.effectiveHeight(t.prepended)>0||z[0])&&1===z.push(!1)&&(O(e),Q.loading(!0))}function T(e){e||(z=[],e=++q);var t=$();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),m(e)||(j(e,t),S(e),z.length||Q.calculateProperties())})}function I(e){var t=$();r(function(){t.inserted.forEach(function(e){return e.element.removeClass("ng-hide")}),t.prepended.forEach(function(e){return e.element.removeClass("ng-hide")}),Y.adjustScrollTopAfterPrepend(t),m(e)||(j(e,t),S(e,t),z.shift(),z.length?O(e):(Q.loading(!1),v(),Q.calculateProperties()))})}function O(e){z[0]?X.length&&!Y.shouldLoadBottom()?I(e):K(function(t){m(e)||(t.length0&&(Y.clipTop(),X.append(t)),I(e))}):X.length&&!Y.shouldLoadTop()?I(e):Z(function(t){m(e)||(t.length0&&(X.length&&Y.clipBottom(),X.prepend(t)),I(e))})}function A(){n.$$phase||Q.isLoading||Q.disabled||(S(q),z.length?b():(Q.calculateProperties(),e.$apply()))}function k(e){if(!Q.disabled){var t=Y[0].scrollTop,n=Y[0].scrollHeight-Y[0].clientHeight;(0===t&&!X.bof||t===n&&!X.eof)&&e.preventDefault()}}var L=l.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!L)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+l.uiScroll+"'");var C=3,V=10,_=.3,H=.5,M=null,U=L[1],B=L[2],D=c[0],F=Math.max(C,h(l.bufferSize,V)),N=Math.max(_,h(l.padding,H)),W=h(l.startIndex,1),q=0,z=[],R=new u.default(t,i),X=new s.default(R,F),Y=new f.default(R,X,a,D,n,N),Q=new p.default(Y,X,T,y,l,o,a,e);D&&(D.adapter=Q);var G=function(){return angular.isObject(M)&&angular.isFunction(M.get)};if(M=o(B)(e),!G()&&(M=t.get(B),!G()))throw new Error(B+" is not a valid datasource");var J={};g(M,"minIndex","minIndexUser"),g(M,"maxIndex","maxIndexUser");var K=2!==M.get.length?function(e){return M.get(X.next,F,e)}:function(e){M.get({index:X.next,append:X.length?X[X.length-1].item:void 0,count:F},e)},Z=2!==M.get.length?function(e){return M.get(X.first-F,F,e)}:function(e){M.get({index:X.first-F,prepend:X.length?X[0].item:void 0,count:F},e)};d(function(e,t){Y.createPaddingElements(e[0]),t.$destroy(),e.remove()}),e.$on("$destroy",function(){b(),Y.unbind("mousewheel",k)}),Y.bind("mousewheel",k),r(function(){Y.applyContainerStyle(),y()})}return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:a}}])},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(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&&u.return&&u.return()}finally{if(i)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=function(){function e(e,t){for(var n=0;n0?{base:a.base-a.padding-a.border,outer:a.base,outerfull:a.base+a.margin}[r]:(i=u(e),o=i[t],(o<0||null===o)&&(o=e.style[t]||0),o=parseFloat(o)||0,{base:o-a.padding-a.border,outer:o,outerfull:o+a.padding+a.border+a.margin}[r])}var o=void 0,a=void 0,u=void 0,l=void 0;return a=angular.element.prototype.css,e.prototype.css=function(e,t){var n=this,r=n[0];if(r&&3!==r.nodeType&&8!==r.nodeType&&r.style)return a.call(n,e,t)},l=function(e){return e&&e.document&&e.location&&e.alert&&e.setInterval},window.getComputedStyle?(u=function(e){return window.getComputedStyle(e,null)},o=function(e,t){return parseFloat(t)}):(u=function(e){return e.currentStyle},o=function(e,t){var n=void 0,r=void 0,i=void 0,o=void 0,a=void 0,u=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,l=new RegExp("^("+u+")(?!px)[a-z%]+$","i");return l.test(t)?(a=e.style,n=a.left,i=e.runtimeStyle,o=i&&i.left,i&&(i.left=a.left),a.left=t,r=a.pixelLeft,a.left=n,o&&(i.left=o),r):parseFloat(t)}),angular.forEach({before:function(e){var t,n,r,i,o,a,u;if(u=this,n=u[0],o=u.parent(),t=o.contents(),t[0]===n)return o.prepend(e);for(r=i=1,a=t.length-1;1<=a?i<=a:i>=a;r=1<=a?++i:--i)if(t[r]===n)return void angular.element(t[r-1]).after(e);throw new Error("invalid DOM structure "+n.outerHTML)},height:function(e){var t;return t=this,angular.isDefined(e)?(angular.isNumber(e)&&(e+="px"),a.call(t,"height",e)):i(this[0],"height","base")},outerHeight:function(e){return i(this[0],"height",e?"outerfull":"outer")},outerWidth:function(e){return i(this[0],"width",e?"outerfull":"outer")},offset:function(e){var t=void 0,n=void 0,r=this,i={top:0,left:0},o=r[0],a=o&&o.ownerDocument;if(arguments.length){if(void 0===e)return r;throw new Error("offset setter method is not implemented")}if(a)return t=a.documentElement,null!=o.getBoundingClientRect&&(i=o.getBoundingClientRect()),n=a.defaultView||a.parentWindow,{top:i.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:i.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}},scrollTop:function(e){return t(this,"top",e)},scrollLeft:function(e){return t(this,"left",e)}},function(t,n){if(!e.prototype[n])return e.prototype[n]=t})}}]),e}();t.default=o},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(){function e(e,t){for(var n=0;n=0&&(r=t[o].element.outerHeight(!0),!(n+r>i));o--)s.cache.add(t[o]),n+=r,e++;e>0&&(t.eof=!1,t.remove(t.length-e,t.length),t.next-=e,c.adjustPadding())},shouldLoadTop:function(){return!t.bof&&c.topDataPos()>c.topVisiblePos()-u()},clipTop:function(){for(var e=0,n=0,r=0,i=c.topVisiblePos()-c.topDataPos()-u(),o=0;oi));o++)l.cache.add(t[o]),n+=r,e++;e>0&&(l.height(l.height()+n),t.bof=!1,t.remove(0,e),t.first+=e)},adjustPadding:function(){if(t.length){var e=l.cache.reduce(function(e,n){return e+(n.index=t.next?n.height:0)},0),r=t.reduce(function(e,t){return e+t.element.outerHeight(!0)},0),i=(r+e+n)/(t.maxIndex-t.minIndex+1),o=null!==t.minIndexUser&&t.minIndex>t.minIndexUser,a=null!==t.maxIndexUser&&t.maxIndext.minIndexUser){var n=l.height()-e;c.scrollTop(c.scrollTop()+n)}},adjustScrollTopAfterPrepend:function(e){if(e.prepended.length){var n=t.effectiveHeight(e.prepended),r=l.height()-n;r>=0?l.height(r):(l.height(0),c.scrollTop(c.scrollTop()-r))}},resetTopPadding:function(){l.height(0),l.cache.clear()},resetBottomPadding:function(){s.height(0),s.cache.clear()}}),c}Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var o=n(5),a=r(o)},function(e,t){"use strict";function n(){var e=Object.create(Array.prototype);return angular.extend(e,{add:function(t){for(var n=e.length-1;n>=0;n--)if(e[n].index===t.scope.$index)return void(e[n].height=t.element.outerHeight());e.push({index:t.scope.$index,height:t.element.outerHeight()})},clear:function(){e.length=0}}),e}function r(e){var t=void 0;switch(e.tagName){case"dl":throw new Error("ui-scroll directive does not support <"+e.tagName+"> as a repeating tag: "+e.outerHTML);case"tr":var r=angular.element("
    ");t=r.find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t.cache=new n,t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){var n=e.match(/^(.+)(\s+on\s+)(.+)?/);if(n&&4===n.length){window.console.log('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.');for(var r=n[3],i=n[1],o=t;o.length;){var a=o.scope(),u=(o.attr("ng-controller")||"").match(/(\w(?:\w|\d)*)(?:\s+as\s+(\w(?:\w|\d)*))?/);if(u&&u[1]===r)return{target:a,source:i};o=o.parent()}throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller "'+r+'" to inject "'+i+'"')}}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n=0;i--)this.publicContext[r[i]]=this[r[i]].bind(this);for(var o=["isLoading","topVisible","topVisibleElement","topVisibleScope"],a=function(r){var i=void 0,a=e[o[r]];Object.defineProperty(n,o[r],{get:function(){return i},set:function(e){i=e,n.publicContext[o[r]]=e,a&&t(a).assign(n.startScope,e)}})},u=o.length-1;u>=0;u--)a(u);Object.defineProperty(this.publicContext,"disabled",{get:function(){return n.disabled},set:function(e){return(n.disabled=e)?null:n.adjustBuffer()}})}},{key:"loading",value:function(e){this.isLoading=e}},{key:"isBOF",value:function(){return this.buffer.bof}},{key:"isEOF",value:function(){return this.buffer.eof}},{key:"isEmpty",value:function(){return!this.buffer.length}},{key:"applyUpdates",value:function(e,t){var n=this;if(angular.isFunction(e))this.buffer.slice(0).forEach(function(t){n.applyUpdate(t,e(t.item,t.scope,t.element))});else{if(e%1!==0)throw new Error("applyUpdates - "+e+" is not a valid index");var r=e-this.buffer.first;r>=0&&r 0 ? buffer[insertAfter - 1].element : undefined;\n\t linker(function (clone, scope) {\n\t promises = insertElement(clone, sibling);\n\t wrapper.element = clone;\n\t wrapper.scope = scope;\n\t scope[itemName] = wrapper.item;\n\t });\n\t if (adapter.transform) adapter.transform(wrapper.scope, wrapper.element);\n\t return promises;\n\t }\n\t\n\t function updateDOM() {\n\t var promises = [];\n\t var toBePrepended = [];\n\t var toBeRemoved = [];\n\t var inserted = [];\n\t\n\t buffer.forEach(function (wrapper, i) {\n\t switch (wrapper.op) {\n\t case 'prepend':\n\t toBePrepended.unshift(wrapper);\n\t break;\n\t case 'append':\n\t insertWrapperContent(wrapper, i);\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'insert':\n\t promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'remove':\n\t toBeRemoved.push(wrapper);\n\t }\n\t });\n\t\n\t toBeRemoved.forEach(function (wrapper) {\n\t return promises = promises.concat(buffer.remove(wrapper));\n\t });\n\t\n\t if (toBePrepended.length) toBePrepended.forEach(function (wrapper) {\n\t insertWrapperContent(wrapper);\n\t wrapper.op = 'none';\n\t });\n\t\n\t buffer.forEach(function (item, i) {\n\t return item.scope.$index = buffer.first + i;\n\t });\n\t\n\t return {\n\t prepended: toBePrepended,\n\t removed: toBeRemoved,\n\t inserted: inserted,\n\t animated: promises\n\t };\n\t }\n\t\n\t function updatePaddings(rid, updates) {\n\t // schedule another adjustBuffer after animation completion\n\t if (updates.animated.length) {\n\t $q.all(updates.animated).then(function () {\n\t viewport.adjustPadding();\n\t adjustBuffer(rid);\n\t });\n\t } else {\n\t viewport.adjustPadding();\n\t }\n\t }\n\t\n\t function enqueueFetch(rid, updates) {\n\t if (viewport.shouldLoadBottom()) {\n\t if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t if (pending.push(true) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t } else if (viewport.shouldLoadTop()) {\n\t if (!updates || buffer.effectiveHeight(updates.prepended) > 0 || pending[0]) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n\t // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n\t if (pending.push(false) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t }\n\t }\n\t\n\t function adjustBuffer(rid) {\n\t if (!rid) {\n\t // dismiss pending requests\n\t pending = [];\n\t rid = ++ridActual;\n\t }\n\t\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid);\n\t\n\t if (!pending.length) {\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function adjustBufferAfterFetch(rid) {\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t viewport.adjustScrollTopAfterPrepend(updates);\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid, updates);\n\t pending.shift();\n\t\n\t if (pending.length) fetch(rid);else {\n\t adapter.loading(false);\n\t bindEvents();\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function fetch(rid) {\n\t if (pending[0]) {\n\t // scrolling down\n\t if (buffer.length && !viewport.shouldLoadBottom()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchNext(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.eof = true;\n\t }\n\t\n\t if (result.length > 0) {\n\t viewport.clipTop();\n\t buffer.append(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t } else {\n\t // scrolling up\n\t if (buffer.length && !viewport.shouldLoadTop()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchPrevious(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.bof = true;\n\t // log 'bof is reached'\n\t }\n\t\n\t if (result.length > 0) {\n\t if (buffer.length) {\n\t viewport.clipBottom();\n\t }\n\t buffer.prepend(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t }\n\t }\n\t\n\t function resizeAndScrollHandler() {\n\t if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\t\n\t enqueueFetch(ridActual);\n\t\n\t if (pending.length) {\n\t unbindEvents();\n\t } else {\n\t adapter.calculateProperties();\n\t $scope.$apply();\n\t }\n\t }\n\t }\n\t\n\t function wheelHandler(event) {\n\t if (!adapter.disabled) {\n\t var scrollTop = viewport[0].scrollTop;\n\t var yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\t\n\t if (scrollTop === 0 && !buffer.bof || scrollTop === yMax && !buffer.eof) {\n\t event.preventDefault();\n\t }\n\t }\n\t }\n\t }\n\t}]);\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*!\r\n\t globals: angular, window\r\n\t List of used element methods available in JQuery but not in JQuery Lite\r\n\t element.before(elem)\r\n\t element.height()\r\n\t element.outerHeight(true)\r\n\t element.height(value) = only for Top/Bottom padding elements\r\n\t element.scrollTop()\r\n\t element.scrollTop(value)\r\n\t */\n\t\n\tvar JQLiteExtras = function () {\n\t function JQLiteExtras() {\n\t _classCallCheck(this, JQLiteExtras);\n\t }\n\t\n\t _createClass(JQLiteExtras, [{\n\t key: 'registerFor',\n\t value: function registerFor(element) {\n\t var convertToPx = void 0,\n\t css = void 0,\n\t getStyle = void 0,\n\t isWindow = void 0;\n\t // angular implementation blows up if elem is the window\n\t css = angular.element.prototype.css;\n\t\n\t element.prototype.css = function (name, value) {\n\t var self = this;\n\t var elem = self[0];\n\t if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\n\t return css.call(self, name, value);\n\t }\n\t };\n\t\n\t // as defined in angularjs v1.0.5\n\t isWindow = function isWindow(obj) {\n\t return obj && obj.document && obj.location && obj.alert && obj.setInterval;\n\t };\n\t\n\t function scrollTo(self, direction, value) {\n\t var elem = self[0];\n\t\n\t var _top$left$direction = _slicedToArray({\n\t top: ['scrollTop', 'pageYOffset', 'scrollLeft'],\n\t left: ['scrollLeft', 'pageXOffset', 'scrollTop']\n\t }[direction], 3),\n\t method = _top$left$direction[0],\n\t prop = _top$left$direction[1],\n\t preserve = _top$left$direction[2];\n\t\n\t if (isWindow(elem)) {\n\t if (angular.isDefined(value)) {\n\t return elem.scrollTo(self[preserve].call(self), value);\n\t }\n\t return prop in elem ? elem[prop] : elem.document.documentElement[method];\n\t } else {\n\t if (angular.isDefined(value)) {\n\t elem[method] = value;\n\t }\n\t return elem[method];\n\t }\n\t }\n\t\n\t if (window.getComputedStyle) {\n\t getStyle = function getStyle(elem) {\n\t return window.getComputedStyle(elem, null);\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t return parseFloat(value);\n\t };\n\t } else {\n\t getStyle = function getStyle(elem) {\n\t return elem.currentStyle;\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t var left = void 0,\n\t result = void 0,\n\t rs = void 0,\n\t rsLeft = void 0,\n\t style = void 0;\n\t var core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\n\t var rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\n\t\n\t if (!rnumnonpx.test(value)) {\n\t return parseFloat(value);\n\t }\n\t\n\t // ported from JQuery\n\t style = elem.style;\n\t left = style.left;\n\t rs = elem.runtimeStyle;\n\t rsLeft = rs && rs.left;\n\t if (rs) {\n\t rs.left = style.left;\n\t }\n\t // put in the new values to get a computed style out\n\t style.left = value;\n\t result = style.pixelLeft;\n\t style.left = left;\n\t if (rsLeft) {\n\t rs.left = rsLeft;\n\t }\n\t return result;\n\t };\n\t }\n\t\n\t function getMeasurements(elem, measure) {\n\t var base = void 0,\n\t borderA = void 0,\n\t borderB = void 0,\n\t computedMarginA = void 0,\n\t computedMarginB = void 0,\n\t computedStyle = void 0,\n\t dirA = void 0,\n\t dirB = void 0,\n\t marginA = void 0,\n\t marginB = void 0,\n\t paddingA = void 0,\n\t paddingB = void 0;\n\t\n\t if (isWindow(elem)) {\n\t base = document.documentElement[{ height: 'clientHeight', width: 'clientWidth' }[measure]];\n\t\n\t return {\n\t base: base,\n\t padding: 0,\n\t border: 0,\n\t margin: 0\n\t };\n\t }\n\t\n\t // Start with offset property\n\t\n\t var _width$height$measure = _slicedToArray({\n\t width: [elem.offsetWidth, 'Left', 'Right'],\n\t height: [elem.offsetHeight, 'Top', 'Bottom']\n\t }[measure], 3);\n\t\n\t base = _width$height$measure[0];\n\t dirA = _width$height$measure[1];\n\t dirB = _width$height$measure[2];\n\t\n\t\n\t computedStyle = getStyle(elem);\n\t paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\n\t paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\n\t borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\n\t borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\n\t computedMarginA = computedStyle['margin' + dirA];\n\t computedMarginB = computedStyle['margin' + dirB];\n\t\n\t // I do not care for width for now, so this hack is irrelevant\n\t // if ( !supportsPercentMargin )\n\t // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\n\t // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\n\t marginA = convertToPx(elem, computedMarginA) || 0;\n\t marginB = convertToPx(elem, computedMarginB) || 0;\n\t\n\t return {\n\t base: base,\n\t padding: paddingA + paddingB,\n\t border: borderA + borderB,\n\t margin: marginA + marginB\n\t };\n\t }\n\t\n\t function getWidthHeight(elem, direction, measure) {\n\t var computedStyle = void 0,\n\t result = void 0;\n\t\n\t var measurements = getMeasurements(elem, direction);\n\t\n\t if (measurements.base > 0) {\n\t return {\n\t base: measurements.base - measurements.padding - measurements.border,\n\t outer: measurements.base,\n\t outerfull: measurements.base + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // Fall back to computed then uncomputed css if necessary\n\t computedStyle = getStyle(elem);\n\t result = computedStyle[direction];\n\t\n\t if (result < 0 || result === null) {\n\t result = elem.style[direction] || 0;\n\t }\n\t\n\t // Normalize \"\", auto, and prepare for extra\n\t result = parseFloat(result) || 0;\n\t\n\t return {\n\t base: result - measurements.padding - measurements.border,\n\t outer: result,\n\t outerfull: result + measurements.padding + measurements.border + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // define missing methods\n\t return angular.forEach({\n\t before: function before(newElem) {\n\t var children, elem, i, j, parent, ref, self;\n\t self = this;\n\t elem = self[0];\n\t parent = self.parent();\n\t children = parent.contents();\n\t if (children[0] === elem) {\n\t return parent.prepend(newElem);\n\t } else {\n\t for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n\t if (children[i] === elem) {\n\t angular.element(children[i - 1]).after(newElem);\n\t return;\n\t }\n\t }\n\t throw new Error('invalid DOM structure ' + elem.outerHTML);\n\t }\n\t },\n\t height: function height(value) {\n\t var self;\n\t self = this;\n\t if (angular.isDefined(value)) {\n\t if (angular.isNumber(value)) {\n\t value = value + 'px';\n\t }\n\t return css.call(self, 'height', value);\n\t } else {\n\t return getWidthHeight(this[0], 'height', 'base');\n\t }\n\t },\n\t outerHeight: function outerHeight(option) {\n\t return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\n\t },\n\t outerWidth: function outerWidth(option) {\n\t return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\n\t },\n\t\n\t\n\t /*\r\n\t The offset setter method is not implemented\r\n\t */\n\t offset: function offset(value) {\n\t var docElem = void 0,\n\t win = void 0;\n\t var self = this;\n\t var box = {\n\t top: 0,\n\t left: 0\n\t };\n\t var elem = self[0];\n\t var doc = elem && elem.ownerDocument;\n\t\n\t if (arguments.length) {\n\t if (value === undefined) {\n\t return self;\n\t }\n\t // TODO: implement setter\n\t throw new Error('offset setter method is not implemented');\n\t }\n\t\n\t if (!doc) {\n\t return;\n\t }\n\t\n\t docElem = doc.documentElement;\n\t\n\t // TODO: Make sure it's not a disconnected DOM node\n\t\n\t if (elem.getBoundingClientRect != null) {\n\t box = elem.getBoundingClientRect();\n\t }\n\t\n\t win = doc.defaultView || doc.parentWindow;\n\t\n\t return {\n\t top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n\t left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n\t };\n\t },\n\t scrollTop: function scrollTop(value) {\n\t return scrollTo(this, 'top', value);\n\t },\n\t scrollLeft: function scrollLeft(value) {\n\t return scrollTo(this, 'left', value);\n\t }\n\t }, function (value, key) {\n\t if (!element.prototype[key]) {\n\t return element.prototype[key] = value;\n\t }\n\t });\n\t }\n\t }]);\n\t\n\t return JQLiteExtras;\n\t}();\n\t\n\texports.default = JQLiteExtras;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar ElementRoutines = function () {\n\t function ElementRoutines($injector, $q) {\n\t _classCallCheck(this, ElementRoutines);\n\t\n\t this.$animate = $injector.has && $injector.has('$animate') ? $injector.get('$animate') : null;\n\t this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\n\t this.$q = $q;\n\t }\n\t\n\t _createClass(ElementRoutines, [{\n\t key: 'insertElement',\n\t value: function insertElement(newElement, previousElement) {\n\t previousElement.after(newElement);\n\t return [];\n\t }\n\t }, {\n\t key: 'removeElement',\n\t value: function removeElement(wrapper) {\n\t wrapper.element.remove();\n\t wrapper.scope.$destroy();\n\t return [];\n\t }\n\t }, {\n\t key: 'insertElementAnimated',\n\t value: function insertElementAnimated(newElement, previousElement) {\n\t var _this = this;\n\t\n\t if (!this.$animate) {\n\t return this.insertElement(newElement, previousElement);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret = function () {\n\t var deferred = _this.$q.defer();\n\t // no need for parent - previous element is never null\n\t _this.$animate.enter(newElement, null, previousElement, function () {\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n\t }\n\t\n\t // no need for parent - previous element is never null\n\t return [this.$animate.enter(newElement, null, previousElement)];\n\t }\n\t }, {\n\t key: 'removeElementAnimated',\n\t value: function removeElementAnimated(wrapper) {\n\t var _this2 = this;\n\t\n\t if (!this.$animate) {\n\t return this.removeElement(wrapper);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret2 = function () {\n\t var deferred = _this2.$q.defer();\n\t _this2.$animate.leave(wrapper.element, function () {\n\t wrapper.scope.$destroy();\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n\t }\n\t\n\t return [this.$animate.leave(wrapper.element).then(function () {\n\t return wrapper.scope.$destroy();\n\t })];\n\t }\n\t }]);\n\t\n\t return ElementRoutines;\n\t}();\n\t\n\texports.default = ElementRoutines;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = ScrollBuffer;\n\tfunction ScrollBuffer(elementRoutines, bufferSize) {\n\t var buffer = Object.create(Array.prototype);\n\t\n\t angular.extend(buffer, {\n\t size: bufferSize,\n\t\n\t reset: function reset(startIndex) {\n\t buffer.remove(0, buffer.length);\n\t buffer.eof = false;\n\t buffer.bof = false;\n\t buffer.first = startIndex;\n\t buffer.next = startIndex;\n\t buffer.minIndex = startIndex;\n\t buffer.maxIndex = startIndex;\n\t buffer.minIndexUser = null;\n\t buffer.maxIndexUser = null;\n\t },\n\t append: function append(items) {\n\t items.forEach(function (item) {\n\t ++buffer.next;\n\t buffer.insert('append', item);\n\t });\n\t buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\n\t },\n\t prepend: function prepend(items) {\n\t items.reverse().forEach(function (item) {\n\t --buffer.first;\n\t buffer.insert('prepend', item);\n\t });\n\t buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\n\t },\n\t\n\t\n\t /**\r\n\t * inserts wrapped element in the buffer\r\n\t * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n\t * for insert the number is the index for the buffer element the new one have to be inserted after\r\n\t * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n\t */\n\t insert: function insert(operation, item) {\n\t var wrapper = {\n\t item: item\n\t };\n\t\n\t if (operation % 1 === 0) {\n\t // it is an insert\n\t wrapper.op = 'insert';\n\t buffer.splice(operation, 0, wrapper);\n\t } else {\n\t wrapper.op = operation;\n\t switch (operation) {\n\t case 'append':\n\t buffer.push(wrapper);\n\t break;\n\t case 'prepend':\n\t buffer.unshift(wrapper);\n\t break;\n\t }\n\t }\n\t },\n\t\n\t\n\t // removes elements from buffer\n\t remove: function remove(arg1, arg2) {\n\t if (angular.isNumber(arg1)) {\n\t // removes items from arg1 (including) through arg2 (excluding)\n\t for (var i = arg1; i < arg2; i++) {\n\t elementRoutines.removeElement(buffer[i]);\n\t }\n\t\n\t return buffer.splice(arg1, arg2 - arg1);\n\t }\n\t // removes single item(wrapper) from the buffer\n\t buffer.splice(buffer.indexOf(arg1), 1);\n\t\n\t return elementRoutines.removeElementAnimated(arg1);\n\t },\n\t effectiveHeight: function effectiveHeight(elements) {\n\t if (!elements.length) {\n\t return 0;\n\t }\n\t var top = Number.MAX_VALUE;\n\t var bottom = Number.MIN_VALUE;\n\t elements.forEach(function (wrapper) {\n\t if (wrapper.element[0].offsetParent) {\n\t // element style is not display:none\n\t top = Math.min(top, wrapper.element.offset().top);\n\t bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\n\t }\n\t });\n\t return Math.max(0, bottom - top);\n\t }\n\t });\n\t\n\t return buffer;\n\t}\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Viewport;\n\t\n\tvar _padding = __webpack_require__(5);\n\t\n\tvar _padding2 = _interopRequireDefault(_padding);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\n\t var topPadding = null;\n\t var bottomPadding = null;\n\t var viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\n\t var container = viewportController && viewportController.container ? viewportController.container : undefined;\n\t var scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\n\t\n\t viewport.css({\n\t 'overflow-anchor': 'none',\n\t 'overflow-y': 'auto',\n\t 'display': 'block'\n\t });\n\t\n\t function bufferPadding() {\n\t return viewport.outerHeight() * padding; // some extra space to initiate preload\n\t }\n\t\n\t angular.extend(viewport, {\n\t getScope: function getScope() {\n\t return scope;\n\t },\n\t createPaddingElements: function createPaddingElements(template) {\n\t topPadding = new _padding2.default(template);\n\t bottomPadding = new _padding2.default(template);\n\t element.before(topPadding);\n\t element.after(bottomPadding);\n\t },\n\t applyContainerStyle: function applyContainerStyle() {\n\t if (container && container !== viewport) {\n\t viewport.css('height', window.getComputedStyle(container[0]).height);\n\t }\n\t },\n\t bottomDataPos: function bottomDataPos() {\n\t var scrollHeight = viewport[0].scrollHeight;\n\t scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\n\t return scrollHeight - bottomPadding.height();\n\t },\n\t topDataPos: function topDataPos() {\n\t return topPadding.height();\n\t },\n\t bottomVisiblePos: function bottomVisiblePos() {\n\t return viewport.scrollTop() + viewport.outerHeight();\n\t },\n\t topVisiblePos: function topVisiblePos() {\n\t return viewport.scrollTop();\n\t },\n\t insertElement: function insertElement(e, sibling) {\n\t return elementRoutines.insertElement(e, sibling || topPadding);\n\t },\n\t insertElementAnimated: function insertElementAnimated(e, sibling) {\n\t return elementRoutines.insertElementAnimated(e, sibling || topPadding);\n\t },\n\t shouldLoadBottom: function shouldLoadBottom() {\n\t return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\n\t },\n\t clipBottom: function clipBottom() {\n\t // clip the invisible items off the bottom\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\n\t\n\t for (var i = buffer.length - 1; i >= 0; i--) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t bottomPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t buffer.eof = false;\n\t buffer.remove(buffer.length - overage, buffer.length);\n\t buffer.next -= overage;\n\t viewport.adjustPadding();\n\t }\n\t },\n\t shouldLoadTop: function shouldLoadTop() {\n\t return !buffer.bof && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding();\n\t },\n\t clipTop: function clipTop() {\n\t // clip the invisible items off the top\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\n\t\n\t for (var i = 0; i < buffer.length; i++) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t topPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t // we need to adjust top padding element before items are removed from top\n\t // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\n\t topPadding.height(topPadding.height() + overageHeight);\n\t buffer.bof = false;\n\t buffer.remove(0, overage);\n\t buffer.first += overage;\n\t }\n\t },\n\t adjustPadding: function adjustPadding() {\n\t if (!buffer.length) {\n\t return;\n\t }\n\t\n\t // precise heights calculation, items that were in buffer once\n\t var topPaddingHeight = topPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index < buffer.first ? item.height : 0);\n\t }, 0);\n\t var bottomPaddingHeight = bottomPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index >= buffer.next ? item.height : 0);\n\t }, 0);\n\t\n\t // average item height based on buffer data\n\t var visibleItemsHeight = buffer.reduce(function (summ, item) {\n\t return summ + item.element.outerHeight(true);\n\t }, 0);\n\t var averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\n\t\n\t // average heights calculation, items that have never been reached\n\t var adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\n\t var adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\n\t var topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\n\t var bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\n\t\n\t // paddings combine adjustment\n\t topPadding.height(topPaddingHeight + topPaddingHeightAdd);\n\t bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\n\t },\n\t adjustScrollTopAfterMinIndexSet: function adjustScrollTopAfterMinIndexSet(topPaddingHeightOld) {\n\t // additional scrollTop adjustment in case of datasource.minIndex external set\n\t if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\n\t var diff = topPadding.height() - topPaddingHeightOld;\n\t viewport.scrollTop(viewport.scrollTop() + diff);\n\t }\n\t },\n\t adjustScrollTopAfterPrepend: function adjustScrollTopAfterPrepend(updates) {\n\t if (!updates.prepended.length) return;\n\t var height = buffer.effectiveHeight(updates.prepended);\n\t var paddingHeight = topPadding.height() - height;\n\t if (paddingHeight >= 0) {\n\t topPadding.height(paddingHeight);\n\t } else {\n\t topPadding.height(0);\n\t viewport.scrollTop(viewport.scrollTop() - paddingHeight);\n\t }\n\t },\n\t resetTopPadding: function resetTopPadding() {\n\t topPadding.height(0);\n\t topPadding.cache.clear();\n\t },\n\t resetBottomPadding: function resetBottomPadding() {\n\t bottomPadding.height(0);\n\t bottomPadding.cache.clear();\n\t }\n\t });\n\t\n\t return viewport;\n\t}\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Padding;\n\tfunction Cache() {\n\t var cache = Object.create(Array.prototype);\n\t\n\t angular.extend(cache, {\n\t add: function add(item) {\n\t for (var i = cache.length - 1; i >= 0; i--) {\n\t if (cache[i].index === item.scope.$index) {\n\t cache[i].height = item.element.outerHeight();\n\t return;\n\t }\n\t }\n\t cache.push({\n\t index: item.scope.$index,\n\t height: item.element.outerHeight()\n\t });\n\t },\n\t clear: function clear() {\n\t cache.length = 0;\n\t }\n\t });\n\t\n\t return cache;\n\t}\n\t\n\tfunction Padding(template) {\n\t var result = void 0;\n\t\n\t switch (template.tagName) {\n\t case 'dl':\n\t throw new Error('ui-scroll directive does not support <' + template.tagName + '> as a repeating tag: ' + template.outerHTML);\n\t case 'tr':\n\t var table = angular.element('
    ');\n\t result = table.find('tr');\n\t break;\n\t case 'li':\n\t result = angular.element('
  • ');\n\t break;\n\t default:\n\t result = angular.element('
    ');\n\t }\n\t\n\t result.cache = new Cache();\n\t\n\t return result;\n\t}\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction getCtrlOnData(attr, element) {\n\t var onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\n\t if (onSyntax && onSyntax.length === 4) {\n\t window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\n\t var ctrl = onSyntax[3];\n\t var tail = onSyntax[1];\n\t var candidate = element;\n\t while (candidate.length) {\n\t var candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\n\t var candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\n\t if (candidateName && candidateName[1] === ctrl) {\n\t return {\n\t target: candidateScope,\n\t source: tail\n\t };\n\t }\n\t candidate = candidate.parent();\n\t }\n\t throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\n\t }\n\t}\n\t\n\tvar Adapter = function () {\n\t function Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope) {\n\t _classCallCheck(this, Adapter);\n\t\n\t this.viewport = viewport;\n\t this.buffer = buffer;\n\t this.adjustBuffer = adjustBuffer;\n\t this.reload = reload;\n\t\n\t this.isLoading = false;\n\t this.disabled = false;\n\t\n\t var viewportScope = viewport.getScope();\n\t this.startScope = viewportScope.$parent ? viewportScope : $scope;\n\t\n\t this.publicContext = {};\n\t this.assignAdapter($attr.adapter, $parse, element);\n\t this.generatePublicContext($attr, $parse);\n\t }\n\t\n\t _createClass(Adapter, [{\n\t key: 'assignAdapter',\n\t value: function assignAdapter(adapterAttr, $parse, element) {\n\t if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\n\t return;\n\t }\n\t var ctrlOnData = getCtrlOnData(adapterAttr, element);\n\t var adapterOnScope = void 0;\n\t\n\t try {\n\t if (ctrlOnData) {\n\t // \"Controller On\", deprecated since v1.6.1\n\t $parse(ctrlOnData.source).assign(ctrlOnData.target, {});\n\t adapterOnScope = $parse(ctrlOnData.source)(ctrlOnData.target);\n\t } else {\n\t $parse(adapterAttr).assign(this.startScope, {});\n\t adapterOnScope = $parse(adapterAttr)(this.startScope);\n\t }\n\t } catch (error) {\n\t error.message = 'Angular ui-scroll Adapter assignment exception.\\n' + ('Can\\'t parse \"' + adapterAttr + '\" expression.\\n') + error.message;\n\t throw error;\n\t }\n\t\n\t angular.extend(adapterOnScope, this.publicContext);\n\t this.publicContext = adapterOnScope;\n\t }\n\t }, {\n\t key: 'generatePublicContext',\n\t value: function generatePublicContext($attr, $parse) {\n\t var _this = this;\n\t\n\t // these methods will be accessible out of ui-scroll via user defined adapter\n\t var publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\n\t for (var i = publicMethods.length - 1; i >= 0; i--) {\n\t this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\n\t }\n\t\n\t // these read-only props will be accessible out of ui-scroll via user defined adapter\n\t var publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope'];\n\t\n\t var _loop = function _loop(_i) {\n\t var property = void 0,\n\t attr = $attr[publicProps[_i]];\n\t Object.defineProperty(_this, publicProps[_i], {\n\t get: function get() {\n\t return property;\n\t },\n\t set: function set(value) {\n\t property = value;\n\t _this.publicContext[publicProps[_i]] = value;\n\t if (attr) {\n\t $parse(attr).assign(_this.startScope, value);\n\t }\n\t }\n\t });\n\t };\n\t\n\t for (var _i = publicProps.length - 1; _i >= 0; _i--) {\n\t _loop(_i);\n\t }\n\t\n\t // non-read-only public property\n\t Object.defineProperty(this.publicContext, 'disabled', {\n\t get: function get() {\n\t return _this.disabled;\n\t },\n\t set: function set(value) {\n\t return !(_this.disabled = value) ? _this.adjustBuffer() : null;\n\t }\n\t });\n\t }\n\t }, {\n\t key: 'loading',\n\t value: function loading(value) {\n\t this['isLoading'] = value;\n\t }\n\t }, {\n\t key: 'isBOF',\n\t value: function isBOF() {\n\t return this.buffer.bof;\n\t }\n\t }, {\n\t key: 'isEOF',\n\t value: function isEOF() {\n\t return this.buffer.eof;\n\t }\n\t }, {\n\t key: 'isEmpty',\n\t value: function isEmpty() {\n\t return !this.buffer.length;\n\t }\n\t }, {\n\t key: 'applyUpdates',\n\t value: function applyUpdates(arg1, arg2) {\n\t var _this2 = this;\n\t\n\t if (angular.isFunction(arg1)) {\n\t // arg1 is the updater function, arg2 is ignored\n\t this.buffer.slice(0).forEach(function (wrapper) {\n\t // we need to do it on the buffer clone, because buffer content\n\t // may change as we iterate through\n\t _this2.applyUpdate(wrapper, arg1(wrapper.item, wrapper.scope, wrapper.element));\n\t });\n\t } else {\n\t // arg1 is item index, arg2 is the newItems array\n\t if (arg1 % 1 !== 0) {\n\t // checking if it is an integer\n\t throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\n\t }\n\t\n\t var index = arg1 - this.buffer.first;\n\t if (index >= 0 && index < this.buffer.length) {\n\t this.applyUpdate(this.buffer[index], arg2);\n\t }\n\t }\n\t\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'append',\n\t value: function append(newItems) {\n\t this.buffer.append(newItems);\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'prepend',\n\t value: function prepend(newItems) {\n\t this.buffer.prepend(newItems);\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'calculateProperties',\n\t value: function calculateProperties() {\n\t var item = void 0,\n\t itemHeight = void 0,\n\t itemTop = void 0,\n\t isNewRow = void 0,\n\t rowTop = null;\n\t var topHeight = 0;\n\t for (var i = 0; i < this.buffer.length; i++) {\n\t item = this.buffer[i];\n\t itemTop = item.element.offset().top;\n\t isNewRow = rowTop !== itemTop;\n\t rowTop = itemTop;\n\t if (isNewRow) {\n\t itemHeight = item.element.outerHeight(true);\n\t }\n\t if (isNewRow && this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos()) {\n\t topHeight += itemHeight;\n\t } else {\n\t if (isNewRow) {\n\t this['topVisible'] = item.item;\n\t this['topVisibleElement'] = item.element;\n\t this['topVisibleScope'] = item.scope;\n\t }\n\t break;\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'applyUpdate',\n\t value: function applyUpdate(wrapper, newItems) {\n\t var _this3 = this;\n\t\n\t if (!angular.isArray(newItems)) {\n\t return;\n\t }\n\t\n\t var keepIt = void 0;\n\t var pos = this.buffer.indexOf(wrapper) + 1;\n\t\n\t newItems.reverse().forEach(function (newItem) {\n\t if (newItem === wrapper.item) {\n\t keepIt = true;\n\t pos--;\n\t } else {\n\t _this3.buffer.insert(pos, newItem);\n\t }\n\t });\n\t\n\t if (!keepIt) {\n\t wrapper.op = 'remove';\n\t }\n\t }\n\t }]);\n\t\n\t return Adapter;\n\t}();\n\t\n\texports.default = Adapter;\n\n/***/ }\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// ui-scroll.min.js"," \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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 171ff513de35bc561c8f","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 /**\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","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);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","function getCtrlOnData(attr, element) {\r\n let onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\r\n if (onSyntax && onSyntax.length === 4) {\r\n window.console.warn('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\r\n let ctrl = onSyntax[3];\r\n let tail = onSyntax[1];\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[1] === ctrl) {\r\n return {\r\n target: candidateScope,\r\n source: tail\r\n };\r\n }\r\n candidate = candidate.parent();\r\n }\r\n throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\r\n }\r\n}\r\n\r\nclass Adapter {\r\n\r\n constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope) {\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n this.adjustBuffer = adjustBuffer;\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, $parse, element);\r\n this.generatePublicContext($attr, $parse);\r\n }\r\n\r\n assignAdapter(adapterAttr, $parse, element) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let ctrlOnData = getCtrlOnData(adapterAttr, element);\r\n let adapterOnScope;\r\n\r\n try {\r\n if (ctrlOnData) { // \"Controller On\", deprecated since v1.6.1\r\n $parse(ctrlOnData.source).assign(ctrlOnData.target, {});\r\n adapterOnScope = $parse(ctrlOnData.source)(ctrlOnData.target);\r\n }\r\n else {\r\n $parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = $parse(adapterAttr)(this.startScope);\r\n }\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($attr, $parse) {\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'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = $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 $parse(attr).assign(this.startScope, value);\r\n }\r\n }\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.adjustBuffer() : 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 applyUpdates(arg1, arg2) {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\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, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - this.buffer.first;\r\n if ((index >= 0 && index < this.buffer.length)) {\r\n this.applyUpdate(this.buffer[index], arg2);\r\n }\r\n }\r\n\r\n this.adjustBuffer();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n calculateProperties() {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n item = this.buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n break;\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\r\n let keepIt;\r\n let pos = (this.buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n this.buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///ui-scroll.min.js","webpack:///webpack/bootstrap 7beb37c5cc746a38af3d","webpack:///./src/ui-scroll.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/adapter.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","_jqLiteExtras","_jqLiteExtras2","_elementRoutines","_elementRoutines2","_buffer","_buffer2","_viewport","_viewport2","_adapter","_adapter2","angular","service","run","jqLiteExtras","window","jQuery","registerFor","element","directive","restrict","controller","scope","_this","this","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$q","$parse","link","$scope","$attr","controllers","linker","parseNumericAttr","value","defaultValue","result","isNaN","defineProperty","datasource","propName","propUserName","descriptor","Object","getOwnPropertyDescriptor","set","get","indexStore","buffer","pending","length","topPaddingHeightOld","topDataPos","adjustPadding","adjustScrollTopAfterMinIndexSet","isInvalid","rid","ridActual","$$destroyed","bindEvents","bind","resizeAndScrollHandler","unbindEvents","unbind","reload","resetTopPadding","resetBottomPadding","arguments","startIndex","reset","adjustBuffer","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","item","isFunction","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","addClass","promises","sibling","undefined","clone","itemName","adapter","transform","updateDOM","toBePrepended","toBeRemoved","inserted","i","op","unshift","push","concat","insertElementAnimated","remove","$index","first","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","fetch","loading","shouldLoadTop","w","removeClass","calculateProperties","adjustBufferAfterFetch","adjustScrollTopAfterPrepend","shift","fetchNext","bufferSize","eof","clipTop","append","fetchPrevious","bof","clipBottom","prepend","$$phase","isLoading","disabled","$apply","wheelHandler","event","scrollTop","yMax","scrollHeight","clientHeight","preventDefault","match","uiScroll","Error","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","datasourceName","viewportController","Math","max","padding","elementRoutines","isDatasourceValid","isObject","success","next","index","count","createPaddingElements","$destroy","$on","applyContainerStyle","require","transclude","priority","terminal","_classCallCheck","instance","Constructor","TypeError","_slicedToArray","sliceIterator","arr","_arr","_n","_d","_e","_s","_i","Symbol","iterator","done","err","Array","isArray","_createClass","defineProperties","target","props","enumerable","configurable","writable","key","protoProps","staticProps","prototype","JQLiteExtras","scrollTo","self","direction","elem","_top$left$direction","top","left","method","prop","preserve","isWindow","isDefined","document","documentElement","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","width","border","margin","_width$height$measure","offsetWidth","offsetHeight","getStyle","convertToPx","getWidthHeight","measurements","outer","outerfull","style","parseFloat","css","name","nodeType","location","alert","setInterval","getComputedStyle","currentStyle","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","before","newElem","j","parent","ref","contents","after","outerHTML","isNumber","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","_typeof","constructor","ElementRoutines","$animate","has","isAngularVersionLessThen1_3","version","major","minor","newElement","previousElement","_ret","deferred","defer","enter","resolve","v","promise","_this2","removeElement","_ret2","leave","ScrollBuffer","create","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","splice","arg1","arg2","indexOf","removeElementAnimated","elements","Number","MAX_VALUE","bottom","MIN_VALUE","Viewport","bufferPadding","topPadding","bottomPadding","overflow-anchor","overflow-y","display","getScope","template","_padding2","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","topPaddingHeight","reduce","summ","bottomPaddingHeight","visibleItemsHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","_padding","Cache","Padding","table","find","getCtrlOnData","attr","onSyntax","log","ctrl","tail","candidate","candidateScope","candidateName","Adapter","viewportScope","startScope","$parent","publicContext","assignAdapter","generatePublicContext","adapterAttr","replace","ctrlOnData","adapterOnScope","assign","error","message","publicMethods","publicProps","_loop","property","slice","applyUpdate","newItems","itemTop","isNewRow","rowTop","topHeight","_this3","keepIt","pos","newItem"],"mappings":"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","file":"ui-scroll.min.js","sourcesContent":["/*!\r\n * angular-ui-scroll (uncompressed)\r\n * https://github.com/angular-ui/ui-scroll\r\n * Version: 1.6.1 -- 2017-03-06T07:25:29.944Z\r\n * License: MIT\r\n */\n/******/ (function(modules) { // webpackBootstrap\n/******/ \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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _jqLiteExtras = __webpack_require__(1);\n\t\n\tvar _jqLiteExtras2 = _interopRequireDefault(_jqLiteExtras);\n\t\n\tvar _elementRoutines = __webpack_require__(2);\n\t\n\tvar _elementRoutines2 = _interopRequireDefault(_elementRoutines);\n\t\n\tvar _buffer = __webpack_require__(3);\n\t\n\tvar _buffer2 = _interopRequireDefault(_buffer);\n\t\n\tvar _viewport = __webpack_require__(4);\n\t\n\tvar _viewport2 = _interopRequireDefault(_viewport);\n\t\n\tvar _adapter = __webpack_require__(6);\n\t\n\tvar _adapter2 = _interopRequireDefault(_adapter);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tangular.module('ui.scroll', []).service('jqLiteExtras', function () {\n\t return new _jqLiteExtras2.default();\n\t}).run(['jqLiteExtras', function (jqLiteExtras) {\n\t return !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null;\n\t}]).directive('uiScrollViewport', function () {\n\t return {\n\t restrict: 'A',\n\t controller: ['$scope', '$element', function (scope, element) {\n\t var _this = this;\n\t\n\t this.container = element;\n\t this.viewport = element;\n\t this.scope = scope;\n\t\n\t angular.forEach(element.children(), function (child) {\n\t if (child.tagName.toLowerCase() === 'tbody') {\n\t _this.viewport = angular.element(child);\n\t }\n\t });\n\t\n\t return this;\n\t }]\n\t };\n\t}).directive('uiScroll', ['$log', '$injector', '$rootScope', '$timeout', '$q', '$parse', function (console, $injector, $rootScope, $timeout, $q, $parse) {\n\t\n\t return {\n\t require: ['?^uiScrollViewport'],\n\t restrict: 'A',\n\t transclude: 'element',\n\t priority: 1000,\n\t terminal: true,\n\t link: link\n\t };\n\t\n\t function link($scope, element, $attr, controllers, linker) {\n\t var match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n\t if (!match) {\n\t throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n\t }\n\t\n\t function parseNumericAttr(value, defaultValue) {\n\t var result = $parse(value)($scope);\n\t return isNaN(result) ? defaultValue : result;\n\t }\n\t\n\t var BUFFER_MIN = 3;\n\t var BUFFER_DEFAULT = 10;\n\t var PADDING_MIN = 0.3;\n\t var PADDING_DEFAULT = 0.5;\n\t\n\t var datasource = null;\n\t var itemName = match[1];\n\t var datasourceName = match[2];\n\t var viewportController = controllers[0];\n\t var bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n\t var padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT));\n\t var startIndex = parseNumericAttr($attr.startIndex, 1);\n\t var ridActual = 0; // current data revision id\n\t var pending = [];\n\t\n\t var elementRoutines = new _elementRoutines2.default($injector, $q);\n\t var buffer = new _buffer2.default(elementRoutines, bufferSize);\n\t var viewport = new _viewport2.default(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n\t var adapter = new _adapter2.default(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope);\n\t\n\t if (viewportController) {\n\t viewportController.adapter = adapter;\n\t }\n\t\n\t var isDatasourceValid = function isDatasourceValid() {\n\t return angular.isObject(datasource) && angular.isFunction(datasource.get);\n\t };\n\t datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n\t if (!isDatasourceValid()) {\n\t datasource = $injector.get(datasourceName); // try to inject datasource as service\n\t if (!isDatasourceValid()) {\n\t throw new Error(datasourceName + ' is not a valid datasource');\n\t }\n\t }\n\t\n\t var indexStore = {};\n\t\n\t function defineProperty(datasource, propName, propUserName) {\n\t var descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n\t if (!descriptor || !descriptor.set && !descriptor.get) {\n\t Object.defineProperty(datasource, propName, {\n\t set: function set(value) {\n\t indexStore[propName] = value;\n\t $timeout(function () {\n\t buffer[propUserName] = value;\n\t if (!pending.length) {\n\t var topPaddingHeightOld = viewport.topDataPos();\n\t viewport.adjustPadding();\n\t if (propName === 'minIndex') {\n\t viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n\t }\n\t }\n\t });\n\t },\n\t get: function get() {\n\t return indexStore[propName];\n\t }\n\t });\n\t }\n\t }\n\t\n\t defineProperty(datasource, 'minIndex', 'minIndexUser');\n\t defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\t\n\t var fetchNext = datasource.get.length !== 2 ? function (success) {\n\t return datasource.get(buffer.next, bufferSize, success);\n\t } : function (success) {\n\t datasource.get({\n\t index: buffer.next,\n\t append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n\t count: bufferSize\n\t }, success);\n\t };\n\t\n\t var fetchPrevious = datasource.get.length !== 2 ? function (success) {\n\t return datasource.get(buffer.first - bufferSize, bufferSize, success);\n\t } : function (success) {\n\t datasource.get({\n\t index: buffer.first - bufferSize,\n\t prepend: buffer.length ? buffer[0].item : void 0,\n\t count: bufferSize\n\t }, success);\n\t };\n\t\n\t /**\n\t * Build padding elements\n\t *\n\t * Calling linker is the only way I found to get access to the tag name of the template\n\t * to prevent the directive scope from pollution a new scope is created and destroyed\n\t * right after the builder creation is completed\n\t */\n\t linker(function (clone, scope) {\n\t viewport.createPaddingElements(clone[0]);\n\t // we do not include the clone in the DOM. It means that the nested directives will not\n\t // be able to reach the parent directives, but in this case it is intentional because we\n\t // created the clone to access the template tag name\n\t scope.$destroy();\n\t clone.remove();\n\t });\n\t\n\t $scope.$on('$destroy', function () {\n\t unbindEvents();\n\t viewport.unbind('mousewheel', wheelHandler);\n\t });\n\t\n\t viewport.bind('mousewheel', wheelHandler);\n\t\n\t $timeout(function () {\n\t viewport.applyContainerStyle();\n\t reload();\n\t });\n\t\n\t /* Private function definitions */\n\t\n\t function isInvalid(rid) {\n\t return rid && rid !== ridActual || $scope.$$destroyed;\n\t }\n\t\n\t function bindEvents() {\n\t viewport.bind('resize', resizeAndScrollHandler);\n\t viewport.bind('scroll', resizeAndScrollHandler);\n\t }\n\t\n\t function unbindEvents() {\n\t viewport.unbind('resize', resizeAndScrollHandler);\n\t viewport.unbind('scroll', resizeAndScrollHandler);\n\t }\n\t\n\t function reload() {\n\t viewport.resetTopPadding();\n\t viewport.resetBottomPadding();\n\t if (arguments.length) {\n\t startIndex = arguments[0];\n\t }\n\t buffer.reset(startIndex);\n\t adjustBuffer();\n\t }\n\t\n\t function isElementVisible(wrapper) {\n\t return wrapper.element.height() && wrapper.element[0].offsetParent;\n\t }\n\t\n\t function visibilityWatcher(wrapper) {\n\t if (isElementVisible(wrapper)) {\n\t buffer.forEach(function (item) {\n\t if (angular.isFunction(item.unregisterVisibilityWatcher)) {\n\t item.unregisterVisibilityWatcher();\n\t delete item.unregisterVisibilityWatcher;\n\t }\n\t });\n\t if (!pending.length) {\n\t adjustBuffer();\n\t }\n\t }\n\t }\n\t\n\t function insertWrapperContent(wrapper, insertAfter) {\n\t createElement(wrapper, insertAfter, viewport.insertElement);\n\t if (!isElementVisible(wrapper)) {\n\t wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(function () {\n\t return visibilityWatcher(wrapper);\n\t });\n\t }\n\t wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n\t }\n\t\n\t function createElement(wrapper, insertAfter, insertElement) {\n\t var promises = null;\n\t var sibling = insertAfter > 0 ? buffer[insertAfter - 1].element : undefined;\n\t linker(function (clone, scope) {\n\t promises = insertElement(clone, sibling);\n\t wrapper.element = clone;\n\t wrapper.scope = scope;\n\t scope[itemName] = wrapper.item;\n\t });\n\t if (adapter.transform) adapter.transform(wrapper.scope, wrapper.element);\n\t return promises;\n\t }\n\t\n\t function updateDOM() {\n\t var promises = [];\n\t var toBePrepended = [];\n\t var toBeRemoved = [];\n\t var inserted = [];\n\t\n\t buffer.forEach(function (wrapper, i) {\n\t switch (wrapper.op) {\n\t case 'prepend':\n\t toBePrepended.unshift(wrapper);\n\t break;\n\t case 'append':\n\t insertWrapperContent(wrapper, i);\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'insert':\n\t promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n\t wrapper.op = 'none';\n\t inserted.push(wrapper);\n\t break;\n\t case 'remove':\n\t toBeRemoved.push(wrapper);\n\t }\n\t });\n\t\n\t toBeRemoved.forEach(function (wrapper) {\n\t return promises = promises.concat(buffer.remove(wrapper));\n\t });\n\t\n\t if (toBePrepended.length) toBePrepended.forEach(function (wrapper) {\n\t insertWrapperContent(wrapper);\n\t wrapper.op = 'none';\n\t });\n\t\n\t buffer.forEach(function (item, i) {\n\t return item.scope.$index = buffer.first + i;\n\t });\n\t\n\t return {\n\t prepended: toBePrepended,\n\t removed: toBeRemoved,\n\t inserted: inserted,\n\t animated: promises\n\t };\n\t }\n\t\n\t function updatePaddings(rid, updates) {\n\t // schedule another adjustBuffer after animation completion\n\t if (updates.animated.length) {\n\t $q.all(updates.animated).then(function () {\n\t viewport.adjustPadding();\n\t adjustBuffer(rid);\n\t });\n\t } else {\n\t viewport.adjustPadding();\n\t }\n\t }\n\t\n\t function enqueueFetch(rid, updates) {\n\t if (viewport.shouldLoadBottom()) {\n\t if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t if (pending.push(true) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t } else if (viewport.shouldLoadTop()) {\n\t if (!updates || buffer.effectiveHeight(updates.prepended) > 0 || pending[0]) {\n\t // this means that at least one item appended in the last batch has height > 0\n\t // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n\t // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n\t if (pending.push(false) === 1) {\n\t fetch(rid);\n\t adapter.loading(true);\n\t }\n\t }\n\t }\n\t }\n\t\n\t function adjustBuffer(rid) {\n\t if (!rid) {\n\t // dismiss pending requests\n\t pending = [];\n\t rid = ++ridActual;\n\t }\n\t\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid);\n\t\n\t if (!pending.length) {\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function adjustBufferAfterFetch(rid) {\n\t var updates = updateDOM();\n\t\n\t // We need the item bindings to be processed before we can do adjustment\n\t $timeout(function () {\n\t\n\t // show elements after data binging has been done\n\t updates.inserted.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t updates.prepended.forEach(function (w) {\n\t return w.element.removeClass('ng-hide');\n\t });\n\t\n\t viewport.adjustScrollTopAfterPrepend(updates);\n\t\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t updatePaddings(rid, updates);\n\t enqueueFetch(rid, updates);\n\t pending.shift();\n\t\n\t if (pending.length) fetch(rid);else {\n\t adapter.loading(false);\n\t bindEvents();\n\t adapter.calculateProperties();\n\t }\n\t });\n\t }\n\t\n\t function fetch(rid) {\n\t if (pending[0]) {\n\t // scrolling down\n\t if (buffer.length && !viewport.shouldLoadBottom()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchNext(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.eof = true;\n\t }\n\t\n\t if (result.length > 0) {\n\t viewport.clipTop();\n\t buffer.append(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t } else {\n\t // scrolling up\n\t if (buffer.length && !viewport.shouldLoadTop()) {\n\t adjustBufferAfterFetch(rid);\n\t } else {\n\t fetchPrevious(function (result) {\n\t if (isInvalid(rid)) {\n\t return;\n\t }\n\t\n\t if (result.length < bufferSize) {\n\t buffer.bof = true;\n\t // log 'bof is reached'\n\t }\n\t\n\t if (result.length > 0) {\n\t if (buffer.length) {\n\t viewport.clipBottom();\n\t }\n\t buffer.prepend(result);\n\t }\n\t\n\t adjustBufferAfterFetch(rid);\n\t });\n\t }\n\t }\n\t }\n\t\n\t function resizeAndScrollHandler() {\n\t if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\t\n\t enqueueFetch(ridActual);\n\t\n\t if (pending.length) {\n\t unbindEvents();\n\t } else {\n\t adapter.calculateProperties();\n\t $scope.$apply();\n\t }\n\t }\n\t }\n\t\n\t function wheelHandler(event) {\n\t if (!adapter.disabled) {\n\t var scrollTop = viewport[0].scrollTop;\n\t var yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\t\n\t if (scrollTop === 0 && !buffer.bof || scrollTop === yMax && !buffer.eof) {\n\t event.preventDefault();\n\t }\n\t }\n\t }\n\t }\n\t}]);\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*!\r\n\t globals: angular, window\r\n\t List of used element methods available in JQuery but not in JQuery Lite\r\n\t element.before(elem)\r\n\t element.height()\r\n\t element.outerHeight(true)\r\n\t element.height(value) = only for Top/Bottom padding elements\r\n\t element.scrollTop()\r\n\t element.scrollTop(value)\r\n\t */\n\t\n\tvar JQLiteExtras = function () {\n\t function JQLiteExtras() {\n\t _classCallCheck(this, JQLiteExtras);\n\t }\n\t\n\t _createClass(JQLiteExtras, [{\n\t key: 'registerFor',\n\t value: function registerFor(element) {\n\t var convertToPx = void 0,\n\t css = void 0,\n\t getStyle = void 0,\n\t isWindow = void 0;\n\t // angular implementation blows up if elem is the window\n\t css = angular.element.prototype.css;\n\t\n\t element.prototype.css = function (name, value) {\n\t var self = this;\n\t var elem = self[0];\n\t if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\n\t return css.call(self, name, value);\n\t }\n\t };\n\t\n\t // as defined in angularjs v1.0.5\n\t isWindow = function isWindow(obj) {\n\t return obj && obj.document && obj.location && obj.alert && obj.setInterval;\n\t };\n\t\n\t function scrollTo(self, direction, value) {\n\t var elem = self[0];\n\t\n\t var _top$left$direction = _slicedToArray({\n\t top: ['scrollTop', 'pageYOffset', 'scrollLeft'],\n\t left: ['scrollLeft', 'pageXOffset', 'scrollTop']\n\t }[direction], 3),\n\t method = _top$left$direction[0],\n\t prop = _top$left$direction[1],\n\t preserve = _top$left$direction[2];\n\t\n\t if (isWindow(elem)) {\n\t if (angular.isDefined(value)) {\n\t return elem.scrollTo(self[preserve].call(self), value);\n\t }\n\t return prop in elem ? elem[prop] : elem.document.documentElement[method];\n\t } else {\n\t if (angular.isDefined(value)) {\n\t elem[method] = value;\n\t }\n\t return elem[method];\n\t }\n\t }\n\t\n\t if (window.getComputedStyle) {\n\t getStyle = function getStyle(elem) {\n\t return window.getComputedStyle(elem, null);\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t return parseFloat(value);\n\t };\n\t } else {\n\t getStyle = function getStyle(elem) {\n\t return elem.currentStyle;\n\t };\n\t convertToPx = function convertToPx(elem, value) {\n\t var left = void 0,\n\t result = void 0,\n\t rs = void 0,\n\t rsLeft = void 0,\n\t style = void 0;\n\t var core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\n\t var rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\n\t\n\t if (!rnumnonpx.test(value)) {\n\t return parseFloat(value);\n\t }\n\t\n\t // ported from JQuery\n\t style = elem.style;\n\t left = style.left;\n\t rs = elem.runtimeStyle;\n\t rsLeft = rs && rs.left;\n\t if (rs) {\n\t rs.left = style.left;\n\t }\n\t // put in the new values to get a computed style out\n\t style.left = value;\n\t result = style.pixelLeft;\n\t style.left = left;\n\t if (rsLeft) {\n\t rs.left = rsLeft;\n\t }\n\t return result;\n\t };\n\t }\n\t\n\t function getMeasurements(elem, measure) {\n\t var base = void 0,\n\t borderA = void 0,\n\t borderB = void 0,\n\t computedMarginA = void 0,\n\t computedMarginB = void 0,\n\t computedStyle = void 0,\n\t dirA = void 0,\n\t dirB = void 0,\n\t marginA = void 0,\n\t marginB = void 0,\n\t paddingA = void 0,\n\t paddingB = void 0;\n\t\n\t if (isWindow(elem)) {\n\t base = document.documentElement[{ height: 'clientHeight', width: 'clientWidth' }[measure]];\n\t\n\t return {\n\t base: base,\n\t padding: 0,\n\t border: 0,\n\t margin: 0\n\t };\n\t }\n\t\n\t // Start with offset property\n\t\n\t var _width$height$measure = _slicedToArray({\n\t width: [elem.offsetWidth, 'Left', 'Right'],\n\t height: [elem.offsetHeight, 'Top', 'Bottom']\n\t }[measure], 3);\n\t\n\t base = _width$height$measure[0];\n\t dirA = _width$height$measure[1];\n\t dirB = _width$height$measure[2];\n\t\n\t\n\t computedStyle = getStyle(elem);\n\t paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\n\t paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\n\t borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\n\t borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\n\t computedMarginA = computedStyle['margin' + dirA];\n\t computedMarginB = computedStyle['margin' + dirB];\n\t\n\t // I do not care for width for now, so this hack is irrelevant\n\t // if ( !supportsPercentMargin )\n\t // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\n\t // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\n\t marginA = convertToPx(elem, computedMarginA) || 0;\n\t marginB = convertToPx(elem, computedMarginB) || 0;\n\t\n\t return {\n\t base: base,\n\t padding: paddingA + paddingB,\n\t border: borderA + borderB,\n\t margin: marginA + marginB\n\t };\n\t }\n\t\n\t function getWidthHeight(elem, direction, measure) {\n\t var computedStyle = void 0,\n\t result = void 0;\n\t\n\t var measurements = getMeasurements(elem, direction);\n\t\n\t if (measurements.base > 0) {\n\t return {\n\t base: measurements.base - measurements.padding - measurements.border,\n\t outer: measurements.base,\n\t outerfull: measurements.base + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // Fall back to computed then uncomputed css if necessary\n\t computedStyle = getStyle(elem);\n\t result = computedStyle[direction];\n\t\n\t if (result < 0 || result === null) {\n\t result = elem.style[direction] || 0;\n\t }\n\t\n\t // Normalize \"\", auto, and prepare for extra\n\t result = parseFloat(result) || 0;\n\t\n\t return {\n\t base: result - measurements.padding - measurements.border,\n\t outer: result,\n\t outerfull: result + measurements.padding + measurements.border + measurements.margin\n\t }[measure];\n\t }\n\t\n\t // define missing methods\n\t return angular.forEach({\n\t before: function before(newElem) {\n\t var children, elem, i, j, parent, ref, self;\n\t self = this;\n\t elem = self[0];\n\t parent = self.parent();\n\t children = parent.contents();\n\t if (children[0] === elem) {\n\t return parent.prepend(newElem);\n\t } else {\n\t for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n\t if (children[i] === elem) {\n\t angular.element(children[i - 1]).after(newElem);\n\t return;\n\t }\n\t }\n\t throw new Error('invalid DOM structure ' + elem.outerHTML);\n\t }\n\t },\n\t height: function height(value) {\n\t var self;\n\t self = this;\n\t if (angular.isDefined(value)) {\n\t if (angular.isNumber(value)) {\n\t value = value + 'px';\n\t }\n\t return css.call(self, 'height', value);\n\t } else {\n\t return getWidthHeight(this[0], 'height', 'base');\n\t }\n\t },\n\t outerHeight: function outerHeight(option) {\n\t return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\n\t },\n\t outerWidth: function outerWidth(option) {\n\t return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\n\t },\n\t\n\t\n\t /*\r\n\t The offset setter method is not implemented\r\n\t */\n\t offset: function offset(value) {\n\t var docElem = void 0,\n\t win = void 0;\n\t var self = this;\n\t var box = {\n\t top: 0,\n\t left: 0\n\t };\n\t var elem = self[0];\n\t var doc = elem && elem.ownerDocument;\n\t\n\t if (arguments.length) {\n\t if (value === undefined) {\n\t return self;\n\t }\n\t // TODO: implement setter\n\t throw new Error('offset setter method is not implemented');\n\t }\n\t\n\t if (!doc) {\n\t return;\n\t }\n\t\n\t docElem = doc.documentElement;\n\t\n\t // TODO: Make sure it's not a disconnected DOM node\n\t\n\t if (elem.getBoundingClientRect != null) {\n\t box = elem.getBoundingClientRect();\n\t }\n\t\n\t win = doc.defaultView || doc.parentWindow;\n\t\n\t return {\n\t top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n\t left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n\t };\n\t },\n\t scrollTop: function scrollTop(value) {\n\t return scrollTo(this, 'top', value);\n\t },\n\t scrollLeft: function scrollLeft(value) {\n\t return scrollTo(this, 'left', value);\n\t }\n\t }, function (value, key) {\n\t if (!element.prototype[key]) {\n\t return element.prototype[key] = value;\n\t }\n\t });\n\t }\n\t }]);\n\t\n\t return JQLiteExtras;\n\t}();\n\t\n\texports.default = JQLiteExtras;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar ElementRoutines = function () {\n\t function ElementRoutines($injector, $q) {\n\t _classCallCheck(this, ElementRoutines);\n\t\n\t this.$animate = $injector.has && $injector.has('$animate') ? $injector.get('$animate') : null;\n\t this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\n\t this.$q = $q;\n\t }\n\t\n\t _createClass(ElementRoutines, [{\n\t key: 'insertElement',\n\t value: function insertElement(newElement, previousElement) {\n\t previousElement.after(newElement);\n\t return [];\n\t }\n\t }, {\n\t key: 'removeElement',\n\t value: function removeElement(wrapper) {\n\t wrapper.element.remove();\n\t wrapper.scope.$destroy();\n\t return [];\n\t }\n\t }, {\n\t key: 'insertElementAnimated',\n\t value: function insertElementAnimated(newElement, previousElement) {\n\t var _this = this;\n\t\n\t if (!this.$animate) {\n\t return this.insertElement(newElement, previousElement);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret = function () {\n\t var deferred = _this.$q.defer();\n\t // no need for parent - previous element is never null\n\t _this.$animate.enter(newElement, null, previousElement, function () {\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n\t }\n\t\n\t // no need for parent - previous element is never null\n\t return [this.$animate.enter(newElement, null, previousElement)];\n\t }\n\t }, {\n\t key: 'removeElementAnimated',\n\t value: function removeElementAnimated(wrapper) {\n\t var _this2 = this;\n\t\n\t if (!this.$animate) {\n\t return this.removeElement(wrapper);\n\t }\n\t\n\t if (this.isAngularVersionLessThen1_3) {\n\t var _ret2 = function () {\n\t var deferred = _this2.$q.defer();\n\t _this2.$animate.leave(wrapper.element, function () {\n\t wrapper.scope.$destroy();\n\t return deferred.resolve();\n\t });\n\t\n\t return {\n\t v: [deferred.promise]\n\t };\n\t }();\n\t\n\t if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n\t }\n\t\n\t return [this.$animate.leave(wrapper.element).then(function () {\n\t return wrapper.scope.$destroy();\n\t })];\n\t }\n\t }]);\n\t\n\t return ElementRoutines;\n\t}();\n\t\n\texports.default = ElementRoutines;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = ScrollBuffer;\n\tfunction ScrollBuffer(elementRoutines, bufferSize) {\n\t var buffer = Object.create(Array.prototype);\n\t\n\t angular.extend(buffer, {\n\t size: bufferSize,\n\t\n\t reset: function reset(startIndex) {\n\t buffer.remove(0, buffer.length);\n\t buffer.eof = false;\n\t buffer.bof = false;\n\t buffer.first = startIndex;\n\t buffer.next = startIndex;\n\t buffer.minIndex = startIndex;\n\t buffer.maxIndex = startIndex;\n\t buffer.minIndexUser = null;\n\t buffer.maxIndexUser = null;\n\t },\n\t append: function append(items) {\n\t items.forEach(function (item) {\n\t ++buffer.next;\n\t buffer.insert('append', item);\n\t });\n\t buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\n\t },\n\t prepend: function prepend(items) {\n\t items.reverse().forEach(function (item) {\n\t --buffer.first;\n\t buffer.insert('prepend', item);\n\t });\n\t buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\n\t },\n\t\n\t\n\t /**\r\n\t * inserts wrapped element in the buffer\r\n\t * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n\t * for insert the number is the index for the buffer element the new one have to be inserted after\r\n\t * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n\t */\n\t insert: function insert(operation, item) {\n\t var wrapper = {\n\t item: item\n\t };\n\t\n\t if (operation % 1 === 0) {\n\t // it is an insert\n\t wrapper.op = 'insert';\n\t buffer.splice(operation, 0, wrapper);\n\t } else {\n\t wrapper.op = operation;\n\t switch (operation) {\n\t case 'append':\n\t buffer.push(wrapper);\n\t break;\n\t case 'prepend':\n\t buffer.unshift(wrapper);\n\t break;\n\t }\n\t }\n\t },\n\t\n\t\n\t // removes elements from buffer\n\t remove: function remove(arg1, arg2) {\n\t if (angular.isNumber(arg1)) {\n\t // removes items from arg1 (including) through arg2 (excluding)\n\t for (var i = arg1; i < arg2; i++) {\n\t elementRoutines.removeElement(buffer[i]);\n\t }\n\t\n\t return buffer.splice(arg1, arg2 - arg1);\n\t }\n\t // removes single item(wrapper) from the buffer\n\t buffer.splice(buffer.indexOf(arg1), 1);\n\t\n\t return elementRoutines.removeElementAnimated(arg1);\n\t },\n\t effectiveHeight: function effectiveHeight(elements) {\n\t if (!elements.length) {\n\t return 0;\n\t }\n\t var top = Number.MAX_VALUE;\n\t var bottom = Number.MIN_VALUE;\n\t elements.forEach(function (wrapper) {\n\t if (wrapper.element[0].offsetParent) {\n\t // element style is not display:none\n\t top = Math.min(top, wrapper.element.offset().top);\n\t bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\n\t }\n\t });\n\t return Math.max(0, bottom - top);\n\t }\n\t });\n\t\n\t return buffer;\n\t}\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Viewport;\n\t\n\tvar _padding = __webpack_require__(5);\n\t\n\tvar _padding2 = _interopRequireDefault(_padding);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\n\t var topPadding = null;\n\t var bottomPadding = null;\n\t var viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\n\t var container = viewportController && viewportController.container ? viewportController.container : undefined;\n\t var scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\n\t\n\t viewport.css({\n\t 'overflow-anchor': 'none',\n\t 'overflow-y': 'auto',\n\t 'display': 'block'\n\t });\n\t\n\t function bufferPadding() {\n\t return viewport.outerHeight() * padding; // some extra space to initiate preload\n\t }\n\t\n\t angular.extend(viewport, {\n\t getScope: function getScope() {\n\t return scope;\n\t },\n\t createPaddingElements: function createPaddingElements(template) {\n\t topPadding = new _padding2.default(template);\n\t bottomPadding = new _padding2.default(template);\n\t element.before(topPadding);\n\t element.after(bottomPadding);\n\t },\n\t applyContainerStyle: function applyContainerStyle() {\n\t if (container && container !== viewport) {\n\t viewport.css('height', window.getComputedStyle(container[0]).height);\n\t }\n\t },\n\t bottomDataPos: function bottomDataPos() {\n\t var scrollHeight = viewport[0].scrollHeight;\n\t scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\n\t return scrollHeight - bottomPadding.height();\n\t },\n\t topDataPos: function topDataPos() {\n\t return topPadding.height();\n\t },\n\t bottomVisiblePos: function bottomVisiblePos() {\n\t return viewport.scrollTop() + viewport.outerHeight();\n\t },\n\t topVisiblePos: function topVisiblePos() {\n\t return viewport.scrollTop();\n\t },\n\t insertElement: function insertElement(e, sibling) {\n\t return elementRoutines.insertElement(e, sibling || topPadding);\n\t },\n\t insertElementAnimated: function insertElementAnimated(e, sibling) {\n\t return elementRoutines.insertElementAnimated(e, sibling || topPadding);\n\t },\n\t shouldLoadBottom: function shouldLoadBottom() {\n\t return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\n\t },\n\t clipBottom: function clipBottom() {\n\t // clip the invisible items off the bottom\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\n\t\n\t for (var i = buffer.length - 1; i >= 0; i--) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t bottomPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t buffer.eof = false;\n\t buffer.remove(buffer.length - overage, buffer.length);\n\t buffer.next -= overage;\n\t viewport.adjustPadding();\n\t }\n\t },\n\t shouldLoadTop: function shouldLoadTop() {\n\t return !buffer.bof && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding();\n\t },\n\t clipTop: function clipTop() {\n\t // clip the invisible items off the top\n\t var overage = 0;\n\t var overageHeight = 0;\n\t var itemHeight = 0;\n\t var emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\n\t\n\t for (var i = 0; i < buffer.length; i++) {\n\t itemHeight = buffer[i].element.outerHeight(true);\n\t if (overageHeight + itemHeight > emptySpaceHeight) {\n\t break;\n\t }\n\t topPadding.cache.add(buffer[i]);\n\t overageHeight += itemHeight;\n\t overage++;\n\t }\n\t\n\t if (overage > 0) {\n\t // we need to adjust top padding element before items are removed from top\n\t // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\n\t topPadding.height(topPadding.height() + overageHeight);\n\t buffer.bof = false;\n\t buffer.remove(0, overage);\n\t buffer.first += overage;\n\t }\n\t },\n\t adjustPadding: function adjustPadding() {\n\t if (!buffer.length) {\n\t return;\n\t }\n\t\n\t // precise heights calculation, items that were in buffer once\n\t var topPaddingHeight = topPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index < buffer.first ? item.height : 0);\n\t }, 0);\n\t var bottomPaddingHeight = bottomPadding.cache.reduce(function (summ, item) {\n\t return summ + (item.index >= buffer.next ? item.height : 0);\n\t }, 0);\n\t\n\t // average item height based on buffer data\n\t var visibleItemsHeight = buffer.reduce(function (summ, item) {\n\t return summ + item.element.outerHeight(true);\n\t }, 0);\n\t var averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\n\t\n\t // average heights calculation, items that have never been reached\n\t var adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\n\t var adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\n\t var topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\n\t var bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\n\t\n\t // paddings combine adjustment\n\t topPadding.height(topPaddingHeight + topPaddingHeightAdd);\n\t bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\n\t },\n\t adjustScrollTopAfterMinIndexSet: function adjustScrollTopAfterMinIndexSet(topPaddingHeightOld) {\n\t // additional scrollTop adjustment in case of datasource.minIndex external set\n\t if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\n\t var diff = topPadding.height() - topPaddingHeightOld;\n\t viewport.scrollTop(viewport.scrollTop() + diff);\n\t }\n\t },\n\t adjustScrollTopAfterPrepend: function adjustScrollTopAfterPrepend(updates) {\n\t if (!updates.prepended.length) return;\n\t var height = buffer.effectiveHeight(updates.prepended);\n\t var paddingHeight = topPadding.height() - height;\n\t if (paddingHeight >= 0) {\n\t topPadding.height(paddingHeight);\n\t } else {\n\t topPadding.height(0);\n\t viewport.scrollTop(viewport.scrollTop() - paddingHeight);\n\t }\n\t },\n\t resetTopPadding: function resetTopPadding() {\n\t topPadding.height(0);\n\t topPadding.cache.clear();\n\t },\n\t resetBottomPadding: function resetBottomPadding() {\n\t bottomPadding.height(0);\n\t bottomPadding.cache.clear();\n\t }\n\t });\n\t\n\t return viewport;\n\t}\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = Padding;\n\tfunction Cache() {\n\t var cache = Object.create(Array.prototype);\n\t\n\t angular.extend(cache, {\n\t add: function add(item) {\n\t for (var i = cache.length - 1; i >= 0; i--) {\n\t if (cache[i].index === item.scope.$index) {\n\t cache[i].height = item.element.outerHeight();\n\t return;\n\t }\n\t }\n\t cache.push({\n\t index: item.scope.$index,\n\t height: item.element.outerHeight()\n\t });\n\t },\n\t clear: function clear() {\n\t cache.length = 0;\n\t }\n\t });\n\t\n\t return cache;\n\t}\n\t\n\tfunction Padding(template) {\n\t var result = void 0;\n\t\n\t switch (template.tagName) {\n\t case 'dl':\n\t throw new Error('ui-scroll directive does not support <' + template.tagName + '> as a repeating tag: ' + template.outerHTML);\n\t case 'tr':\n\t var table = angular.element('
    ');\n\t result = table.find('tr');\n\t break;\n\t case 'li':\n\t result = angular.element('
  • ');\n\t break;\n\t default:\n\t result = angular.element('
    ');\n\t }\n\t\n\t result.cache = new Cache();\n\t\n\t return result;\n\t}\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction getCtrlOnData(attr, element) {\n\t var onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\n\t if (onSyntax && onSyntax.length === 4) {\n\t window.console.log('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\n\t var ctrl = onSyntax[3];\n\t var tail = onSyntax[1];\n\t var candidate = element;\n\t while (candidate.length) {\n\t var candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\n\t var candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\n\t if (candidateName && candidateName[1] === ctrl) {\n\t return {\n\t target: candidateScope,\n\t source: tail\n\t };\n\t }\n\t candidate = candidate.parent();\n\t }\n\t throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\n\t }\n\t}\n\t\n\tvar Adapter = function () {\n\t function Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope) {\n\t _classCallCheck(this, Adapter);\n\t\n\t this.viewport = viewport;\n\t this.buffer = buffer;\n\t this.adjustBuffer = adjustBuffer;\n\t this.reload = reload;\n\t\n\t this.isLoading = false;\n\t this.disabled = false;\n\t\n\t var viewportScope = viewport.getScope();\n\t this.startScope = viewportScope.$parent ? viewportScope : $scope;\n\t\n\t this.publicContext = {};\n\t this.assignAdapter($attr.adapter, $parse, element);\n\t this.generatePublicContext($attr, $parse);\n\t }\n\t\n\t _createClass(Adapter, [{\n\t key: 'assignAdapter',\n\t value: function assignAdapter(adapterAttr, $parse, element) {\n\t if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\n\t return;\n\t }\n\t var ctrlOnData = getCtrlOnData(adapterAttr, element);\n\t var adapterOnScope = void 0;\n\t\n\t try {\n\t if (ctrlOnData) {\n\t // \"Controller On\", deprecated since v1.6.1\n\t $parse(ctrlOnData.source).assign(ctrlOnData.target, {});\n\t adapterOnScope = $parse(ctrlOnData.source)(ctrlOnData.target);\n\t } else {\n\t $parse(adapterAttr).assign(this.startScope, {});\n\t adapterOnScope = $parse(adapterAttr)(this.startScope);\n\t }\n\t } catch (error) {\n\t error.message = 'Angular ui-scroll Adapter assignment exception.\\n' + ('Can\\'t parse \"' + adapterAttr + '\" expression.\\n') + error.message;\n\t throw error;\n\t }\n\t\n\t angular.extend(adapterOnScope, this.publicContext);\n\t this.publicContext = adapterOnScope;\n\t }\n\t }, {\n\t key: 'generatePublicContext',\n\t value: function generatePublicContext($attr, $parse) {\n\t var _this = this;\n\t\n\t // these methods will be accessible out of ui-scroll via user defined adapter\n\t var publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\n\t for (var i = publicMethods.length - 1; i >= 0; i--) {\n\t this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\n\t }\n\t\n\t // these read-only props will be accessible out of ui-scroll via user defined adapter\n\t var publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope'];\n\t\n\t var _loop = function _loop(_i) {\n\t var property = void 0,\n\t attr = $attr[publicProps[_i]];\n\t Object.defineProperty(_this, publicProps[_i], {\n\t get: function get() {\n\t return property;\n\t },\n\t set: function set(value) {\n\t property = value;\n\t _this.publicContext[publicProps[_i]] = value;\n\t if (attr) {\n\t $parse(attr).assign(_this.startScope, value);\n\t }\n\t }\n\t });\n\t };\n\t\n\t for (var _i = publicProps.length - 1; _i >= 0; _i--) {\n\t _loop(_i);\n\t }\n\t\n\t // non-read-only public property\n\t Object.defineProperty(this.publicContext, 'disabled', {\n\t get: function get() {\n\t return _this.disabled;\n\t },\n\t set: function set(value) {\n\t return !(_this.disabled = value) ? _this.adjustBuffer() : null;\n\t }\n\t });\n\t }\n\t }, {\n\t key: 'loading',\n\t value: function loading(value) {\n\t this['isLoading'] = value;\n\t }\n\t }, {\n\t key: 'isBOF',\n\t value: function isBOF() {\n\t return this.buffer.bof;\n\t }\n\t }, {\n\t key: 'isEOF',\n\t value: function isEOF() {\n\t return this.buffer.eof;\n\t }\n\t }, {\n\t key: 'isEmpty',\n\t value: function isEmpty() {\n\t return !this.buffer.length;\n\t }\n\t }, {\n\t key: 'applyUpdates',\n\t value: function applyUpdates(arg1, arg2) {\n\t var _this2 = this;\n\t\n\t if (angular.isFunction(arg1)) {\n\t // arg1 is the updater function, arg2 is ignored\n\t this.buffer.slice(0).forEach(function (wrapper) {\n\t // we need to do it on the buffer clone, because buffer content\n\t // may change as we iterate through\n\t _this2.applyUpdate(wrapper, arg1(wrapper.item, wrapper.scope, wrapper.element));\n\t });\n\t } else {\n\t // arg1 is item index, arg2 is the newItems array\n\t if (arg1 % 1 !== 0) {\n\t // checking if it is an integer\n\t throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\n\t }\n\t\n\t var index = arg1 - this.buffer.first;\n\t if (index >= 0 && index < this.buffer.length) {\n\t this.applyUpdate(this.buffer[index], arg2);\n\t }\n\t }\n\t\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'append',\n\t value: function append(newItems) {\n\t this.buffer.append(newItems);\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'prepend',\n\t value: function prepend(newItems) {\n\t this.buffer.prepend(newItems);\n\t this.adjustBuffer();\n\t }\n\t }, {\n\t key: 'calculateProperties',\n\t value: function calculateProperties() {\n\t var item = void 0,\n\t itemHeight = void 0,\n\t itemTop = void 0,\n\t isNewRow = void 0,\n\t rowTop = null;\n\t var topHeight = 0;\n\t for (var i = 0; i < this.buffer.length; i++) {\n\t item = this.buffer[i];\n\t itemTop = item.element.offset().top;\n\t isNewRow = rowTop !== itemTop;\n\t rowTop = itemTop;\n\t if (isNewRow) {\n\t itemHeight = item.element.outerHeight(true);\n\t }\n\t if (isNewRow && this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos()) {\n\t topHeight += itemHeight;\n\t } else {\n\t if (isNewRow) {\n\t this['topVisible'] = item.item;\n\t this['topVisibleElement'] = item.element;\n\t this['topVisibleScope'] = item.scope;\n\t }\n\t break;\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'applyUpdate',\n\t value: function applyUpdate(wrapper, newItems) {\n\t var _this3 = this;\n\t\n\t if (!angular.isArray(newItems)) {\n\t return;\n\t }\n\t\n\t var keepIt = void 0;\n\t var pos = this.buffer.indexOf(wrapper) + 1;\n\t\n\t newItems.reverse().forEach(function (newItem) {\n\t if (newItem === wrapper.item) {\n\t keepIt = true;\n\t pos--;\n\t } else {\n\t _this3.buffer.insert(pos, newItem);\n\t }\n\t });\n\t\n\t if (!keepIt) {\n\t wrapper.op = 'remove';\n\t }\n\t }\n\t }]);\n\t\n\t return Adapter;\n\t}();\n\t\n\texports.default = Adapter;\n\n/***/ }\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// ui-scroll.min.js"," \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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 7beb37c5cc746a38af3d","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 .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\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 '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $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 parseNumericAttr(value, defaultValue) {\n let result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\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\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));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0;// current data revision id\n let pending = [];\n\n let elementRoutines = new ElementRoutines($injector, $q);\n let buffer = new ScrollBuffer(elementRoutines, bufferSize);\n let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);\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 indexStore = {};\n\n function defineProperty(datasource, propName, propUserName) {\n let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (!descriptor || (!descriptor.set && !descriptor.get)) {\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n indexStore[propName] = value;\n $timeout(() => {\n buffer[propUserName] = value;\n if (!pending.length) {\n let topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPadding();\n if (propName === 'minIndex') {\n viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);\n }\n }\n });\n },\n get: () => indexStore[propName]\n });\n }\n }\n\n defineProperty(datasource, 'minIndex', 'minIndexUser');\n defineProperty(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ? (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) ? (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 /**\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 $timeout(() => {\n viewport.applyContainerStyle();\n reload();\n });\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 viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n adjustBuffer();\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 (angular.isFunction(item.unregisterVisibilityWatcher)) {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n adjustBuffer();\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 wrapper.element.addClass('ng-hide'); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n let 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 if (adapter.transform)\n adapter.transform(wrapper.scope, wrapper.element);\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(buffer.remove(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 adjustBuffer after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPadding();\n adjustBuffer(rid);\n });\n } else {\n viewport.adjustPadding();\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 fetch(rid);\n adapter.loading(true);\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 fetch(rid);\n adapter.loading(true);\n }\n }\n }\n }\n\n function adjustBuffer(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\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\n function adjustBufferAfterFetch(rid) {\n let updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustment\n $timeout(() => {\n\n // show elements after data binging has been done\n updates.inserted.forEach(w => w.element.removeClass('ng-hide'));\n updates.prepended.forEach(w => w.element.removeClass('ng-hide'));\n\n viewport.adjustScrollTopAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\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\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n adjustBufferAfterFetch(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 adjustBufferAfterFetch(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.$apply();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n let scrollTop = viewport[0].scrollTop;\n let 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\n\n// WEBPACK FOOTER //\n// ./src/ui-scroll.js","/*!\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 if (isWindow(elem)) {\r\n if (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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 (angular.isDefined(value)) {\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\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","export default class ElementRoutines {\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 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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize) {\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) {\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 } 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\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\r\n return elementRoutines.removeElementAnimated(arg1);\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.MIN_VALUE;\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 });\r\n\r\n return buffer;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","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);\r\n element.after(bottomPadding);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (container && container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\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);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding);\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.adjustPadding();\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 adjustPadding() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation, items that were in buffer once\r\n let topPaddingHeight = topPadding.cache.reduce((summ, item) => summ + (item.index < buffer.first ? item.height : 0), 0);\r\n let bottomPaddingHeight = bottomPadding.cache.reduce((summ, item) => summ + (item.index >= buffer.next ? item.height : 0), 0);\r\n\r\n // average item height based on buffer data\r\n let visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n let averageItemHeight = (visibleItemsHeight + topPaddingHeight + bottomPaddingHeight) / (buffer.maxIndex - buffer.minIndex + 1);\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 adjustScrollTopAfterMinIndexSet(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 }\r\n },\r\n\r\n adjustScrollTopAfterPrepend(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\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","function Cache() {\r\n const cache = Object.create(Array.prototype);\r\n\r\n angular.extend(cache, {\r\n add(item) {\r\n for (let i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i].index === item.scope.$index) {\r\n cache[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n cache.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n },\r\n clear() {\r\n cache.length = 0;\r\n }\r\n });\r\n\r\n return cache;\r\n}\r\n\r\nexport default function Padding(template) {\r\n let result;\r\n\r\n switch (template.tagName) {\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 result = table.find('tr');\r\n break;\r\n case 'li':\r\n result = angular.element('
  • ');\r\n break;\r\n default:\r\n result = angular.element('
    ');\r\n }\r\n\r\n result.cache = new Cache();\r\n\r\n return result;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","function getCtrlOnData(attr, element) {\r\n let onSyntax = attr.match(/^(.+)(\\s+on\\s+)(.+)?/);\r\n if (onSyntax && onSyntax.length === 4) {\r\n window.console.log('Angular ui-scroll adapter assignment warning. \"Controller On\" syntax has been deprecated since ui-scroll v1.6.1.');\r\n let ctrl = onSyntax[3];\r\n let tail = onSyntax[1];\r\n let candidate = element;\r\n while (candidate.length) {\r\n let candidateScope = candidate.scope(); // doesn't work when debugInfoEnabled flag = true\r\n let candidateName = (candidate.attr('ng-controller') || '').match(/(\\w(?:\\w|\\d)*)(?:\\s+as\\s+(\\w(?:\\w|\\d)*))?/);\r\n if (candidateName && candidateName[1] === ctrl) {\r\n return {\r\n target: candidateScope,\r\n source: tail\r\n };\r\n }\r\n candidate = candidate.parent();\r\n }\r\n throw new Error('Angular ui-scroll adapter assignment error. Failed to locate target controller \"' + ctrl + '\" to inject \"' + tail + '\"');\r\n }\r\n}\r\n\r\nclass Adapter {\r\n\r\n constructor(viewport, buffer, adjustBuffer, reload, $attr, $parse, element, $scope) {\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n this.adjustBuffer = adjustBuffer;\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, $parse, element);\r\n this.generatePublicContext($attr, $parse);\r\n }\r\n\r\n assignAdapter(adapterAttr, $parse, element) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let ctrlOnData = getCtrlOnData(adapterAttr, element);\r\n let adapterOnScope;\r\n\r\n try {\r\n if (ctrlOnData) { // \"Controller On\", deprecated since v1.6.1\r\n $parse(ctrlOnData.source).assign(ctrlOnData.target, {});\r\n adapterOnScope = $parse(ctrlOnData.source)(ctrlOnData.target);\r\n }\r\n else {\r\n $parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = $parse(adapterAttr)(this.startScope);\r\n }\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($attr, $parse) {\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'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = $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 $parse(attr).assign(this.startScope, value);\r\n }\r\n }\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.adjustBuffer() : 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 applyUpdates(arg1, arg2) {\r\n if (angular.isFunction(arg1)) {\r\n // arg1 is the updater function, arg2 is ignored\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, arg1(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n } else {\r\n // arg1 is item index, arg2 is the newItems array\r\n if (arg1 % 1 !== 0) {// checking if it is an integer\r\n throw new Error('applyUpdates - ' + arg1 + ' is not a valid index');\r\n }\r\n\r\n const index = arg1 - this.buffer.first;\r\n if ((index >= 0 && index < this.buffer.length)) {\r\n this.applyUpdate(this.buffer[index], arg2);\r\n }\r\n }\r\n\r\n this.adjustBuffer();\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.adjustBuffer();\r\n }\r\n\r\n calculateProperties() {\r\n let item, itemHeight, itemTop, isNewRow, rowTop = null;\r\n let topHeight = 0;\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n item = this.buffer[i];\r\n itemTop = item.element.offset().top;\r\n isNewRow = rowTop !== itemTop;\r\n rowTop = itemTop;\r\n if (isNewRow) {\r\n itemHeight = item.element.outerHeight(true);\r\n }\r\n if (isNewRow && (this.viewport.topDataPos() + topHeight + itemHeight <= this.viewport.topVisiblePos())) {\r\n topHeight += itemHeight;\r\n } else {\r\n if (isNewRow) {\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n break;\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\r\n let keepIt;\r\n let pos = (this.buffer.indexOf(wrapper)) + 1;\r\n\r\n newItems.reverse().forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n keepIt = true;\r\n pos--;\r\n } else {\r\n this.buffer.insert(pos, newItem);\r\n }\r\n });\r\n\r\n if (!keepIt) {\r\n wrapper.op = 'remove';\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file diff --git a/src/modules/adapter.js b/src/modules/adapter.js index 3dfb6003..fc4e8ed8 100644 --- a/src/modules/adapter.js +++ b/src/modules/adapter.js @@ -1,7 +1,7 @@ function getCtrlOnData(attr, element) { let onSyntax = attr.match(/^(.+)(\s+on\s+)(.+)?/); if (onSyntax && onSyntax.length === 4) { - window.console.warn('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.'); + window.console.log('Angular ui-scroll adapter assignment warning. "Controller On" syntax has been deprecated since ui-scroll v1.6.1.'); let ctrl = onSyntax[3]; let tail = onSyntax[1]; let candidate = element; From 625d25e6891b00e8a63dc3a75e9c626ed533b9ef Mon Sep 17 00:00:00 2001 From: dhilt Date: Mon, 6 Mar 2017 11:42:14 +0300 Subject: [PATCH 7/7] "dev" npm script --- Gruntfile.js | 6 ++++-- README.md | 13 +++++++++++-- package.json | 8 +++++--- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 2ce1018c..9f4056b3 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -126,12 +126,14 @@ module.exports = function (grunt) { }); grunt.registerTask('server', [ - 'webpack:default', 'connect', 'watch' ]); - grunt.registerTask('default', ['server']); + grunt.registerTask('default', [ + 'webpack:default', + 'server' + ]); grunt.registerTask('test', [ 'clean:temp', diff --git a/README.md b/README.md index 62d433d2..c15de738 100644 --- a/README.md +++ b/README.md @@ -403,7 +403,7 @@ The ui-scroll sources are in [./src](https://github.com/angular-ui/ui-scroll/tre because of ES6 modules (since v1.6.0), they should be built. Build process includes jshint sources verification, webpack-based distributive files forming and tests running. -Three npm scripts are available for developing. +There are some npm scripts available for developing. __1__. To run dev-server use @@ -426,7 +426,16 @@ npm test than 160 tests. They are living at the [./test](https://github.com/angular-ui/ui-scroll/tree/master/test) folder. Karma watches for temp and test folders changes and automatically re-runs tests. - __3__. To run full build use + __3__. To run both dev-server and tests in keep-alive mode use + +``` +npm run dev +``` + + This is the combination of first two scripts running in concurrently mode. This allows you to work with the ui-scroll examples on 5005 port + during continuous tests running. + + __4__. To run full build process use ``` npm run build diff --git a/package.json b/package.json index ac2f15ba..ed80c2a6 100644 --- a/package.json +++ b/package.json @@ -19,15 +19,17 @@ }, "license": "MIT", "scripts": { - "start": "grunt server", - "build": "grunt build", - "test": "grunt test" + "start": "grunt", + "test": "grunt test", + "dev": "concurrently --kill-others --raw \"grunt server\" \"grunt test\"", + "build": "grunt build" }, "devDependencies": { "babel-core": "^6.22.1", "babel-loader": "^6.2.10", "babel-preset-es2015": "^6.22.0", "clean-webpack-plugin": "^0.1.15", + "concurrently": "^3.4.0", "express": "^4.14.0", "grunt": "^1.0.1", "grunt-contrib-clean": "^1.0.0",