diff --git a/bower.json b/bower.json index f9d7f0ee..d2c37bc2 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "angular-ui-scroll", "description": "AngularJS infinite scrolling module", - "version": "1.7.2", + "version": "1.8.0-rc", "main": "./dist/ui-scroll.js", "homepage": "https://github.com/angular-ui/ui-scroll.git", "license": "MIT", diff --git a/demo/serviceDatasource/serviceDatasource.html b/demo/serviceDatasource/serviceDatasource.html index 030ac514..a3744d2d 100644 --- a/demo/serviceDatasource/serviceDatasource.html +++ b/demo/serviceDatasource/serviceDatasource.html @@ -39,10 +39,14 @@

Datasource as service

-
{{item}}
+
+
{{item}} ************ {{$index}}
+
{{item}} ************ {{$index}} OOOOOOOOOOOO
+
{{item}}
+
- \ No newline at end of file + diff --git a/demo/serviceDatasource/serviceDatasource.js b/demo/serviceDatasource/serviceDatasource.js index b8eab711..92b31b2c 100644 --- a/demo/serviceDatasource/serviceDatasource.js +++ b/demo/serviceDatasource/serviceDatasource.js @@ -9,7 +9,7 @@ angular.module('application', ['ui.scroll']) result.push("item #" + i); } success(result); - }, 100); + }, 700); }; return { diff --git a/dist/ui-scroll-grid.js b/dist/ui-scroll-grid.js index f930ebbe..43a32ea3 100644 --- a/dist/ui-scroll-grid.js +++ b/dist/ui-scroll-grid.js @@ -1,7 +1,7 @@ /*! * angular-ui-scroll * https://github.com/angular-ui/ui-scroll - * Version: 1.7.2 -- 2018-07-26T04:32:37.367Z + * Version: 1.8.0-rc -- 2018-08-13T12:05:10.496Z * License: MIT */ /******/ (function(modules) { // webpackBootstrap diff --git a/dist/ui-scroll-grid.js.map b/dist/ui-scroll-grid.js.map index 5c6464f6..c359203b 100644 --- a/dist/ui-scroll-grid.js.map +++ b/dist/ui-scroll-grid.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 8c9f7d12571bf2ad3771","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","tdInitializer","uiScrollTdInitializer","linking","$on","onLink"],"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 \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 7);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 8c9f7d12571bf2ad3771","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 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,\n 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 return;\n }\n let scope = $scope;\n let tdInitializer = $scope.uiScrollTdInitializer;\n if (!tdInitializer) {\n tdInitializer = $scope.uiScrollTdInitializer = {\n linking: true\n };\n }\n if (!tdInitializer.linking) {\n scope = tdInitializer.scope;\n }\n let gridController = controllers[0].gridController;\n if (gridController.registerCell(scope, element)) {\n $scope.$on('$destroy', () => gridController.unregisterCell(scope, element));\n }\n if (!tdInitializer.linking) {\n tdInitializer.onLink();\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 2386088bf7ce5bf5d4af","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","tdInitializer","uiScrollTdInitializer","linking","$on","onLink"],"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 \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 7);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2386088bf7ce5bf5d4af","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 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,\n 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 return;\n }\n let scope = $scope;\n let tdInitializer = $scope.uiScrollTdInitializer;\n if (!tdInitializer) {\n tdInitializer = $scope.uiScrollTdInitializer = {\n linking: true\n };\n }\n if (!tdInitializer.linking) {\n scope = tdInitializer.scope;\n }\n let gridController = controllers[0].gridController;\n if (gridController.registerCell(scope, element)) {\n $scope.$on('$destroy', () => gridController.unregisterCell(scope, element));\n }\n if (!tdInitializer.linking) {\n tdInitializer.onLink();\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 40515a6d..00c8a6ce 100644 --- a/dist/ui-scroll-grid.min.js +++ b/dist/ui-scroll-grid.min.js @@ -1,7 +1,7 @@ /*! * angular-ui-scroll * https://github.com/angular-ui/ui-scroll - * Version: 1.7.2 -- 2018-07-26T04:32:37.367Z + * Version: 1.8.0-rc -- 2018-08-13T12:05:10.496Z * License: MIT */ !function(t){function n(e){if(r[e])return r[e].exports;var o=r[e]={i:e,l:!1,exports:{}};return t[e].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r={};n.m=t,n.c=r,n.d=function(t,r,e){n.o(t,r)||Object.defineProperty(t,r,{configurable:!1,enumerable:!0,get:e})},n.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(r,"a",r),r},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=7)}({7:function(t,n,r){"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 e(t,n){this.css=function(){var r=arguments[0],e=arguments[1];if(1==arguments.length)return n.header.css(r);2==arguments.length&&(n.header.css(r,e),t.forEachRow(function(t){return t[n.id].css(r,e)}),n.css[r]=e)},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 o(t,n,r){function e(t,n,r){var e=t.offset();return!(n=c.length)&&(r.push(n),!0)},this.unregisterCell=function(t,n){var r=a.get(t),e=r.indexOf(n);r.splice(e,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 e(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 e=t.mapTo,o=null;r-=ee?1:0,t.mapTo+=t.mapTo>=r?1:0,o=t.mapTo===r+1?t:o}),t.mapTo=r,t.moveBefore(o)}},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 e(this,r):void 0}}return{require:["^^uiScrollViewport"],restrict:"A",link:function(t,n,r,e){e[0].gridController=e[0].gridController||new i(e[0]),e[0].gridController.registerColumn(n)}}}]).directive("uiScrollTd",function(){return{require:["?^^uiScrollViewport"],restrict:"A",link:function(t,n,r,e){if(e[0]){var o=t,i=t.uiScrollTdInitializer;i||(i=t.uiScrollTdInitializer={linking:!0}),i.linking||(o=i.scope);var u=e[0].gridController;u.registerCell(o,n)&&t.$on("$destroy",function(){return u.unregisterCell(o,n)}),i.linking||i.onLink()}}}})}}); diff --git a/dist/ui-scroll-grid.min.js.map b/dist/ui-scroll-grid.min.js.map index c86fc7eb..c1b801a0 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 8c9f7d12571bf2ad3771","webpack:///./src/ui-scroll-grid.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","7","angular","directive","console","$timeout","GridAdapter","controller","this","getLayout","applyLayout","layout","columnFromPoint","x","y","getColumns","ColumnAdapter","column","css","attr","arguments","value","length","header","forEachRow","row","id","moveBefore","index","exchangeWith","ColumnController","columns","insidePoint","element","offset","left","outerWidth","top","outerHeight","target","detach","before","moveLast","parent","append","applyCss","removeAttr","mapTo","extend","_this","_this2","result","GridController","scrollViewport","transform","visible","forEach","cell","_this3","rowMap","Map","adapter","publicContext","gridAdapter","scope","item","registerColumn","push","registerCell","set","unregisterCell","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","tdInitializer","uiScrollTdInitializer","linking","$on","onLink"],"mappings":"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","file":"ui-scroll-grid.min.js","sourcesContent":["/******/ (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/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 7:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nangular.module('ui.scroll.grid', []).directive('uiScrollTh', ['$log', '$timeout', function (console, $timeout) {\n\n function GridAdapter(controller) {\n\n this.getLayout = function () {\n return controller.getLayout();\n };\n\n this.applyLayout = function (layout) {\n return controller.applyLayout(layout);\n };\n\n this.columnFromPoint = function (x, y) {\n return controller.columnFromPoint(x, y);\n };\n\n Object.defineProperty(this, 'columns', { get: function get() {\n return controller.getColumns();\n } });\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(function (row) {\n return row[column.id].css(attr, value);\n });\n column.css[attr] = value;\n }\n };\n\n this.moveBefore = function (index) {\n return controller.moveBefore(column, index);\n };\n\n this.exchangeWith = function (index) {\n return controller.exchangeWith(column, index);\n };\n\n Object.defineProperty(this, 'columnId', { get: function get() {\n return column.id;\n } });\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 var _this = this;\n\n if (target) {\n moveBefore(header, target.header);\n controller.forEachRow(function (row) {\n return moveBefore(row[_this.id], row[target.id]);\n });\n } else {\n moveLast(header);\n controller.forEachRow(function (row) {\n return moveLast(row[_this.id]);\n });\n }\n };\n\n this.columnFromPoint = function (x, y) {\n var _this2 = this;\n\n if (insidePoint(header, x, y)) {\n return this;\n }\n var result = null;\n controller.forEachRow(function (row) {\n return result = insidePoint(row[_this2.id], x, y) ? _this2 : 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 var offset = element.offset();\n if (x < offset.left || offset.left + element.outerWidth(true) < x) return false;\n if (y < offset.top || offset.top + element.outerHeight(true) < y) 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 var parent = element.parent();\n element.detach();\n parent.append(element);\n }\n\n function applyCss(target, css) {\n target.removeAttr('style');\n for (var attr in css) {\n if (css.hasOwnProperty(attr)) {\n target.css(attr, css[attr]);\n }\n }\n }\n }\n\n function GridController(scrollViewport) {\n var _this3 = this;\n\n var columns = [];\n var rowMap = new Map();\n\n $timeout(function () {\n scrollViewport.adapter.publicContext.gridAdapter = new GridAdapter(_this3);\n scrollViewport.adapter.transform = function (scope, item) {\n return transform(rowMap.get(scope), item);\n };\n });\n\n this.registerColumn = function (header) {\n columns.push(new ColumnController(this, columns, header));\n };\n\n this.registerCell = function (scope, cell) {\n var 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 var row = rowMap.get(scope);\n var 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 var _this4 = this;\n\n var result = [];\n columns.slice().sort(function (a, b) {\n return a.mapTo - b.mapTo;\n }).forEach(function (column) {\n return result.push(new ColumnAdapter(_this4, column));\n });\n return result;\n };\n\n this.getLayout = function () {\n var result = [];\n columns.forEach(function (column, index) {\n return 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(function (layout, index) {\n return columns[index].applyLayout(layout);\n });\n transform(columns.map(function (column) {\n return column.header;\n }));\n rowMap.forEach(function (row) {\n return transform(row);\n });\n };\n\n this.moveBefore = function (selected, target) {\n var 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 var mapTo = selected.mapTo,\n next = null;\n index -= mapTo < index ? 1 : 0;\n\n columns.forEach(function (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(function (c) {\n return c.mapTo === index;\n }).mapTo = selected.mapTo;\n selected.mapTo = index;\n };\n\n this.columnFromPoint = function (x, y) {\n var column = columns.find(function (col) {\n return col.columnFromPoint(x, y);\n });\n return column ? new ColumnAdapter(this, column) : undefined;\n };\n\n // function definitions\n\n function transform(row) {\n var parent = row[0].parent();\n var visible = [];\n\n row.forEach(function (cell, index) {\n columns[index].applyCss(cell);\n visible[columns[index].mapTo] = row[index];\n row[index].detach();\n });\n\n visible.forEach(function (cell) {\n return parent.append(cell);\n });\n }\n }\n\n return {\n require: ['^^uiScrollViewport'],\n restrict: 'A',\n link: function 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}]).directive('uiScrollTd', function () {\n return {\n require: ['?^^uiScrollViewport'],\n restrict: 'A',\n link: function link($scope, element, $attr, controllers) {\n if (!controllers[0]) {\n return;\n }\n var scope = $scope;\n var tdInitializer = $scope.uiScrollTdInitializer;\n if (!tdInitializer) {\n tdInitializer = $scope.uiScrollTdInitializer = {\n linking: true\n };\n }\n if (!tdInitializer.linking) {\n scope = tdInitializer.scope;\n }\n var gridController = controllers[0].gridController;\n if (gridController.registerCell(scope, element)) {\n $scope.$on('$destroy', function () {\n return gridController.unregisterCell(scope, element);\n });\n }\n if (!tdInitializer.linking) {\n tdInitializer.onLink();\n }\n }\n };\n});\n\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 \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 7);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 8c9f7d12571bf2ad3771","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 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,\n 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 return;\n }\n let scope = $scope;\n let tdInitializer = $scope.uiScrollTdInitializer;\n if (!tdInitializer) {\n tdInitializer = $scope.uiScrollTdInitializer = {\n linking: true\n };\n }\n if (!tdInitializer.linking) {\n scope = tdInitializer.scope;\n }\n let gridController = controllers[0].gridController;\n if (gridController.registerCell(scope, element)) {\n $scope.$on('$destroy', () => gridController.unregisterCell(scope, element));\n }\n if (!tdInitializer.linking) {\n tdInitializer.onLink();\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 2386088bf7ce5bf5d4af","webpack:///./src/ui-scroll-grid.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","7","angular","directive","console","$timeout","GridAdapter","controller","this","getLayout","applyLayout","layout","columnFromPoint","x","y","getColumns","ColumnAdapter","column","css","attr","arguments","value","length","header","forEachRow","row","id","moveBefore","index","exchangeWith","ColumnController","columns","insidePoint","element","offset","left","outerWidth","top","outerHeight","target","detach","before","moveLast","parent","append","applyCss","removeAttr","mapTo","extend","_this","_this2","result","GridController","scrollViewport","transform","visible","forEach","cell","_this3","rowMap","Map","adapter","publicContext","gridAdapter","scope","item","registerColumn","push","registerCell","set","unregisterCell","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","tdInitializer","uiScrollTdInitializer","linking","$on","onLink"],"mappings":"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","file":"ui-scroll-grid.min.js","sourcesContent":["/******/ (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/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 7:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nangular.module('ui.scroll.grid', []).directive('uiScrollTh', ['$log', '$timeout', function (console, $timeout) {\n\n function GridAdapter(controller) {\n\n this.getLayout = function () {\n return controller.getLayout();\n };\n\n this.applyLayout = function (layout) {\n return controller.applyLayout(layout);\n };\n\n this.columnFromPoint = function (x, y) {\n return controller.columnFromPoint(x, y);\n };\n\n Object.defineProperty(this, 'columns', { get: function get() {\n return controller.getColumns();\n } });\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(function (row) {\n return row[column.id].css(attr, value);\n });\n column.css[attr] = value;\n }\n };\n\n this.moveBefore = function (index) {\n return controller.moveBefore(column, index);\n };\n\n this.exchangeWith = function (index) {\n return controller.exchangeWith(column, index);\n };\n\n Object.defineProperty(this, 'columnId', { get: function get() {\n return column.id;\n } });\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 var _this = this;\n\n if (target) {\n moveBefore(header, target.header);\n controller.forEachRow(function (row) {\n return moveBefore(row[_this.id], row[target.id]);\n });\n } else {\n moveLast(header);\n controller.forEachRow(function (row) {\n return moveLast(row[_this.id]);\n });\n }\n };\n\n this.columnFromPoint = function (x, y) {\n var _this2 = this;\n\n if (insidePoint(header, x, y)) {\n return this;\n }\n var result = null;\n controller.forEachRow(function (row) {\n return result = insidePoint(row[_this2.id], x, y) ? _this2 : 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 var offset = element.offset();\n if (x < offset.left || offset.left + element.outerWidth(true) < x) return false;\n if (y < offset.top || offset.top + element.outerHeight(true) < y) 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 var parent = element.parent();\n element.detach();\n parent.append(element);\n }\n\n function applyCss(target, css) {\n target.removeAttr('style');\n for (var attr in css) {\n if (css.hasOwnProperty(attr)) {\n target.css(attr, css[attr]);\n }\n }\n }\n }\n\n function GridController(scrollViewport) {\n var _this3 = this;\n\n var columns = [];\n var rowMap = new Map();\n\n $timeout(function () {\n scrollViewport.adapter.publicContext.gridAdapter = new GridAdapter(_this3);\n scrollViewport.adapter.transform = function (scope, item) {\n return transform(rowMap.get(scope), item);\n };\n });\n\n this.registerColumn = function (header) {\n columns.push(new ColumnController(this, columns, header));\n };\n\n this.registerCell = function (scope, cell) {\n var 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 var row = rowMap.get(scope);\n var 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 var _this4 = this;\n\n var result = [];\n columns.slice().sort(function (a, b) {\n return a.mapTo - b.mapTo;\n }).forEach(function (column) {\n return result.push(new ColumnAdapter(_this4, column));\n });\n return result;\n };\n\n this.getLayout = function () {\n var result = [];\n columns.forEach(function (column, index) {\n return 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(function (layout, index) {\n return columns[index].applyLayout(layout);\n });\n transform(columns.map(function (column) {\n return column.header;\n }));\n rowMap.forEach(function (row) {\n return transform(row);\n });\n };\n\n this.moveBefore = function (selected, target) {\n var 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 var mapTo = selected.mapTo,\n next = null;\n index -= mapTo < index ? 1 : 0;\n\n columns.forEach(function (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(function (c) {\n return c.mapTo === index;\n }).mapTo = selected.mapTo;\n selected.mapTo = index;\n };\n\n this.columnFromPoint = function (x, y) {\n var column = columns.find(function (col) {\n return col.columnFromPoint(x, y);\n });\n return column ? new ColumnAdapter(this, column) : undefined;\n };\n\n // function definitions\n\n function transform(row) {\n var parent = row[0].parent();\n var visible = [];\n\n row.forEach(function (cell, index) {\n columns[index].applyCss(cell);\n visible[columns[index].mapTo] = row[index];\n row[index].detach();\n });\n\n visible.forEach(function (cell) {\n return parent.append(cell);\n });\n }\n }\n\n return {\n require: ['^^uiScrollViewport'],\n restrict: 'A',\n link: function 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}]).directive('uiScrollTd', function () {\n return {\n require: ['?^^uiScrollViewport'],\n restrict: 'A',\n link: function link($scope, element, $attr, controllers) {\n if (!controllers[0]) {\n return;\n }\n var scope = $scope;\n var tdInitializer = $scope.uiScrollTdInitializer;\n if (!tdInitializer) {\n tdInitializer = $scope.uiScrollTdInitializer = {\n linking: true\n };\n }\n if (!tdInitializer.linking) {\n scope = tdInitializer.scope;\n }\n var gridController = controllers[0].gridController;\n if (gridController.registerCell(scope, element)) {\n $scope.$on('$destroy', function () {\n return gridController.unregisterCell(scope, element);\n });\n }\n if (!tdInitializer.linking) {\n tdInitializer.onLink();\n }\n }\n };\n});\n\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 \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 7);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2386088bf7ce5bf5d4af","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 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,\n 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 return;\n }\n let scope = $scope;\n let tdInitializer = $scope.uiScrollTdInitializer;\n if (!tdInitializer) {\n tdInitializer = $scope.uiScrollTdInitializer = {\n linking: true\n };\n }\n if (!tdInitializer.linking) {\n scope = tdInitializer.scope;\n }\n let gridController = controllers[0].gridController;\n if (gridController.registerCell(scope, element)) {\n $scope.$on('$destroy', () => gridController.unregisterCell(scope, element));\n }\n if (!tdInitializer.linking) {\n tdInitializer.onLink();\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 3a57a096..0b3aa961 100644 --- a/dist/ui-scroll.js +++ b/dist/ui-scroll.js @@ -1,7 +1,7 @@ /*! * angular-ui-scroll * https://github.com/angular-ui/ui-scroll - * Version: 1.7.2 -- 2018-07-26T04:32:37.367Z + * Version: 1.8.0-rc -- 2018-08-13T12:05:10.496Z * License: MIT */ /******/ (function(modules) { // webpackBootstrap @@ -144,7 +144,7 @@ angular.module('ui.scroll', []).constant('JQLiteExtras', _jqLiteExtras2.default) var BUFFER_MIN = 3; var BUFFER_DEFAULT = 10; - var PADDING_MIN = 0.3; + var PADDING_MIN = 0.01; var PADDING_DEFAULT = 0.5; var MAX_VIEWPORT_DELAY = 500; var VIEWPORT_POLLING_INTERVAL = 50; @@ -573,18 +573,40 @@ angular.module('ui.scroll', []).constant('JQLiteExtras', _jqLiteExtras2.default) } } - function resizeAndScrollHandler() { - if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) { + function resizeAndScrollHandler(ev) { + if ($rootScope.$$phase || adapter.isLoading || adapter.disabled) { + return; + } - enqueueFetch(ridActual); + if (ev.type === 'scroll') { + // Don't process scroll event if it was triggered by us setting scrollTop. + if (viewport[0].scrollTop === viewport.scrollTopValue) { + return false; + } - if (pending.length) { - unbindEvents(); - } else { - adapter.calculateProperties(); - !$scope.$$phase && $scope.$digest(); + // Check if we tried to set scrollTop and it failed. If that happens, don't prepend more items based on the stale value + // of scrollTop that will be used by shouldLoadTop(). Also, try to set it again. + viewport.scrollTopSetFailed = false; + if (viewport.scrollTopValue != null) { + var curScrollTop = viewport[0].scrollTop; + if (Math.abs(curScrollTop - viewport.scrollTopValue) > Math.abs(curScrollTop - viewport.scrollTopBeforeSet)) { + viewport.scrollTopSetFailed = true; + viewport.scrollTop(curScrollTop - viewport.scrollTopAdjust); + } } } + + enqueueFetch(ridActual); + + // we got a real scroll event, so browser is now in charge of scrollTop + viewport.scrollTopValue = null; + + if (pending.length) { + unbindEvents(); + } else { + adapter.calculateProperties(); + !$scope.$$phase && $scope.$digest(); + } } function wheelHandler(event) { @@ -1222,6 +1244,10 @@ function Viewport(elementRoutines, buffer, element, viewportController, $rootSco 'display': 'block' }); + viewport.scrollTopOriginal = viewport.scrollTopOriginal || viewport.scrollTop; + viewport.scrollTopBeforeSet = null; + viewport.scrollTopValue = null; + function bufferPadding() { return viewport.outerHeight() * padding; // some extra space to initiate preload } @@ -1230,6 +1256,13 @@ function Viewport(elementRoutines, buffer, element, viewportController, $rootSco getScope: function getScope() { return scope; }, + scrollTop: function scrollTop() { + if (typeof arguments[0] !== 'undefined') { + viewport.scrollTopBeforeSet = viewport.scrollTop(); + viewport.scrollTopValue = arguments[0]; + } + return viewport.scrollTopOriginal.apply(viewport, arguments); + }, createPaddingElements: function createPaddingElements(template) { topPadding = new _padding2.default(template); bottomPadding = new _padding2.default(template); @@ -1295,7 +1328,7 @@ function Viewport(elementRoutines, buffer, element, viewportController, $rootSco } }, shouldLoadTop: function shouldLoadTop() { - return !buffer.bof && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding(); + return !buffer.bof && !viewport.scrollTopSetFailed && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding(); }, clipTop: function clipTop() { // clip the invisible items off the top @@ -1383,6 +1416,7 @@ function Viewport(elementRoutines, buffer, element, viewportController, $rootSco topPadding.height(paddingHeight); } else { topPadding.height(0); + viewport.scrollTopAdjust = paddingHeight; viewport.scrollTop(viewport.scrollTop() - paddingHeight); } }, @@ -1590,7 +1624,7 @@ var Adapter = function () { var _this = this; // these methods will be accessible out of ui-scroll via user defined adapter - var publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty']; + var publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty', 'resetScrollTopCorrection']; for (var i = publicMethods.length - 1; i >= 0; i--) { this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this); } @@ -1649,6 +1683,12 @@ var Adapter = function () { value: function isEmpty() { return !this.buffer.length; } + }, { + key: 'resetScrollTopCorrection', + value: function resetScrollTopCorrection() { + // is needed to scroll at negative area programmatically (e.g. tests) + this.viewport.scrollTopValue = null; + } }, { key: 'append', value: function append(newItems) { diff --git a/dist/ui-scroll.js.map b/dist/ui-scroll.js.map index 29c760d0..adcc7550 100644 --- a/dist/ui-scroll.js.map +++ b/dist/ui-scroll.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 8c9f7d12571bf2ad3771","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","constant","JQLiteExtras","run","window","jQuery","registerFor","element","ElementRoutines","addCSSRules","directive","restrict","controller","scope","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$interval","$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","MAX_VIEWPORT_DELAY","VIEWPORT_POLLING_INTERVAL","datasource","itemName","datasourceName","viewportController","bufferSize","Math","max","padding","startIndex","ridActual","pending","elementRoutines","buffer","ScrollBuffer","Viewport","adapter","Adapter","doAdjust","reload","isDatasourceValid","Object","prototype","toString","call","get","onRenderHandlers","onRenderHandlersRunner","handler","persistDatasourceIndex","propName","getter","isNumber","filter","id","push","defineDatasourceIndex","propUserName","descriptor","getOwnPropertyDescriptor","set","defineProperty","length","topPaddingHeightOld","topDataPos","adjustPaddings","onAfterMinIndexSet","fetchNext","success","next","index","append","item","count","fetchPrevious","first","prepend","initialize","tryCount","applyContainerStyle","timer","cancel","clone","createPaddingElements","$destroy","remove","$on","unbindEvents","unbind","wheelHandler","bind","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","resetTopPadding","resetBottomPadding","arguments","reset","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","hideElement","promises","sibling","undefined","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updateDOM","toBePrepended","toBeRemoved","inserted","i","op","unshift","concat","insertElementAnimated","removeItem","$index","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","loading","fetch","shouldLoadTop","processUpdates","$$phase","$digest","showElement","w","calculateProperties","doAdjustAfterFetch","onAfterPrepend","shift","eof","clipTop","bof","clipBottom","isLoading","disabled","event","scrollTop","yMax","scrollHeight","clientHeight","preventDefault","convertToPx","css","getStyle","isWindow","name","self","elem","nodeType","style","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isValueDefined","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","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","key","hideClassToken","selector","rules","sheet","styleSheets","cssRules","err","insertRule","addRule","$animate","has","isAngularVersionLessThen1_3","version","major","minor","addClass","removeClass","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","create","Array","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","isTop","splice","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","elements","Number","MAX_VALUE","bottom","NEGATIVE_INFINITY","topPadding","bottomPadding","bufferPadding","getScope","template","Padding","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","totalHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","removeCacheItem","CacheProto","sort","a","b","argument","_isTop","Cache","instance","apply","setPrototypeOf","getOwnPropertyNames","methodName","generateElement","Node","ELEMENT_NODE","table","find","viewportScope","startScope","$parent","publicContext","assignAdapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","publicMethods","publicProps","property","attr","newItems","applyUpdatesFunc","applyUpdatesIndex","cb","slice","applyUpdate","_index","isArray","position","some","newItem","rowTop","topHeight","topDone","bottomDone","itemTop","isEOF"],"mappings":"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","file":"ui-scroll.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 8c9f7d12571bf2ad3771","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n !window.jQuery ? (new JQLiteExtras()).registerFor(angular.element) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumericAttr(value, defaultValue) {\n const 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 const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler() {\n if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\n enqueueFetch(ridActual);\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n\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 const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items) {\r\n items.reverse().forEach((item) => {\r\n --buffer.first;\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\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.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding());\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, index === this.buffer.minIndex);\r\n if(index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if(position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 2386088bf7ce5bf5d4af","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","constant","JQLiteExtras","run","window","jQuery","registerFor","element","ElementRoutines","addCSSRules","directive","restrict","controller","scope","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$interval","$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","MAX_VIEWPORT_DELAY","VIEWPORT_POLLING_INTERVAL","datasource","itemName","datasourceName","viewportController","bufferSize","Math","max","padding","startIndex","ridActual","pending","elementRoutines","buffer","ScrollBuffer","Viewport","adapter","Adapter","doAdjust","reload","isDatasourceValid","Object","prototype","toString","call","get","onRenderHandlers","onRenderHandlersRunner","handler","persistDatasourceIndex","propName","getter","isNumber","filter","id","push","defineDatasourceIndex","propUserName","descriptor","getOwnPropertyDescriptor","set","defineProperty","length","topPaddingHeightOld","topDataPos","adjustPaddings","onAfterMinIndexSet","fetchNext","success","next","index","append","item","count","fetchPrevious","first","prepend","initialize","tryCount","applyContainerStyle","timer","cancel","clone","createPaddingElements","$destroy","remove","$on","unbindEvents","unbind","wheelHandler","bind","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","resetTopPadding","resetBottomPadding","arguments","reset","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","hideElement","promises","sibling","undefined","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updateDOM","toBePrepended","toBeRemoved","inserted","i","op","unshift","concat","insertElementAnimated","removeItem","$index","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","loading","fetch","shouldLoadTop","processUpdates","$$phase","$digest","showElement","w","calculateProperties","doAdjustAfterFetch","onAfterPrepend","shift","eof","clipTop","bof","clipBottom","ev","isLoading","disabled","type","scrollTop","scrollTopValue","scrollTopSetFailed","curScrollTop","abs","scrollTopBeforeSet","scrollTopAdjust","event","yMax","scrollHeight","clientHeight","preventDefault","convertToPx","css","getStyle","isWindow","name","self","elem","nodeType","style","obj","document","location","alert","setInterval","scrollTo","direction","top","left","method","prop","preserve","isValueDefined","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","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","key","hideClassToken","selector","rules","sheet","styleSheets","cssRules","err","insertRule","addRule","$animate","has","isAngularVersionLessThen1_3","version","major","minor","addClass","removeClass","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","create","Array","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","isTop","splice","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","elements","Number","MAX_VALUE","bottom","NEGATIVE_INFINITY","topPadding","bottomPadding","scrollTopOriginal","bufferPadding","getScope","apply","template","Padding","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","totalHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","removeCacheItem","CacheProto","sort","a","b","argument","_isTop","Cache","instance","setPrototypeOf","getOwnPropertyNames","methodName","generateElement","Node","ELEMENT_NODE","table","find","viewportScope","startScope","$parent","publicContext","assignAdapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","publicMethods","publicProps","property","attr","newItems","applyUpdatesFunc","applyUpdatesIndex","cb","slice","applyUpdate","_index","isArray","position","some","newItem","rowTop","topHeight","topDone","bottomDone","itemTop","isEOF"],"mappings":"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","file":"ui-scroll.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2386088bf7ce5bf5d4af","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n !window.jQuery ? (new JQLiteExtras()).registerFor(angular.element) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumericAttr(value, defaultValue) {\n const 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.01;\n const PADDING_DEFAULT = 0.5;\n const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler(ev) {\n if ($rootScope.$$phase || adapter.isLoading || adapter.disabled) {\n return;\n }\n\n if (ev.type === 'scroll') {\n // Don't process scroll event if it was triggered by us setting scrollTop.\n if (viewport[0].scrollTop === viewport.scrollTopValue) {\n return false;\n }\n\n // Check if we tried to set scrollTop and it failed. If that happens, don't prepend more items based on the stale value\n // of scrollTop that will be used by shouldLoadTop(). Also, try to set it again.\n viewport.scrollTopSetFailed = false;\n if (viewport.scrollTopValue != null) {\n const curScrollTop = viewport[0].scrollTop;\n if (Math.abs(curScrollTop - viewport.scrollTopValue) > Math.abs(curScrollTop - viewport.scrollTopBeforeSet)) {\n viewport.scrollTopSetFailed = true;\n viewport.scrollTop(curScrollTop - viewport.scrollTopAdjust);\n }\n }\n }\n\n enqueueFetch(ridActual);\n\n // we got a real scroll event, so browser is now in charge of scrollTop\n viewport.scrollTopValue = null;\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n\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 const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items) {\r\n items.reverse().forEach((item) => {\r\n --buffer.first;\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\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 viewport.scrollTopOriginal = viewport.scrollTopOriginal || viewport.scrollTop;\r\n viewport.scrollTopBeforeSet = null;\r\n viewport.scrollTopValue = null;\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 scrollTop() {\r\n if (typeof arguments[0] !== 'undefined') {\r\n viewport.scrollTopBeforeSet = viewport.scrollTop();\r\n viewport.scrollTopValue = arguments[0];\r\n }\r\n return viewport.scrollTopOriginal.apply(viewport, arguments);\r\n },\r\n\r\n createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && !viewport.scrollTopSetFailed && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding();\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTopAdjust = paddingHeight;\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
    ');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty', 'resetScrollTopCorrection'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n resetScrollTopCorrection() {\r\n // is needed to scroll at negative area programmatically (e.g. tests)\r\n this.viewport.scrollTopValue = null;\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, index === this.buffer.minIndex);\r\n if(index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if(position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n\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 1a25cf9b..7f29ee92 100644 --- a/dist/ui-scroll.min.js +++ b/dist/ui-scroll.min.js @@ -1,8 +1,8 @@ /*! * angular-ui-scroll * https://github.com/angular-ui/ui-scroll - * Version: 1.7.2 -- 2018-07-26T04:32:37.367Z + * Version: 1.8.0-rc -- 2018-08-13T12:05:10.496Z * License: MIT */ -!function(e){function t(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(1),o=i(r),a=n(2),u=i(a),s=n(3),l=i(s),c=n(4),f=i(c),d=n(6),h=i(d);angular.module("ui.scroll",[]).constant("JQLiteExtras",o.default).run(["JQLiteExtras",function(e){window.jQuery||(new e).registerFor(angular.element),u.default.addCSSRules()}]).directive("uiScrollViewport",function(){return{restrict:"A",controller:["$scope","$element",function(e,t){var n=this;return this.container=t,this.viewport=t,this.scope=e,angular.forEach(t.children(),function(e){"tbody"===e.tagName.toLowerCase()&&(n.viewport=angular.element(e))}),this}]}}).directive("uiScroll",["$log","$injector","$rootScope","$timeout","$interval","$q","$parse",function(e,t,n,i,r,o,a){function s(e,s,c,d,p){function m(t,n){var i=a(t)(e);return isNaN(i)?n:i}function g(){G.forEach(function(e){return e.run()}),G=[]}function v(e,t){var n=void 0;angular.isNumber(e[t])&&(n=e[t],angular.isNumber(n)&&(G=G.filter(function(e){return e.id!==t}),G.push({id:t,run:function(){return e[t]=n}})))}function b(e,t,n){var i=Object.getOwnPropertyDescriptor(e,t);if(!i||!i.set&&!i.get){var r=void 0;v(e,t),Object.defineProperty(e,t,{set:function(i){if(r=i,z.length&&!Q.length)return void v(e,t);Q[n]=i;var o=X.topDataPos();X.adjustPaddings(),"minIndex"===t&&X.onAfterMinIndexSet(o)},get:function(){return r}})}}function x(t){return t&&t!==W||e.$$destroyed}function y(){X.bind("resize",V),X.bind("scroll",V)}function w(){X.unbind("resize",V),X.unbind("scroll",V)}function I(){X.resetTopPadding(),X.resetBottomPadding(),arguments.length&&(R=arguments[0]),Q.reset(R),v(L,"minIndex"),v(L,"maxIndex"),j()}function E(e){return e.element.height()&&e.element[0].offsetParent}function P(e){E(e)&&(Q.forEach(function(e){"function"==typeof e.unregisterVisibilityWatcher&&(e.unregisterVisibilityWatcher(),delete e.unregisterVisibilityWatcher)}),z.length||i(function(){return j()}))}function $(e,t){T(e,t,X.insertElement),E(e)||(e.unregisterVisibilityWatcher=e.scope.$watch(function(){return P(e)})),q.hideElement(e)}function T(e,t,n){var i=null,r=t>0?Q[t-1].element:void 0;if(p(function(t,o){i=n(t,r),e.element=t,e.scope=o,o[H]=e.item}),Y.transform){var o=e.scope.uiScrollTdInitializer;o&&o.linking?Y.transform(e.scope,e.element):e.scope.uiScrollTdInitializer={onLink:function(){return Y.transform(e.scope,e.element)},scope:e.scope}}return i}function k(){var e=[],t=[],n=[],i=[];return Q.forEach(function(r,o){switch(r.op){case"prepend":t.unshift(r);break;case"append":$(r,o),r.op="none",i.push(r);break;case"insert":e=e.concat(T(r,o,X.insertElementAnimated)),r.op="none",i.push(r);break;case"remove":n.push(r)}}),n.forEach(function(t){return e=e.concat(X.removeItem(t))}),t.length&&t.forEach(function(e){$(e),e.op="none"}),Q.forEach(function(e,t){return e.scope.$index=Q.first+t}),{prepended:t,removed:n,inserted:i,animated:e}}function O(e,t){t.animated.length?o.all(t.animated).then(function(){X.adjustPaddings(),j(e)}):X.adjustPaddings()}function A(e,t){X.shouldLoadBottom()?(!t||Q.effectiveHeight(t.inserted)>0)&&1===z.push(!0)&&(Y.loading(!0),U(e)):X.shouldLoadTop()&&(!t||Q.effectiveHeight(t.prepended)>0||z[0])&&1===z.push(!1)&&(Y.loading(!0),U(e))}function S(){var t=k();return!e.$$phase&&!n.$$phase&&e.$digest(),t.inserted.forEach(function(e){return q.showElement(e)}),t.prepended.forEach(function(e){return q.showElement(e)}),t}function j(e){e||(z=[],e=++W);var t=S();x(e)||(O(e,t),A(e),z.length||Y.calculateProperties())}function M(e){var t=S();X.onAfterPrepend(t),x(e)||(O(e,t),g(),A(e,t),z.shift(),z.length?U(e):(Y.loading(!1),y(),Y.calculateProperties()))}function U(e){z[0]?Q.length&&!X.shouldLoadBottom()?M(e):K(function(t){x(e)||(t.length0&&(X.clipTop(),Q.append(t)),M(e))}):Q.length&&!X.shouldLoadTop()?M(e):Z(function(t){x(e)||(t.length0&&(Q.length&&X.clipBottom(),Q.prepend(t)),M(e))})}function V(){n.$$phase||Y.isLoading||Y.disabled||(A(W),z.length?w():(Y.calculateProperties(),!e.$$phase&&e.$digest()))}function _(e){if(!Y.disabled){var t=X[0].scrollTop,n=X[0].scrollHeight-X[0].clientHeight;(0===t&&!Q.bof||t===n&&!Q.eof)&&e.preventDefault()}}var C=c.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!C)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+c.uiScroll+"'");var L=null,H=C[1],N=C[2],B=d[0],D=Math.max(3,m(c.bufferSize,10)),F=Math.max(.3,m(c.padding,.5)),R=m(c.startIndex,1),W=0,z=[],q=new u.default(t,o),Q=new l.default(q,D,R),X=new f.default(q,Q,s,B,n,F),Y=new h.default(e,a,c,X,Q,j,I);B&&(B.adapter=Y);var J=function(){return"[object Object]"===Object.prototype.toString.call(L)&&"function"==typeof L.get};if(L=a(N)(e),!J()&&(L=t.get(N),!J()))throw new Error(N+" is not a valid datasource");var G=[];b(L,"minIndex","minIndexUser"),b(L,"maxIndex","maxIndexUser");var K=2!==L.get.length?function(e){return L.get(Q.next,D,e)}:function(e){L.get({index:Q.next,append:Q.length?Q[Q.length-1].item:void 0,count:D},e)},Z=2!==L.get.length?function(e){return L.get(Q.first-D,D,e)}:function(e){L.get({index:Q.first-D,prepend:Q.length?Q[0].item:void 0,count:D},e)};p(function(e,t){X.createPaddingElements(e[0]),t.$destroy(),e.remove()}),e.$on("$destroy",function(){w(),X.unbind("mousewheel",_)}),X.bind("mousewheel",_),function(){var e=0;if(X.applyContainerStyle())j();else var t=r(function(){if(e++,X.applyContainerStyle()&&(r.cancel(t),j()),50*e>=500)throw r.cancel(t),Error("ui-scroll directive requires a viewport with non-zero height in 500ms")},50)}()}return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:s}}])},function(e,t,n){"use strict";function i(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=[],i=!0,r=!1,o=void 0;try{for(var a,u=e[Symbol.iterator]();!(i=(a=u.next()).done)&&(n.push(a.value),!t||n.length!==t);i=!0);}catch(e){r=!0,o=e}finally{try{!i&&u.return&&u.return()}finally{if(r)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")}}(),o=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}[i]:(r=u(e),o=r[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}[i])}var o=void 0,a=void 0,u=void 0,s=void 0;return a=angular.element.prototype.css,e.prototype.css=function(e,t){var n=this,i=n[0];if(i&&3!==i.nodeType&&8!==i.nodeType&&i.style)return a.call(n,e,t)},s=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,i=void 0,r=void 0,o=void 0,a=void 0,u=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;return new RegExp("^("+u+")(?!px)[a-z%]+$","i").test(t)?(a=e.style,n=a.left,r=e.runtimeStyle,o=r&&r.left,r&&(r.left=a.left),a.left=t,i=a.pixelLeft,a.left=n,o&&(r.left=o),i):parseFloat(t)}),angular.forEach({before:function(e){var t,n,i,r,o,a,u;if(u=this,n=u[0],o=u.parent(),t=o.contents(),t[0]===n)return o.prepend(e);for(i=r=1,a=t.length-1;1<=a?r<=a:r>=a;i=1<=a?++r:--r)if(t[i]===n)return void angular.element(t[i-1]).after(e);throw new Error("invalid DOM structure "+n.outerHTML)},height:function(e){var t;return t=this,void 0!==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,i=this,r={top:0,left:0},o=i[0],a=o&&o.ownerDocument;if(arguments.length){if(void 0===e)return i;throw new Error("offset setter method is not implemented")}if(a)return t=a.documentElement,null!=o.getBoundingClientRect&&(r=o.getBoundingClientRect()),n=a.defaultView||a.parentWindow,{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.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=a},function(e,t,n){"use strict";function i(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){for(var n=0;ni.minIndexUser)return void i.minIndexUser++;i.minIndex===i.minIndexUser&&i.minIndexUser++}i.minIndex++},decrementMaxIndex:function(){null!==i.maxIndexUser&&i.maxIndex<=i.maxIndexUser&&i.maxIndexUser--,i.maxIndex--},getAbsMinIndex:function(){return null!==i.minIndexUser?Math.min(i.minIndexUser,i.minIndex):i.minIndex},getAbsMaxIndex:function(){return null!==i.maxIndexUser?Math.max(i.maxIndexUser,i.maxIndex):i.maxIndex},effectiveHeight:function(e){if(!e.length)return 0;var t=Number.MAX_VALUE,n=Number.NEGATIVE_INFINITY;return e.forEach(function(e){e.element[0].offsetParent&&(t=Math.min(t,e.element.offset().top),n=Math.max(n,e.element.offset().top+e.element.outerHeight(!0)))}),Math.max(0,n-t)}}),i.reset(n),i}Object.defineProperty(t,"__esModule",{value:!0}),t.default=i},function(e,t,n){"use strict";function i(e,t,n,i,r,a){function u(){return c.outerHeight()*a}var s=null,l=null,c=i&&i.viewport?i.viewport:angular.element(window),f=i&&i.container?i.container:void 0,d=i&&i.scope?i.scope:r;return c.css({"overflow-anchor":"none","overflow-y":"auto",display:"block"}),angular.extend(c,{getScope:function(){return d},createPaddingElements:function(e){s=new o.default(e),l=new o.default(e),n.before(s.element),n.after(l.element),s.height(0),l.height(0)},applyContainerStyle:function(){return!f||(f!==c&&c.css("height",window.getComputedStyle(f[0]).height),c.height()>0)},bottomDataPos:function(){var e=c[0].scrollHeight;return(e=null!=e?e:c[0].document.documentElement.scrollHeight)-l.height()},topDataPos:function(){return s.height()},bottomVisiblePos:function(){return c.scrollTop()+c.outerHeight()},topVisiblePos:function(){return c.scrollTop()},insertElement:function(t,n){return e.insertElement(t,n||s.element)},insertElementAnimated:function(t,n){return e.insertElementAnimated(t,n||s.element)},shouldLoadBottom:function(){return!t.eof&&c.bottomDataPos()=0&&(i=t[o].element.outerHeight(!0),!(n+i>r));o--)l.cache.add(t[o]),n+=i,e++;e>0&&(t.eof=!1,t.remove(t.length-e,t.length),t.next-=e,c.adjustPaddings())},shouldLoadTop:function(){return!t.bof&&c.topDataPos()>c.topVisiblePos()-u()},clipTop:function(){for(var e=0,n=0,i=0,r=c.topVisiblePos()-c.topDataPos()-u(),o=0;or));o++)s.cache.add(t[o]),n+=i,e++;e>0&&(s.height(s.height()+n),t.bof=!1,t.remove(0,e),t.first+=e)},adjustPaddings:function(){if(t.length){var e=t.reduce(function(e,t){return e+t.element.outerHeight(!0)},0),n=0,i=0;s.cache.forEach(function(e){e.index=t.next&&(r+=e.height,o++)});var a=e+n+r,u=a/(i+o+t.length),c=null!==t.minIndexUser&&t.minIndex>t.minIndexUser,f=null!==t.maxIndexUser&&t.maxIndext.minIndexUser){var n=s.height()-e;for(c.scrollTop(c.scrollTop()+n);(n-=c.scrollTop())>0;)l.height(l.height()+n),c.scrollTop(c.scrollTop()+n)}},onAfterPrepend:function(e){if(e.prepended.length){var n=t.effectiveHeight(e.prepended),i=s.height()-n;i>=0?s.height(i):(s.height(0),c.scrollTop(c.scrollTop()-i))}},resetTopPadding:function(){s.height(0),s.cache.clear()},resetBottomPadding:function(){l.height(0),l.cache.clear()},removeCacheItem:function(e,t){s.cache.remove(e,t),l.cache.remove(e,t)},removeItem:function(e){return this.removeCacheItem(e),t.remove(e)}}),c}Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(5),o=function(e){return e&&e.__esModule?e:{default:e}}(r)},function(e,t,n){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(){var e=[];return e.push.apply(e,arguments),Object.setPrototypeOf(e,r.prototype),e}function o(e){if(e.nodeType!==Node.ELEMENT_NODE)throw new Error("ui-scroll directive requires an Element node for templating the view");var t=void 0;switch(e.tagName.toLowerCase()){case"dl":throw new Error("ui-scroll directive does not support <"+e.tagName+"> as a repeating tag: "+e.outerHTML);case"tr":t=angular.element("
    ").find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n=0;t--)if(this[t].index===e.scope.$index)return void(this[t].height=e.element.outerHeight());this.push({index:e.scope.$index,height:e.element.outerHeight()}),this.sort(function(e,t){return e.indext.index?1:0})}},{key:"remove",value:function(e,t){for(var n=e%1==0?e:e.scope.$index,i=e%1==0?t:"isTop"===e._op,r=this.length-1;r>=0;r--)if(this[r].index===n){this.splice(r,1);break}if(!i)for(var o=this.length-1;o>=0;o--)this[o].index>n&&this[o].index--}},{key:"clear",value:function(){this.length=0}}]),e}();r.prototype=Object.create(Array.prototype),Object.getOwnPropertyNames(u.prototype).forEach(function(e){return r.prototype[e]=u.prototype[e]});var s=function(){function e(t){i(this,e),this.element=o(t),this.cache=new r}return a(e,[{key:"height",value:function(){return this.element.height.apply(this.element,arguments)}}]),e}();t.default=s},function(e,t,n){"use strict";function i(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){for(var n=0;n=0;n--)this.publicContext[t[n]]=this[t[n]].bind(this);for(var i=["isLoading","topVisible","topVisibleElement","topVisibleScope","bottomVisible","bottomVisibleElement","bottomVisibleScope"],r=i.length-1;r>=0;r--)!function(t){var n=void 0,r=e.$attr[i[t]];Object.defineProperty(e,i[t],{get:function(){return n},set:function(o){n=o,e.publicContext[i[t]]=o,r&&e.$parse(r).assign(e.startScope,o)}})}(r);Object.defineProperty(this.publicContext,"disabled",{get:function(){return e.disabled},set:function(t){return(e.disabled=t)?null:e.doAdjust()}})}},{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:"append",value:function(e){this.buffer.append(e),this.doAdjust(),this.viewport.clipTop(),this.viewport.clipBottom()}},{key:"prepend",value:function(e){this.buffer.prepend(e),this.doAdjust(),this.viewport.clipTop(),this.viewport.clipBottom()}},{key:"applyUpdates",value:function(e,t){"function"==typeof e?this.applyUpdatesFunc(e):this.applyUpdatesIndex(e,t),this.doAdjust()}},{key:"applyUpdatesFunc",value:function(e){var t=this;this.buffer.slice(0).forEach(function(n){t.applyUpdate(n,e(n.item,n.scope,n.element))})}},{key:"applyUpdatesIndex",value:function(e,t){if(e%1!=0)throw new Error("applyUpdates - "+e+" is not a valid index (should be an integer)");var n=e-this.buffer.first;n>=0&&n=this.buffer.getAbsMinIndex()&&e<=this.buffer.getAbsMaxIndex()&&angular.isArray(t)&&!t.length&&(this.viewport.removeCacheItem(e,e===this.buffer.minIndex),e===this.buffer.getAbsMinIndex()?this.buffer.incrementMinIndex():this.buffer.decrementMaxIndex())}},{key:"applyUpdate",value:function(e,t){var n=this;if(angular.isArray(t)){var i=this.buffer.indexOf(e);t.reverse().some(function(t){return t===e.item})||(e.op="remove",0!==i||t.length||(e._op="isTop")),t.forEach(function(t){t===e.item?i--:n.buffer.insert(i+1,t,-1===i)})}}},{key:"calculateProperties",value:function(){for(var e=null,t=0,n=!1,i=!1,r=this.buffer.length,o=0;othis.viewport.topVisiblePos()&&(n=!0,this.topVisible=a.item,this.topVisibleElement=a.element,this.topVisibleScope=a.scope),!i&&(l>=this.viewport.bottomVisiblePos()||o===r-1&&this.isEOF())&&(i=!0,this.bottomVisible=a.item,this.bottomVisibleElement=a.element,this.bottomVisibleScope=a.scope),t+=s}if(e=u,n&&i)break}}}]),e}();t.default=o}]); +!function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}var i=n(1),o=r(i),l=n(2),a=r(l),u=n(3),s=r(u),c=n(4),f=r(c),d=n(6),p=r(d);angular.module("ui.scroll",[]).constant("JQLiteExtras",o.default).run(["JQLiteExtras",function(e){window.jQuery||(new e).registerFor(angular.element),a.default.addCSSRules()}]).directive("uiScrollViewport",function(){return{restrict:"A",controller:["$scope","$element",function(e,t){var n=this;return this.container=t,this.viewport=t,this.scope=e,angular.forEach(t.children(),function(e){"tbody"===e.tagName.toLowerCase()&&(n.viewport=angular.element(e))}),this}]}}).directive("uiScroll",["$log","$injector","$rootScope","$timeout","$interval","$q","$parse",function(e,t,n,r,i,o,l){function u(e,u,c,d,h){function m(t,n){var r=l(t)(e);return isNaN(r)?n:r}function g(){G.forEach(function(e){return e.run()}),G=[]}function v(e,t){var n=void 0;angular.isNumber(e[t])&&(n=e[t],angular.isNumber(n)&&(G=G.filter(function(e){return e.id!==t}),G.push({id:t,run:function(){return e[t]=n}})))}function b(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t);if(!r||!r.set&&!r.get){var i=void 0;v(e,t),Object.defineProperty(e,t,{set:function(r){if(i=r,z.length&&!Q.length)return void v(e,t);Q[n]=r;var o=X.topDataPos();X.adjustPaddings(),"minIndex"===t&&X.onAfterMinIndexSet(o)},get:function(){return i}})}}function x(t){return t&&t!==W||e.$$destroyed}function y(){X.bind("resize",U),X.bind("scroll",U)}function w(){X.unbind("resize",U),X.unbind("scroll",U)}function I(){X.resetTopPadding(),X.resetBottomPadding(),arguments.length&&(R=arguments[0]),Q.reset(R),v(L,"minIndex"),v(L,"maxIndex"),j()}function E(e){return e.element.height()&&e.element[0].offsetParent}function T(e){E(e)&&(Q.forEach(function(e){"function"==typeof e.unregisterVisibilityWatcher&&(e.unregisterVisibilityWatcher(),delete e.unregisterVisibilityWatcher)}),z.length||r(function(){return j()}))}function P(e,t){$(e,t,X.insertElement),E(e)||(e.unregisterVisibilityWatcher=e.scope.$watch(function(){return T(e)})),q.hideElement(e)}function $(e,t,n){var r=null,i=t>0?Q[t-1].element:void 0;if(h(function(t,o){r=n(t,i),e.element=t,e.scope=o,o[H]=e.item}),Y.transform){var o=e.scope.uiScrollTdInitializer;o&&o.linking?Y.transform(e.scope,e.element):e.scope.uiScrollTdInitializer={onLink:function(){return Y.transform(e.scope,e.element)},scope:e.scope}}return r}function S(){var e=[],t=[],n=[],r=[];return Q.forEach(function(i,o){switch(i.op){case"prepend":t.unshift(i);break;case"append":P(i,o),i.op="none",r.push(i);break;case"insert":e=e.concat($(i,o,X.insertElementAnimated)),i.op="none",r.push(i);break;case"remove":n.push(i)}}),n.forEach(function(t){return e=e.concat(X.removeItem(t))}),t.length&&t.forEach(function(e){P(e),e.op="none"}),Q.forEach(function(e,t){return e.scope.$index=Q.first+t}),{prepended:t,removed:n,inserted:r,animated:e}}function O(e,t){t.animated.length?o.all(t.animated).then(function(){X.adjustPaddings(),j(e)}):X.adjustPaddings()}function k(e,t){X.shouldLoadBottom()?(!t||Q.effectiveHeight(t.inserted)>0)&&1===z.push(!0)&&(Y.loading(!0),V(e)):X.shouldLoadTop()&&(!t||Q.effectiveHeight(t.prepended)>0||z[0])&&1===z.push(!1)&&(Y.loading(!0),V(e))}function A(){var t=S();return!e.$$phase&&!n.$$phase&&e.$digest(),t.inserted.forEach(function(e){return q.showElement(e)}),t.prepended.forEach(function(e){return q.showElement(e)}),t}function j(e){e||(z=[],e=++W);var t=A();x(e)||(O(e,t),k(e),z.length||Y.calculateProperties())}function M(e){var t=A();X.onAfterPrepend(t),x(e)||(O(e,t),g(),k(e,t),z.shift(),z.length?V(e):(Y.loading(!1),y(),Y.calculateProperties()))}function V(e){z[0]?Q.length&&!X.shouldLoadBottom()?M(e):K(function(t){x(e)||(t.length0&&(X.clipTop(),Q.append(t)),M(e))}):Q.length&&!X.shouldLoadTop()?M(e):Z(function(t){x(e)||(t.length0&&(Q.length&&X.clipBottom(),Q.prepend(t)),M(e))})}function U(t){if(!(n.$$phase||Y.isLoading||Y.disabled)){if("scroll"===t.type){if(X[0].scrollTop===X.scrollTopValue)return!1;if(X.scrollTopSetFailed=!1,null!=X.scrollTopValue){var r=X[0].scrollTop;Math.abs(r-X.scrollTopValue)>Math.abs(r-X.scrollTopBeforeSet)&&(X.scrollTopSetFailed=!0,X.scrollTop(r-X.scrollTopAdjust))}}k(W),X.scrollTopValue=null,z.length?w():(Y.calculateProperties(),!e.$$phase&&e.$digest())}}function C(e){if(!Y.disabled){var t=X[0].scrollTop,n=X[0].scrollHeight-X[0].clientHeight;(0===t&&!Q.bof||t===n&&!Q.eof)&&e.preventDefault()}}var _=c.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!_)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+c.uiScroll+"'");var L=null,H=_[1],N=_[2],B=d[0],F=Math.max(3,m(c.bufferSize,10)),D=Math.max(.01,m(c.padding,.5)),R=m(c.startIndex,1),W=0,z=[],q=new a.default(t,o),Q=new s.default(q,F,R),X=new f.default(q,Q,u,B,n,D),Y=new p.default(e,l,c,X,Q,j,I);B&&(B.adapter=Y);var J=function(){return"[object Object]"===Object.prototype.toString.call(L)&&"function"==typeof L.get};if(L=l(N)(e),!J()&&(L=t.get(N),!J()))throw new Error(N+" is not a valid datasource");var G=[];b(L,"minIndex","minIndexUser"),b(L,"maxIndex","maxIndexUser");var K=2!==L.get.length?function(e){return L.get(Q.next,F,e)}:function(e){L.get({index:Q.next,append:Q.length?Q[Q.length-1].item:void 0,count:F},e)},Z=2!==L.get.length?function(e){return L.get(Q.first-F,F,e)}:function(e){L.get({index:Q.first-F,prepend:Q.length?Q[0].item:void 0,count:F},e)};h(function(e,t){X.createPaddingElements(e[0]),t.$destroy(),e.remove()}),e.$on("$destroy",function(){w(),X.unbind("mousewheel",C)}),X.bind("mousewheel",C),function(){var e=0;if(X.applyContainerStyle())j();else var t=i(function(){if(e++,X.applyContainerStyle()&&(i.cancel(t),j()),50*e>=500)throw i.cancel(t),Error("ui-scroll directive requires a viewport with non-zero height in 500ms")},50)}()}return{require:["?^uiScrollViewport"],restrict:"A",transclude:"element",priority:1e3,terminal:!0,link:u}}])},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var l,a=e[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&a.return&&a.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")}}(),o=function(){function e(e,t){for(var n=0;n0?{base:l.base-l.padding-l.border,outer:l.base,outerfull:l.base+l.margin}[r]:(i=a(e),o=i[t],(o<0||null===o)&&(o=e.style[t]||0),o=parseFloat(o)||0,{base:o-l.padding-l.border,outer:o,outerfull:o+l.padding+l.border+l.margin}[r])}var o=void 0,l=void 0,a=void 0,u=void 0;return l=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 l.call(n,e,t)},u=function(e){return e&&e.document&&e.location&&e.alert&&e.setInterval},window.getComputedStyle?(a=function(e){return window.getComputedStyle(e,null)},o=function(e,t){return parseFloat(t)}):(a=function(e){return e.currentStyle},o=function(e,t){var n=void 0,r=void 0,i=void 0,o=void 0,l=void 0,a=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;return new RegExp("^("+a+")(?!px)[a-z%]+$","i").test(t)?(l=e.style,n=l.left,i=e.runtimeStyle,o=i&&i.left,i&&(i.left=l.left),l.left=t,r=l.pixelLeft,l.left=n,o&&(i.left=o),r):parseFloat(t)}),angular.forEach({before:function(e){var t,n,r,i,o,l,a;if(a=this,n=a[0],o=a.parent(),t=o.contents(),t[0]===n)return o.prepend(e);for(r=i=1,l=t.length-1;1<=l?i<=l:i>=l;r=1<=l?++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,void 0!==e?(angular.isNumber(e)&&(e+="px"),l.call(t,"height",e)):r(this[0],"height","base")},outerHeight:function(e){return r(this[0],"height",e?"outerfull":"outer")},outerWidth:function(e){return r(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],l=o&&o.ownerDocument;if(arguments.length){if(void 0===e)return r;throw new Error("offset setter method is not implemented")}if(l)return t=l.documentElement,null!=o.getBoundingClientRect&&(i=o.getBoundingClientRect()),n=l.defaultView||l.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=l},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;nr.minIndexUser)return void r.minIndexUser++;r.minIndex===r.minIndexUser&&r.minIndexUser++}r.minIndex++},decrementMaxIndex:function(){null!==r.maxIndexUser&&r.maxIndex<=r.maxIndexUser&&r.maxIndexUser--,r.maxIndex--},getAbsMinIndex:function(){return null!==r.minIndexUser?Math.min(r.minIndexUser,r.minIndex):r.minIndex},getAbsMaxIndex:function(){return null!==r.maxIndexUser?Math.max(r.maxIndexUser,r.maxIndex):r.maxIndex},effectiveHeight:function(e){if(!e.length)return 0;var t=Number.MAX_VALUE,n=Number.NEGATIVE_INFINITY;return e.forEach(function(e){e.element[0].offsetParent&&(t=Math.min(t,e.element.offset().top),n=Math.max(n,e.element.offset().top+e.element.outerHeight(!0)))}),Math.max(0,n-t)}}),r.reset(n),r}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r},function(e,t,n){"use strict";function r(e,t,n,r,i,l){function a(){return c.outerHeight()*l}var u=null,s=null,c=r&&r.viewport?r.viewport:angular.element(window),f=r&&r.container?r.container:void 0,d=r&&r.scope?r.scope:i;return c.css({"overflow-anchor":"none","overflow-y":"auto",display:"block"}),c.scrollTopOriginal=c.scrollTopOriginal||c.scrollTop,c.scrollTopBeforeSet=null,c.scrollTopValue=null,angular.extend(c,{getScope:function(){return d},scrollTop:function(){return void 0!==arguments[0]&&(c.scrollTopBeforeSet=c.scrollTop(),c.scrollTopValue=arguments[0]),c.scrollTopOriginal.apply(c,arguments)},createPaddingElements:function(e){u=new o.default(e),s=new o.default(e),n.before(u.element),n.after(s.element),u.height(0),s.height(0)},applyContainerStyle:function(){return!f||(f!==c&&c.css("height",window.getComputedStyle(f[0]).height),c.height()>0)},bottomDataPos:function(){var e=c[0].scrollHeight;return(e=null!=e?e:c[0].document.documentElement.scrollHeight)-s.height()},topDataPos:function(){return u.height()},bottomVisiblePos:function(){return c.scrollTop()+c.outerHeight()},topVisiblePos:function(){return c.scrollTop()},insertElement:function(t,n){return e.insertElement(t,n||u.element)},insertElementAnimated:function(t,n){return e.insertElementAnimated(t,n||u.element)},shouldLoadBottom:function(){return!t.eof&&c.bottomDataPos()=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.adjustPaddings())},shouldLoadTop:function(){return!t.bof&&!c.scrollTopSetFailed&&c.topDataPos()>c.topVisiblePos()-a()},clipTop:function(){for(var e=0,n=0,r=0,i=c.topVisiblePos()-c.topDataPos()-a(),o=0;oi));o++)u.cache.add(t[o]),n+=r,e++;e>0&&(u.height(u.height()+n),t.bof=!1,t.remove(0,e),t.first+=e)},adjustPaddings:function(){if(t.length){var e=t.reduce(function(e,t){return e+t.element.outerHeight(!0)},0),n=0,r=0;u.cache.forEach(function(e){e.index=t.next&&(i+=e.height,o++)});var l=e+n+i,a=l/(r+o+t.length),c=null!==t.minIndexUser&&t.minIndex>t.minIndexUser,f=null!==t.maxIndexUser&&t.maxIndext.minIndexUser){var n=u.height()-e;for(c.scrollTop(c.scrollTop()+n);(n-=c.scrollTop())>0;)s.height(s.height()+n),c.scrollTop(c.scrollTop()+n)}},onAfterPrepend: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.scrollTopAdjust=r,c.scrollTop(c.scrollTop()-r))}},resetTopPadding:function(){u.height(0),u.cache.clear()},resetBottomPadding:function(){s.height(0),s.cache.clear()},removeCacheItem:function(e,t){u.cache.remove(e,t),s.cache.remove(e,t)},removeItem:function(e){return this.removeCacheItem(e),t.remove(e)}}),c}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(5),o=function(e){return e&&e.__esModule?e:{default:e}}(i)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(){var e=[];return e.push.apply(e,arguments),Object.setPrototypeOf(e,i.prototype),e}function o(e){if(e.nodeType!==Node.ELEMENT_NODE)throw new Error("ui-scroll directive requires an Element node for templating the view");var t=void 0;switch(e.tagName.toLowerCase()){case"dl":throw new Error("ui-scroll directive does not support <"+e.tagName+"> as a repeating tag: "+e.outerHTML);case"tr":t=angular.element("
    ").find("tr");break;case"li":t=angular.element("
  • ");break;default:t=angular.element("
    ")}return t}Object.defineProperty(t,"__esModule",{value:!0});var l=function(){function e(e,t){for(var n=0;n=0;t--)if(this[t].index===e.scope.$index)return void(this[t].height=e.element.outerHeight());this.push({index:e.scope.$index,height:e.element.outerHeight()}),this.sort(function(e,t){return e.indext.index?1:0})}},{key:"remove",value:function(e,t){for(var n=e%1==0?e:e.scope.$index,r=e%1==0?t:"isTop"===e._op,i=this.length-1;i>=0;i--)if(this[i].index===n){this.splice(i,1);break}if(!r)for(var o=this.length-1;o>=0;o--)this[o].index>n&&this[o].index--}},{key:"clear",value:function(){this.length=0}}]),e}();i.prototype=Object.create(Array.prototype),Object.getOwnPropertyNames(a.prototype).forEach(function(e){return i.prototype[e]=a.prototype[e]});var u=function(){function e(t){r(this,e),this.element=o(t),this.cache=new i}return l(e,[{key:"height",value:function(){return this.element.height.apply(this.element,arguments)}}]),e}();t.default=u},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n=0;n--)this.publicContext[t[n]]=this[t[n]].bind(this);for(var r=["isLoading","topVisible","topVisibleElement","topVisibleScope","bottomVisible","bottomVisibleElement","bottomVisibleScope"],i=r.length-1;i>=0;i--)!function(t){var n=void 0,i=e.$attr[r[t]];Object.defineProperty(e,r[t],{get:function(){return n},set:function(o){n=o,e.publicContext[r[t]]=o,i&&e.$parse(i).assign(e.startScope,o)}})}(i);Object.defineProperty(this.publicContext,"disabled",{get:function(){return e.disabled},set:function(t){return(e.disabled=t)?null:e.doAdjust()}})}},{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:"resetScrollTopCorrection",value:function(){this.viewport.scrollTopValue=null}},{key:"append",value:function(e){this.buffer.append(e),this.doAdjust(),this.viewport.clipTop(),this.viewport.clipBottom()}},{key:"prepend",value:function(e){this.buffer.prepend(e),this.doAdjust(),this.viewport.clipTop(),this.viewport.clipBottom()}},{key:"applyUpdates",value:function(e,t){"function"==typeof e?this.applyUpdatesFunc(e):this.applyUpdatesIndex(e,t),this.doAdjust()}},{key:"applyUpdatesFunc",value:function(e){var t=this;this.buffer.slice(0).forEach(function(n){t.applyUpdate(n,e(n.item,n.scope,n.element))})}},{key:"applyUpdatesIndex",value:function(e,t){if(e%1!=0)throw new Error("applyUpdates - "+e+" is not a valid index (should be an integer)");var n=e-this.buffer.first;n>=0&&n=this.buffer.getAbsMinIndex()&&e<=this.buffer.getAbsMaxIndex()&&angular.isArray(t)&&!t.length&&(this.viewport.removeCacheItem(e,e===this.buffer.minIndex),e===this.buffer.getAbsMinIndex()?this.buffer.incrementMinIndex():this.buffer.decrementMaxIndex())}},{key:"applyUpdate",value:function(e,t){var n=this;if(angular.isArray(t)){var r=this.buffer.indexOf(e);t.reverse().some(function(t){return t===e.item})||(e.op="remove",0!==r||t.length||(e._op="isTop")),t.forEach(function(t){t===e.item?r--:n.buffer.insert(r+1,t,-1===r)})}}},{key:"calculateProperties",value:function(){for(var e=null,t=0,n=!1,r=!1,i=this.buffer.length,o=0;othis.viewport.topVisiblePos()&&(n=!0,this.topVisible=l.item,this.topVisibleElement=l.element,this.topVisibleScope=l.scope),!r&&(s>=this.viewport.bottomVisiblePos()||o===i-1&&this.isEOF())&&(r=!0,this.bottomVisible=l.item,this.bottomVisibleElement=l.element,this.bottomVisibleScope=l.scope),t+=u}if(e=a,n&&r)break}}}]),e}();t.default=o}]); //# sourceMappingURL=ui-scroll.min.js.map \ No newline at end of file diff --git a/dist/ui-scroll.min.js.map b/dist/ui-scroll.min.js.map index 221dda03..9535f7cc 100644 --- a/dist/ui-scroll.min.js.map +++ b/dist/ui-scroll.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///ui-scroll.min.js","webpack:///webpack/bootstrap 8c9f7d12571bf2ad3771","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","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","_interopRequireDefault","obj","default","_jqLiteExtras","_jqLiteExtras2","_elementRoutines","_elementRoutines2","_buffer","_buffer2","_viewport","_viewport2","_adapter","_adapter2","angular","constant","JQLiteExtras","run","window","jQuery","registerFor","element","ElementRoutines","addCSSRules","directive","restrict","controller","scope","_this","this","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$interval","$q","$parse","link","$scope","$attr","controllers","linker","parseNumericAttr","value","defaultValue","result","isNaN","onRenderHandlersRunner","onRenderHandlers","handler","persistDatasourceIndex","datasource","propName","isNumber","filter","id","push","defineDatasourceIndex","propUserName","descriptor","getOwnPropertyDescriptor","set","pending","length","buffer","topPaddingHeightOld","topDataPos","adjustPaddings","onAfterMinIndexSet","isInvalid","rid","ridActual","$$destroyed","bindEvents","bind","resizeAndScrollHandler","unbindEvents","unbind","reload","resetTopPadding","resetBottomPadding","arguments","startIndex","reset","doAdjust","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","item","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","elementRoutines","hideElement","promises","sibling","undefined","clone","itemName","adapter","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updateDOM","toBePrepended","toBeRemoved","inserted","op","unshift","concat","insertElementAnimated","removeItem","$index","first","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","loading","fetch","shouldLoadTop","processUpdates","$$phase","$digest","w","showElement","calculateProperties","doAdjustAfterFetch","onAfterPrepend","shift","fetchNext","bufferSize","eof","clipTop","append","fetchPrevious","bof","clipBottom","prepend","isLoading","disabled","wheelHandler","event","scrollTop","yMax","scrollHeight","clientHeight","preventDefault","match","uiScroll","Error","datasourceName","viewportController","Math","max","padding","ScrollBuffer","Viewport","Adapter","isDatasourceValid","toString","success","next","index","count","createPaddingElements","$destroy","remove","$on","tryCount","applyContainerStyle","timer","cancel","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","writable","key","protoProps","staticProps","scrollTo","self","direction","elem","_top$left$direction","top","left","method","prop","preserve","isValueDefined","isWindow","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","nodeType","location","alert","setInterval","getComputedStyle","currentStyle","rs","rsLeft","core_pnum","source","RegExp","test","runtimeStyle","pixelLeft","before","newElem","j","parent","ref","contents","after","outerHTML","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","$animate","has","isAngularVersionLessThen1_3","version","major","minor","sheet","styleSheets","cssRules","insertRule","selector","addRule","addClass","removeClass","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","create","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","isTop","splice","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","elements","Number","MAX_VALUE","bottom","NEGATIVE_INFINITY","bufferPadding","topPadding","bottomPadding","overflow-anchor","overflow-y","display","getScope","template","Padding","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","totalHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","removeCacheItem","_padding","_padding2","Cache","apply","setPrototypeOf","generateElement","Node","ELEMENT_NODE","find","CacheProto","sort","a","b","argument","_isTop","getOwnPropertyNames","methodName","viewportScope","startScope","$parent","publicContext","assignAdapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","publicMethods","publicProps","attr","newItems","applyUpdatesFunc","applyUpdatesIndex","cb","_this2","slice","applyUpdate","_index","_this3","position","some","newItem","rowTop","topHeight","topDone","bottomDone","itemTop","isEOF"],"mappings":"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","file":"ui-scroll.min.js","sourcesContent":["/******/ (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/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _jqLiteExtras = __webpack_require__(1);\n\nvar _jqLiteExtras2 = _interopRequireDefault(_jqLiteExtras);\n\nvar _elementRoutines = __webpack_require__(2);\n\nvar _elementRoutines2 = _interopRequireDefault(_elementRoutines);\n\nvar _buffer = __webpack_require__(3);\n\nvar _buffer2 = _interopRequireDefault(_buffer);\n\nvar _viewport = __webpack_require__(4);\n\nvar _viewport2 = _interopRequireDefault(_viewport);\n\nvar _adapter = __webpack_require__(6);\n\nvar _adapter2 = _interopRequireDefault(_adapter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nangular.module('ui.scroll', []).constant('JQLiteExtras', _jqLiteExtras2.default).run(['JQLiteExtras', function (JQLiteExtras) {\n !window.jQuery ? new JQLiteExtras().registerFor(angular.element) : null;\n _elementRoutines2.default.addCSSRules();\n}]).directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: ['$scope', '$element', function (scope, element) {\n var _this = this;\n\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), function (child) {\n if (child.tagName.toLowerCase() === 'tbody') {\n _this.viewport = angular.element(child);\n }\n });\n\n return this;\n }]\n };\n}).directive('uiScroll', ['$log', '$injector', '$rootScope', '$timeout', '$interval', '$q', '$parse', function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n var 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 var result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\n }\n\n var BUFFER_MIN = 3;\n var BUFFER_DEFAULT = 10;\n var PADDING_MIN = 0.3;\n var PADDING_DEFAULT = 0.5;\n var MAX_VIEWPORT_DELAY = 500;\n var VIEWPORT_POLLING_INTERVAL = 50;\n\n var datasource = null;\n var itemName = match[1];\n var datasourceName = match[2];\n var viewportController = controllers[0];\n var bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n var padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT));\n var startIndex = parseNumericAttr($attr.startIndex, 1);\n var ridActual = 0; // current data revision id\n var pending = [];\n\n var elementRoutines = new _elementRoutines2.default($injector, $q);\n var buffer = new _buffer2.default(elementRoutines, bufferSize, startIndex);\n var viewport = new _viewport2.default(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n var adapter = new _adapter2.default($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n var isDatasourceValid = function isDatasourceValid() {\n return Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n };\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n var onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(function (handler) {\n return handler.run();\n });\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n var getter = void 0;\n // need to postpone min/maxIndexUser processing if the view is empty\n if (angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if (angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(function (handler) {\n return handler.id !== propName;\n });\n onRenderHandlers.push({\n id: propName,\n run: function run() {\n return datasource[propName] = getter;\n }\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n var descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n var getter = void 0;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: function set(value) {\n getter = value;\n if (pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n var topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: function get() {\n return getter;\n }\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n var fetchNext = datasource.get.length !== 2 ? function (success) {\n return datasource.get(buffer.next, bufferSize, success);\n } : function (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 var fetchPrevious = datasource.get.length !== 2 ? function (success) {\n return datasource.get(buffer.first - bufferSize, bufferSize, success);\n } : function (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 var initialize = function initialize() {\n var tryCount = 0;\n if (!viewport.applyContainerStyle()) {\n var timer = $interval(function () {\n tryCount++;\n if (viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if (tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error('ui-scroll directive requires a viewport with non-zero height in ' + MAX_VIEWPORT_DELAY + 'ms');\n }\n }, VIEWPORT_POLLING_INTERVAL);\n } else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker(function (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', function () {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return rid && rid !== ridActual || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach(function (item) {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(function () {\n return doAdjust();\n });\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(function () {\n return visibilityWatcher(wrapper);\n });\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n var promises = null;\n var sibling = insertAfter > 0 ? buffer[insertAfter - 1].element : undefined;\n linker(function (clone, scope) {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n var tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: function onLink() {\n return adapter.transform(wrapper.scope, wrapper.element);\n },\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n var promises = [];\n var toBePrepended = [];\n var toBeRemoved = [];\n var inserted = [];\n\n buffer.forEach(function (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(function (wrapper) {\n return promises = promises.concat(viewport.removeItem(wrapper));\n });\n\n if (toBePrepended.length) toBePrepended.forEach(function (wrapper) {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach(function (item, i) {\n return item.scope.$index = buffer.first + i;\n });\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(function () {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if (!updates || buffer.effectiveHeight(updates.prepended) > 0 || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n var updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(function (w) {\n return elementRoutines.showElement(w);\n });\n updates.prepended.forEach(function (w) {\n return elementRoutines.showElement(w);\n });\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) {\n // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n var updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n var updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length) fetch(rid);else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {\n // scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext(function (result) {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else {\n // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious(function (result) {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler() {\n if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\n enqueueFetch(ridActual);\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n var scrollTop = viewport[0].scrollTop;\n var 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/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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\nvar _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\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/*!\r\n globals: angular, window\r\n List of used element methods available in JQuery but not in JQuery Lite\r\n element.before(elem)\r\n element.height()\r\n element.outerHeight(true)\r\n element.height(value) = only for Top/Bottom padding elements\r\n element.scrollTop()\r\n element.scrollTop(value)\r\n */\n\nvar JQLiteExtras = function () {\n function JQLiteExtras() {\n _classCallCheck(this, JQLiteExtras);\n }\n\n _createClass(JQLiteExtras, [{\n key: 'registerFor',\n value: function registerFor(element) {\n var convertToPx = void 0,\n css = void 0,\n getStyle = void 0,\n isWindow = void 0;\n // angular implementation blows up if elem is the window\n css = angular.element.prototype.css;\n\n element.prototype.css = function (name, value) {\n var self = this;\n var elem = self[0];\n if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\n return css.call(self, name, value);\n }\n };\n\n // as defined in angularjs v1.0.5\n isWindow = function isWindow(obj) {\n return obj && obj.document && obj.location && obj.alert && obj.setInterval;\n };\n\n function scrollTo(self, direction, value) {\n var elem = self[0];\n\n var _top$left$direction = _slicedToArray({\n top: ['scrollTop', 'pageYOffset', 'scrollLeft'],\n left: ['scrollLeft', 'pageXOffset', 'scrollTop']\n }[direction], 3),\n method = _top$left$direction[0],\n prop = _top$left$direction[1],\n preserve = _top$left$direction[2];\n\n var isValueDefined = typeof value !== 'undefined';\n if (isWindow(elem)) {\n if (isValueDefined) {\n return elem.scrollTo(self[preserve].call(self), value);\n }\n return prop in elem ? elem[prop] : elem.document.documentElement[method];\n } else {\n if (isValueDefined) {\n elem[method] = value;\n }\n return elem[method];\n }\n }\n\n if (window.getComputedStyle) {\n getStyle = function getStyle(elem) {\n return window.getComputedStyle(elem, null);\n };\n convertToPx = function convertToPx(elem, value) {\n return parseFloat(value);\n };\n } else {\n getStyle = function getStyle(elem) {\n return elem.currentStyle;\n };\n convertToPx = function convertToPx(elem, value) {\n var left = void 0,\n result = void 0,\n rs = void 0,\n rsLeft = void 0,\n style = void 0;\n var core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\n var rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\n\n if (!rnumnonpx.test(value)) {\n return parseFloat(value);\n }\n\n // ported from JQuery\n style = elem.style;\n left = style.left;\n rs = elem.runtimeStyle;\n rsLeft = rs && rs.left;\n if (rs) {\n rs.left = style.left;\n }\n // put in the new values to get a computed style out\n style.left = value;\n result = style.pixelLeft;\n style.left = left;\n if (rsLeft) {\n rs.left = rsLeft;\n }\n return result;\n };\n }\n\n function getMeasurements(elem, measure) {\n var base = void 0,\n borderA = void 0,\n borderB = void 0,\n computedMarginA = void 0,\n computedMarginB = void 0,\n computedStyle = void 0,\n dirA = void 0,\n dirB = void 0,\n marginA = void 0,\n marginB = void 0,\n paddingA = void 0,\n paddingB = void 0;\n\n if (isWindow(elem)) {\n base = document.documentElement[{ height: 'clientHeight', width: 'clientWidth' }[measure]];\n\n return {\n base: base,\n padding: 0,\n border: 0,\n margin: 0\n };\n }\n\n // Start with offset property\n\n var _width$height$measure = _slicedToArray({\n width: [elem.offsetWidth, 'Left', 'Right'],\n height: [elem.offsetHeight, 'Top', 'Bottom']\n }[measure], 3);\n\n base = _width$height$measure[0];\n dirA = _width$height$measure[1];\n dirB = _width$height$measure[2];\n\n\n computedStyle = getStyle(elem);\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\n computedMarginA = computedStyle['margin' + dirA];\n computedMarginB = computedStyle['margin' + dirB];\n\n // I do not care for width for now, so this hack is irrelevant\n // if ( !supportsPercentMargin )\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\n marginA = convertToPx(elem, computedMarginA) || 0;\n marginB = convertToPx(elem, computedMarginB) || 0;\n\n return {\n base: base,\n padding: paddingA + paddingB,\n border: borderA + borderB,\n margin: marginA + marginB\n };\n }\n\n function getWidthHeight(elem, direction, measure) {\n var computedStyle = void 0,\n result = void 0;\n\n var measurements = getMeasurements(elem, direction);\n\n if (measurements.base > 0) {\n return {\n base: measurements.base - measurements.padding - measurements.border,\n outer: measurements.base,\n outerfull: measurements.base + measurements.margin\n }[measure];\n }\n\n // Fall back to computed then uncomputed css if necessary\n computedStyle = getStyle(elem);\n result = computedStyle[direction];\n\n if (result < 0 || result === null) {\n result = elem.style[direction] || 0;\n }\n\n // Normalize \"\", auto, and prepare for extra\n result = parseFloat(result) || 0;\n\n return {\n base: result - measurements.padding - measurements.border,\n outer: result,\n outerfull: result + measurements.padding + measurements.border + measurements.margin\n }[measure];\n }\n\n // define missing methods\n return angular.forEach({\n before: function before(newElem) {\n var children, elem, i, j, parent, ref, self;\n self = this;\n elem = self[0];\n parent = self.parent();\n children = parent.contents();\n if (children[0] === elem) {\n return parent.prepend(newElem);\n } else {\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n if (children[i] === elem) {\n angular.element(children[i - 1]).after(newElem);\n return;\n }\n }\n throw new Error('invalid DOM structure ' + elem.outerHTML);\n }\n },\n height: function height(value) {\n var self;\n self = this;\n if (typeof value !== 'undefined') {\n if (angular.isNumber(value)) {\n value = value + 'px';\n }\n return css.call(self, 'height', value);\n } else {\n return getWidthHeight(this[0], 'height', 'base');\n }\n },\n outerHeight: function outerHeight(option) {\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\n },\n outerWidth: function outerWidth(option) {\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\n },\n\n\n /*\r\n The offset setter method is not implemented\r\n */\n offset: function offset(value) {\n var docElem = void 0,\n win = void 0;\n var self = this;\n var box = {\n top: 0,\n left: 0\n };\n var elem = self[0];\n var doc = elem && elem.ownerDocument;\n\n if (arguments.length) {\n if (value === undefined) {\n return self;\n }\n // TODO: implement setter\n throw new Error('offset setter method is not implemented');\n }\n\n if (!doc) {\n return;\n }\n\n docElem = doc.documentElement;\n\n // TODO: Make sure it's not a disconnected DOM node\n\n if (elem.getBoundingClientRect != null) {\n box = elem.getBoundingClientRect();\n }\n\n win = doc.defaultView || doc.parentWindow;\n\n return {\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n };\n },\n scrollTop: function scrollTop(value) {\n return scrollTo(this, 'top', value);\n },\n scrollLeft: function scrollLeft(value) {\n return scrollTo(this, 'left', value);\n }\n }, function (value, key) {\n if (!element.prototype[key]) {\n return element.prototype[key] = value;\n }\n });\n }\n }]);\n\n return JQLiteExtras;\n}();\n\nexports.default = JQLiteExtras;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar hideClassToken = 'ng-ui-scroll-hide';\n\nvar ElementRoutines = function () {\n _createClass(ElementRoutines, null, [{\n key: 'addCSSRules',\n value: function addCSSRules() {\n var selector = '.' + hideClassToken;\n var rules = 'display: none';\n var sheet = document.styleSheets[0];\n var index = void 0;\n try {\n index = sheet.cssRules.length;\n } catch (err) {\n index = 0;\n }\n if ('insertRule' in sheet) {\n sheet.insertRule(selector + '{' + rules + '}', index);\n } else if ('addRule' in sheet) {\n sheet.addRule(selector, rules, index);\n }\n }\n }]);\n\n function ElementRoutines($injector, $q) {\n _classCallCheck(this, ElementRoutines);\n\n this.$animate = $injector.has && $injector.has('$animate') ? $injector.get('$animate') : null;\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\n this.$q = $q;\n }\n\n _createClass(ElementRoutines, [{\n key: 'hideElement',\n value: function hideElement(wrapper) {\n wrapper.element.addClass(hideClassToken);\n }\n }, {\n key: 'showElement',\n value: function showElement(wrapper) {\n wrapper.element.removeClass(hideClassToken);\n }\n }, {\n key: 'insertElement',\n value: function insertElement(newElement, previousElement) {\n previousElement.after(newElement);\n return [];\n }\n }, {\n key: 'removeElement',\n value: function removeElement(wrapper) {\n wrapper.element.remove();\n wrapper.scope.$destroy();\n return [];\n }\n }, {\n key: 'insertElementAnimated',\n value: function insertElementAnimated(newElement, previousElement) {\n if (!this.$animate) {\n return this.insertElement(newElement, previousElement);\n }\n\n if (this.isAngularVersionLessThen1_3) {\n var deferred = this.$q.defer();\n // no need for parent - previous element is never null\n this.$animate.enter(newElement, null, previousElement, function () {\n return deferred.resolve();\n });\n\n return [deferred.promise];\n }\n\n // no need for parent - previous element is never null\n return [this.$animate.enter(newElement, null, previousElement)];\n }\n }, {\n key: 'removeElementAnimated',\n value: function removeElementAnimated(wrapper) {\n if (!this.$animate) {\n return this.removeElement(wrapper);\n }\n\n if (this.isAngularVersionLessThen1_3) {\n var deferred = this.$q.defer();\n this.$animate.leave(wrapper.element, function () {\n wrapper.scope.$destroy();\n return deferred.resolve();\n });\n\n return [deferred.promise];\n }\n\n return [this.$animate.leave(wrapper.element).then(function () {\n return wrapper.scope.$destroy();\n })];\n }\n }]);\n\n return ElementRoutines;\n}();\n\nexports.default = ElementRoutines;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = ScrollBuffer;\nfunction ScrollBuffer(elementRoutines, bufferSize, startIndex) {\n var buffer = Object.create(Array.prototype);\n\n angular.extend(buffer, {\n size: bufferSize,\n\n reset: function reset(startIndex) {\n buffer.remove(0, buffer.length);\n buffer.eof = false;\n buffer.bof = false;\n buffer.first = startIndex;\n buffer.next = startIndex;\n buffer.minIndex = startIndex;\n buffer.maxIndex = startIndex;\n buffer.minIndexUser = null;\n buffer.maxIndexUser = null;\n },\n append: function append(items) {\n items.forEach(function (item) {\n ++buffer.next;\n buffer.insert('append', item);\n });\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\n },\n prepend: function prepend(items) {\n items.reverse().forEach(function (item) {\n --buffer.first;\n buffer.insert('prepend', item);\n });\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\n },\n\n\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 */\n insert: function insert(operation, item, isTop) {\n var wrapper = {\n item: item\n };\n\n if (operation % 1 === 0) {\n // it is an insert\n wrapper.op = 'insert';\n buffer.splice(operation, 0, wrapper);\n if (isTop) {\n buffer.first--;\n } else {\n buffer.next++;\n }\n } else {\n wrapper.op = operation;\n switch (operation) {\n case 'append':\n buffer.push(wrapper);\n break;\n case 'prepend':\n buffer.unshift(wrapper);\n break;\n }\n }\n },\n\n\n // removes elements from buffer\n remove: function remove(arg1, arg2) {\n if (angular.isNumber(arg1)) {\n // removes items from arg1 (including) through arg2 (excluding)\n for (var i = arg1; i < arg2; i++) {\n elementRoutines.removeElement(buffer[i]);\n }\n return buffer.splice(arg1, arg2 - arg1);\n }\n // removes single item(wrapper) from the buffer\n buffer.splice(buffer.indexOf(arg1), 1);\n if (arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\n this.incrementMinIndex();\n } else {\n this.decrementMaxIndex();\n }\n if (arg1._op === 'isTop') {\n buffer.first++;\n } else {\n buffer.next--;\n }\n if (!buffer.length) {\n buffer.first = 1;\n buffer.next = 1;\n }\n\n return elementRoutines.removeElementAnimated(arg1);\n },\n incrementMinIndex: function incrementMinIndex() {\n if (buffer.minIndexUser !== null) {\n if (buffer.minIndex > buffer.minIndexUser) {\n buffer.minIndexUser++;\n return;\n }\n if (buffer.minIndex === buffer.minIndexUser) {\n buffer.minIndexUser++;\n }\n }\n buffer.minIndex++;\n },\n decrementMaxIndex: function decrementMaxIndex() {\n if (buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\n buffer.maxIndexUser--;\n }\n buffer.maxIndex--;\n },\n getAbsMinIndex: function getAbsMinIndex() {\n if (buffer.minIndexUser !== null) {\n return Math.min(buffer.minIndexUser, buffer.minIndex);\n }\n return buffer.minIndex;\n },\n getAbsMaxIndex: function getAbsMaxIndex() {\n if (buffer.maxIndexUser !== null) {\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\n }\n return buffer.maxIndex;\n },\n effectiveHeight: function effectiveHeight(elements) {\n if (!elements.length) {\n return 0;\n }\n var top = Number.MAX_VALUE;\n var bottom = Number.NEGATIVE_INFINITY;\n elements.forEach(function (wrapper) {\n if (wrapper.element[0].offsetParent) {\n // element style is not display:none\n top = Math.min(top, wrapper.element.offset().top);\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\n }\n });\n return Math.max(0, bottom - top);\n }\n });\n\n buffer.reset(startIndex);\n\n return buffer;\n}\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = Viewport;\n\nvar _padding = __webpack_require__(5);\n\nvar _padding2 = _interopRequireDefault(_padding);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\n var topPadding = null;\n var bottomPadding = null;\n var viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\n var container = viewportController && viewportController.container ? viewportController.container : undefined;\n var scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\n\n viewport.css({\n 'overflow-anchor': 'none',\n 'overflow-y': 'auto',\n 'display': 'block'\n });\n\n function bufferPadding() {\n return viewport.outerHeight() * padding; // some extra space to initiate preload\n }\n\n angular.extend(viewport, {\n getScope: function getScope() {\n return scope;\n },\n createPaddingElements: function createPaddingElements(template) {\n topPadding = new _padding2.default(template);\n bottomPadding = new _padding2.default(template);\n element.before(topPadding.element);\n element.after(bottomPadding.element);\n topPadding.height(0);\n bottomPadding.height(0);\n },\n applyContainerStyle: function applyContainerStyle() {\n if (!container) {\n return true;\n }\n if (container !== viewport) {\n viewport.css('height', window.getComputedStyle(container[0]).height);\n }\n return viewport.height() > 0;\n },\n bottomDataPos: function bottomDataPos() {\n var scrollHeight = viewport[0].scrollHeight;\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\n return scrollHeight - bottomPadding.height();\n },\n topDataPos: function topDataPos() {\n return topPadding.height();\n },\n bottomVisiblePos: function bottomVisiblePos() {\n return viewport.scrollTop() + viewport.outerHeight();\n },\n topVisiblePos: function topVisiblePos() {\n return viewport.scrollTop();\n },\n insertElement: function insertElement(e, sibling) {\n return elementRoutines.insertElement(e, sibling || topPadding.element);\n },\n insertElementAnimated: function insertElementAnimated(e, sibling) {\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\n },\n shouldLoadBottom: function shouldLoadBottom() {\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\n },\n clipBottom: function clipBottom() {\n // clip the invisible items off the bottom\n var overage = 0;\n var overageHeight = 0;\n var itemHeight = 0;\n var emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\n\n for (var i = buffer.length - 1; i >= 0; i--) {\n itemHeight = buffer[i].element.outerHeight(true);\n if (overageHeight + itemHeight > emptySpaceHeight) {\n break;\n }\n bottomPadding.cache.add(buffer[i]);\n overageHeight += itemHeight;\n overage++;\n }\n\n if (overage > 0) {\n buffer.eof = false;\n buffer.remove(buffer.length - overage, buffer.length);\n buffer.next -= overage;\n viewport.adjustPaddings();\n }\n },\n shouldLoadTop: function shouldLoadTop() {\n return !buffer.bof && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding();\n },\n clipTop: function clipTop() {\n // clip the invisible items off the top\n var overage = 0;\n var overageHeight = 0;\n var itemHeight = 0;\n var emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\n\n for (var i = 0; i < buffer.length; i++) {\n itemHeight = buffer[i].element.outerHeight(true);\n if (overageHeight + itemHeight > emptySpaceHeight) {\n break;\n }\n topPadding.cache.add(buffer[i]);\n overageHeight += itemHeight;\n overage++;\n }\n\n if (overage > 0) {\n // we need to adjust top padding element before items are removed from top\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\n topPadding.height(topPadding.height() + overageHeight);\n buffer.bof = false;\n buffer.remove(0, overage);\n buffer.first += overage;\n }\n },\n adjustPaddings: function adjustPaddings() {\n if (!buffer.length) {\n return;\n }\n\n // precise heights calculation based on items that are in buffer or that were in buffer once\n var visibleItemsHeight = buffer.reduce(function (summ, item) {\n return summ + item.element.outerHeight(true);\n }, 0);\n\n var topPaddingHeight = 0,\n topCount = 0;\n topPadding.cache.forEach(function (item) {\n if (item.index < buffer.first) {\n topPaddingHeight += item.height;\n topCount++;\n }\n });\n\n var bottomPaddingHeight = 0,\n bottomCount = 0;\n bottomPadding.cache.forEach(function (item) {\n if (item.index >= buffer.next) {\n bottomPaddingHeight += item.height;\n bottomCount++;\n }\n });\n\n var totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\n var averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\n\n // average heights calculation, items that have never been reached\n var adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\n var adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\n var topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\n var bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\n\n // paddings combine adjustment\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\n },\n onAfterMinIndexSet: function onAfterMinIndexSet(topPaddingHeightOld) {\n // additional scrollTop adjustment in case of datasource.minIndex external set\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\n var diff = topPadding.height() - topPaddingHeightOld;\n viewport.scrollTop(viewport.scrollTop() + diff);\n while ((diff -= viewport.scrollTop()) > 0) {\n bottomPadding.height(bottomPadding.height() + diff);\n viewport.scrollTop(viewport.scrollTop() + diff);\n }\n }\n },\n onAfterPrepend: function onAfterPrepend(updates) {\n if (!updates.prepended.length) return;\n var height = buffer.effectiveHeight(updates.prepended);\n var paddingHeight = topPadding.height() - height;\n if (paddingHeight >= 0) {\n topPadding.height(paddingHeight);\n } else {\n topPadding.height(0);\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\n }\n },\n resetTopPadding: function resetTopPadding() {\n topPadding.height(0);\n topPadding.cache.clear();\n },\n resetBottomPadding: function resetBottomPadding() {\n bottomPadding.height(0);\n bottomPadding.cache.clear();\n },\n removeCacheItem: function removeCacheItem(item, isTop) {\n topPadding.cache.remove(item, isTop);\n bottomPadding.cache.remove(item, isTop);\n },\n removeItem: function removeItem(item) {\n this.removeCacheItem(item);\n return buffer.remove(item);\n }\n });\n\n return viewport;\n}\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Can't just extend the Array, due to Babel does not support built-in classes extending\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\nvar CacheProto = function () {\n function CacheProto() {\n _classCallCheck(this, CacheProto);\n }\n\n _createClass(CacheProto, [{\n key: 'add',\n value: function add(item) {\n for (var i = this.length - 1; i >= 0; i--) {\n if (this[i].index === item.scope.$index) {\n this[i].height = item.element.outerHeight();\n return;\n }\n }\n this.push({\n index: item.scope.$index,\n height: item.element.outerHeight()\n });\n this.sort(function (a, b) {\n return a.index < b.index ? -1 : a.index > b.index ? 1 : 0;\n });\n }\n }, {\n key: 'remove',\n value: function remove(argument, _isTop) {\n var index = argument % 1 === 0 ? argument : argument.scope.$index;\n var isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\n for (var i = this.length - 1; i >= 0; i--) {\n if (this[i].index === index) {\n this.splice(i, 1);\n break;\n }\n }\n if (!isTop) {\n for (var _i = this.length - 1; _i >= 0; _i--) {\n if (this[_i].index > index) {\n this[_i].index--;\n }\n }\n }\n }\n }, {\n key: 'clear',\n value: function clear() {\n this.length = 0;\n }\n }]);\n\n return CacheProto;\n}();\n\nfunction Cache() {\n var instance = [];\n instance.push.apply(instance, arguments);\n Object.setPrototypeOf(instance, Cache.prototype);\n return instance;\n}\nCache.prototype = Object.create(Array.prototype);\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(function (methodName) {\n return Cache.prototype[methodName] = CacheProto.prototype[methodName];\n});\n\nfunction generateElement(template) {\n if (template.nodeType !== Node.ELEMENT_NODE) {\n throw new Error('ui-scroll directive requires an Element node for templating the view');\n }\n var element = void 0;\n switch (template.tagName.toLowerCase()) {\n case 'dl':\n throw new Error('ui-scroll directive does not support <' + template.tagName + '> as a repeating tag: ' + template.outerHTML);\n case 'tr':\n var table = angular.element('
    ');\n element = table.find('tr');\n break;\n case 'li':\n element = angular.element('
  • ');\n break;\n default:\n element = angular.element('
    ');\n }\n return element;\n}\n\nvar Padding = function () {\n function Padding(template) {\n _classCallCheck(this, Padding);\n\n this.element = generateElement(template);\n this.cache = new Cache();\n }\n\n _createClass(Padding, [{\n key: 'height',\n value: function height() {\n return this.element.height.apply(this.element, arguments);\n }\n }]);\n\n return Padding;\n}();\n\nexports.default = Padding;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Adapter = function () {\n function Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\n _classCallCheck(this, Adapter);\n\n this.$parse = $parse;\n this.$attr = $attr;\n this.viewport = viewport;\n this.buffer = buffer;\n\n this.doAdjust = doAdjust;\n this.reload = reload;\n\n this.isLoading = false;\n this.disabled = false;\n\n var viewportScope = viewport.getScope();\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\n\n this.publicContext = {};\n this.assignAdapter($attr.adapter);\n this.generatePublicContext();\n }\n\n _createClass(Adapter, [{\n key: 'assignAdapter',\n value: function assignAdapter(adapterAttr) {\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\n return;\n }\n var adapterOnScope = void 0;\n\n try {\n this.$parse(adapterAttr).assign(this.startScope, {});\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\n } catch (error) {\n error.message = 'Angular ui-scroll Adapter assignment exception.\\n' + ('Can\\'t parse \"' + adapterAttr + '\" expression.\\n') + error.message;\n throw error;\n }\n\n angular.extend(adapterOnScope, this.publicContext);\n this.publicContext = adapterOnScope;\n }\n }, {\n key: 'generatePublicContext',\n value: function generatePublicContext() {\n var _this = this;\n\n // these methods will be accessible out of ui-scroll via user defined adapter\n var publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\n for (var i = publicMethods.length - 1; i >= 0; i--) {\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\n }\n\n // these read-only props will be accessible out of ui-scroll via user defined adapter\n var publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\n\n var _loop = function _loop(_i) {\n var property = void 0,\n attr = _this.$attr[publicProps[_i]];\n Object.defineProperty(_this, publicProps[_i], {\n get: function get() {\n return property;\n },\n set: function set(value) {\n property = value;\n _this.publicContext[publicProps[_i]] = value;\n if (attr) {\n _this.$parse(attr).assign(_this.startScope, value);\n }\n }\n });\n };\n\n for (var _i = publicProps.length - 1; _i >= 0; _i--) {\n _loop(_i);\n }\n\n // non-read-only public property\n Object.defineProperty(this.publicContext, 'disabled', {\n get: function get() {\n return _this.disabled;\n },\n set: function set(value) {\n return !(_this.disabled = value) ? _this.doAdjust() : null;\n }\n });\n }\n }, {\n key: 'loading',\n value: function loading(value) {\n this.isLoading = value;\n }\n }, {\n key: 'isBOF',\n value: function isBOF() {\n return this.buffer.bof;\n }\n }, {\n key: 'isEOF',\n value: function isEOF() {\n return this.buffer.eof;\n }\n }, {\n key: 'isEmpty',\n value: function isEmpty() {\n return !this.buffer.length;\n }\n }, {\n key: 'append',\n value: function append(newItems) {\n this.buffer.append(newItems);\n this.doAdjust();\n this.viewport.clipTop();\n this.viewport.clipBottom();\n }\n }, {\n key: 'prepend',\n value: function prepend(newItems) {\n this.buffer.prepend(newItems);\n this.doAdjust();\n this.viewport.clipTop();\n this.viewport.clipBottom();\n }\n }, {\n key: 'applyUpdates',\n value: function applyUpdates(arg1, arg2) {\n if (typeof arg1 === 'function') {\n this.applyUpdatesFunc(arg1);\n } else {\n this.applyUpdatesIndex(arg1, arg2);\n }\n this.doAdjust();\n }\n }, {\n key: 'applyUpdatesFunc',\n value: function applyUpdatesFunc(cb) {\n var _this2 = this;\n\n this.buffer.slice(0).forEach(function (wrapper) {\n // we need to do it on the buffer clone, because buffer content\n // may change as we iterate through\n _this2.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element));\n });\n }\n }, {\n key: 'applyUpdatesIndex',\n value: function applyUpdatesIndex(index, newItems) {\n if (index % 1 !== 0) {\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\n }\n var _index = index - this.buffer.first;\n\n // apply updates only within buffer\n if (_index >= 0 && _index < this.buffer.length) {\n this.applyUpdate(this.buffer[_index], newItems);\n }\n // out-of-buffer case: deletion may affect Paddings\n else if (index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\n if (angular.isArray(newItems) && !newItems.length) {\n this.viewport.removeCacheItem(index, index === this.buffer.minIndex);\n if (index === this.buffer.getAbsMinIndex()) {\n this.buffer.incrementMinIndex();\n } else {\n this.buffer.decrementMaxIndex();\n }\n }\n }\n }\n }, {\n key: 'applyUpdate',\n value: function applyUpdate(wrapper, newItems) {\n var _this3 = this;\n\n if (!angular.isArray(newItems)) {\n return;\n }\n var position = this.buffer.indexOf(wrapper);\n if (!newItems.reverse().some(function (newItem) {\n return newItem === wrapper.item;\n })) {\n wrapper.op = 'remove';\n if (position === 0 && !newItems.length) {\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\n }\n }\n newItems.forEach(function (newItem) {\n if (newItem === wrapper.item) {\n position--;\n } else {\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\n _this3.buffer.insert(position + 1, newItem, position === -1);\n }\n });\n }\n }, {\n key: 'calculateProperties',\n value: function calculateProperties() {\n var rowTop = null,\n topHeight = 0;\n var topDone = false,\n bottomDone = false;\n var length = this.buffer.length;\n\n for (var i = 0; i < length; i++) {\n var item = this.buffer[i];\n var itemTop = item.element.offset().top;\n\n if (rowTop !== itemTop) {\n // a new row condition\n var itemHeight = item.element.outerHeight(true);\n var top = this.viewport.topDataPos() + topHeight + itemHeight;\n\n if (!topDone && top > this.viewport.topVisiblePos()) {\n topDone = true;\n this['topVisible'] = item.item;\n this['topVisibleElement'] = item.element;\n this['topVisibleScope'] = item.scope;\n }\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || i === length - 1 && this.isEOF())) {\n bottomDone = true;\n this['bottomVisible'] = item.item;\n this['bottomVisibleElement'] = item.element;\n this['bottomVisibleScope'] = item.scope;\n }\n topHeight += itemHeight;\n }\n rowTop = itemTop;\n\n if (topDone && bottomDone) {\n break;\n }\n }\n }\n }]);\n\n return Adapter;\n}();\n\nexports.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 \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 8c9f7d12571bf2ad3771","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n !window.jQuery ? (new JQLiteExtras()).registerFor(angular.element) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumericAttr(value, defaultValue) {\n const 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 const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler() {\n if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) {\n\n enqueueFetch(ridActual);\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n\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 const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items) {\r\n items.reverse().forEach((item) => {\r\n --buffer.first;\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\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.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding());\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
    ');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, index === this.buffer.minIndex);\r\n if(index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if(position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n\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 2386088bf7ce5bf5d4af","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","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","_interopRequireDefault","obj","default","_jqLiteExtras","_jqLiteExtras2","_elementRoutines","_elementRoutines2","_buffer","_buffer2","_viewport","_viewport2","_adapter","_adapter2","angular","constant","JQLiteExtras","run","window","jQuery","registerFor","element","ElementRoutines","addCSSRules","directive","restrict","controller","scope","_this","this","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$interval","$q","$parse","link","$scope","$attr","controllers","linker","parseNumericAttr","value","defaultValue","result","isNaN","onRenderHandlersRunner","onRenderHandlers","handler","persistDatasourceIndex","datasource","propName","isNumber","filter","id","push","defineDatasourceIndex","propUserName","descriptor","getOwnPropertyDescriptor","set","pending","length","buffer","topPaddingHeightOld","topDataPos","adjustPaddings","onAfterMinIndexSet","isInvalid","rid","ridActual","$$destroyed","bindEvents","bind","resizeAndScrollHandler","unbindEvents","unbind","reload","resetTopPadding","resetBottomPadding","arguments","startIndex","reset","doAdjust","isElementVisible","wrapper","height","offsetParent","visibilityWatcher","item","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","insertElement","$watch","elementRoutines","hideElement","promises","sibling","undefined","clone","itemName","adapter","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updateDOM","toBePrepended","toBeRemoved","inserted","op","unshift","concat","insertElementAnimated","removeItem","$index","first","prepended","removed","animated","updatePaddings","updates","all","then","enqueueFetch","shouldLoadBottom","effectiveHeight","loading","fetch","shouldLoadTop","processUpdates","$$phase","$digest","w","showElement","calculateProperties","doAdjustAfterFetch","onAfterPrepend","shift","fetchNext","bufferSize","eof","clipTop","append","fetchPrevious","bof","clipBottom","prepend","ev","isLoading","disabled","type","scrollTop","scrollTopValue","scrollTopSetFailed","curScrollTop","Math","abs","scrollTopBeforeSet","scrollTopAdjust","wheelHandler","event","yMax","scrollHeight","clientHeight","preventDefault","match","uiScroll","Error","datasourceName","viewportController","max","padding","ScrollBuffer","Viewport","Adapter","isDatasourceValid","toString","success","next","index","count","createPaddingElements","$destroy","remove","$on","tryCount","applyContainerStyle","timer","cancel","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","writable","key","protoProps","staticProps","scrollTo","self","direction","elem","_top$left$direction","top","left","method","prop","preserve","isValueDefined","isWindow","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","nodeType","location","alert","setInterval","getComputedStyle","currentStyle","rs","rsLeft","core_pnum","source","RegExp","test","runtimeStyle","pixelLeft","before","newElem","j","parent","ref","contents","after","outerHTML","outerHeight","option","outerWidth","offset","docElem","win","box","doc","ownerDocument","getBoundingClientRect","defaultView","parentWindow","pageYOffset","clientTop","pageXOffset","scrollLeft","clientLeft","$animate","has","isAngularVersionLessThen1_3","version","major","minor","sheet","styleSheets","cssRules","insertRule","selector","addRule","addClass","removeClass","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","create","extend","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","isTop","splice","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","elements","Number","MAX_VALUE","bottom","NEGATIVE_INFINITY","bufferPadding","topPadding","bottomPadding","overflow-anchor","overflow-y","display","scrollTopOriginal","getScope","apply","template","Padding","bottomDataPos","bottomVisiblePos","topVisiblePos","e","overage","overageHeight","itemHeight","emptySpaceHeight","cache","add","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","totalHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","diff","paddingHeight","clear","removeCacheItem","_padding","_padding2","Cache","setPrototypeOf","generateElement","Node","ELEMENT_NODE","find","CacheProto","sort","a","b","argument","_isTop","getOwnPropertyNames","methodName","viewportScope","startScope","$parent","publicContext","assignAdapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","publicMethods","publicProps","attr","newItems","applyUpdatesFunc","applyUpdatesIndex","cb","_this2","slice","applyUpdate","_index","_this3","position","some","newItem","rowTop","topHeight","topDone","bottomDone","itemTop","isEOF"],"mappings":"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","file":"ui-scroll.min.js","sourcesContent":["/******/ (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/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _jqLiteExtras = __webpack_require__(1);\n\nvar _jqLiteExtras2 = _interopRequireDefault(_jqLiteExtras);\n\nvar _elementRoutines = __webpack_require__(2);\n\nvar _elementRoutines2 = _interopRequireDefault(_elementRoutines);\n\nvar _buffer = __webpack_require__(3);\n\nvar _buffer2 = _interopRequireDefault(_buffer);\n\nvar _viewport = __webpack_require__(4);\n\nvar _viewport2 = _interopRequireDefault(_viewport);\n\nvar _adapter = __webpack_require__(6);\n\nvar _adapter2 = _interopRequireDefault(_adapter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nangular.module('ui.scroll', []).constant('JQLiteExtras', _jqLiteExtras2.default).run(['JQLiteExtras', function (JQLiteExtras) {\n !window.jQuery ? new JQLiteExtras().registerFor(angular.element) : null;\n _elementRoutines2.default.addCSSRules();\n}]).directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: ['$scope', '$element', function (scope, element) {\n var _this = this;\n\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), function (child) {\n if (child.tagName.toLowerCase() === 'tbody') {\n _this.viewport = angular.element(child);\n }\n });\n\n return this;\n }]\n };\n}).directive('uiScroll', ['$log', '$injector', '$rootScope', '$timeout', '$interval', '$q', '$parse', function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n var 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 var result = $parse(value)($scope);\n return isNaN(result) ? defaultValue : result;\n }\n\n var BUFFER_MIN = 3;\n var BUFFER_DEFAULT = 10;\n var PADDING_MIN = 0.01;\n var PADDING_DEFAULT = 0.5;\n var MAX_VIEWPORT_DELAY = 500;\n var VIEWPORT_POLLING_INTERVAL = 50;\n\n var datasource = null;\n var itemName = match[1];\n var datasourceName = match[2];\n var viewportController = controllers[0];\n var bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n var padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT));\n var startIndex = parseNumericAttr($attr.startIndex, 1);\n var ridActual = 0; // current data revision id\n var pending = [];\n\n var elementRoutines = new _elementRoutines2.default($injector, $q);\n var buffer = new _buffer2.default(elementRoutines, bufferSize, startIndex);\n var viewport = new _viewport2.default(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n var adapter = new _adapter2.default($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n var isDatasourceValid = function isDatasourceValid() {\n return Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n };\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n var onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(function (handler) {\n return handler.run();\n });\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n var getter = void 0;\n // need to postpone min/maxIndexUser processing if the view is empty\n if (angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if (angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(function (handler) {\n return handler.id !== propName;\n });\n onRenderHandlers.push({\n id: propName,\n run: function run() {\n return datasource[propName] = getter;\n }\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n var descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n var getter = void 0;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: function set(value) {\n getter = value;\n if (pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n var topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: function get() {\n return getter;\n }\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n var fetchNext = datasource.get.length !== 2 ? function (success) {\n return datasource.get(buffer.next, bufferSize, success);\n } : function (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 var fetchPrevious = datasource.get.length !== 2 ? function (success) {\n return datasource.get(buffer.first - bufferSize, bufferSize, success);\n } : function (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 var initialize = function initialize() {\n var tryCount = 0;\n if (!viewport.applyContainerStyle()) {\n var timer = $interval(function () {\n tryCount++;\n if (viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if (tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error('ui-scroll directive requires a viewport with non-zero height in ' + MAX_VIEWPORT_DELAY + 'ms');\n }\n }, VIEWPORT_POLLING_INTERVAL);\n } else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker(function (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', function () {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return rid && rid !== ridActual || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach(function (item) {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(function () {\n return doAdjust();\n });\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(function () {\n return visibilityWatcher(wrapper);\n });\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n var promises = null;\n var sibling = insertAfter > 0 ? buffer[insertAfter - 1].element : undefined;\n linker(function (clone, scope) {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n var tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: function onLink() {\n return adapter.transform(wrapper.scope, wrapper.element);\n },\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n var promises = [];\n var toBePrepended = [];\n var toBeRemoved = [];\n var inserted = [];\n\n buffer.forEach(function (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(function (wrapper) {\n return promises = promises.concat(viewport.removeItem(wrapper));\n });\n\n if (toBePrepended.length) toBePrepended.forEach(function (wrapper) {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach(function (item, i) {\n return item.scope.$index = buffer.first + i;\n });\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(function () {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if (!updates || buffer.effectiveHeight(updates.prepended) > 0 || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n var updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(function (w) {\n return elementRoutines.showElement(w);\n });\n updates.prepended.forEach(function (w) {\n return elementRoutines.showElement(w);\n });\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) {\n // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n var updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n var updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length) fetch(rid);else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {\n // scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext(function (result) {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else {\n // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious(function (result) {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler(ev) {\n if ($rootScope.$$phase || adapter.isLoading || adapter.disabled) {\n return;\n }\n\n if (ev.type === 'scroll') {\n // Don't process scroll event if it was triggered by us setting scrollTop.\n if (viewport[0].scrollTop === viewport.scrollTopValue) {\n return false;\n }\n\n // Check if we tried to set scrollTop and it failed. If that happens, don't prepend more items based on the stale value\n // of scrollTop that will be used by shouldLoadTop(). Also, try to set it again.\n viewport.scrollTopSetFailed = false;\n if (viewport.scrollTopValue != null) {\n var curScrollTop = viewport[0].scrollTop;\n if (Math.abs(curScrollTop - viewport.scrollTopValue) > Math.abs(curScrollTop - viewport.scrollTopBeforeSet)) {\n viewport.scrollTopSetFailed = true;\n viewport.scrollTop(curScrollTop - viewport.scrollTopAdjust);\n }\n }\n }\n\n enqueueFetch(ridActual);\n\n // we got a real scroll event, so browser is now in charge of scrollTop\n viewport.scrollTopValue = null;\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n var scrollTop = viewport[0].scrollTop;\n var 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/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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\nvar _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\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/*!\r\n globals: angular, window\r\n List of used element methods available in JQuery but not in JQuery Lite\r\n element.before(elem)\r\n element.height()\r\n element.outerHeight(true)\r\n element.height(value) = only for Top/Bottom padding elements\r\n element.scrollTop()\r\n element.scrollTop(value)\r\n */\n\nvar JQLiteExtras = function () {\n function JQLiteExtras() {\n _classCallCheck(this, JQLiteExtras);\n }\n\n _createClass(JQLiteExtras, [{\n key: 'registerFor',\n value: function registerFor(element) {\n var convertToPx = void 0,\n css = void 0,\n getStyle = void 0,\n isWindow = void 0;\n // angular implementation blows up if elem is the window\n css = angular.element.prototype.css;\n\n element.prototype.css = function (name, value) {\n var self = this;\n var elem = self[0];\n if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {\n return css.call(self, name, value);\n }\n };\n\n // as defined in angularjs v1.0.5\n isWindow = function isWindow(obj) {\n return obj && obj.document && obj.location && obj.alert && obj.setInterval;\n };\n\n function scrollTo(self, direction, value) {\n var elem = self[0];\n\n var _top$left$direction = _slicedToArray({\n top: ['scrollTop', 'pageYOffset', 'scrollLeft'],\n left: ['scrollLeft', 'pageXOffset', 'scrollTop']\n }[direction], 3),\n method = _top$left$direction[0],\n prop = _top$left$direction[1],\n preserve = _top$left$direction[2];\n\n var isValueDefined = typeof value !== 'undefined';\n if (isWindow(elem)) {\n if (isValueDefined) {\n return elem.scrollTo(self[preserve].call(self), value);\n }\n return prop in elem ? elem[prop] : elem.document.documentElement[method];\n } else {\n if (isValueDefined) {\n elem[method] = value;\n }\n return elem[method];\n }\n }\n\n if (window.getComputedStyle) {\n getStyle = function getStyle(elem) {\n return window.getComputedStyle(elem, null);\n };\n convertToPx = function convertToPx(elem, value) {\n return parseFloat(value);\n };\n } else {\n getStyle = function getStyle(elem) {\n return elem.currentStyle;\n };\n convertToPx = function convertToPx(elem, value) {\n var left = void 0,\n result = void 0,\n rs = void 0,\n rsLeft = void 0,\n style = void 0;\n var core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\n var rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\n\n if (!rnumnonpx.test(value)) {\n return parseFloat(value);\n }\n\n // ported from JQuery\n style = elem.style;\n left = style.left;\n rs = elem.runtimeStyle;\n rsLeft = rs && rs.left;\n if (rs) {\n rs.left = style.left;\n }\n // put in the new values to get a computed style out\n style.left = value;\n result = style.pixelLeft;\n style.left = left;\n if (rsLeft) {\n rs.left = rsLeft;\n }\n return result;\n };\n }\n\n function getMeasurements(elem, measure) {\n var base = void 0,\n borderA = void 0,\n borderB = void 0,\n computedMarginA = void 0,\n computedMarginB = void 0,\n computedStyle = void 0,\n dirA = void 0,\n dirB = void 0,\n marginA = void 0,\n marginB = void 0,\n paddingA = void 0,\n paddingB = void 0;\n\n if (isWindow(elem)) {\n base = document.documentElement[{ height: 'clientHeight', width: 'clientWidth' }[measure]];\n\n return {\n base: base,\n padding: 0,\n border: 0,\n margin: 0\n };\n }\n\n // Start with offset property\n\n var _width$height$measure = _slicedToArray({\n width: [elem.offsetWidth, 'Left', 'Right'],\n height: [elem.offsetHeight, 'Top', 'Bottom']\n }[measure], 3);\n\n base = _width$height$measure[0];\n dirA = _width$height$measure[1];\n dirB = _width$height$measure[2];\n\n\n computedStyle = getStyle(elem);\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\n computedMarginA = computedStyle['margin' + dirA];\n computedMarginB = computedStyle['margin' + dirB];\n\n // I do not care for width for now, so this hack is irrelevant\n // if ( !supportsPercentMargin )\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\n marginA = convertToPx(elem, computedMarginA) || 0;\n marginB = convertToPx(elem, computedMarginB) || 0;\n\n return {\n base: base,\n padding: paddingA + paddingB,\n border: borderA + borderB,\n margin: marginA + marginB\n };\n }\n\n function getWidthHeight(elem, direction, measure) {\n var computedStyle = void 0,\n result = void 0;\n\n var measurements = getMeasurements(elem, direction);\n\n if (measurements.base > 0) {\n return {\n base: measurements.base - measurements.padding - measurements.border,\n outer: measurements.base,\n outerfull: measurements.base + measurements.margin\n }[measure];\n }\n\n // Fall back to computed then uncomputed css if necessary\n computedStyle = getStyle(elem);\n result = computedStyle[direction];\n\n if (result < 0 || result === null) {\n result = elem.style[direction] || 0;\n }\n\n // Normalize \"\", auto, and prepare for extra\n result = parseFloat(result) || 0;\n\n return {\n base: result - measurements.padding - measurements.border,\n outer: result,\n outerfull: result + measurements.padding + measurements.border + measurements.margin\n }[measure];\n }\n\n // define missing methods\n return angular.forEach({\n before: function before(newElem) {\n var children, elem, i, j, parent, ref, self;\n self = this;\n elem = self[0];\n parent = self.parent();\n children = parent.contents();\n if (children[0] === elem) {\n return parent.prepend(newElem);\n } else {\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n if (children[i] === elem) {\n angular.element(children[i - 1]).after(newElem);\n return;\n }\n }\n throw new Error('invalid DOM structure ' + elem.outerHTML);\n }\n },\n height: function height(value) {\n var self;\n self = this;\n if (typeof value !== 'undefined') {\n if (angular.isNumber(value)) {\n value = value + 'px';\n }\n return css.call(self, 'height', value);\n } else {\n return getWidthHeight(this[0], 'height', 'base');\n }\n },\n outerHeight: function outerHeight(option) {\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\n },\n outerWidth: function outerWidth(option) {\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\n },\n\n\n /*\r\n The offset setter method is not implemented\r\n */\n offset: function offset(value) {\n var docElem = void 0,\n win = void 0;\n var self = this;\n var box = {\n top: 0,\n left: 0\n };\n var elem = self[0];\n var doc = elem && elem.ownerDocument;\n\n if (arguments.length) {\n if (value === undefined) {\n return self;\n }\n // TODO: implement setter\n throw new Error('offset setter method is not implemented');\n }\n\n if (!doc) {\n return;\n }\n\n docElem = doc.documentElement;\n\n // TODO: Make sure it's not a disconnected DOM node\n\n if (elem.getBoundingClientRect != null) {\n box = elem.getBoundingClientRect();\n }\n\n win = doc.defaultView || doc.parentWindow;\n\n return {\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n };\n },\n scrollTop: function scrollTop(value) {\n return scrollTo(this, 'top', value);\n },\n scrollLeft: function scrollLeft(value) {\n return scrollTo(this, 'left', value);\n }\n }, function (value, key) {\n if (!element.prototype[key]) {\n return element.prototype[key] = value;\n }\n });\n }\n }]);\n\n return JQLiteExtras;\n}();\n\nexports.default = JQLiteExtras;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar hideClassToken = 'ng-ui-scroll-hide';\n\nvar ElementRoutines = function () {\n _createClass(ElementRoutines, null, [{\n key: 'addCSSRules',\n value: function addCSSRules() {\n var selector = '.' + hideClassToken;\n var rules = 'display: none';\n var sheet = document.styleSheets[0];\n var index = void 0;\n try {\n index = sheet.cssRules.length;\n } catch (err) {\n index = 0;\n }\n if ('insertRule' in sheet) {\n sheet.insertRule(selector + '{' + rules + '}', index);\n } else if ('addRule' in sheet) {\n sheet.addRule(selector, rules, index);\n }\n }\n }]);\n\n function ElementRoutines($injector, $q) {\n _classCallCheck(this, ElementRoutines);\n\n this.$animate = $injector.has && $injector.has('$animate') ? $injector.get('$animate') : null;\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\n this.$q = $q;\n }\n\n _createClass(ElementRoutines, [{\n key: 'hideElement',\n value: function hideElement(wrapper) {\n wrapper.element.addClass(hideClassToken);\n }\n }, {\n key: 'showElement',\n value: function showElement(wrapper) {\n wrapper.element.removeClass(hideClassToken);\n }\n }, {\n key: 'insertElement',\n value: function insertElement(newElement, previousElement) {\n previousElement.after(newElement);\n return [];\n }\n }, {\n key: 'removeElement',\n value: function removeElement(wrapper) {\n wrapper.element.remove();\n wrapper.scope.$destroy();\n return [];\n }\n }, {\n key: 'insertElementAnimated',\n value: function insertElementAnimated(newElement, previousElement) {\n if (!this.$animate) {\n return this.insertElement(newElement, previousElement);\n }\n\n if (this.isAngularVersionLessThen1_3) {\n var deferred = this.$q.defer();\n // no need for parent - previous element is never null\n this.$animate.enter(newElement, null, previousElement, function () {\n return deferred.resolve();\n });\n\n return [deferred.promise];\n }\n\n // no need for parent - previous element is never null\n return [this.$animate.enter(newElement, null, previousElement)];\n }\n }, {\n key: 'removeElementAnimated',\n value: function removeElementAnimated(wrapper) {\n if (!this.$animate) {\n return this.removeElement(wrapper);\n }\n\n if (this.isAngularVersionLessThen1_3) {\n var deferred = this.$q.defer();\n this.$animate.leave(wrapper.element, function () {\n wrapper.scope.$destroy();\n return deferred.resolve();\n });\n\n return [deferred.promise];\n }\n\n return [this.$animate.leave(wrapper.element).then(function () {\n return wrapper.scope.$destroy();\n })];\n }\n }]);\n\n return ElementRoutines;\n}();\n\nexports.default = ElementRoutines;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = ScrollBuffer;\nfunction ScrollBuffer(elementRoutines, bufferSize, startIndex) {\n var buffer = Object.create(Array.prototype);\n\n angular.extend(buffer, {\n size: bufferSize,\n\n reset: function reset(startIndex) {\n buffer.remove(0, buffer.length);\n buffer.eof = false;\n buffer.bof = false;\n buffer.first = startIndex;\n buffer.next = startIndex;\n buffer.minIndex = startIndex;\n buffer.maxIndex = startIndex;\n buffer.minIndexUser = null;\n buffer.maxIndexUser = null;\n },\n append: function append(items) {\n items.forEach(function (item) {\n ++buffer.next;\n buffer.insert('append', item);\n });\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\n },\n prepend: function prepend(items) {\n items.reverse().forEach(function (item) {\n --buffer.first;\n buffer.insert('prepend', item);\n });\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\n },\n\n\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 */\n insert: function insert(operation, item, isTop) {\n var wrapper = {\n item: item\n };\n\n if (operation % 1 === 0) {\n // it is an insert\n wrapper.op = 'insert';\n buffer.splice(operation, 0, wrapper);\n if (isTop) {\n buffer.first--;\n } else {\n buffer.next++;\n }\n } else {\n wrapper.op = operation;\n switch (operation) {\n case 'append':\n buffer.push(wrapper);\n break;\n case 'prepend':\n buffer.unshift(wrapper);\n break;\n }\n }\n },\n\n\n // removes elements from buffer\n remove: function remove(arg1, arg2) {\n if (angular.isNumber(arg1)) {\n // removes items from arg1 (including) through arg2 (excluding)\n for (var i = arg1; i < arg2; i++) {\n elementRoutines.removeElement(buffer[i]);\n }\n return buffer.splice(arg1, arg2 - arg1);\n }\n // removes single item(wrapper) from the buffer\n buffer.splice(buffer.indexOf(arg1), 1);\n if (arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\n this.incrementMinIndex();\n } else {\n this.decrementMaxIndex();\n }\n if (arg1._op === 'isTop') {\n buffer.first++;\n } else {\n buffer.next--;\n }\n if (!buffer.length) {\n buffer.first = 1;\n buffer.next = 1;\n }\n\n return elementRoutines.removeElementAnimated(arg1);\n },\n incrementMinIndex: function incrementMinIndex() {\n if (buffer.minIndexUser !== null) {\n if (buffer.minIndex > buffer.minIndexUser) {\n buffer.minIndexUser++;\n return;\n }\n if (buffer.minIndex === buffer.minIndexUser) {\n buffer.minIndexUser++;\n }\n }\n buffer.minIndex++;\n },\n decrementMaxIndex: function decrementMaxIndex() {\n if (buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\n buffer.maxIndexUser--;\n }\n buffer.maxIndex--;\n },\n getAbsMinIndex: function getAbsMinIndex() {\n if (buffer.minIndexUser !== null) {\n return Math.min(buffer.minIndexUser, buffer.minIndex);\n }\n return buffer.minIndex;\n },\n getAbsMaxIndex: function getAbsMaxIndex() {\n if (buffer.maxIndexUser !== null) {\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\n }\n return buffer.maxIndex;\n },\n effectiveHeight: function effectiveHeight(elements) {\n if (!elements.length) {\n return 0;\n }\n var top = Number.MAX_VALUE;\n var bottom = Number.NEGATIVE_INFINITY;\n elements.forEach(function (wrapper) {\n if (wrapper.element[0].offsetParent) {\n // element style is not display:none\n top = Math.min(top, wrapper.element.offset().top);\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\n }\n });\n return Math.max(0, bottom - top);\n }\n });\n\n buffer.reset(startIndex);\n\n return buffer;\n}\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = Viewport;\n\nvar _padding = __webpack_require__(5);\n\nvar _padding2 = _interopRequireDefault(_padding);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) {\n var topPadding = null;\n var bottomPadding = null;\n var viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window);\n var container = viewportController && viewportController.container ? viewportController.container : undefined;\n var scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope;\n\n viewport.css({\n 'overflow-anchor': 'none',\n 'overflow-y': 'auto',\n 'display': 'block'\n });\n\n viewport.scrollTopOriginal = viewport.scrollTopOriginal || viewport.scrollTop;\n viewport.scrollTopBeforeSet = null;\n viewport.scrollTopValue = null;\n\n function bufferPadding() {\n return viewport.outerHeight() * padding; // some extra space to initiate preload\n }\n\n angular.extend(viewport, {\n getScope: function getScope() {\n return scope;\n },\n scrollTop: function scrollTop() {\n if (typeof arguments[0] !== 'undefined') {\n viewport.scrollTopBeforeSet = viewport.scrollTop();\n viewport.scrollTopValue = arguments[0];\n }\n return viewport.scrollTopOriginal.apply(viewport, arguments);\n },\n createPaddingElements: function createPaddingElements(template) {\n topPadding = new _padding2.default(template);\n bottomPadding = new _padding2.default(template);\n element.before(topPadding.element);\n element.after(bottomPadding.element);\n topPadding.height(0);\n bottomPadding.height(0);\n },\n applyContainerStyle: function applyContainerStyle() {\n if (!container) {\n return true;\n }\n if (container !== viewport) {\n viewport.css('height', window.getComputedStyle(container[0]).height);\n }\n return viewport.height() > 0;\n },\n bottomDataPos: function bottomDataPos() {\n var scrollHeight = viewport[0].scrollHeight;\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\n return scrollHeight - bottomPadding.height();\n },\n topDataPos: function topDataPos() {\n return topPadding.height();\n },\n bottomVisiblePos: function bottomVisiblePos() {\n return viewport.scrollTop() + viewport.outerHeight();\n },\n topVisiblePos: function topVisiblePos() {\n return viewport.scrollTop();\n },\n insertElement: function insertElement(e, sibling) {\n return elementRoutines.insertElement(e, sibling || topPadding.element);\n },\n insertElementAnimated: function insertElementAnimated(e, sibling) {\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\n },\n shouldLoadBottom: function shouldLoadBottom() {\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\n },\n clipBottom: function clipBottom() {\n // clip the invisible items off the bottom\n var overage = 0;\n var overageHeight = 0;\n var itemHeight = 0;\n var emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\n\n for (var i = buffer.length - 1; i >= 0; i--) {\n itemHeight = buffer[i].element.outerHeight(true);\n if (overageHeight + itemHeight > emptySpaceHeight) {\n break;\n }\n bottomPadding.cache.add(buffer[i]);\n overageHeight += itemHeight;\n overage++;\n }\n\n if (overage > 0) {\n buffer.eof = false;\n buffer.remove(buffer.length - overage, buffer.length);\n buffer.next -= overage;\n viewport.adjustPaddings();\n }\n },\n shouldLoadTop: function shouldLoadTop() {\n return !buffer.bof && !viewport.scrollTopSetFailed && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding();\n },\n clipTop: function clipTop() {\n // clip the invisible items off the top\n var overage = 0;\n var overageHeight = 0;\n var itemHeight = 0;\n var emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\n\n for (var i = 0; i < buffer.length; i++) {\n itemHeight = buffer[i].element.outerHeight(true);\n if (overageHeight + itemHeight > emptySpaceHeight) {\n break;\n }\n topPadding.cache.add(buffer[i]);\n overageHeight += itemHeight;\n overage++;\n }\n\n if (overage > 0) {\n // we need to adjust top padding element before items are removed from top\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\n topPadding.height(topPadding.height() + overageHeight);\n buffer.bof = false;\n buffer.remove(0, overage);\n buffer.first += overage;\n }\n },\n adjustPaddings: function adjustPaddings() {\n if (!buffer.length) {\n return;\n }\n\n // precise heights calculation based on items that are in buffer or that were in buffer once\n var visibleItemsHeight = buffer.reduce(function (summ, item) {\n return summ + item.element.outerHeight(true);\n }, 0);\n\n var topPaddingHeight = 0,\n topCount = 0;\n topPadding.cache.forEach(function (item) {\n if (item.index < buffer.first) {\n topPaddingHeight += item.height;\n topCount++;\n }\n });\n\n var bottomPaddingHeight = 0,\n bottomCount = 0;\n bottomPadding.cache.forEach(function (item) {\n if (item.index >= buffer.next) {\n bottomPaddingHeight += item.height;\n bottomCount++;\n }\n });\n\n var totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\n var averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\n\n // average heights calculation, items that have never been reached\n var adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\n var adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\n var topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\n var bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\n\n // paddings combine adjustment\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\n },\n onAfterMinIndexSet: function onAfterMinIndexSet(topPaddingHeightOld) {\n // additional scrollTop adjustment in case of datasource.minIndex external set\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\n var diff = topPadding.height() - topPaddingHeightOld;\n viewport.scrollTop(viewport.scrollTop() + diff);\n while ((diff -= viewport.scrollTop()) > 0) {\n bottomPadding.height(bottomPadding.height() + diff);\n viewport.scrollTop(viewport.scrollTop() + diff);\n }\n }\n },\n onAfterPrepend: function onAfterPrepend(updates) {\n if (!updates.prepended.length) return;\n var height = buffer.effectiveHeight(updates.prepended);\n var paddingHeight = topPadding.height() - height;\n if (paddingHeight >= 0) {\n topPadding.height(paddingHeight);\n } else {\n topPadding.height(0);\n viewport.scrollTopAdjust = paddingHeight;\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\n }\n },\n resetTopPadding: function resetTopPadding() {\n topPadding.height(0);\n topPadding.cache.clear();\n },\n resetBottomPadding: function resetBottomPadding() {\n bottomPadding.height(0);\n bottomPadding.cache.clear();\n },\n removeCacheItem: function removeCacheItem(item, isTop) {\n topPadding.cache.remove(item, isTop);\n bottomPadding.cache.remove(item, isTop);\n },\n removeItem: function removeItem(item) {\n this.removeCacheItem(item);\n return buffer.remove(item);\n }\n });\n\n return viewport;\n}\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Can't just extend the Array, due to Babel does not support built-in classes extending\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\nvar CacheProto = function () {\n function CacheProto() {\n _classCallCheck(this, CacheProto);\n }\n\n _createClass(CacheProto, [{\n key: 'add',\n value: function add(item) {\n for (var i = this.length - 1; i >= 0; i--) {\n if (this[i].index === item.scope.$index) {\n this[i].height = item.element.outerHeight();\n return;\n }\n }\n this.push({\n index: item.scope.$index,\n height: item.element.outerHeight()\n });\n this.sort(function (a, b) {\n return a.index < b.index ? -1 : a.index > b.index ? 1 : 0;\n });\n }\n }, {\n key: 'remove',\n value: function remove(argument, _isTop) {\n var index = argument % 1 === 0 ? argument : argument.scope.$index;\n var isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\n for (var i = this.length - 1; i >= 0; i--) {\n if (this[i].index === index) {\n this.splice(i, 1);\n break;\n }\n }\n if (!isTop) {\n for (var _i = this.length - 1; _i >= 0; _i--) {\n if (this[_i].index > index) {\n this[_i].index--;\n }\n }\n }\n }\n }, {\n key: 'clear',\n value: function clear() {\n this.length = 0;\n }\n }]);\n\n return CacheProto;\n}();\n\nfunction Cache() {\n var instance = [];\n instance.push.apply(instance, arguments);\n Object.setPrototypeOf(instance, Cache.prototype);\n return instance;\n}\nCache.prototype = Object.create(Array.prototype);\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(function (methodName) {\n return Cache.prototype[methodName] = CacheProto.prototype[methodName];\n});\n\nfunction generateElement(template) {\n if (template.nodeType !== Node.ELEMENT_NODE) {\n throw new Error('ui-scroll directive requires an Element node for templating the view');\n }\n var element = void 0;\n switch (template.tagName.toLowerCase()) {\n case 'dl':\n throw new Error('ui-scroll directive does not support <' + template.tagName + '> as a repeating tag: ' + template.outerHTML);\n case 'tr':\n var table = angular.element('
    ');\n element = table.find('tr');\n break;\n case 'li':\n element = angular.element('
  • ');\n break;\n default:\n element = angular.element('
    ');\n }\n return element;\n}\n\nvar Padding = function () {\n function Padding(template) {\n _classCallCheck(this, Padding);\n\n this.element = generateElement(template);\n this.cache = new Cache();\n }\n\n _createClass(Padding, [{\n key: 'height',\n value: function height() {\n return this.element.height.apply(this.element, arguments);\n }\n }]);\n\n return Padding;\n}();\n\nexports.default = Padding;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Adapter = function () {\n function Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\n _classCallCheck(this, Adapter);\n\n this.$parse = $parse;\n this.$attr = $attr;\n this.viewport = viewport;\n this.buffer = buffer;\n\n this.doAdjust = doAdjust;\n this.reload = reload;\n\n this.isLoading = false;\n this.disabled = false;\n\n var viewportScope = viewport.getScope();\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\n\n this.publicContext = {};\n this.assignAdapter($attr.adapter);\n this.generatePublicContext();\n }\n\n _createClass(Adapter, [{\n key: 'assignAdapter',\n value: function assignAdapter(adapterAttr) {\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\n return;\n }\n var adapterOnScope = void 0;\n\n try {\n this.$parse(adapterAttr).assign(this.startScope, {});\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\n } catch (error) {\n error.message = 'Angular ui-scroll Adapter assignment exception.\\n' + ('Can\\'t parse \"' + adapterAttr + '\" expression.\\n') + error.message;\n throw error;\n }\n\n angular.extend(adapterOnScope, this.publicContext);\n this.publicContext = adapterOnScope;\n }\n }, {\n key: 'generatePublicContext',\n value: function generatePublicContext() {\n var _this = this;\n\n // these methods will be accessible out of ui-scroll via user defined adapter\n var publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty', 'resetScrollTopCorrection'];\n for (var i = publicMethods.length - 1; i >= 0; i--) {\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\n }\n\n // these read-only props will be accessible out of ui-scroll via user defined adapter\n var publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\n\n var _loop = function _loop(_i) {\n var property = void 0,\n attr = _this.$attr[publicProps[_i]];\n Object.defineProperty(_this, publicProps[_i], {\n get: function get() {\n return property;\n },\n set: function set(value) {\n property = value;\n _this.publicContext[publicProps[_i]] = value;\n if (attr) {\n _this.$parse(attr).assign(_this.startScope, value);\n }\n }\n });\n };\n\n for (var _i = publicProps.length - 1; _i >= 0; _i--) {\n _loop(_i);\n }\n\n // non-read-only public property\n Object.defineProperty(this.publicContext, 'disabled', {\n get: function get() {\n return _this.disabled;\n },\n set: function set(value) {\n return !(_this.disabled = value) ? _this.doAdjust() : null;\n }\n });\n }\n }, {\n key: 'loading',\n value: function loading(value) {\n this.isLoading = value;\n }\n }, {\n key: 'isBOF',\n value: function isBOF() {\n return this.buffer.bof;\n }\n }, {\n key: 'isEOF',\n value: function isEOF() {\n return this.buffer.eof;\n }\n }, {\n key: 'isEmpty',\n value: function isEmpty() {\n return !this.buffer.length;\n }\n }, {\n key: 'resetScrollTopCorrection',\n value: function resetScrollTopCorrection() {\n // is needed to scroll at negative area programmatically (e.g. tests)\n this.viewport.scrollTopValue = null;\n }\n }, {\n key: 'append',\n value: function append(newItems) {\n this.buffer.append(newItems);\n this.doAdjust();\n this.viewport.clipTop();\n this.viewport.clipBottom();\n }\n }, {\n key: 'prepend',\n value: function prepend(newItems) {\n this.buffer.prepend(newItems);\n this.doAdjust();\n this.viewport.clipTop();\n this.viewport.clipBottom();\n }\n }, {\n key: 'applyUpdates',\n value: function applyUpdates(arg1, arg2) {\n if (typeof arg1 === 'function') {\n this.applyUpdatesFunc(arg1);\n } else {\n this.applyUpdatesIndex(arg1, arg2);\n }\n this.doAdjust();\n }\n }, {\n key: 'applyUpdatesFunc',\n value: function applyUpdatesFunc(cb) {\n var _this2 = this;\n\n this.buffer.slice(0).forEach(function (wrapper) {\n // we need to do it on the buffer clone, because buffer content\n // may change as we iterate through\n _this2.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element));\n });\n }\n }, {\n key: 'applyUpdatesIndex',\n value: function applyUpdatesIndex(index, newItems) {\n if (index % 1 !== 0) {\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\n }\n var _index = index - this.buffer.first;\n\n // apply updates only within buffer\n if (_index >= 0 && _index < this.buffer.length) {\n this.applyUpdate(this.buffer[_index], newItems);\n }\n // out-of-buffer case: deletion may affect Paddings\n else if (index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\n if (angular.isArray(newItems) && !newItems.length) {\n this.viewport.removeCacheItem(index, index === this.buffer.minIndex);\n if (index === this.buffer.getAbsMinIndex()) {\n this.buffer.incrementMinIndex();\n } else {\n this.buffer.decrementMaxIndex();\n }\n }\n }\n }\n }, {\n key: 'applyUpdate',\n value: function applyUpdate(wrapper, newItems) {\n var _this3 = this;\n\n if (!angular.isArray(newItems)) {\n return;\n }\n var position = this.buffer.indexOf(wrapper);\n if (!newItems.reverse().some(function (newItem) {\n return newItem === wrapper.item;\n })) {\n wrapper.op = 'remove';\n if (position === 0 && !newItems.length) {\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\n }\n }\n newItems.forEach(function (newItem) {\n if (newItem === wrapper.item) {\n position--;\n } else {\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\n _this3.buffer.insert(position + 1, newItem, position === -1);\n }\n });\n }\n }, {\n key: 'calculateProperties',\n value: function calculateProperties() {\n var rowTop = null,\n topHeight = 0;\n var topDone = false,\n bottomDone = false;\n var length = this.buffer.length;\n\n for (var i = 0; i < length; i++) {\n var item = this.buffer[i];\n var itemTop = item.element.offset().top;\n\n if (rowTop !== itemTop) {\n // a new row condition\n var itemHeight = item.element.outerHeight(true);\n var top = this.viewport.topDataPos() + topHeight + itemHeight;\n\n if (!topDone && top > this.viewport.topVisiblePos()) {\n topDone = true;\n this['topVisible'] = item.item;\n this['topVisibleElement'] = item.element;\n this['topVisibleScope'] = item.scope;\n }\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || i === length - 1 && this.isEOF())) {\n bottomDone = true;\n this['bottomVisible'] = item.item;\n this['bottomVisibleElement'] = item.element;\n this['bottomVisibleScope'] = item.scope;\n }\n topHeight += itemHeight;\n }\n rowTop = itemTop;\n\n if (topDone && bottomDone) {\n break;\n }\n }\n }\n }]);\n\n return Adapter;\n}();\n\nexports.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 \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2386088bf7ce5bf5d4af","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .constant('JQLiteExtras', JQLiteExtras)\n .run(['JQLiteExtras', (JQLiteExtras) => {\n !window.jQuery ? (new JQLiteExtras()).registerFor(angular.element) : null;\n ElementRoutines.addCSSRules();\n }])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$interval',\n '$q',\n '$parse',\n function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {\n\n return {\n require: ['?^uiScrollViewport'],\n restrict: 'A',\n transclude: 'element',\n priority: 1000,\n terminal: true,\n link: link\n };\n\n function link($scope, element, $attr, controllers, linker) {\n const match = $attr.uiScroll.match(/^\\s*(\\w+)\\s+in\\s+([(\\w|\\$)\\.]+)\\s*$/);\n if (!match) {\n throw new Error('Expected uiScroll in form of \\'_item_ in _datasource_\\' but got \\'' + $attr.uiScroll + '\\'');\n }\n\n function parseNumericAttr(value, defaultValue) {\n const 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.01;\n const PADDING_DEFAULT = 0.5;\n const MAX_VIEWPORT_DELAY = 500;\n const VIEWPORT_POLLING_INTERVAL = 50;\n\n let datasource = null;\n const itemName = match[1];\n const datasourceName = match[2];\n const viewportController = controllers[0];\n const bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT));\n const padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT));\n let startIndex = parseNumericAttr($attr.startIndex, 1);\n let ridActual = 0; // current data revision id\n let pending = [];\n\n const elementRoutines = new ElementRoutines($injector, $q);\n const buffer = new ScrollBuffer(elementRoutines, bufferSize, startIndex);\n const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);\n const adapter = new Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload);\n\n if (viewportController) {\n viewportController.adapter = adapter;\n }\n\n const isDatasourceValid = () =>\n Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function';\n\n datasource = $parse(datasourceName)($scope); // try to get datasource on scope\n if (!isDatasourceValid()) {\n datasource = $injector.get(datasourceName); // try to inject datasource as service\n if (!isDatasourceValid()) {\n throw new Error(datasourceName + ' is not a valid datasource');\n }\n }\n\n let onRenderHandlers = [];\n function onRenderHandlersRunner() {\n onRenderHandlers.forEach(handler => handler.run());\n onRenderHandlers = [];\n }\n function persistDatasourceIndex(datasource, propName) {\n let getter;\n // need to postpone min/maxIndexUser processing if the view is empty\n if(angular.isNumber(datasource[propName])) {\n getter = datasource[propName];\n if(angular.isNumber(getter)) {\n onRenderHandlers = onRenderHandlers.filter(handler => handler.id !== propName);\n onRenderHandlers.push({\n id: propName,\n run: () => datasource[propName] = getter\n });\n }\n }\n }\n\n function defineDatasourceIndex(datasource, propName, propUserName) {\n const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);\n if (descriptor && (descriptor.set || descriptor.get)) {\n return;\n }\n let getter;\n persistDatasourceIndex(datasource, propName);\n Object.defineProperty(datasource, propName, {\n set: (value) => {\n getter = value;\n if(pending.length && !buffer.length) {\n persistDatasourceIndex(datasource, propName);\n return;\n }\n buffer[propUserName] = value;\n const topPaddingHeightOld = viewport.topDataPos();\n viewport.adjustPaddings();\n if (propName === 'minIndex') {\n viewport.onAfterMinIndexSet(topPaddingHeightOld);\n }\n },\n get: () => getter\n });\n }\n\n defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser');\n defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser');\n\n const fetchNext = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.next, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.next,\n append: buffer.length ? buffer[buffer.length - 1].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const fetchPrevious = (datasource.get.length !== 2) ?\n (success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :\n (success) => {\n datasource.get({\n index: buffer.first - bufferSize,\n prepend: buffer.length ? buffer[0].item : void 0,\n count: bufferSize\n }, success);\n };\n\n const initialize = () => {\n let tryCount = 0;\n if(!viewport.applyContainerStyle()) {\n const timer = $interval(() => {\n tryCount++;\n if(viewport.applyContainerStyle()) {\n $interval.cancel(timer);\n doAdjust();\n }\n if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {\n $interval.cancel(timer);\n throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);\n }\n }, VIEWPORT_POLLING_INTERVAL);\n }\n else {\n doAdjust();\n }\n };\n\n /**\n * Build padding elements\n *\n * Calling linker is the only way I found to get access to the tag name of the template\n * to prevent the directive scope from pollution a new scope is created and destroyed\n * right after the builder creation is completed\n */\n linker((clone, scope) => {\n viewport.createPaddingElements(clone[0]);\n // we do not include the clone in the DOM. It means that the nested directives will not\n // be able to reach the parent directives, but in this case it is intentional because we\n // created the clone to access the template tag name\n scope.$destroy();\n clone.remove();\n });\n\n $scope.$on('$destroy', () => {\n unbindEvents();\n viewport.unbind('mousewheel', wheelHandler);\n });\n\n viewport.bind('mousewheel', wheelHandler);\n\n initialize();\n\n /* Private function definitions */\n\n function isInvalid(rid) {\n return (rid && rid !== ridActual) || $scope.$$destroyed;\n }\n\n function bindEvents() {\n viewport.bind('resize', resizeAndScrollHandler);\n viewport.bind('scroll', resizeAndScrollHandler);\n }\n\n function unbindEvents() {\n viewport.unbind('resize', resizeAndScrollHandler);\n viewport.unbind('scroll', resizeAndScrollHandler);\n }\n\n function reload() {\n viewport.resetTopPadding();\n viewport.resetBottomPadding();\n if (arguments.length) {\n startIndex = arguments[0];\n }\n buffer.reset(startIndex);\n persistDatasourceIndex(datasource, 'minIndex');\n persistDatasourceIndex(datasource, 'maxIndex');\n doAdjust();\n }\n\n function isElementVisible(wrapper) {\n return wrapper.element.height() && wrapper.element[0].offsetParent;\n }\n\n function visibilityWatcher(wrapper) {\n if (isElementVisible(wrapper)) {\n buffer.forEach((item) => {\n if (typeof item.unregisterVisibilityWatcher === 'function') {\n item.unregisterVisibilityWatcher();\n delete item.unregisterVisibilityWatcher;\n }\n });\n if (!pending.length) {\n $timeout(() => doAdjust());\n }\n }\n }\n\n function insertWrapperContent(wrapper, insertAfter) {\n createElement(wrapper, insertAfter, viewport.insertElement);\n if (!isElementVisible(wrapper)) {\n wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(() => visibilityWatcher(wrapper));\n }\n elementRoutines.hideElement(wrapper); // hide inserted elements before data binding\n }\n\n function createElement(wrapper, insertAfter, insertElement) {\n let promises = null;\n const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;\n linker((clone, scope) => {\n promises = insertElement(clone, sibling);\n wrapper.element = clone;\n wrapper.scope = scope;\n scope[itemName] = wrapper.item;\n });\n // ui-scroll-grid apply\n if (adapter.transform) {\n const tdInitializer = wrapper.scope.uiScrollTdInitializer;\n if (tdInitializer && tdInitializer.linking) {\n adapter.transform(wrapper.scope, wrapper.element);\n } else {\n wrapper.scope.uiScrollTdInitializer = {\n onLink: () => adapter.transform(wrapper.scope, wrapper.element),\n scope: wrapper.scope\n };\n }\n }\n return promises;\n }\n\n function updateDOM() {\n let promises = [];\n const toBePrepended = [];\n const toBeRemoved = [];\n const inserted = [];\n\n buffer.forEach((wrapper, i) => {\n switch (wrapper.op) {\n case 'prepend':\n toBePrepended.unshift(wrapper);\n break;\n case 'append':\n insertWrapperContent(wrapper, i);\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'insert':\n promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated));\n wrapper.op = 'none';\n inserted.push(wrapper);\n break;\n case 'remove':\n toBeRemoved.push(wrapper);\n }\n });\n\n toBeRemoved.forEach((wrapper) => promises = promises.concat(viewport.removeItem(wrapper)));\n\n if (toBePrepended.length)\n toBePrepended.forEach((wrapper) => {\n insertWrapperContent(wrapper);\n wrapper.op = 'none';\n });\n\n buffer.forEach((item, i) => item.scope.$index = buffer.first + i);\n\n return {\n prepended: toBePrepended,\n removed: toBeRemoved,\n inserted: inserted,\n animated: promises\n };\n\n }\n\n function updatePaddings(rid, updates) {\n // schedule another doAdjust after animation completion\n if (updates.animated.length) {\n $q.all(updates.animated).then(() => {\n viewport.adjustPaddings();\n doAdjust(rid);\n });\n } else {\n viewport.adjustPaddings();\n }\n }\n\n function enqueueFetch(rid, updates) {\n if (viewport.shouldLoadBottom()) {\n if (!updates || buffer.effectiveHeight(updates.inserted) > 0) {\n // this means that at least one item appended in the last batch has height > 0\n if (pending.push(true) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n } else if (viewport.shouldLoadTop()) {\n if ((!updates || buffer.effectiveHeight(updates.prepended) > 0) || pending[0]) {\n // this means that at least one item appended in the last batch has height > 0\n // pending[0] = true means that previous fetch was appending. We need to force at least one prepend\n // BTW there will always be at least 1 element in the pending array because bottom is fetched first\n if (pending.push(false) === 1) {\n adapter.loading(true);\n fetch(rid);\n }\n }\n }\n }\n\n function processUpdates() {\n const updates = updateDOM();\n\n // We need the item bindings to be processed before we can do adjustments\n !$scope.$$phase && !$rootScope.$$phase && $scope.$digest();\n\n updates.inserted.forEach(w => elementRoutines.showElement(w));\n updates.prepended.forEach(w => elementRoutines.showElement(w));\n return updates;\n }\n\n function doAdjust(rid) {\n if (!rid) { // dismiss pending requests\n pending = [];\n rid = ++ridActual;\n }\n\n const updates = processUpdates();\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n enqueueFetch(rid);\n\n if (!pending.length) {\n adapter.calculateProperties();\n }\n }\n\n function doAdjustAfterFetch(rid) {\n const updates = processUpdates();\n\n viewport.onAfterPrepend(updates);\n\n if (isInvalid(rid)) {\n return;\n }\n\n updatePaddings(rid, updates);\n onRenderHandlersRunner();\n enqueueFetch(rid, updates);\n pending.shift();\n\n if (pending.length)\n fetch(rid);\n else {\n adapter.loading(false);\n bindEvents();\n adapter.calculateProperties();\n }\n }\n\n function fetch(rid) {\n if (pending[0]) {// scrolling down\n if (buffer.length && !viewport.shouldLoadBottom()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchNext((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.eof = true;\n }\n\n if (result.length > 0) {\n viewport.clipTop();\n buffer.append(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n } else { // scrolling up\n if (buffer.length && !viewport.shouldLoadTop()) {\n doAdjustAfterFetch(rid);\n } else {\n fetchPrevious((result) => {\n if (isInvalid(rid)) {\n return;\n }\n\n if (result.length < bufferSize) {\n buffer.bof = true;\n // log 'bof is reached'\n }\n\n if (result.length > 0) {\n if (buffer.length) {\n viewport.clipBottom();\n }\n buffer.prepend(result);\n }\n\n doAdjustAfterFetch(rid);\n });\n }\n }\n }\n\n function resizeAndScrollHandler(ev) {\n if ($rootScope.$$phase || adapter.isLoading || adapter.disabled) {\n return;\n }\n\n if (ev.type === 'scroll') {\n // Don't process scroll event if it was triggered by us setting scrollTop.\n if (viewport[0].scrollTop === viewport.scrollTopValue) {\n return false;\n }\n\n // Check if we tried to set scrollTop and it failed. If that happens, don't prepend more items based on the stale value\n // of scrollTop that will be used by shouldLoadTop(). Also, try to set it again.\n viewport.scrollTopSetFailed = false;\n if (viewport.scrollTopValue != null) {\n const curScrollTop = viewport[0].scrollTop;\n if (Math.abs(curScrollTop - viewport.scrollTopValue) > Math.abs(curScrollTop - viewport.scrollTopBeforeSet)) {\n viewport.scrollTopSetFailed = true;\n viewport.scrollTop(curScrollTop - viewport.scrollTopAdjust);\n }\n }\n }\n\n enqueueFetch(ridActual);\n\n // we got a real scroll event, so browser is now in charge of scrollTop\n viewport.scrollTopValue = null;\n\n if (pending.length) {\n unbindEvents();\n } else {\n adapter.calculateProperties();\n !$scope.$$phase && $scope.$digest();\n }\n }\n\n function wheelHandler(event) {\n if (!adapter.disabled) {\n const scrollTop = viewport[0].scrollTop;\n const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;\n\n if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {\n event.preventDefault();\n }\n }\n }\n }\n\n }\n ]);\n\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 const isValueDefined = typeof value !== 'undefined';\r\n if (isWindow(elem)) {\r\n if (isValueDefined) {\r\n return elem.scrollTo(self[preserve].call(self), value);\r\n }\r\n return (prop in elem) ? elem[prop] : elem.document.documentElement[method];\r\n } else {\r\n if (isValueDefined) {\r\n elem[method] = value;\r\n }\r\n return elem[method];\r\n }\r\n }\r\n\r\n if (window.getComputedStyle) {\r\n getStyle = (elem) => window.getComputedStyle(elem, null);\r\n convertToPx = (elem, value) => parseFloat(value);\r\n } else {\r\n getStyle = (elem) => elem.currentStyle;\r\n convertToPx = (elem, value) => {\r\n let left, result, rs, rsLeft, style;\r\n let core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n let rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');\r\n\r\n if (!rnumnonpx.test(value)) {\r\n return parseFloat(value);\r\n }\r\n\r\n // ported from JQuery\r\n style = elem.style;\r\n left = style.left;\r\n rs = elem.runtimeStyle;\r\n rsLeft = rs && rs.left;\r\n if (rs) {\r\n rs.left = style.left;\r\n }\r\n // put in the new values to get a computed style out\r\n style.left = value;\r\n result = style.pixelLeft;\r\n style.left = left;\r\n if (rsLeft) {\r\n rs.left = rsLeft;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n function getMeasurements(elem, measure) {\r\n let base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB;\r\n\r\n if (isWindow(elem)) {\r\n base = document.documentElement[{height: 'clientHeight', width: 'clientWidth'}[measure]];\r\n\r\n return {\r\n base: base,\r\n padding: 0,\r\n border: 0,\r\n margin: 0\r\n };\r\n }\r\n\r\n // Start with offset property\r\n [\r\n base,\r\n dirA,\r\n dirB\r\n ] = {\r\n width: [\r\n elem.offsetWidth,\r\n 'Left',\r\n 'Right'\r\n ],\r\n height: [\r\n elem.offsetHeight,\r\n 'Top',\r\n 'Bottom'\r\n ]\r\n }[measure];\r\n\r\n computedStyle = getStyle(elem);\r\n paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;\r\n paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;\r\n borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;\r\n borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;\r\n computedMarginA = computedStyle['margin' + dirA];\r\n computedMarginB = computedStyle['margin' + dirB];\r\n\r\n // I do not care for width for now, so this hack is irrelevant\r\n // if ( !supportsPercentMargin )\r\n // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )\r\n // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )\r\n marginA = convertToPx(elem, computedMarginA) || 0;\r\n marginB = convertToPx(elem, computedMarginB) || 0;\r\n\r\n return {\r\n base: base,\r\n padding: paddingA + paddingB,\r\n border: borderA + borderB,\r\n margin: marginA + marginB\r\n };\r\n }\r\n\r\n function getWidthHeight(elem, direction, measure) {\r\n let computedStyle, result;\r\n\r\n let measurements = getMeasurements(elem, direction);\r\n\r\n if (measurements.base > 0) {\r\n return {\r\n base: measurements.base - measurements.padding - measurements.border,\r\n outer: measurements.base,\r\n outerfull: measurements.base + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // Fall back to computed then uncomputed css if necessary\r\n computedStyle = getStyle(elem);\r\n result = computedStyle[direction];\r\n\r\n if (result < 0 || result === null) {\r\n result = elem.style[direction] || 0;\r\n }\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n result = parseFloat(result) || 0;\r\n\r\n return {\r\n base: result - measurements.padding - measurements.border,\r\n outer: result,\r\n outerfull: result + measurements.padding + measurements.border + measurements.margin\r\n }[measure];\r\n }\r\n\r\n // define missing methods\r\n return angular.forEach({\r\n before(newElem) {\r\n var children, elem, i, j, parent, ref, self;\r\n self = this;\r\n elem = self[0];\r\n parent = self.parent();\r\n children = parent.contents();\r\n if (children[0] === elem) {\r\n return parent.prepend(newElem);\r\n } else {\r\n for (i = j = 1, ref = children.length - 1; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r\n if (children[i] === elem) {\r\n angular.element(children[i - 1]).after(newElem);\r\n return;\r\n }\r\n }\r\n throw new Error('invalid DOM structure ' + elem.outerHTML);\r\n }\r\n },\r\n height (value){\r\n var self;\r\n self = this;\r\n if (typeof value !== 'undefined') {\r\n if (angular.isNumber(value)) {\r\n value = value + 'px';\r\n }\r\n return css.call(self, 'height', value);\r\n } else {\r\n return getWidthHeight(this[0], 'height', 'base');\r\n }\r\n },\r\n outerHeight(option) {\r\n return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');\r\n },\r\n outerWidth(option) {\r\n return getWidthHeight(this[0], 'width', option ? 'outerfull' : 'outer');\r\n },\r\n\r\n /*\r\n The offset setter method is not implemented\r\n */\r\n offset(value) {\r\n let docElem, win;\r\n let self = this;\r\n let box = {\r\n top: 0,\r\n left: 0\r\n };\r\n let elem = self[0];\r\n let doc = elem && elem.ownerDocument;\r\n\r\n if (arguments.length) {\r\n if (value === undefined) {\r\n return self;\r\n }\r\n // TODO: implement setter\r\n throw new Error('offset setter method is not implemented');\r\n }\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n\r\n // TODO: Make sure it's not a disconnected DOM node\r\n\r\n if (elem.getBoundingClientRect != null) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n\r\n win = doc.defaultView || doc.parentWindow;\r\n\r\n return {\r\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\r\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\r\n };\r\n },\r\n scrollTop(value) {\r\n return scrollTo(this, 'top', value);\r\n },\r\n scrollLeft(value) {\r\n return scrollTo(this, 'left', value);\r\n }\r\n }, (value, key) => {\r\n if (!element.prototype[key]) {\r\n return element.prototype[key] = value;\r\n }\r\n });\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/jqLiteExtras.js","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nexport default class ElementRoutines {\r\n\r\n static addCSSRules() {\r\n const selector = '.' + hideClassToken;\r\n const rules = 'display: none';\r\n const sheet = document.styleSheets[0];\r\n let index;\r\n try {\r\n index = sheet.cssRules.length;\r\n } catch (err) {\r\n index = 0;\r\n }\r\n if('insertRule' in sheet) {\r\n sheet.insertRule(selector + '{' + rules + '}', index);\r\n }\r\n else if('addRule' in sheet) {\r\n sheet.addRule(selector, rules, index);\r\n }\r\n }\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n }\r\n\r\n hideElement(wrapper) {\r\n wrapper.element.addClass(hideClassToken);\r\n }\r\n\r\n showElement(wrapper) {\r\n wrapper.element.removeClass(hideClassToken);\r\n }\r\n\r\n insertElement(newElement, previousElement) {\r\n previousElement.after(newElement);\r\n return [];\r\n }\r\n\r\n removeElement(wrapper) {\r\n wrapper.element.remove();\r\n wrapper.scope.$destroy();\r\n return [];\r\n }\r\n\r\n insertElementAnimated(newElement, previousElement) {\r\n if (!this.$animate) {\r\n return this.insertElement(newElement, previousElement);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n // no need for parent - previous element is never null\r\n this.$animate.enter(newElement, null, previousElement, () => deferred.resolve());\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n // no need for parent - previous element is never null\r\n return [this.$animate.enter(newElement, null, previousElement)];\r\n }\r\n\r\n removeElementAnimated(wrapper) {\r\n if (!this.$animate) {\r\n return this.removeElement(wrapper);\r\n }\r\n\r\n if (this.isAngularVersionLessThen1_3) {\r\n const deferred = this.$q.defer();\r\n this.$animate.leave(wrapper.element, () => {\r\n wrapper.scope.$destroy();\r\n return deferred.resolve();\r\n });\r\n\r\n return [deferred.promise];\r\n }\r\n\r\n return [(this.$animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/elementRoutines.js","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n angular.extend(buffer, {\r\n size: bufferSize,\r\n\r\n reset(startIndex) {\r\n buffer.remove(0, buffer.length);\r\n buffer.eof = false;\r\n buffer.bof = false;\r\n buffer.first = startIndex;\r\n buffer.next = startIndex;\r\n buffer.minIndex = startIndex;\r\n buffer.maxIndex = startIndex;\r\n buffer.minIndexUser = null;\r\n buffer.maxIndexUser = null;\r\n },\r\n\r\n append(items) {\r\n items.forEach((item) => {\r\n ++buffer.next;\r\n buffer.insert('append', item);\r\n });\r\n buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex);\r\n },\r\n\r\n prepend(items) {\r\n items.reverse().forEach((item) => {\r\n --buffer.first;\r\n buffer.insert('prepend', item);\r\n });\r\n buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex);\r\n },\r\n\r\n /**\r\n * inserts wrapped element in the buffer\r\n * the first argument is either operation keyword (see below) or a number for operation 'insert'\r\n * for insert the number is the index for the buffer element the new one have to be inserted after\r\n * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none'\r\n */\r\n insert(operation, item, isTop) {\r\n const wrapper = {\r\n item: item\r\n };\r\n\r\n if (operation % 1 === 0) {// it is an insert\r\n wrapper.op = 'insert';\r\n buffer.splice(operation, 0, wrapper);\r\n if(isTop) {\r\n buffer.first--;\r\n }\r\n else {\r\n buffer.next++;\r\n }\r\n } else {\r\n wrapper.op = operation;\r\n switch (operation) {\r\n case 'append':\r\n buffer.push(wrapper);\r\n break;\r\n case 'prepend':\r\n buffer.unshift(wrapper);\r\n break;\r\n }\r\n }\r\n },\r\n\r\n // removes elements from buffer\r\n remove(arg1, arg2) {\r\n if (angular.isNumber(arg1)) {\r\n // removes items from arg1 (including) through arg2 (excluding)\r\n for (let i = arg1; i < arg2; i++) {\r\n elementRoutines.removeElement(buffer[i]);\r\n }\r\n return buffer.splice(arg1, arg2 - arg1);\r\n }\r\n // removes single item(wrapper) from the buffer\r\n buffer.splice(buffer.indexOf(arg1), 1);\r\n if(arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) {\r\n this.incrementMinIndex();\r\n }\r\n else {\r\n this.decrementMaxIndex();\r\n }\r\n if(arg1._op === 'isTop') {\r\n buffer.first++;\r\n }\r\n else {\r\n buffer.next--;\r\n }\r\n if(!buffer.length) {\r\n buffer.first = 1;\r\n buffer.next = 1;\r\n }\r\n\r\n return elementRoutines.removeElementAnimated(arg1);\r\n },\r\n\r\n incrementMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n if(buffer.minIndex > buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n return;\r\n }\r\n if(buffer.minIndex === buffer.minIndexUser) {\r\n buffer.minIndexUser++;\r\n }\r\n }\r\n buffer.minIndex++;\r\n },\r\n\r\n decrementMaxIndex() {\r\n if(buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) {\r\n buffer.maxIndexUser--;\r\n }\r\n buffer.maxIndex--;\r\n },\r\n\r\n getAbsMinIndex() {\r\n if(buffer.minIndexUser !== null) {\r\n return Math.min(buffer.minIndexUser, buffer.minIndex);\r\n }\r\n return buffer.minIndex;\r\n },\r\n\r\n getAbsMaxIndex() {\r\n if(buffer.maxIndexUser !== null) {\r\n return Math.max(buffer.maxIndexUser, buffer.maxIndex);\r\n }\r\n return buffer.maxIndex;\r\n },\r\n\r\n effectiveHeight(elements) {\r\n if (!elements.length) {\r\n return 0;\r\n }\r\n let top = Number.MAX_VALUE;\r\n let bottom = Number.NEGATIVE_INFINITY;\r\n elements.forEach((wrapper) => {\r\n if (wrapper.element[0].offsetParent) {\r\n // element style is not display:none\r\n top = Math.min(top, wrapper.element.offset().top);\r\n bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true));\r\n }\r\n });\r\n return Math.max(0, bottom - top);\r\n }\r\n\r\n });\r\n\r\n buffer.reset(startIndex);\r\n\r\n return buffer;\r\n}\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 viewport.scrollTopOriginal = viewport.scrollTopOriginal || viewport.scrollTop;\r\n viewport.scrollTopBeforeSet = null;\r\n viewport.scrollTopValue = null;\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 scrollTop() {\r\n if (typeof arguments[0] !== 'undefined') {\r\n viewport.scrollTopBeforeSet = viewport.scrollTop();\r\n viewport.scrollTopValue = arguments[0];\r\n }\r\n return viewport.scrollTopOriginal.apply(viewport, arguments);\r\n },\r\n\r\n createPaddingElements(template) {\r\n topPadding = new Padding(template);\r\n bottomPadding = new Padding(template);\r\n element.before(topPadding.element);\r\n element.after(bottomPadding.element);\r\n topPadding.height(0);\r\n bottomPadding.height(0);\r\n },\r\n\r\n applyContainerStyle() {\r\n if (!container) {\r\n return true;\r\n }\r\n if(container !== viewport) {\r\n viewport.css('height', window.getComputedStyle(container[0]).height);\r\n }\r\n return viewport.height() > 0;\r\n },\r\n\r\n bottomDataPos() {\r\n let scrollHeight = viewport[0].scrollHeight;\r\n scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight;\r\n return scrollHeight - bottomPadding.height();\r\n },\r\n\r\n topDataPos() {\r\n return topPadding.height();\r\n },\r\n\r\n bottomVisiblePos() {\r\n return viewport.scrollTop() + viewport.outerHeight();\r\n },\r\n\r\n topVisiblePos() {\r\n return viewport.scrollTop();\r\n },\r\n\r\n insertElement(e, sibling) {\r\n return elementRoutines.insertElement(e, sibling || topPadding.element);\r\n },\r\n\r\n insertElementAnimated(e, sibling) {\r\n return elementRoutines.insertElementAnimated(e, sibling || topPadding.element);\r\n },\r\n\r\n shouldLoadBottom() {\r\n return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding();\r\n },\r\n\r\n clipBottom() {\r\n // clip the invisible items off the bottom\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding();\r\n\r\n for (let i = buffer.length - 1; i >= 0; i--) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n bottomPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n buffer.eof = false;\r\n buffer.remove(buffer.length - overage, buffer.length);\r\n buffer.next -= overage;\r\n viewport.adjustPaddings();\r\n }\r\n },\r\n\r\n shouldLoadTop() {\r\n return !buffer.bof && !viewport.scrollTopSetFailed && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding();\r\n },\r\n\r\n clipTop() {\r\n // clip the invisible items off the top\r\n let overage = 0;\r\n let overageHeight = 0;\r\n let itemHeight = 0;\r\n let emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding();\r\n\r\n for (let i = 0; i < buffer.length; i++) {\r\n itemHeight = buffer[i].element.outerHeight(true);\r\n if (overageHeight + itemHeight > emptySpaceHeight) {\r\n break;\r\n }\r\n topPadding.cache.add(buffer[i]);\r\n overageHeight += itemHeight;\r\n overage++;\r\n }\r\n\r\n if (overage > 0) {\r\n // we need to adjust top padding element before items are removed from top\r\n // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom\r\n topPadding.height(topPadding.height() + overageHeight);\r\n buffer.bof = false;\r\n buffer.remove(0, overage);\r\n buffer.first += overage;\r\n }\r\n },\r\n\r\n adjustPaddings() {\r\n if (!buffer.length) {\r\n return;\r\n }\r\n\r\n // precise heights calculation based on items that are in buffer or that were in buffer once\r\n const visibleItemsHeight = buffer.reduce((summ, item) => summ + item.element.outerHeight(true), 0);\r\n\r\n let topPaddingHeight = 0, topCount = 0;\r\n topPadding.cache.forEach(item => {\r\n if(item.index < buffer.first) {\r\n topPaddingHeight += item.height;\r\n topCount++;\r\n }\r\n });\r\n\r\n let bottomPaddingHeight = 0, bottomCount = 0;\r\n bottomPadding.cache.forEach(item => {\r\n if(item.index >= buffer.next) {\r\n bottomPaddingHeight += item.height;\r\n bottomCount++;\r\n }\r\n });\r\n\r\n const totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight;\r\n const averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length);\r\n\r\n // average heights calculation, items that have never been reached\r\n let adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser;\r\n let adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser;\r\n let topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0;\r\n let bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0;\r\n\r\n // paddings combine adjustment\r\n topPadding.height(topPaddingHeight + topPaddingHeightAdd);\r\n bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);\r\n },\r\n\r\n onAfterMinIndexSet(topPaddingHeightOld) {\r\n // additional scrollTop adjustment in case of datasource.minIndex external set\r\n if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {\r\n let diff = topPadding.height() - topPaddingHeightOld;\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n while((diff -= viewport.scrollTop()) > 0) {\r\n bottomPadding.height(bottomPadding.height() + diff);\r\n viewport.scrollTop(viewport.scrollTop() + diff);\r\n }\r\n }\r\n },\r\n\r\n onAfterPrepend(updates) {\r\n if (!updates.prepended.length)\r\n return;\r\n const height = buffer.effectiveHeight(updates.prepended);\r\n const paddingHeight = topPadding.height() - height;\r\n if (paddingHeight >= 0) {\r\n topPadding.height(paddingHeight);\r\n }\r\n else {\r\n topPadding.height(0);\r\n viewport.scrollTopAdjust = paddingHeight;\r\n viewport.scrollTop(viewport.scrollTop() - paddingHeight);\r\n }\r\n },\r\n\r\n resetTopPadding() {\r\n topPadding.height(0);\r\n topPadding.cache.clear();\r\n },\r\n\r\n resetBottomPadding() {\r\n bottomPadding.height(0);\r\n bottomPadding.cache.clear();\r\n },\r\n\r\n removeCacheItem(item, isTop) {\r\n topPadding.cache.remove(item, isTop);\r\n bottomPadding.cache.remove(item, isTop);\r\n },\r\n\r\n removeItem(item) {\r\n this.removeCacheItem(item);\r\n return buffer.remove(item);\r\n }\r\n });\r\n\r\n return viewport;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/viewport.js","// Can't just extend the Array, due to Babel does not support built-in classes extending\r\n// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile\r\nclass CacheProto {\r\n add(item) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === item.scope.$index) {\r\n this[i].height = item.element.outerHeight();\r\n return;\r\n }\r\n }\r\n this.push({\r\n index: item.scope.$index,\r\n height: item.element.outerHeight()\r\n });\r\n this.sort((a, b) => ((a.index < b.index) ? -1 : ((a.index > b.index) ? 1 : 0)));\r\n }\r\n\r\n remove(argument, _isTop) {\r\n const index = argument % 1 === 0 ? argument : argument.scope.$index;\r\n const isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop';\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index === index) {\r\n this.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if(!isTop) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n if (this[i].index > index) {\r\n this[i].index--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this.length = 0;\r\n }\r\n}\r\n\r\nfunction Cache() {\r\n const instance = [];\r\n instance.push.apply(instance, arguments);\r\n Object.setPrototypeOf(instance, Cache.prototype);\r\n return instance;\r\n}\r\nCache.prototype = Object.create(Array.prototype);\r\nObject.getOwnPropertyNames(CacheProto.prototype).forEach(methodName =>\r\n Cache.prototype[methodName] = CacheProto.prototype[methodName]\r\n);\r\n\r\nfunction generateElement(template) {\r\n if(template.nodeType !== Node.ELEMENT_NODE) {\r\n throw new Error('ui-scroll directive requires an Element node for templating the view');\r\n }\r\n let element;\r\n switch (template.tagName.toLowerCase()) {\r\n case 'dl':\r\n throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);\r\n case 'tr':\r\n let table = angular.element('
    ');\r\n element = table.find('tr');\r\n break;\r\n case 'li':\r\n element = angular.element('
  • ');\r\n break;\r\n default:\r\n element = angular.element('
    ');\r\n }\r\n return element;\r\n}\r\n\r\nclass Padding {\r\n constructor(template) {\r\n this.element = generateElement(template);\r\n this.cache = new Cache();\r\n }\r\n\r\n height() {\r\n return this.element.height.apply(this.element, arguments);\r\n }\r\n}\r\n\r\nexport default Padding;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/padding.js","class Adapter {\r\n\r\n constructor($scope, $parse, $attr, viewport, buffer, doAdjust, reload) {\r\n this.$parse = $parse;\r\n this.$attr = $attr;\r\n this.viewport = viewport;\r\n this.buffer = buffer;\r\n\r\n this.doAdjust = doAdjust;\r\n this.reload = reload;\r\n\r\n this.isLoading = false;\r\n this.disabled = false;\r\n\r\n const viewportScope = viewport.getScope();\r\n this.startScope = viewportScope.$parent ? viewportScope : $scope;\r\n\r\n this.publicContext = {};\r\n this.assignAdapter($attr.adapter);\r\n this.generatePublicContext();\r\n }\r\n\r\n assignAdapter(adapterAttr) {\r\n if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\\s+|\\s+$/gm, ''))) {\r\n return;\r\n }\r\n let adapterOnScope;\r\n\r\n try {\r\n this.$parse(adapterAttr).assign(this.startScope, {});\r\n adapterOnScope = this.$parse(adapterAttr)(this.startScope);\r\n }\r\n catch (error) {\r\n error.message = `Angular ui-scroll Adapter assignment exception.\\n` +\r\n `Can't parse \"${adapterAttr}\" expression.\\n` +\r\n error.message;\r\n throw error;\r\n }\r\n\r\n angular.extend(adapterOnScope, this.publicContext);\r\n this.publicContext = adapterOnScope;\r\n }\r\n\r\n generatePublicContext() {\r\n // these methods will be accessible out of ui-scroll via user defined adapter\r\n const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty', 'resetScrollTopCorrection'];\r\n for (let i = publicMethods.length - 1; i >= 0; i--) {\r\n this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this);\r\n }\r\n\r\n // these read-only props will be accessible out of ui-scroll via user defined adapter\r\n const publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope'];\r\n for (let i = publicProps.length - 1; i >= 0; i--) {\r\n let property, attr = this.$attr[publicProps[i]];\r\n Object.defineProperty(this, publicProps[i], {\r\n get: () => property,\r\n set: (value) => {\r\n property = value;\r\n this.publicContext[publicProps[i]] = value;\r\n if (attr) {\r\n this.$parse(attr).assign(this.startScope, value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // non-read-only public property\r\n Object.defineProperty(this.publicContext, 'disabled', {\r\n get: () => this.disabled,\r\n set: (value) => (!(this.disabled = value)) ? this.doAdjust() : null\r\n });\r\n }\r\n\r\n loading(value) {\r\n this.isLoading = value;\r\n }\r\n\r\n isBOF() {\r\n return this.buffer.bof;\r\n }\r\n\r\n isEOF() {\r\n return this.buffer.eof;\r\n }\r\n\r\n isEmpty() {\r\n return !this.buffer.length;\r\n }\r\n\r\n resetScrollTopCorrection() {\r\n // is needed to scroll at negative area programmatically (e.g. tests)\r\n this.viewport.scrollTopValue = null;\r\n }\r\n\r\n append(newItems) {\r\n this.buffer.append(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n prepend(newItems) {\r\n this.buffer.prepend(newItems);\r\n this.doAdjust();\r\n this.viewport.clipTop();\r\n this.viewport.clipBottom();\r\n }\r\n\r\n applyUpdates(arg1, arg2) {\r\n if (typeof arg1 === 'function') {\r\n this.applyUpdatesFunc(arg1);\r\n } else {\r\n this.applyUpdatesIndex(arg1, arg2);\r\n }\r\n this.doAdjust();\r\n }\r\n\r\n applyUpdatesFunc(cb) {\r\n this.buffer.slice(0).forEach((wrapper) => {\r\n // we need to do it on the buffer clone, because buffer content\r\n // may change as we iterate through\r\n this.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element));\r\n });\r\n }\r\n\r\n applyUpdatesIndex(index, newItems) {\r\n if (index % 1 !== 0) {\r\n throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)');\r\n }\r\n const _index = index - this.buffer.first;\r\n\r\n // apply updates only within buffer\r\n if (_index >= 0 && _index < this.buffer.length) {\r\n this.applyUpdate(this.buffer[_index], newItems);\r\n }\r\n // out-of-buffer case: deletion may affect Paddings\r\n else if(index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) {\r\n if(angular.isArray(newItems) && !newItems.length) {\r\n this.viewport.removeCacheItem(index, index === this.buffer.minIndex);\r\n if(index === this.buffer.getAbsMinIndex()) {\r\n this.buffer.incrementMinIndex();\r\n }\r\n else {\r\n this.buffer.decrementMaxIndex();\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyUpdate(wrapper, newItems) {\r\n if (!angular.isArray(newItems)) {\r\n return;\r\n }\r\n let position = this.buffer.indexOf(wrapper);\r\n if (!newItems.reverse().some(newItem => newItem === wrapper.item)) {\r\n wrapper.op = 'remove';\r\n if(position === 0 && !newItems.length) {\r\n wrapper._op = 'isTop'; // to catch \"first\" edge case on remove\r\n }\r\n }\r\n newItems.forEach((newItem) => {\r\n if (newItem === wrapper.item) {\r\n position--;\r\n } else {\r\n // 3 parameter (isTop) is to catch \"first\" edge case on insert\r\n this.buffer.insert(position + 1, newItem, position === -1);\r\n }\r\n });\r\n }\r\n\r\n calculateProperties() {\r\n let rowTop = null, topHeight = 0;\r\n let topDone = false, bottomDone = false;\r\n const length = this.buffer.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n const item = this.buffer[i];\r\n const itemTop = item.element.offset().top;\r\n\r\n if (rowTop !== itemTop) { // a new row condition\r\n const itemHeight = item.element.outerHeight(true);\r\n const top = this.viewport.topDataPos() + topHeight + itemHeight;\r\n\r\n if (!topDone && top > this.viewport.topVisiblePos()) {\r\n topDone = true;\r\n this['topVisible'] = item.item;\r\n this['topVisibleElement'] = item.element;\r\n this['topVisibleScope'] = item.scope;\r\n }\r\n if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || (i === length - 1 && this.isEOF()))) {\r\n bottomDone = true;\r\n this['bottomVisible'] = item.item;\r\n this['bottomVisibleElement'] = item.element;\r\n this['bottomVisibleScope'] = item.scope;\r\n }\r\n topHeight += itemHeight;\r\n }\r\n rowTop = itemTop;\r\n\r\n if (topDone && bottomDone) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Adapter;\r\n\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 82d926b3..88bf2623 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "angular-ui-scroll", "description": "AngularJS infinite scrolling module", - "version": "1.7.2", + "version": "1.8.0-rc", "src": "./src/", "public": "./dist/", "main": "./dist/ui-scroll.js", diff --git a/src/modules/adapter.js b/src/modules/adapter.js index 09e8767a..1f597e35 100644 --- a/src/modules/adapter.js +++ b/src/modules/adapter.js @@ -43,7 +43,7 @@ class Adapter { generatePublicContext() { // these methods will be accessible out of ui-scroll via user defined adapter - const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty']; + const publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty', 'resetScrollTopCorrection']; for (let i = publicMethods.length - 1; i >= 0; i--) { this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this); } @@ -87,6 +87,11 @@ class Adapter { return !this.buffer.length; } + resetScrollTopCorrection() { + // is needed to scroll at negative area programmatically (e.g. tests) + this.viewport.scrollTopValue = null; + } + append(newItems) { this.buffer.append(newItems); this.doAdjust(); diff --git a/src/modules/viewport.js b/src/modules/viewport.js index 4f64acb9..b85710b7 100644 --- a/src/modules/viewport.js +++ b/src/modules/viewport.js @@ -13,6 +13,10 @@ export default function Viewport(elementRoutines, buffer, element, viewportContr 'display': 'block' }); + viewport.scrollTopOriginal = viewport.scrollTopOriginal || viewport.scrollTop; + viewport.scrollTopBeforeSet = null; + viewport.scrollTopValue = null; + function bufferPadding() { return viewport.outerHeight() * padding; // some extra space to initiate preload } @@ -22,6 +26,14 @@ export default function Viewport(elementRoutines, buffer, element, viewportContr return scope; }, + scrollTop() { + if (typeof arguments[0] !== 'undefined') { + viewport.scrollTopBeforeSet = viewport.scrollTop(); + viewport.scrollTopValue = arguments[0]; + } + return viewport.scrollTopOriginal.apply(viewport, arguments); + }, + createPaddingElements(template) { topPadding = new Padding(template); bottomPadding = new Padding(template); @@ -97,7 +109,7 @@ export default function Viewport(elementRoutines, buffer, element, viewportContr }, shouldLoadTop() { - return !buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding()); + return !buffer.bof && !viewport.scrollTopSetFailed && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding(); }, clipTop() { @@ -187,6 +199,7 @@ export default function Viewport(elementRoutines, buffer, element, viewportContr } else { topPadding.height(0); + viewport.scrollTopAdjust = paddingHeight; viewport.scrollTop(viewport.scrollTop() - paddingHeight); } }, diff --git a/src/ui-scroll.js b/src/ui-scroll.js index f5d1aa96..c9deee76 100644 --- a/src/ui-scroll.js +++ b/src/ui-scroll.js @@ -67,7 +67,7 @@ angular.module('ui.scroll', []) const BUFFER_MIN = 3; const BUFFER_DEFAULT = 10; - const PADDING_MIN = 0.3; + const PADDING_MIN = 0.01; const PADDING_DEFAULT = 0.5; const MAX_VIEWPORT_DELAY = 500; const VIEWPORT_POLLING_INTERVAL = 50; @@ -475,18 +475,40 @@ angular.module('ui.scroll', []) } } - function resizeAndScrollHandler() { - if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) { + function resizeAndScrollHandler(ev) { + if ($rootScope.$$phase || adapter.isLoading || adapter.disabled) { + return; + } - enqueueFetch(ridActual); + if (ev.type === 'scroll') { + // Don't process scroll event if it was triggered by us setting scrollTop. + if (viewport[0].scrollTop === viewport.scrollTopValue) { + return false; + } - if (pending.length) { - unbindEvents(); - } else { - adapter.calculateProperties(); - !$scope.$$phase && $scope.$digest(); + // Check if we tried to set scrollTop and it failed. If that happens, don't prepend more items based on the stale value + // of scrollTop that will be used by shouldLoadTop(). Also, try to set it again. + viewport.scrollTopSetFailed = false; + if (viewport.scrollTopValue != null) { + const curScrollTop = viewport[0].scrollTop; + if (Math.abs(curScrollTop - viewport.scrollTopValue) > Math.abs(curScrollTop - viewport.scrollTopBeforeSet)) { + viewport.scrollTopSetFailed = true; + viewport.scrollTop(curScrollTop - viewport.scrollTopAdjust); + } } } + + enqueueFetch(ridActual); + + // we got a real scroll event, so browser is now in charge of scrollTop + viewport.scrollTopValue = null; + + if (pending.length) { + unbindEvents(); + } else { + adapter.calculateProperties(); + !$scope.$$phase && $scope.$digest(); + } } function wheelHandler(event) { diff --git a/test/BasicTestsSpec.js b/test/BasicTestsSpec.js index af792169..3c8dcc0b 100644 --- a/test/BasicTestsSpec.js +++ b/test/BasicTestsSpec.js @@ -409,9 +409,12 @@ describe('uiScroll', function () { datasource: 'myEdgeDatasource', bufferSize: buffer, viewportHeight: viewportHeight, - itemHeight: itemHeight + itemHeight: itemHeight, + adapter: 'adapter' }, - function (viewport) { + function (viewport, scope) { + scope.adapter.resetScrollTopCorrection(); + viewport.scrollTop(0); //first full, scroll to -2 viewport.trigger('scroll'); @@ -433,7 +436,12 @@ describe('uiScroll', function () { }); describe('prevent unwanted scroll bubbling', function () { - var scrollSettings = { datasource: 'myDatasourceToPreventScrollBubbling', bufferSize: 3, viewportHeight: 300 }; + var scrollSettings = { + datasource: 'myDatasourceToPreventScrollBubbling', + bufferSize: 3, + viewportHeight: 300, + adapter: 'adapter' + }; var documentScrollBubblingCount = 0; var incrementDocumentScrollCount = function (event) { @@ -457,7 +465,7 @@ describe('uiScroll', function () { }); runTest(scrollSettings, - function (viewport) { + function (viewport, scope) { var wheelEventElement = viewport[0]; angular.element(document.body).bind('mousewheel', incrementDocumentScrollCount); //spy for wheel-events bubbling @@ -467,6 +475,8 @@ describe('uiScroll', function () { wheelEventElement.dispatchEvent(getNewWheelEvent()); //preventDefault will not occurred but the document will not scroll because of viewport will be scrolled expect(documentScrollBubblingCount).toBe(1); + scope.adapter.resetScrollTopCorrection(); + viewport.scrollTop(0); viewport.trigger('scroll'); @@ -504,7 +514,8 @@ describe('uiScroll', function () { datasource: 'myInfiniteDatasource', viewportHeight: viewportHeight, itemHeight: itemHeight, - bufferSize: bufferSize + bufferSize: bufferSize, + adapter: 'adapter' }; it('should calculate top padding element\'s height during scroll down', function () { @@ -522,7 +533,8 @@ describe('uiScroll', function () { it('should calculate bottom padding element\'s height during scroll up', function () { runTest(scrollSettings, - function (viewport) { + function (viewport, scope) { + scope.adapter.resetScrollTopCorrection(); // scroll up + expectation for(var i = 0; i < 6; i++) { viewport.scrollTop(-5000); @@ -747,7 +759,8 @@ describe('uiScroll', function () { datasource: 'myInfiniteDatasource', template: myTemplate, topVisible: 'topVisible', - bufferSize: 10 + bufferSize: 10, + adapter: 'adapter' }; it('should keep 1st item at the top after initial auto fetching is done', function() { @@ -766,6 +779,7 @@ describe('uiScroll', function () { it('should keep (-bufferSize) item at the top after one manual fetching is done', function() { runTest(scrollSettings, function (viewport, scope) { + scope.adapter.resetScrollTopCorrection(); viewport.scrollTop(0); // scroll to the very top viewport.trigger('scroll');