diff --git a/.gitignore b/.gitignore index 2b23aa8e..d714480e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,4 @@ -.idea -public node_modules temp -/nbproject/private/ -*.log \ No newline at end of file +*.log +.idea \ No newline at end of file diff --git a/.jshintrc b/.jshintrc index b3b46156..cd4cfd3c 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,24 +1,25 @@ { - "boss": true, - "browser": true, - "eqnull": true, - "expr": true, - "esversion": 6, - "immed": true, - "laxbreak": true, - "loopfunc": true, - "newcap": true, - "noarg": true, - "noempty": true, - "nonew": true, - "quotmark": true, - "smarttabs": true, - "strict": true, - "sub": true, - "trailing": true, - "undef": true, - "unused": true, - "globals": { - "angular": false - } + "emitErrors": true, + "boss": true, + "browser": true, + "eqnull": true, + "expr": true, + "esversion": 6, + "immed": true, + "laxbreak": true, + "loopfunc": true, + "newcap": true, + "noarg": true, + "noempty": true, + "nonew": true, + "quotmark": true, + "smarttabs": true, + "strict": false, + "sub": true, + "trailing": true, + "undef": true, + "unused": true, + "globals": { + "angular": false + } } diff --git a/.travis.yml b/.travis.yml index 6385a2c1..a898a3a8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,12 +11,10 @@ before_install: - sh -e /etc/init.d/xvfb start before_script: -- npm install -g grunt-cli -- npm install -g karma - npm install script: -- grunt travis +- npm run build deploy: provider: npm diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 6e34613b..00000000 --- a/Gruntfile.js +++ /dev/null @@ -1,159 +0,0 @@ -module.exports = function (grunt) { - grunt.loadNpmTasks('grunt-karma'); - grunt.loadNpmTasks('grunt-contrib-connect'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-copy'); - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.loadNpmTasks('grunt-webpack'); - - var webpackSettings = require('./webpack.config.js'); - - grunt.initConfig({ - connect: { - app: { - options: { - port: 5005, - base: './demo', - middleware: function (connect, options, middlewares) { - middlewares.unshift(function (req, res, next) { - var files = ['ui-scroll.js', 'ui-scroll-grid.js', 'ui-scroll.js.map', 'ui-scroll-grid.js.map']; - for (var i = 0; i < files.length; i++) { - if (req.url === '/dist/' + files[i]) { - res.end(grunt.file.read('./temp/' + files[i])); - } - } - next(); - }); - return middlewares; - } - } - } - }, - watch: { - options: { - livereload: false, - debounceDelay: 250 - }, - scripts: { - files: [ - 'src/**/*.js' - ], - tasks: 'webpack:default' - } - }, - karma: { - options: { - configFile: './test/config/karma.conf.js', - runnerPort: 9100 - }, - default: {}, - compressed: { - options: { - files: require('./test/config/karma.conf.files.js').compressedFiles, - port: 9876, - autoWatch: false, - keepalive: false, - singleRun: true - } - } - }, - webpack: { - options: webpackSettings.config, - default: {}, - compressed: { - plugins: webpackSettings.compressedPlugins, - output: { - filename: '[name].min.js' - } - } - }, - clean: { - temp: ['temp'] - }, - copy: { - sources: { - files: [ - {expand: true, src: ['*'], cwd: 'temp', dest: 'dist/'}, - ] - }, - jqLiteExtrasFake: { - files: [ - {expand: true, src: ['ui-scroll-jqlite.js'], cwd: 'src', dest: 'dist/'}, - { - expand: true, src: ['ui-scroll-jqlite.js'], cwd: 'src', dest: 'dist/', rename: function (dest, src) { - return dest + src.replace(/\.js$/, ".min.js"); - } - } - ] - } - }, - jshint: { - sources: { - files: { - src: [ - './src/*.js', - './src/modules/*.js' - ] - }, - options: grunt.util._.extend({}, grunt.file.readJSON('.jshintrc'), grunt.file.readJSON('./src/.jshintrc')) - }, - tests: { - files: { - src: ['./test/*Spec.js'] - }, - options: grunt.util._.extend({}, grunt.file.readJSON('.jshintrc'), { - node: true, - globals: { - angular: false, - inject: false, - jQuery: false, - jasmine: false, - afterEach: false, - beforeEach: false, - ddescribe: false, - describe: false, - expect: false, - iit: false, - it: false, - spyOn: false, - xdescribe: false, - xit: false - } - }) - } - } - }); - - grunt.registerTask('server', [ - 'connect', - 'watch' - ]); - - grunt.registerTask('default', [ - 'webpack:default', - 'server' - ]); - - grunt.registerTask('test', [ - 'clean:temp', - 'webpack:default', - 'karma:default' - ]); - - grunt.registerTask('build', [ - 'jshint:tests', - 'jshint:sources', - 'clean:temp', - 'webpack:compressed', - 'karma:compressed', - 'webpack:default', - 'copy:sources', - 'copy:jqLiteExtrasFake' - ]); - - grunt.registerTask('travis', [ - 'webpack:compressed', - 'karma:compressed' - ]); -}; diff --git a/dist/ui-scroll-grid.js b/dist/ui-scroll-grid.js index 6fd3faa5..e5a46583 100644 --- a/dist/ui-scroll-grid.js +++ b/dist/ui-scroll-grid.js @@ -1,8 +1,8 @@ -/*! - * angular-ui-scroll (uncompressed) - * https://github.com/angular-ui/ui-scroll - * Version: 1.7.0-rc.6 -- 2017-11-17T18:27:05.558Z - * License: MIT +/*! + * angular-ui-scroll + * https://github.com/angular-ui/ui-scroll + * Version: 1.7.0-rc.6 -- 2017-11-19T07:39:04.374Z + * License: MIT */ /******/ (function(modules) { // webpackBootstrap /******/ // The module cache @@ -39,9 +39,6 @@ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ -/******/ // identity function for calling harmony imports with the correct context -/******/ __webpack_require__.i = function(value) { return value; }; -/******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { @@ -69,12 +66,12 @@ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 6); +/******/ return __webpack_require__(__webpack_require__.s = 7); /******/ }) /************************************************************************/ /******/ ({ -/***/ 6: +/***/ 7: /***/ (function(module, exports, __webpack_require__) { "use strict"; diff --git a/dist/ui-scroll-grid.js.map b/dist/ui-scroll-grid.js.map index 85e91dab..9dee0f57 100644 --- a/dist/ui-scroll-grid.js.map +++ b/dist/ui-scroll-grid.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap af02e5af19248c8e95e9?13bb","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","assign","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// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\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 = 6);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap af02e5af19248c8e95e9","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 = Object.assign({}, 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: Object.assign({}, 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 36a3010ad66560b7fc51","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","assign","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 36a3010ad66560b7fc51","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 = Object.assign({}, 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: Object.assign({}, 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 a89f1252..3d8a0149 100644 --- a/dist/ui-scroll-grid.min.js +++ b/dist/ui-scroll-grid.min.js @@ -1,8 +1,8 @@ -/*! - * angular-ui-scroll (compressed) - * https://github.com/angular-ui/ui-scroll - * Version: 1.7.0-rc.6 -- 2017-11-17T18:27:05.969Z - * License: MIT +/*! + * angular-ui-scroll + * https://github.com/angular-ui/ui-scroll + * Version: 1.7.0-rc.6 -- 2017-11-19T07:39:04.374Z + * 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.i=function(t){return t},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=6)}({6: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:Object.assign({},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()}}}})}}); +!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:Object.assign({},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()}}}})}}); //# sourceMappingURL=ui-scroll-grid.min.js.map \ No newline at end of file diff --git a/dist/ui-scroll-grid.min.js.map b/dist/ui-scroll-grid.min.js.map index 380c5f34..b7bfe497 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 ff58afc7647583ed56f1?4add","webpack:///./src/ui-scroll-grid.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","6","angular","directive","console","$timeout","GridAdapter","controller","this","getLayout","applyLayout","layout","columnFromPoint","x","y","getColumns","ColumnAdapter","column","css","attr","arguments","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","assign","_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":["/*!\r\n * angular-ui-scroll (uncompressed)\r\n * https://github.com/angular-ui/ui-scroll\r\n * Version: 1.7.0-rc.6 -- 2017-11-17T18:27:05.558Z\r\n * License: MIT\r\n */\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \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// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\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 = 6);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 6:\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 = Object.assign({}, 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: Object.assign({}, 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// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\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 = 6);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap ff58afc7647583ed56f1","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 = Object.assign({}, 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: Object.assign({}, 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 36a3010ad66560b7fc51","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","assign","_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 = Object.assign({}, 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: Object.assign({}, 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 36a3010ad66560b7fc51","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 = Object.assign({}, 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: Object.assign({}, 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 c4a6bf22..bec5a53b 100644 --- a/dist/ui-scroll.js +++ b/dist/ui-scroll.js @@ -1,8 +1,8 @@ -/*! - * angular-ui-scroll (uncompressed) - * https://github.com/angular-ui/ui-scroll - * Version: 1.7.0-rc.6 -- 2017-11-17T18:27:05.558Z - * License: MIT +/*! + * angular-ui-scroll + * https://github.com/angular-ui/ui-scroll + * Version: 1.7.0-rc.6 -- 2017-11-19T07:39:04.374Z + * License: MIT */ /******/ (function(modules) { // webpackBootstrap /******/ // The module cache @@ -39,9 +39,6 @@ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ -/******/ // identity function for calling harmony imports with the correct context -/******/ __webpack_require__.i = function(value) { return value; }; -/******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { @@ -69,7 +66,7 @@ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 7); +/******/ return __webpack_require__(__webpack_require__.s = 0); /******/ }) /************************************************************************/ /******/ ([ @@ -79,520 +76,533 @@ "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); +var _jqLiteExtras = __webpack_require__(1); -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); +var _jqLiteExtras2 = _interopRequireDefault(_jqLiteExtras); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +var _elementRoutines = __webpack_require__(2); -var Adapter = function () { - function Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload) { - _classCallCheck(this, Adapter); +var _elementRoutines2 = _interopRequireDefault(_elementRoutines); - this.$parse = $parse; - this.$attr = $attr; - this.viewport = viewport; - this.buffer = buffer; +var _buffer = __webpack_require__(3); - this.doAdjust = doAdjust; - this.reload = reload; +var _buffer2 = _interopRequireDefault(_buffer); - this.isLoading = false; - this.disabled = false; +var _viewport = __webpack_require__(4); - var viewportScope = viewport.getScope(); - this.startScope = viewportScope.$parent ? viewportScope : $scope; +var _viewport2 = _interopRequireDefault(_viewport); - this.publicContext = {}; - this.assignAdapter($attr.adapter); - this.generatePublicContext(); - } +var _adapter = __webpack_require__(6); - _createClass(Adapter, [{ - key: 'assignAdapter', - value: function assignAdapter(adapterAttr) { - if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\s+|\s+$/gm, ''))) { - return; - } - var adapterOnScope = void 0; +var _adapter2 = _interopRequireDefault(_adapter); - try { - this.$parse(adapterAttr).assign(this.startScope, {}); - adapterOnScope = this.$parse(adapterAttr)(this.startScope); - } catch (error) { - error.message = 'Angular ui-scroll Adapter assignment exception.\n' + ('Can\'t parse "' + adapterAttr + '" expression.\n') + error.message; - throw error; - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - Object.assign(adapterOnScope, this.publicContext); - this.publicContext = adapterOnScope; - } - }, { - key: 'generatePublicContext', - value: function generatePublicContext() { +angular.module('ui.scroll', []).service('jqLiteExtras', function () { + return new _jqLiteExtras2.default(); +}).run(['jqLiteExtras', function (jqLiteExtras) { + return !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null; +}]).directive('uiScrollViewport', function () { + return { + restrict: 'A', + controller: ['$scope', '$element', function (scope, element) { 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']; - for (var i = publicMethods.length - 1; i >= 0; i--) { - this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this); - } + this.container = element; + this.viewport = element; + this.scope = scope; - // these read-only props will be accessible out of ui-scroll via user defined adapter - var publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope']; + angular.forEach(element.children(), function (child) { + if (child.tagName.toLowerCase() === 'tbody') { + _this.viewport = angular.element(child); + } + }); - var _loop = function _loop(_i) { - var property = void 0, - attr = _this.$attr[publicProps[_i]]; - Object.defineProperty(_this, publicProps[_i], { - get: function get() { - return property; - }, - set: function set(value) { - property = value; - _this.publicContext[publicProps[_i]] = value; - if (attr) { - _this.$parse(attr).assign(_this.startScope, value); - } - } - }); - }; + return this; + }] + }; +}).directive('uiScroll', ['$log', '$injector', '$rootScope', '$timeout', '$interval', '$q', '$parse', function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) { - for (var _i = publicProps.length - 1; _i >= 0; _i--) { - _loop(_i); - } + return { + require: ['?^uiScrollViewport'], + restrict: 'A', + transclude: 'element', + priority: 1000, + terminal: true, + link: link + }; - // non-read-only public property - Object.defineProperty(this.publicContext, 'disabled', { - get: function get() { - return _this.disabled; - }, - set: function set(value) { - return !(_this.disabled = value) ? _this.doAdjust() : null; - } - }); - } - }, { - key: 'loading', - value: function loading(value) { - this.isLoading = value; - } - }, { - key: 'isBOF', - value: function isBOF() { - return this.buffer.bof; - } - }, { - key: 'isEOF', - value: function isEOF() { - return this.buffer.eof; - } - }, { - key: 'isEmpty', - value: function isEmpty() { - return !this.buffer.length; + function link($scope, element, $attr, controllers, linker) { + var match = $attr.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/); + if (!match) { + throw new Error('Expected uiScroll in form of \'_item_ in _datasource_\' but got \'' + $attr.uiScroll + '\''); } - }, { - key: 'append', - value: function append(newItems) { - this.buffer.append(newItems); - this.doAdjust(); - this.viewport.clipTop(); - this.viewport.clipBottom(); + + function parseNumericAttr(value, defaultValue) { + var result = $parse(value)($scope); + return isNaN(result) ? defaultValue : result; } - }, { - key: 'prepend', - value: function prepend(newItems) { - this.buffer.prepend(newItems); - this.doAdjust(); - this.viewport.clipTop(); - this.viewport.clipBottom(); + + var BUFFER_MIN = 3; + var BUFFER_DEFAULT = 10; + var PADDING_MIN = 0.3; + var PADDING_DEFAULT = 0.5; + var MAX_VIEWPORT_DELAY = 500; + var VIEWPORT_POLLING_INTERVAL = 50; + + var datasource = null; + var itemName = match[1]; + var datasourceName = match[2]; + var viewportController = controllers[0]; + var bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT)); + var padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT)); + var startIndex = parseNumericAttr($attr.startIndex, 1); + var ridActual = 0; // current data revision id + var pending = []; + + var elementRoutines = new _elementRoutines2.default($injector, $q); + var buffer = new _buffer2.default(elementRoutines, bufferSize, startIndex); + var viewport = new _viewport2.default(elementRoutines, buffer, element, viewportController, $rootScope, padding); + var adapter = new _adapter2.default($scope, $parse, $attr, viewport, buffer, doAdjust, reload); + + if (viewportController) { + viewportController.adapter = adapter; } - }, { - key: 'applyUpdates', - value: function applyUpdates(arg1, arg2) { - if (typeof arg1 === 'function') { - this.applyUpdatesFunc(arg1); - } else { - this.applyUpdatesIndex(arg1, arg2); + + var isDatasourceValid = function isDatasourceValid() { + return Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function'; + }; + + datasource = $parse(datasourceName)($scope); // try to get datasource on scope + if (!isDatasourceValid()) { + datasource = $injector.get(datasourceName); // try to inject datasource as service + if (!isDatasourceValid()) { + throw new Error(datasourceName + ' is not a valid datasource'); } - this.doAdjust(); } - }, { - key: 'applyUpdatesFunc', - value: function applyUpdatesFunc(cb) { - var _this2 = this; - this.buffer.slice(0).forEach(function (wrapper) { - // we need to do it on the buffer clone, because buffer content - // may change as we iterate through - _this2.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element)); + var onRenderHandlers = []; + function onRenderHandlersRunner() { + onRenderHandlers.forEach(function (handler) { + return handler.run(); }); + onRenderHandlers = []; } - }, { - key: 'applyUpdatesIndex', - value: function applyUpdatesIndex(index, newItems) { - if (index % 1 !== 0) { - throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)'); - } - var _index = index - this.buffer.first; - - // apply updates only within buffer - if (_index >= 0 && _index < this.buffer.length) { - this.applyUpdate(this.buffer[_index], newItems); - } - // out-of-buffer case: deletion may affect Paddings - else if (index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) { - if (Array.isArray(newItems) && !newItems.length) { - this.viewport.removeCacheItem(index, index === this.buffer.minIndex); - if (index === this.buffer.getAbsMinIndex()) { - this.buffer.incrementMinIndex(); - } else { - this.buffer.decrementMaxIndex(); + function persistDatasourceIndex(datasource, propName) { + var getter = void 0; + // need to postpone min/maxIndexUser processing if the view is empty + if (Number.isInteger(datasource[propName])) { + getter = datasource[propName]; + if (Number.isInteger(getter)) { + onRenderHandlers = onRenderHandlers.filter(function (handler) { + return handler.id !== propName; + }); + onRenderHandlers.push({ + id: propName, + run: function run() { + return datasource[propName] = getter; } - } + }); } + } } - }, { - key: 'applyUpdate', - value: function applyUpdate(wrapper, newItems) { - var _this3 = this; - if (!Array.isArray(newItems)) { - return; - } - var position = this.buffer.indexOf(wrapper); - if (!newItems.reverse().some(function (newItem) { - return newItem === wrapper.item; - })) { - wrapper.op = 'remove'; - if (position === 0 && !newItems.length) { - wrapper._op = 'isTop'; // to catch "first" edge case on remove - } + function defineDatasourceIndex(datasource, propName, propUserName) { + var descriptor = Object.getOwnPropertyDescriptor(datasource, propName); + if (descriptor && (descriptor.set || descriptor.get)) { + return; } - newItems.forEach(function (newItem) { - if (newItem === wrapper.item) { - position--; - } else { - // 3 parameter (isTop) is to catch "first" edge case on insert - _this3.buffer.insert(position + 1, newItem, position === -1); + var getter = void 0; + persistDatasourceIndex(datasource, propName); + Object.defineProperty(datasource, propName, { + set: function set(value) { + getter = value; + if (pending.length && !buffer.length) { + persistDatasourceIndex(datasource, propName); + return; + } + buffer[propUserName] = value; + var topPaddingHeightOld = viewport.topDataPos(); + viewport.adjustPaddings(); + if (propName === 'minIndex') { + viewport.onAfterMinIndexSet(topPaddingHeightOld); + } + }, + get: function get() { + return getter; } }); } - }, { - key: 'calculateProperties', - value: function calculateProperties() { - var rowTop = null, - topHeight = 0; - var topDone = false, - bottomDone = false; - var length = this.buffer.length; - for (var i = 0; i < length; i++) { - var item = this.buffer[i]; - var itemTop = item.element.offset().top; + defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser'); + defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser'); - if (rowTop !== itemTop) { - // a new row condition - var itemHeight = item.element.outerHeight(true); - var top = this.viewport.topDataPos() + topHeight + itemHeight; + var fetchNext = datasource.get.length !== 2 ? function (success) { + return datasource.get(buffer.next, bufferSize, success); + } : function (success) { + datasource.get({ + index: buffer.next, + append: buffer.length ? buffer[buffer.length - 1].item : void 0, + count: bufferSize + }, success); + }; - if (!topDone && top > this.viewport.topVisiblePos()) { - topDone = true; - this['topVisible'] = item.item; - this['topVisibleElement'] = item.element; - this['topVisibleScope'] = item.scope; + var fetchPrevious = datasource.get.length !== 2 ? function (success) { + return datasource.get(buffer.first - bufferSize, bufferSize, success); + } : function (success) { + datasource.get({ + index: buffer.first - bufferSize, + prepend: buffer.length ? buffer[0].item : void 0, + count: bufferSize + }, success); + }; + + var initialize = function initialize() { + var tryCount = 0; + if (!viewport.applyContainerStyle()) { + var timer = $interval(function () { + tryCount++; + if (viewport.applyContainerStyle()) { + $interval.cancel(timer); + doAdjust(); } - if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || i === length - 1 && this.isEOF())) { - bottomDone = true; - this['bottomVisible'] = item.item; - this['bottomVisibleElement'] = item.element; - this['bottomVisibleScope'] = item.scope; + if (tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) { + $interval.cancel(timer); + throw Error('ui-scroll directive requires a viewport with non-zero height in ' + MAX_VIEWPORT_DELAY + 'ms'); } - topHeight += itemHeight; - } - rowTop = itemTop; - - if (topDone && bottomDone) { - break; - } + }, VIEWPORT_POLLING_INTERVAL); + } else { + doAdjust(); } - } - }]); + }; - return Adapter; -}(); + /** + * Build padding elements + * + * Calling linker is the only way I found to get access to the tag name of the template + * to prevent the directive scope from pollution a new scope is created and destroyed + * right after the builder creation is completed + */ + linker(function (clone, scope) { + viewport.createPaddingElements(clone[0]); + // we do not include the clone in the DOM. It means that the nested directives will not + // be able to reach the parent directives, but in this case it is intentional because we + // created the clone to access the template tag name + scope.$destroy(); + clone.remove(); + }); -exports.default = Adapter; + $scope.$on('$destroy', function () { + unbindEvents(); + viewport.unbind('mousewheel', wheelHandler); + }); -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { + viewport.bind('mousewheel', wheelHandler); -"use strict"; + initialize(); + /* Private function definitions */ -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = ScrollBuffer; -function ScrollBuffer(elementRoutines, bufferSize, startIndex) { - var buffer = Object.create(Array.prototype); + function isInvalid(rid) { + return rid && rid !== ridActual || $scope.$$destroyed; + } - Object.assign(buffer, { - size: bufferSize, + function bindEvents() { + viewport.bind('resize', resizeAndScrollHandler); + viewport.bind('scroll', resizeAndScrollHandler); + } - reset: function reset(startIndex) { - buffer.remove(0, buffer.length); - buffer.eof = false; - buffer.bof = false; - buffer.first = startIndex; - buffer.next = startIndex; - buffer.minIndex = startIndex; - buffer.maxIndex = startIndex; - buffer.minIndexUser = null; - buffer.maxIndexUser = null; - }, - append: function append(items) { - items.forEach(function (item) { - ++buffer.next; - buffer.insert('append', item); - }); - buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex); - }, - prepend: function prepend(items) { - items.reverse().forEach(function (item) { - --buffer.first; - buffer.insert('prepend', item); - }); - buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex); - }, + function unbindEvents() { + viewport.unbind('resize', resizeAndScrollHandler); + viewport.unbind('scroll', resizeAndScrollHandler); + } + function reload() { + viewport.resetTopPadding(); + viewport.resetBottomPadding(); + if (arguments.length) { + startIndex = arguments[0]; + } + buffer.reset(startIndex); + persistDatasourceIndex(datasource, 'minIndex'); + persistDatasourceIndex(datasource, 'maxIndex'); + doAdjust(); + } - /** - * inserts wrapped element in the buffer - * the first argument is either operation keyword (see below) or a number for operation 'insert' - * for insert the number is the index for the buffer element the new one have to be inserted after - * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none' - */ - insert: function insert(operation, item, isTop) { - var wrapper = { - item: item - }; + function isElementVisible(wrapper) { + return wrapper.element.height() && wrapper.element[0].offsetParent; + } - if (operation % 1 === 0) { - // it is an insert - wrapper.op = 'insert'; - buffer.splice(operation, 0, wrapper); - if (isTop) { - buffer.first--; - } else { - buffer.next++; - } - } else { - wrapper.op = operation; - switch (operation) { - case 'append': - buffer.push(wrapper); - break; - case 'prepend': - buffer.unshift(wrapper); - break; + function visibilityWatcher(wrapper) { + if (isElementVisible(wrapper)) { + buffer.forEach(function (item) { + if (typeof item.unregisterVisibilityWatcher === 'function') { + item.unregisterVisibilityWatcher(); + delete item.unregisterVisibilityWatcher; + } + }); + if (!pending.length) { + $timeout(function () { + return doAdjust(); + }); } } - }, - + } - // removes elements from buffer - remove: function remove(arg1, arg2) { - if (Number.isInteger(arg1)) { - // removes items from arg1 (including) through arg2 (excluding) - for (var i = arg1; i < arg2; i++) { - elementRoutines.removeElement(buffer[i]); - } - return buffer.splice(arg1, arg2 - arg1); - } - // removes single item(wrapper) from the buffer - buffer.splice(buffer.indexOf(arg1), 1); - if (arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) { - this.incrementMinIndex(); - } else { - this.decrementMaxIndex(); - } - if (arg1._op === 'isTop') { - buffer.first++; - } else { - buffer.next--; - } - if (!buffer.length) { - buffer.first = 1; - buffer.next = 1; + function insertWrapperContent(wrapper, insertAfter) { + createElement(wrapper, insertAfter, viewport.insertElement); + if (!isElementVisible(wrapper)) { + wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(function () { + return visibilityWatcher(wrapper); + }); } + elementRoutines.hideElement(wrapper); // hide inserted elements before data binding + } - return elementRoutines.removeElementAnimated(arg1); - }, - incrementMinIndex: function incrementMinIndex() { - if (buffer.minIndexUser !== null) { - if (buffer.minIndex > buffer.minIndexUser) { - buffer.minIndexUser++; - return; - } - if (buffer.minIndex === buffer.minIndexUser) { - buffer.minIndexUser++; + function createElement(wrapper, insertAfter, insertElement) { + var promises = null; + var sibling = insertAfter > 0 ? buffer[insertAfter - 1].element : undefined; + linker(function (clone, scope) { + promises = insertElement(clone, sibling); + wrapper.element = clone; + wrapper.scope = scope; + scope[itemName] = wrapper.item; + }); + // ui-scroll-grid apply + if (adapter.transform) { + var tdInitializer = wrapper.scope.uiScrollTdInitializer; + if (tdInitializer && tdInitializer.linking) { + adapter.transform(wrapper.scope, wrapper.element); + } else { + wrapper.scope.uiScrollTdInitializer = { + onLink: function onLink() { + return adapter.transform(wrapper.scope, wrapper.element); + }, + scope: wrapper.scope + }; } } - buffer.minIndex++; - }, - decrementMaxIndex: function decrementMaxIndex() { - if (buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) { - buffer.maxIndexUser--; - } - buffer.maxIndex--; - }, - getAbsMinIndex: function getAbsMinIndex() { - if (buffer.minIndexUser !== null) { - return Math.min(buffer.minIndexUser, buffer.minIndex); - } - return buffer.minIndex; - }, - getAbsMaxIndex: function getAbsMaxIndex() { - if (buffer.maxIndexUser !== null) { - return Math.max(buffer.maxIndexUser, buffer.maxIndex); - } - return buffer.maxIndex; - }, - effectiveHeight: function effectiveHeight(elements) { - if (!elements.length) { - return 0; - } - var top = Number.MAX_VALUE; - var bottom = Number.NEGATIVE_INFINITY; - elements.forEach(function (wrapper) { - if (wrapper.element[0].offsetParent) { - // element style is not display:none - top = Math.min(top, wrapper.element.offset().top); - bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true)); - } - }); - return Math.max(0, bottom - top); + return promises; } - }); - - buffer.reset(startIndex); - - return buffer; -} -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { + function updateDOM() { + var promises = []; + var toBePrepended = []; + var toBeRemoved = []; + var inserted = []; -"use strict"; + buffer.forEach(function (wrapper, i) { + switch (wrapper.op) { + case 'prepend': + toBePrepended.unshift(wrapper); + break; + case 'append': + insertWrapperContent(wrapper, i); + wrapper.op = 'none'; + inserted.push(wrapper); + break; + case 'insert': + promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated)); + wrapper.op = 'none'; + inserted.push(wrapper); + break; + case 'remove': + toBeRemoved.push(wrapper); + } + }); + toBeRemoved.forEach(function (wrapper) { + return promises = promises.concat(viewport.removeItem(wrapper)); + }); -Object.defineProperty(exports, "__esModule", { - value: true -}); + if (toBePrepended.length) toBePrepended.forEach(function (wrapper) { + insertWrapperContent(wrapper); + wrapper.op = 'none'; + }); -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + buffer.forEach(function (item, i) { + return item.scope.$index = buffer.first + i; + }); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + return { + prepended: toBePrepended, + removed: toBeRemoved, + inserted: inserted, + animated: promises + }; + } -var hideClassToken = 'ng-ui-scroll-hide'; + function updatePaddings(rid, updates) { + // schedule another doAdjust after animation completion + if (updates.animated.length) { + $q.all(updates.animated).then(function () { + viewport.adjustPaddings(); + doAdjust(rid); + }); + } else { + viewport.adjustPaddings(); + } + } -function addCSSRule(sheet, selector, rules, index) { - if ('insertRule' in sheet) { - sheet.insertRule(selector + '{' + rules + '}', index); - } else if ('addRule' in sheet) { - sheet.addRule(selector, rules, index); - } -} + function enqueueFetch(rid, updates) { + if (viewport.shouldLoadBottom()) { + if (!updates || buffer.effectiveHeight(updates.inserted) > 0) { + // this means that at least one item appended in the last batch has height > 0 + if (pending.push(true) === 1) { + adapter.loading(true); + fetch(rid); + } + } + } else if (viewport.shouldLoadTop()) { + if (!updates || buffer.effectiveHeight(updates.prepended) > 0 || pending[0]) { + // this means that at least one item appended in the last batch has height > 0 + // pending[0] = true means that previous fetch was appending. We need to force at least one prepend + // BTW there will always be at least 1 element in the pending array because bottom is fetched first + if (pending.push(false) === 1) { + adapter.loading(true); + fetch(rid); + } + } + } + } -var ElementRoutines = function () { - function ElementRoutines($injector, $q) { - _classCallCheck(this, ElementRoutines); + function processUpdates() { + var updates = updateDOM(); - this.$animate = $injector.has && $injector.has('$animate') ? $injector.get('$animate') : null; - this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3; - this.$q = $q; - addCSSRule(document.styleSheets[0], '.' + hideClassToken, 'display: none'); - } + // We need the item bindings to be processed before we can do adjustments + !$scope.$$phase && !$rootScope.$$phase && $scope.$digest(); - _createClass(ElementRoutines, [{ - key: 'hideElement', - value: function hideElement(wrapper) { - wrapper.element.addClass(hideClassToken); - } - }, { - key: 'showElement', - value: function showElement(wrapper) { - wrapper.element.removeClass(hideClassToken); - } - }, { - key: 'insertElement', - value: function insertElement(newElement, previousElement) { - previousElement.after(newElement); - return []; - } - }, { - key: 'removeElement', - value: function removeElement(wrapper) { - wrapper.element.remove(); - wrapper.scope.$destroy(); - return []; + updates.inserted.forEach(function (w) { + return elementRoutines.showElement(w); + }); + updates.prepended.forEach(function (w) { + return elementRoutines.showElement(w); + }); + return updates; } - }, { - key: 'insertElementAnimated', - value: function insertElementAnimated(newElement, previousElement) { - if (!this.$animate) { - return this.insertElement(newElement, previousElement); + + function doAdjust(rid) { + if (!rid) { + // dismiss pending requests + pending = []; + rid = ++ridActual; } - if (this.isAngularVersionLessThen1_3) { - var deferred = this.$q.defer(); - // no need for parent - previous element is never null - this.$animate.enter(newElement, null, previousElement, function () { - return deferred.resolve(); - }); + var updates = processUpdates(); - return [deferred.promise]; + if (isInvalid(rid)) { + return; } - // no need for parent - previous element is never null - return [this.$animate.enter(newElement, null, previousElement)]; - } - }, { - key: 'removeElementAnimated', - value: function removeElementAnimated(wrapper) { - if (!this.$animate) { - return this.removeElement(wrapper); + updatePaddings(rid, updates); + enqueueFetch(rid); + + if (!pending.length) { + adapter.calculateProperties(); } + } - if (this.isAngularVersionLessThen1_3) { - var deferred = this.$q.defer(); - this.$animate.leave(wrapper.element, function () { - wrapper.scope.$destroy(); - return deferred.resolve(); - }); + function doAdjustAfterFetch(rid) { + var updates = processUpdates(); - return [deferred.promise]; + viewport.onAfterPrepend(updates); + + if (isInvalid(rid)) { + return; } - return [this.$animate.leave(wrapper.element).then(function () { - return wrapper.scope.$destroy(); - })]; + updatePaddings(rid, updates); + onRenderHandlersRunner(); + enqueueFetch(rid, updates); + pending.shift(); + + if (pending.length) fetch(rid);else { + adapter.loading(false); + bindEvents(); + adapter.calculateProperties(); + } } - }]); - return ElementRoutines; -}(); + function fetch(rid) { + if (pending[0]) { + // scrolling down + if (buffer.length && !viewport.shouldLoadBottom()) { + doAdjustAfterFetch(rid); + } else { + fetchNext(function (result) { + if (isInvalid(rid)) { + return; + } -exports.default = ElementRoutines; + if (result.length < bufferSize) { + buffer.eof = true; + } + + if (result.length > 0) { + viewport.clipTop(); + buffer.append(result); + } + + doAdjustAfterFetch(rid); + }); + } + } else { + // scrolling up + if (buffer.length && !viewport.shouldLoadTop()) { + doAdjustAfterFetch(rid); + } else { + fetchPrevious(function (result) { + if (isInvalid(rid)) { + return; + } + + if (result.length < bufferSize) { + buffer.bof = true; + // log 'bof is reached' + } + + if (result.length > 0) { + if (buffer.length) { + viewport.clipBottom(); + } + buffer.prepend(result); + } + + doAdjustAfterFetch(rid); + }); + } + } + } + + function resizeAndScrollHandler() { + if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) { + + enqueueFetch(ridActual); + + if (pending.length) { + unbindEvents(); + } else { + adapter.calculateProperties(); + !$scope.$$phase && $scope.$digest(); + } + } + } + + function wheelHandler(event) { + if (!adapter.disabled) { + var scrollTop = viewport[0].scrollTop; + var yMax = viewport[0].scrollHeight - viewport[0].clientHeight; + + if (scrollTop === 0 && !buffer.bof || scrollTop === yMax && !buffer.eof) { + event.preventDefault(); + } + } + } + } +}]); /***/ }), -/* 3 */ +/* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -908,7 +918,7 @@ var JQLiteExtras = function () { exports.default = JQLiteExtras; /***/ }), -/* 4 */ +/* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -917,214 +927,262 @@ exports.default = JQLiteExtras; Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Viewport; -var _padding = __webpack_require__(5); +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); -var _padding2 = _interopRequireDefault(_padding); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var hideClassToken = 'ng-ui-scroll-hide'; -function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) { - var topPadding = null; - var bottomPadding = null; - var viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window); - var container = viewportController && viewportController.container ? viewportController.container : undefined; - var scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope; +function addCSSRule(sheet, selector, rules, index) { + if ('insertRule' in sheet) { + sheet.insertRule(selector + '{' + rules + '}', index); + } else if ('addRule' in sheet) { + sheet.addRule(selector, rules, index); + } +} - viewport.css({ - 'overflow-anchor': 'none', - 'overflow-y': 'auto', - 'display': 'block' - }); +var ElementRoutines = function () { + function ElementRoutines($injector, $q) { + _classCallCheck(this, ElementRoutines); - function bufferPadding() { - return viewport.outerHeight() * padding; // some extra space to initiate preload + this.$animate = $injector.has && $injector.has('$animate') ? $injector.get('$animate') : null; + this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3; + this.$q = $q; + addCSSRule(document.styleSheets[0], '.' + hideClassToken, 'display: none'); } - Object.assign(viewport, { - getScope: function getScope() { - return scope; - }, - createPaddingElements: function createPaddingElements(template) { - topPadding = new _padding2.default(template); - bottomPadding = new _padding2.default(template); - element.before(topPadding.element); - element.after(bottomPadding.element); - topPadding.height(0); - bottomPadding.height(0); - }, - applyContainerStyle: function applyContainerStyle() { - if (!container) { - return true; - } - if (container !== viewport) { - viewport.css('height', window.getComputedStyle(container[0]).height); + _createClass(ElementRoutines, [{ + key: 'hideElement', + value: function hideElement(wrapper) { + wrapper.element.addClass(hideClassToken); + } + }, { + key: 'showElement', + value: function showElement(wrapper) { + wrapper.element.removeClass(hideClassToken); + } + }, { + key: 'insertElement', + value: function insertElement(newElement, previousElement) { + previousElement.after(newElement); + return []; + } + }, { + key: 'removeElement', + value: function removeElement(wrapper) { + wrapper.element.remove(); + wrapper.scope.$destroy(); + return []; + } + }, { + key: 'insertElementAnimated', + value: function insertElementAnimated(newElement, previousElement) { + if (!this.$animate) { + return this.insertElement(newElement, previousElement); } - return viewport.height() > 0; - }, - bottomDataPos: function bottomDataPos() { - var scrollHeight = viewport[0].scrollHeight; - scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight; - return scrollHeight - bottomPadding.height(); - }, - topDataPos: function topDataPos() { - return topPadding.height(); - }, - bottomVisiblePos: function bottomVisiblePos() { - return viewport.scrollTop() + viewport.outerHeight(); - }, - topVisiblePos: function topVisiblePos() { - return viewport.scrollTop(); - }, - insertElement: function insertElement(e, sibling) { - return elementRoutines.insertElement(e, sibling || topPadding.element); - }, - insertElementAnimated: function insertElementAnimated(e, sibling) { - return elementRoutines.insertElementAnimated(e, sibling || topPadding.element); - }, - shouldLoadBottom: function shouldLoadBottom() { - return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding(); - }, - clipBottom: function clipBottom() { - // clip the invisible items off the bottom - var overage = 0; - var overageHeight = 0; - var itemHeight = 0; - var emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding(); - for (var i = buffer.length - 1; i >= 0; i--) { - itemHeight = buffer[i].element.outerHeight(true); - if (overageHeight + itemHeight > emptySpaceHeight) { - break; - } - bottomPadding.cache.add(buffer[i]); - overageHeight += itemHeight; - overage++; + if (this.isAngularVersionLessThen1_3) { + var deferred = this.$q.defer(); + // no need for parent - previous element is never null + this.$animate.enter(newElement, null, previousElement, function () { + return deferred.resolve(); + }); + + return [deferred.promise]; } - if (overage > 0) { - buffer.eof = false; - buffer.remove(buffer.length - overage, buffer.length); - buffer.next -= overage; - viewport.adjustPaddings(); + // no need for parent - previous element is never null + return [this.$animate.enter(newElement, null, previousElement)]; + } + }, { + key: 'removeElementAnimated', + value: function removeElementAnimated(wrapper) { + if (!this.$animate) { + return this.removeElement(wrapper); } - }, - shouldLoadTop: function shouldLoadTop() { - return !buffer.bof && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding(); - }, - clipTop: function clipTop() { - // clip the invisible items off the top - var overage = 0; - var overageHeight = 0; - var itemHeight = 0; - var emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding(); - for (var i = 0; i < buffer.length; i++) { - itemHeight = buffer[i].element.outerHeight(true); - if (overageHeight + itemHeight > emptySpaceHeight) { - break; - } - topPadding.cache.add(buffer[i]); - overageHeight += itemHeight; - overage++; - } + if (this.isAngularVersionLessThen1_3) { + var deferred = this.$q.defer(); + this.$animate.leave(wrapper.element, function () { + wrapper.scope.$destroy(); + return deferred.resolve(); + }); - if (overage > 0) { - // we need to adjust top padding element before items are removed from top - // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom - topPadding.height(topPadding.height() + overageHeight); - buffer.bof = false; - buffer.remove(0, overage); - buffer.first += overage; - } - }, - adjustPaddings: function adjustPaddings() { - if (!buffer.length) { - return; + return [deferred.promise]; } - // precise heights calculation based on items that are in buffer or that were in buffer once - var visibleItemsHeight = buffer.reduce(function (summ, item) { - return summ + item.element.outerHeight(true); - }, 0); + return [this.$animate.leave(wrapper.element).then(function () { + return wrapper.scope.$destroy(); + })]; + } + }]); - var topPaddingHeight = 0, - topCount = 0; - topPadding.cache.forEach(function (item) { - if (item.index < buffer.first) { - topPaddingHeight += item.height; - topCount++; - } - }); + return ElementRoutines; +}(); - var bottomPaddingHeight = 0, - bottomCount = 0; - bottomPadding.cache.forEach(function (item) { - if (item.index >= buffer.next) { - bottomPaddingHeight += item.height; - bottomCount++; - } - }); +exports.default = ElementRoutines; - var totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight; - var averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length); +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { - // average heights calculation, items that have never been reached - var adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser; - var adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser; - var topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0; - var bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0; +"use strict"; - // paddings combine adjustment - topPadding.height(topPaddingHeight + topPaddingHeightAdd); - bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd); + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = ScrollBuffer; +function ScrollBuffer(elementRoutines, bufferSize, startIndex) { + var buffer = Object.create(Array.prototype); + + Object.assign(buffer, { + size: bufferSize, + + reset: function reset(startIndex) { + buffer.remove(0, buffer.length); + buffer.eof = false; + buffer.bof = false; + buffer.first = startIndex; + buffer.next = startIndex; + buffer.minIndex = startIndex; + buffer.maxIndex = startIndex; + buffer.minIndexUser = null; + buffer.maxIndexUser = null; }, - onAfterMinIndexSet: function onAfterMinIndexSet(topPaddingHeightOld) { - // additional scrollTop adjustment in case of datasource.minIndex external set - if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) { - var diff = topPadding.height() - topPaddingHeightOld; - viewport.scrollTop(viewport.scrollTop() + diff); - while ((diff -= viewport.scrollTop()) > 0) { - bottomPadding.height(bottomPadding.height() + diff); - viewport.scrollTop(viewport.scrollTop() + diff); + append: function append(items) { + items.forEach(function (item) { + ++buffer.next; + buffer.insert('append', item); + }); + buffer.maxIndex = buffer.eof ? buffer.next - 1 : Math.max(buffer.next - 1, buffer.maxIndex); + }, + prepend: function prepend(items) { + items.reverse().forEach(function (item) { + --buffer.first; + buffer.insert('prepend', item); + }); + buffer.minIndex = buffer.bof ? buffer.minIndex = buffer.first : Math.min(buffer.first, buffer.minIndex); + }, + + + /** + * inserts wrapped element in the buffer + * the first argument is either operation keyword (see below) or a number for operation 'insert' + * for insert the number is the index for the buffer element the new one have to be inserted after + * operations: 'append', 'prepend', 'insert', 'remove', 'update', 'none' + */ + insert: function insert(operation, item, isTop) { + var wrapper = { + item: item + }; + + if (operation % 1 === 0) { + // it is an insert + wrapper.op = 'insert'; + buffer.splice(operation, 0, wrapper); + if (isTop) { + buffer.first--; + } else { + buffer.next++; + } + } else { + wrapper.op = operation; + switch (operation) { + case 'append': + buffer.push(wrapper); + break; + case 'prepend': + buffer.unshift(wrapper); + break; } } }, - onAfterPrepend: function onAfterPrepend(updates) { - if (!updates.prepended.length) return; - var height = buffer.effectiveHeight(updates.prepended); - var paddingHeight = topPadding.height() - height; - if (paddingHeight >= 0) { - topPadding.height(paddingHeight); + + + // removes elements from buffer + remove: function remove(arg1, arg2) { + if (Number.isInteger(arg1)) { + // removes items from arg1 (including) through arg2 (excluding) + for (var i = arg1; i < arg2; i++) { + elementRoutines.removeElement(buffer[i]); + } + return buffer.splice(arg1, arg2 - arg1); + } + // removes single item(wrapper) from the buffer + buffer.splice(buffer.indexOf(arg1), 1); + if (arg1._op === 'isTop' && buffer.first === this.getAbsMinIndex()) { + this.incrementMinIndex(); } else { - topPadding.height(0); - viewport.scrollTop(viewport.scrollTop() - paddingHeight); + this.decrementMaxIndex(); + } + if (arg1._op === 'isTop') { + buffer.first++; + } else { + buffer.next--; + } + if (!buffer.length) { + buffer.first = 1; + buffer.next = 1; } + + return elementRoutines.removeElementAnimated(arg1); }, - resetTopPadding: function resetTopPadding() { - topPadding.height(0); - topPadding.cache.clear(); + incrementMinIndex: function incrementMinIndex() { + if (buffer.minIndexUser !== null) { + if (buffer.minIndex > buffer.minIndexUser) { + buffer.minIndexUser++; + return; + } + if (buffer.minIndex === buffer.minIndexUser) { + buffer.minIndexUser++; + } + } + buffer.minIndex++; }, - resetBottomPadding: function resetBottomPadding() { - bottomPadding.height(0); - bottomPadding.cache.clear(); + decrementMaxIndex: function decrementMaxIndex() { + if (buffer.maxIndexUser !== null && buffer.maxIndex <= buffer.maxIndexUser) { + buffer.maxIndexUser--; + } + buffer.maxIndex--; }, - removeCacheItem: function removeCacheItem(item, isTop) { - topPadding.cache.remove(item, isTop); - bottomPadding.cache.remove(item, isTop); + getAbsMinIndex: function getAbsMinIndex() { + if (buffer.minIndexUser !== null) { + return Math.min(buffer.minIndexUser, buffer.minIndex); + } + return buffer.minIndex; }, - removeItem: function removeItem(item) { - this.removeCacheItem(item); - return buffer.remove(item); + getAbsMaxIndex: function getAbsMaxIndex() { + if (buffer.maxIndexUser !== null) { + return Math.max(buffer.maxIndexUser, buffer.maxIndex); + } + return buffer.maxIndex; + }, + effectiveHeight: function effectiveHeight(elements) { + if (!elements.length) { + return 0; + } + var top = Number.MAX_VALUE; + var bottom = Number.NEGATIVE_INFINITY; + elements.forEach(function (wrapper) { + if (wrapper.element[0].offsetParent) { + // element style is not display:none + top = Math.min(top, wrapper.element.offset().top); + bottom = Math.max(bottom, wrapper.element.offset().top + wrapper.element.outerHeight(true)); + } + }); + return Math.max(0, bottom - top); } }); - return viewport; + buffer.reset(startIndex); + + return buffer; } /***/ }), -/* 5 */ +/* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1133,648 +1191,586 @@ function Viewport(elementRoutines, buffer, element, viewportController, $rootSco Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = Viewport; -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); +var _padding = __webpack_require__(5); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +var _padding2 = _interopRequireDefault(_padding); -// Can't just extend the Array, due to Babel does not support built-in classes extending -// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile -var CacheProto = function () { - function CacheProto() { - _classCallCheck(this, CacheProto); - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - _createClass(CacheProto, [{ - key: 'add', - value: function add(item) { - for (var i = this.length - 1; i >= 0; i--) { - if (this[i].index === item.scope.$index) { - this[i].height = item.element.outerHeight(); - return; - } - } - this.push({ - index: item.scope.$index, - height: item.element.outerHeight() - }); - this.sort(function (a, b) { - return a.index < b.index ? -1 : a.index > b.index ? 1 : 0; - }); - } - }, { - key: 'remove', - value: function remove(argument, _isTop) { - var index = argument % 1 === 0 ? argument : argument.scope.$index; - var isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop'; - for (var i = this.length - 1; i >= 0; i--) { - if (this[i].index === index) { - this.splice(i, 1); - break; - } - } - if (!isTop) { - for (var _i = this.length - 1; _i >= 0; _i--) { - if (this[_i].index > index) { - this[_i].index--; - } - } - } - } - }, { - key: 'clear', - value: function clear() { - this.length = 0; - } - }]); - - return CacheProto; -}(); - -function Cache() { - var instance = []; - instance.push.apply(instance, arguments); - Object.setPrototypeOf(instance, Cache.prototype); - return instance; -} -Cache.prototype = Object.create(Array.prototype); -Object.getOwnPropertyNames(CacheProto.prototype).forEach(function (methodName) { - return Cache.prototype[methodName] = CacheProto.prototype[methodName]; -}); - -function generateElement(template) { - if (template.nodeType !== Node.ELEMENT_NODE) { - throw new Error('ui-scroll directive requires an Element node for templating the view'); - } - var element = void 0; - switch (template.tagName.toLowerCase()) { - case 'dl': - throw new Error('ui-scroll directive does not support <' + template.tagName + '> as a repeating tag: ' + template.outerHTML); - case 'tr': - var table = angular.element('
'); - element = table.find('tr'); - break; - case 'li': - element = angular.element('
  • '); - break; - default: - element = angular.element('
    '); - } - return element; -} +function Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding) { + var topPadding = null; + var bottomPadding = null; + var viewport = viewportController && viewportController.viewport ? viewportController.viewport : angular.element(window); + var container = viewportController && viewportController.container ? viewportController.container : undefined; + var scope = viewportController && viewportController.scope ? viewportController.scope : $rootScope; -var Padding = function () { - function Padding(template) { - _classCallCheck(this, Padding); + viewport.css({ + 'overflow-anchor': 'none', + 'overflow-y': 'auto', + 'display': 'block' + }); - this.element = generateElement(template); - this.cache = new Cache(); + function bufferPadding() { + return viewport.outerHeight() * padding; // some extra space to initiate preload } - _createClass(Padding, [{ - key: 'height', - value: function height() { - return this.element.height.apply(this.element, arguments); - } - }]); - - return Padding; -}(); - -exports.default = Padding; - -/***/ }), -/* 6 */, -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _jqLiteExtras = __webpack_require__(3); - -var _jqLiteExtras2 = _interopRequireDefault(_jqLiteExtras); - -var _elementRoutines = __webpack_require__(2); - -var _elementRoutines2 = _interopRequireDefault(_elementRoutines); - -var _buffer = __webpack_require__(1); - -var _buffer2 = _interopRequireDefault(_buffer); - -var _viewport = __webpack_require__(4); - -var _viewport2 = _interopRequireDefault(_viewport); - -var _adapter = __webpack_require__(0); - -var _adapter2 = _interopRequireDefault(_adapter); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -angular.module('ui.scroll', []).service('jqLiteExtras', function () { - return new _jqLiteExtras2.default(); -}).run(['jqLiteExtras', function (jqLiteExtras) { - return !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null; -}]).directive('uiScrollViewport', function () { - return { - restrict: 'A', - controller: ['$scope', '$element', function (scope, element) { - var _this = this; - - this.container = element; - this.viewport = element; - this.scope = scope; - - angular.forEach(element.children(), function (child) { - if (child.tagName.toLowerCase() === 'tbody') { - _this.viewport = angular.element(child); - } - }); - - return this; - }] - }; -}).directive('uiScroll', ['$log', '$injector', '$rootScope', '$timeout', '$interval', '$q', '$parse', function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) { - - return { - require: ['?^uiScrollViewport'], - restrict: 'A', - transclude: 'element', - priority: 1000, - terminal: true, - link: link - }; - - function link($scope, element, $attr, controllers, linker) { - var match = $attr.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/); - if (!match) { - throw new Error('Expected uiScroll in form of \'_item_ in _datasource_\' but got \'' + $attr.uiScroll + '\''); - } - - function parseNumericAttr(value, defaultValue) { - var result = $parse(value)($scope); - return isNaN(result) ? defaultValue : result; - } - - var BUFFER_MIN = 3; - var BUFFER_DEFAULT = 10; - var PADDING_MIN = 0.3; - var PADDING_DEFAULT = 0.5; - var MAX_VIEWPORT_DELAY = 500; - var VIEWPORT_POLLING_INTERVAL = 50; - - var datasource = null; - var itemName = match[1]; - var datasourceName = match[2]; - var viewportController = controllers[0]; - var bufferSize = Math.max(BUFFER_MIN, parseNumericAttr($attr.bufferSize, BUFFER_DEFAULT)); - var padding = Math.max(PADDING_MIN, parseNumericAttr($attr.padding, PADDING_DEFAULT)); - var startIndex = parseNumericAttr($attr.startIndex, 1); - var ridActual = 0; // current data revision id - var pending = []; - - var elementRoutines = new _elementRoutines2.default($injector, $q); - var buffer = new _buffer2.default(elementRoutines, bufferSize, startIndex); - var viewport = new _viewport2.default(elementRoutines, buffer, element, viewportController, $rootScope, padding); - var adapter = new _adapter2.default($scope, $parse, $attr, viewport, buffer, doAdjust, reload); - - if (viewportController) { - viewportController.adapter = adapter; - } - - var isDatasourceValid = function isDatasourceValid() { - return Object.prototype.toString.call(datasource) === '[object Object]' && typeof datasource.get === 'function'; - }; - - datasource = $parse(datasourceName)($scope); // try to get datasource on scope - if (!isDatasourceValid()) { - datasource = $injector.get(datasourceName); // try to inject datasource as service - if (!isDatasourceValid()) { - throw new Error(datasourceName + ' is not a valid datasource'); + Object.assign(viewport, { + getScope: function getScope() { + return scope; + }, + createPaddingElements: function createPaddingElements(template) { + topPadding = new _padding2.default(template); + bottomPadding = new _padding2.default(template); + element.before(topPadding.element); + element.after(bottomPadding.element); + topPadding.height(0); + bottomPadding.height(0); + }, + applyContainerStyle: function applyContainerStyle() { + if (!container) { + return true; } - } - - var onRenderHandlers = []; - function onRenderHandlersRunner() { - onRenderHandlers.forEach(function (handler) { - return handler.run(); - }); - onRenderHandlers = []; - } - function persistDatasourceIndex(datasource, propName) { - var getter = void 0; - // need to postpone min/maxIndexUser processing if the view is empty - if (Number.isInteger(datasource[propName])) { - getter = datasource[propName]; - if (Number.isInteger(getter)) { - onRenderHandlers = onRenderHandlers.filter(function (handler) { - return handler.id !== propName; - }); - onRenderHandlers.push({ - id: propName, - run: function run() { - return datasource[propName] = getter; - } - }); + if (container !== viewport) { + viewport.css('height', window.getComputedStyle(container[0]).height); + } + return viewport.height() > 0; + }, + bottomDataPos: function bottomDataPos() { + var scrollHeight = viewport[0].scrollHeight; + scrollHeight = scrollHeight != null ? scrollHeight : viewport[0].document.documentElement.scrollHeight; + return scrollHeight - bottomPadding.height(); + }, + topDataPos: function topDataPos() { + return topPadding.height(); + }, + bottomVisiblePos: function bottomVisiblePos() { + return viewport.scrollTop() + viewport.outerHeight(); + }, + topVisiblePos: function topVisiblePos() { + return viewport.scrollTop(); + }, + insertElement: function insertElement(e, sibling) { + return elementRoutines.insertElement(e, sibling || topPadding.element); + }, + insertElementAnimated: function insertElementAnimated(e, sibling) { + return elementRoutines.insertElementAnimated(e, sibling || topPadding.element); + }, + shouldLoadBottom: function shouldLoadBottom() { + return !buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding(); + }, + clipBottom: function clipBottom() { + // clip the invisible items off the bottom + var overage = 0; + var overageHeight = 0; + var itemHeight = 0; + var emptySpaceHeight = viewport.bottomDataPos() - viewport.bottomVisiblePos() - bufferPadding(); + + for (var i = buffer.length - 1; i >= 0; i--) { + itemHeight = buffer[i].element.outerHeight(true); + if (overageHeight + itemHeight > emptySpaceHeight) { + break; } + bottomPadding.cache.add(buffer[i]); + overageHeight += itemHeight; + overage++; } - } - function defineDatasourceIndex(datasource, propName, propUserName) { - var descriptor = Object.getOwnPropertyDescriptor(datasource, propName); - if (descriptor && (descriptor.set || descriptor.get)) { - return; + if (overage > 0) { + buffer.eof = false; + buffer.remove(buffer.length - overage, buffer.length); + buffer.next -= overage; + viewport.adjustPaddings(); } - var getter = void 0; - persistDatasourceIndex(datasource, propName); - Object.defineProperty(datasource, propName, { - set: function set(value) { - getter = value; - if (pending.length && !buffer.length) { - persistDatasourceIndex(datasource, propName); - return; - } - buffer[propUserName] = value; - var topPaddingHeightOld = viewport.topDataPos(); - viewport.adjustPaddings(); - if (propName === 'minIndex') { - viewport.onAfterMinIndexSet(topPaddingHeightOld); - } - }, - get: function get() { - return getter; - } - }); - } - - defineDatasourceIndex(datasource, 'minIndex', 'minIndexUser'); - defineDatasourceIndex(datasource, 'maxIndex', 'maxIndexUser'); - - var fetchNext = datasource.get.length !== 2 ? function (success) { - return datasource.get(buffer.next, bufferSize, success); - } : function (success) { - datasource.get({ - index: buffer.next, - append: buffer.length ? buffer[buffer.length - 1].item : void 0, - count: bufferSize - }, success); - }; - - var fetchPrevious = datasource.get.length !== 2 ? function (success) { - return datasource.get(buffer.first - bufferSize, bufferSize, success); - } : function (success) { - datasource.get({ - index: buffer.first - bufferSize, - prepend: buffer.length ? buffer[0].item : void 0, - count: bufferSize - }, success); - }; + }, + shouldLoadTop: function shouldLoadTop() { + return !buffer.bof && viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding(); + }, + clipTop: function clipTop() { + // clip the invisible items off the top + var overage = 0; + var overageHeight = 0; + var itemHeight = 0; + var emptySpaceHeight = viewport.topVisiblePos() - viewport.topDataPos() - bufferPadding(); - var initialize = function initialize() { - var tryCount = 0; - if (!viewport.applyContainerStyle()) { - var timer = $interval(function () { - tryCount++; - if (viewport.applyContainerStyle()) { - $interval.cancel(timer); - doAdjust(); - } - if (tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) { - $interval.cancel(timer); - throw Error('ui-scroll directive requires a viewport with non-zero height in ' + MAX_VIEWPORT_DELAY + 'ms'); - } - }, VIEWPORT_POLLING_INTERVAL); - } else { - doAdjust(); + for (var i = 0; i < buffer.length; i++) { + itemHeight = buffer[i].element.outerHeight(true); + if (overageHeight + itemHeight > emptySpaceHeight) { + break; + } + topPadding.cache.add(buffer[i]); + overageHeight += itemHeight; + overage++; } - }; - - /** - * Build padding elements - * - * Calling linker is the only way I found to get access to the tag name of the template - * to prevent the directive scope from pollution a new scope is created and destroyed - * right after the builder creation is completed - */ - linker(function (clone, scope) { - viewport.createPaddingElements(clone[0]); - // we do not include the clone in the DOM. It means that the nested directives will not - // be able to reach the parent directives, but in this case it is intentional because we - // created the clone to access the template tag name - scope.$destroy(); - clone.remove(); - }); - - $scope.$on('$destroy', function () { - unbindEvents(); - viewport.unbind('mousewheel', wheelHandler); - }); - - viewport.bind('mousewheel', wheelHandler); - - initialize(); - /* Private function definitions */ + if (overage > 0) { + // we need to adjust top padding element before items are removed from top + // to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom + topPadding.height(topPadding.height() + overageHeight); + buffer.bof = false; + buffer.remove(0, overage); + buffer.first += overage; + } + }, + adjustPaddings: function adjustPaddings() { + if (!buffer.length) { + return; + } - function isInvalid(rid) { - return rid && rid !== ridActual || $scope.$$destroyed; - } + // precise heights calculation based on items that are in buffer or that were in buffer once + var visibleItemsHeight = buffer.reduce(function (summ, item) { + return summ + item.element.outerHeight(true); + }, 0); - function bindEvents() { - viewport.bind('resize', resizeAndScrollHandler); - viewport.bind('scroll', resizeAndScrollHandler); - } + var topPaddingHeight = 0, + topCount = 0; + topPadding.cache.forEach(function (item) { + if (item.index < buffer.first) { + topPaddingHeight += item.height; + topCount++; + } + }); - function unbindEvents() { - viewport.unbind('resize', resizeAndScrollHandler); - viewport.unbind('scroll', resizeAndScrollHandler); - } + var bottomPaddingHeight = 0, + bottomCount = 0; + bottomPadding.cache.forEach(function (item) { + if (item.index >= buffer.next) { + bottomPaddingHeight += item.height; + bottomCount++; + } + }); - function reload() { - viewport.resetTopPadding(); - viewport.resetBottomPadding(); - if (arguments.length) { - startIndex = arguments[0]; - } - buffer.reset(startIndex); - persistDatasourceIndex(datasource, 'minIndex'); - persistDatasourceIndex(datasource, 'maxIndex'); - doAdjust(); - } + var totalHeight = visibleItemsHeight + topPaddingHeight + bottomPaddingHeight; + var averageItemHeight = totalHeight / (topCount + bottomCount + buffer.length); - function isElementVisible(wrapper) { - return wrapper.element.height() && wrapper.element[0].offsetParent; - } + // average heights calculation, items that have never been reached + var adjustTopPadding = buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser; + var adjustBottomPadding = buffer.maxIndexUser !== null && buffer.maxIndex < buffer.maxIndexUser; + var topPaddingHeightAdd = adjustTopPadding ? (buffer.minIndex - buffer.minIndexUser) * averageItemHeight : 0; + var bottomPaddingHeightAdd = adjustBottomPadding ? (buffer.maxIndexUser - buffer.maxIndex) * averageItemHeight : 0; - function visibilityWatcher(wrapper) { - if (isElementVisible(wrapper)) { - buffer.forEach(function (item) { - if (typeof item.unregisterVisibilityWatcher === 'function') { - item.unregisterVisibilityWatcher(); - delete item.unregisterVisibilityWatcher; - } - }); - if (!pending.length) { - $timeout(function () { - return doAdjust(); - }); + // paddings combine adjustment + topPadding.height(topPaddingHeight + topPaddingHeightAdd); + bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd); + }, + onAfterMinIndexSet: function onAfterMinIndexSet(topPaddingHeightOld) { + // additional scrollTop adjustment in case of datasource.minIndex external set + if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) { + var diff = topPadding.height() - topPaddingHeightOld; + viewport.scrollTop(viewport.scrollTop() + diff); + while ((diff -= viewport.scrollTop()) > 0) { + bottomPadding.height(bottomPadding.height() + diff); + viewport.scrollTop(viewport.scrollTop() + diff); } } - } - - function insertWrapperContent(wrapper, insertAfter) { - createElement(wrapper, insertAfter, viewport.insertElement); - if (!isElementVisible(wrapper)) { - wrapper.unregisterVisibilityWatcher = wrapper.scope.$watch(function () { - return visibilityWatcher(wrapper); - }); - } - elementRoutines.hideElement(wrapper); // hide inserted elements before data binding - } - - function createElement(wrapper, insertAfter, insertElement) { - var promises = null; - var sibling = insertAfter > 0 ? buffer[insertAfter - 1].element : undefined; - linker(function (clone, scope) { - promises = insertElement(clone, sibling); - wrapper.element = clone; - wrapper.scope = scope; - scope[itemName] = wrapper.item; - }); - // ui-scroll-grid apply - if (adapter.transform) { - var tdInitializer = wrapper.scope.uiScrollTdInitializer; - if (tdInitializer && tdInitializer.linking) { - adapter.transform(wrapper.scope, wrapper.element); - } else { - wrapper.scope.uiScrollTdInitializer = { - onLink: function onLink() { - return adapter.transform(wrapper.scope, wrapper.element); - }, - scope: wrapper.scope - }; - } + }, + onAfterPrepend: function onAfterPrepend(updates) { + if (!updates.prepended.length) return; + var height = buffer.effectiveHeight(updates.prepended); + var paddingHeight = topPadding.height() - height; + if (paddingHeight >= 0) { + topPadding.height(paddingHeight); + } else { + topPadding.height(0); + viewport.scrollTop(viewport.scrollTop() - paddingHeight); } - return promises; + }, + resetTopPadding: function resetTopPadding() { + topPadding.height(0); + topPadding.cache.clear(); + }, + resetBottomPadding: function resetBottomPadding() { + bottomPadding.height(0); + bottomPadding.cache.clear(); + }, + removeCacheItem: function removeCacheItem(item, isTop) { + topPadding.cache.remove(item, isTop); + bottomPadding.cache.remove(item, isTop); + }, + removeItem: function removeItem(item) { + this.removeCacheItem(item); + return buffer.remove(item); } + }); - function updateDOM() { - var promises = []; - var toBePrepended = []; - var toBeRemoved = []; - var inserted = []; + return viewport; +} - buffer.forEach(function (wrapper, i) { - switch (wrapper.op) { - case 'prepend': - toBePrepended.unshift(wrapper); - break; - case 'append': - insertWrapperContent(wrapper, i); - wrapper.op = 'none'; - inserted.push(wrapper); - break; - case 'insert': - promises = promises.concat(createElement(wrapper, i, viewport.insertElementAnimated)); - wrapper.op = 'none'; - inserted.push(wrapper); - break; - case 'remove': - toBeRemoved.push(wrapper); - } - }); +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { - toBeRemoved.forEach(function (wrapper) { - return promises = promises.concat(viewport.removeItem(wrapper)); - }); +"use strict"; - if (toBePrepended.length) toBePrepended.forEach(function (wrapper) { - insertWrapperContent(wrapper); - wrapper.op = 'none'; - }); - buffer.forEach(function (item, i) { - return item.scope.$index = buffer.first + i; - }); +Object.defineProperty(exports, "__esModule", { + value: true +}); - return { - prepended: toBePrepended, - removed: toBeRemoved, - inserted: inserted, - animated: promises - }; - } +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - function updatePaddings(rid, updates) { - // schedule another doAdjust after animation completion - if (updates.animated.length) { - $q.all(updates.animated).then(function () { - viewport.adjustPaddings(); - doAdjust(rid); - }); - } else { - viewport.adjustPaddings(); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +// Can't just extend the Array, due to Babel does not support built-in classes extending +// This solution was taken from https://stackoverflow.com/questions/46897414/es6-class-extends-array-workaround-for-es5-babel-transpile +var CacheProto = function () { + function CacheProto() { + _classCallCheck(this, CacheProto); + } + + _createClass(CacheProto, [{ + key: 'add', + value: function add(item) { + for (var i = this.length - 1; i >= 0; i--) { + if (this[i].index === item.scope.$index) { + this[i].height = item.element.outerHeight(); + return; + } } + this.push({ + index: item.scope.$index, + height: item.element.outerHeight() + }); + this.sort(function (a, b) { + return a.index < b.index ? -1 : a.index > b.index ? 1 : 0; + }); } - - function enqueueFetch(rid, updates) { - if (viewport.shouldLoadBottom()) { - if (!updates || buffer.effectiveHeight(updates.inserted) > 0) { - // this means that at least one item appended in the last batch has height > 0 - if (pending.push(true) === 1) { - adapter.loading(true); - fetch(rid); - } + }, { + key: 'remove', + value: function remove(argument, _isTop) { + var index = argument % 1 === 0 ? argument : argument.scope.$index; + var isTop = argument % 1 === 0 ? _isTop : argument._op === 'isTop'; + for (var i = this.length - 1; i >= 0; i--) { + if (this[i].index === index) { + this.splice(i, 1); + break; } - } else if (viewport.shouldLoadTop()) { - if (!updates || buffer.effectiveHeight(updates.prepended) > 0 || pending[0]) { - // this means that at least one item appended in the last batch has height > 0 - // pending[0] = true means that previous fetch was appending. We need to force at least one prepend - // BTW there will always be at least 1 element in the pending array because bottom is fetched first - if (pending.push(false) === 1) { - adapter.loading(true); - fetch(rid); + } + if (!isTop) { + for (var _i = this.length - 1; _i >= 0; _i--) { + if (this[_i].index > index) { + this[_i].index--; } } } } + }, { + key: 'clear', + value: function clear() { + this.length = 0; + } + }]); - function processUpdates() { - var updates = updateDOM(); + return CacheProto; +}(); - // We need the item bindings to be processed before we can do adjustments - !$scope.$$phase && !$rootScope.$$phase && $scope.$digest(); +function Cache() { + var instance = []; + instance.push.apply(instance, arguments); + Object.setPrototypeOf(instance, Cache.prototype); + return instance; +} +Cache.prototype = Object.create(Array.prototype); +Object.getOwnPropertyNames(CacheProto.prototype).forEach(function (methodName) { + return Cache.prototype[methodName] = CacheProto.prototype[methodName]; +}); - updates.inserted.forEach(function (w) { - return elementRoutines.showElement(w); - }); - updates.prepended.forEach(function (w) { - return elementRoutines.showElement(w); - }); - return updates; +function generateElement(template) { + if (template.nodeType !== Node.ELEMENT_NODE) { + throw new Error('ui-scroll directive requires an Element node for templating the view'); + } + var element = void 0; + switch (template.tagName.toLowerCase()) { + case 'dl': + throw new Error('ui-scroll directive does not support <' + template.tagName + '> as a repeating tag: ' + template.outerHTML); + case 'tr': + var table = angular.element('
    '); + element = table.find('tr'); + break; + case 'li': + element = angular.element('
  • '); + break; + default: + element = angular.element('
    '); + } + return element; +} + +var Padding = function () { + function Padding(template) { + _classCallCheck(this, Padding); + + this.element = generateElement(template); + this.cache = new Cache(); + } + + _createClass(Padding, [{ + key: 'height', + value: function height() { + return this.element.height.apply(this.element, arguments); } + }]); - function doAdjust(rid) { - if (!rid) { - // dismiss pending requests - pending = []; - rid = ++ridActual; - } + return Padding; +}(); - var updates = processUpdates(); +exports.default = Padding; - if (isInvalid(rid)) { - return; - } +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { - updatePaddings(rid, updates); - enqueueFetch(rid); +"use strict"; - if (!pending.length) { - adapter.calculateProperties(); - } - } - function doAdjustAfterFetch(rid) { - var updates = processUpdates(); +Object.defineProperty(exports, "__esModule", { + value: true +}); - viewport.onAfterPrepend(updates); +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Adapter = function () { + function Adapter($scope, $parse, $attr, viewport, buffer, doAdjust, reload) { + _classCallCheck(this, Adapter); + + this.$parse = $parse; + this.$attr = $attr; + this.viewport = viewport; + this.buffer = buffer; + + this.doAdjust = doAdjust; + this.reload = reload; + + this.isLoading = false; + this.disabled = false; + + var viewportScope = viewport.getScope(); + this.startScope = viewportScope.$parent ? viewportScope : $scope; + + this.publicContext = {}; + this.assignAdapter($attr.adapter); + this.generatePublicContext(); + } - if (isInvalid(rid)) { + _createClass(Adapter, [{ + key: 'assignAdapter', + value: function assignAdapter(adapterAttr) { + if (!adapterAttr || !(adapterAttr = adapterAttr.replace(/^\s+|\s+$/gm, ''))) { return; } + var adapterOnScope = void 0; - updatePaddings(rid, updates); - onRenderHandlersRunner(); - enqueueFetch(rid, updates); - pending.shift(); - - if (pending.length) fetch(rid);else { - adapter.loading(false); - bindEvents(); - adapter.calculateProperties(); + try { + this.$parse(adapterAttr).assign(this.startScope, {}); + adapterOnScope = this.$parse(adapterAttr)(this.startScope); + } catch (error) { + error.message = 'Angular ui-scroll Adapter assignment exception.\n' + ('Can\'t parse "' + adapterAttr + '" expression.\n') + error.message; + throw error; } + + Object.assign(adapterOnScope, this.publicContext); + this.publicContext = adapterOnScope; } + }, { + key: 'generatePublicContext', + value: function generatePublicContext() { + var _this = this; - function fetch(rid) { - if (pending[0]) { - // scrolling down - if (buffer.length && !viewport.shouldLoadBottom()) { - doAdjustAfterFetch(rid); - } else { - fetchNext(function (result) { - if (isInvalid(rid)) { - return; - } + // these methods will be accessible out of ui-scroll via user defined adapter + var publicMethods = ['reload', 'applyUpdates', 'append', 'prepend', 'isBOF', 'isEOF', 'isEmpty']; + for (var i = publicMethods.length - 1; i >= 0; i--) { + this.publicContext[publicMethods[i]] = this[publicMethods[i]].bind(this); + } - if (result.length < bufferSize) { - buffer.eof = true; - } + // these read-only props will be accessible out of ui-scroll via user defined adapter + var publicProps = ['isLoading', 'topVisible', 'topVisibleElement', 'topVisibleScope', 'bottomVisible', 'bottomVisibleElement', 'bottomVisibleScope']; - if (result.length > 0) { - viewport.clipTop(); - buffer.append(result); + var _loop = function _loop(_i) { + var property = void 0, + attr = _this.$attr[publicProps[_i]]; + Object.defineProperty(_this, publicProps[_i], { + get: function get() { + return property; + }, + set: function set(value) { + property = value; + _this.publicContext[publicProps[_i]] = value; + if (attr) { + _this.$parse(attr).assign(_this.startScope, value); } + } + }); + }; - doAdjustAfterFetch(rid); - }); + for (var _i = publicProps.length - 1; _i >= 0; _i--) { + _loop(_i); + } + + // non-read-only public property + Object.defineProperty(this.publicContext, 'disabled', { + get: function get() { + return _this.disabled; + }, + set: function set(value) { + return !(_this.disabled = value) ? _this.doAdjust() : null; } + }); + } + }, { + key: 'loading', + value: function loading(value) { + this.isLoading = value; + } + }, { + key: 'isBOF', + value: function isBOF() { + return this.buffer.bof; + } + }, { + key: 'isEOF', + value: function isEOF() { + return this.buffer.eof; + } + }, { + key: 'isEmpty', + value: function isEmpty() { + return !this.buffer.length; + } + }, { + key: 'append', + value: function append(newItems) { + this.buffer.append(newItems); + this.doAdjust(); + this.viewport.clipTop(); + this.viewport.clipBottom(); + } + }, { + key: 'prepend', + value: function prepend(newItems) { + this.buffer.prepend(newItems); + this.doAdjust(); + this.viewport.clipTop(); + this.viewport.clipBottom(); + } + }, { + key: 'applyUpdates', + value: function applyUpdates(arg1, arg2) { + if (typeof arg1 === 'function') { + this.applyUpdatesFunc(arg1); } else { - // scrolling up - if (buffer.length && !viewport.shouldLoadTop()) { - doAdjustAfterFetch(rid); - } else { - fetchPrevious(function (result) { - if (isInvalid(rid)) { - return; - } + this.applyUpdatesIndex(arg1, arg2); + } + this.doAdjust(); + } + }, { + key: 'applyUpdatesFunc', + value: function applyUpdatesFunc(cb) { + var _this2 = this; - if (result.length < bufferSize) { - buffer.bof = true; - // log 'bof is reached' - } + this.buffer.slice(0).forEach(function (wrapper) { + // we need to do it on the buffer clone, because buffer content + // may change as we iterate through + _this2.applyUpdate(wrapper, cb(wrapper.item, wrapper.scope, wrapper.element)); + }); + } + }, { + key: 'applyUpdatesIndex', + value: function applyUpdatesIndex(index, newItems) { + if (index % 1 !== 0) { + throw new Error('applyUpdates - ' + index + ' is not a valid index (should be an integer)'); + } + var _index = index - this.buffer.first; - if (result.length > 0) { - if (buffer.length) { - viewport.clipBottom(); - } - buffer.prepend(result); + // apply updates only within buffer + if (_index >= 0 && _index < this.buffer.length) { + this.applyUpdate(this.buffer[_index], newItems); + } + // out-of-buffer case: deletion may affect Paddings + else if (index >= this.buffer.getAbsMinIndex() && index <= this.buffer.getAbsMaxIndex()) { + if (Array.isArray(newItems) && !newItems.length) { + this.viewport.removeCacheItem(index, index === this.buffer.minIndex); + if (index === this.buffer.getAbsMinIndex()) { + this.buffer.incrementMinIndex(); + } else { + this.buffer.decrementMaxIndex(); } + } + } + } + }, { + key: 'applyUpdate', + value: function applyUpdate(wrapper, newItems) { + var _this3 = this; - doAdjustAfterFetch(rid); - }); + if (!Array.isArray(newItems)) { + return; + } + var position = this.buffer.indexOf(wrapper); + if (!newItems.reverse().some(function (newItem) { + return newItem === wrapper.item; + })) { + wrapper.op = 'remove'; + if (position === 0 && !newItems.length) { + wrapper._op = 'isTop'; // to catch "first" edge case on remove } } + newItems.forEach(function (newItem) { + if (newItem === wrapper.item) { + position--; + } else { + // 3 parameter (isTop) is to catch "first" edge case on insert + _this3.buffer.insert(position + 1, newItem, position === -1); + } + }); } + }, { + key: 'calculateProperties', + value: function calculateProperties() { + var rowTop = null, + topHeight = 0; + var topDone = false, + bottomDone = false; + var length = this.buffer.length; - function resizeAndScrollHandler() { - if (!$rootScope.$$phase && !adapter.isLoading && !adapter.disabled) { + for (var i = 0; i < length; i++) { + var item = this.buffer[i]; + var itemTop = item.element.offset().top; - enqueueFetch(ridActual); + if (rowTop !== itemTop) { + // a new row condition + var itemHeight = item.element.outerHeight(true); + var top = this.viewport.topDataPos() + topHeight + itemHeight; - if (pending.length) { - unbindEvents(); - } else { - adapter.calculateProperties(); - !$scope.$$phase && $scope.$digest(); + if (!topDone && top > this.viewport.topVisiblePos()) { + topDone = true; + this['topVisible'] = item.item; + this['topVisibleElement'] = item.element; + this['topVisibleScope'] = item.scope; + } + if (!bottomDone && (top >= this.viewport.bottomVisiblePos() || i === length - 1 && this.isEOF())) { + bottomDone = true; + this['bottomVisible'] = item.item; + this['bottomVisibleElement'] = item.element; + this['bottomVisibleScope'] = item.scope; + } + topHeight += itemHeight; } - } - } - - function wheelHandler(event) { - if (!adapter.disabled) { - var scrollTop = viewport[0].scrollTop; - var yMax = viewport[0].scrollHeight - viewport[0].clientHeight; + rowTop = itemTop; - if (scrollTop === 0 && !buffer.bof || scrollTop === yMax && !buffer.eof) { - event.preventDefault(); + if (topDone && bottomDone) { + break; } } } - } -}]); + }]); + + return Adapter; +}(); + +exports.default = Adapter; /***/ }) /******/ ]); diff --git a/dist/ui-scroll.js.map b/dist/ui-scroll.js.map index ce023d95..617f8a6c 100644 --- a/dist/ui-scroll.js.map +++ b/dist/ui-scroll.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap af02e5af19248c8e95e9","webpack:///./src/modules/adapter.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/ui-scroll.js"],"names":["Adapter","$scope","$parse","$attr","viewport","buffer","doAdjust","reload","isLoading","disabled","viewportScope","getScope","startScope","$parent","publicContext","assignAdapter","adapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","Object","publicMethods","i","length","bind","publicProps","property","attr","defineProperty","get","set","value","bof","eof","newItems","append","clipTop","clipBottom","prepend","arg1","arg2","applyUpdatesFunc","applyUpdatesIndex","cb","slice","forEach","wrapper","applyUpdate","item","scope","element","index","Error","_index","first","getAbsMinIndex","getAbsMaxIndex","Array","isArray","removeCacheItem","minIndex","incrementMinIndex","decrementMaxIndex","position","indexOf","reverse","some","newItem","op","_op","insert","rowTop","topHeight","topDone","bottomDone","itemTop","offset","top","itemHeight","outerHeight","topDataPos","topVisiblePos","bottomVisiblePos","isEOF","ScrollBuffer","elementRoutines","bufferSize","startIndex","create","prototype","size","reset","remove","next","maxIndex","minIndexUser","maxIndexUser","items","Math","max","min","operation","isTop","splice","push","unshift","Number","isInteger","removeElement","removeElementAnimated","effectiveHeight","elements","MAX_VALUE","bottom","NEGATIVE_INFINITY","offsetParent","hideClassToken","addCSSRule","sheet","selector","rules","insertRule","addRule","ElementRoutines","$injector","$q","$animate","has","isAngularVersionLessThen1_3","angular","version","major","minor","document","styleSheets","addClass","removeClass","newElement","previousElement","after","$destroy","insertElement","deferred","defer","enter","resolve","promise","leave","then","JQLiteExtras","convertToPx","css","getStyle","isWindow","name","self","elem","nodeType","style","call","obj","location","alert","setInterval","scrollTo","direction","left","method","prop","preserve","isValueDefined","documentElement","window","getComputedStyle","parseFloat","currentStyle","result","rs","rsLeft","core_pnum","source","rnumnonpx","RegExp","test","runtimeStyle","pixelLeft","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","height","width","padding","border","margin","offsetWidth","offsetHeight","getWidthHeight","measurements","outer","outerfull","before","newElem","children","j","parent","ref","contents","outerHTML","option","outerWidth","docElem","win","box","doc","ownerDocument","arguments","undefined","getBoundingClientRect","defaultView","parentWindow","pageYOffset","scrollTop","clientTop","pageXOffset","scrollLeft","clientLeft","key","Viewport","viewportController","$rootScope","topPadding","bottomPadding","container","bufferPadding","createPaddingElements","template","applyContainerStyle","bottomDataPos","scrollHeight","e","sibling","insertElementAnimated","shouldLoadBottom","overage","overageHeight","emptySpaceHeight","cache","add","adjustPaddings","shouldLoadTop","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","totalHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","onAfterMinIndexSet","topPaddingHeightOld","diff","onAfterPrepend","updates","prepended","paddingHeight","resetTopPadding","clear","resetBottomPadding","removeItem","CacheProto","$index","sort","a","b","argument","_isTop","Cache","instance","apply","setPrototypeOf","getOwnPropertyNames","methodName","generateElement","Node","ELEMENT_NODE","tagName","toLowerCase","table","find","Padding","module","service","run","jqLiteExtras","jQuery","registerFor","directive","restrict","controller","child","console","$timeout","$interval","require","transclude","priority","terminal","link","controllers","linker","match","uiScroll","parseNumericAttr","defaultValue","isNaN","BUFFER_MIN","BUFFER_DEFAULT","PADDING_MIN","PADDING_DEFAULT","MAX_VIEWPORT_DELAY","VIEWPORT_POLLING_INTERVAL","datasource","itemName","datasourceName","ridActual","pending","isDatasourceValid","toString","onRenderHandlers","onRenderHandlersRunner","handler","persistDatasourceIndex","propName","getter","filter","id","defineDatasourceIndex","propUserName","descriptor","getOwnPropertyDescriptor","fetchNext","success","count","fetchPrevious","initialize","tryCount","timer","cancel","clone","$on","unbindEvents","unbind","wheelHandler","isInvalid","rid","$$destroyed","bindEvents","resizeAndScrollHandler","isElementVisible","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","$watch","hideElement","promises","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updateDOM","toBePrepended","toBeRemoved","inserted","concat","removed","animated","updatePaddings","all","enqueueFetch","loading","fetch","processUpdates","$$phase","$digest","showElement","w","calculateProperties","doAdjustAfterFetch","shift","event","yMax","clientHeight","preventDefault"],"mappings":"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","file":"ui-scroll.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\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 af02e5af19248c8e95e9","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 Object.assign(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(Array.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 (!Array.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;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n Object.assign(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 (Number.isInteger(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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nfunction addCSSRule(sheet, selector, rules, index) {\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\nexport default class ElementRoutines {\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n addCSSRule(document.styleSheets[0], '.' + hideClassToken, 'display: none');\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","/*!\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 (Number.isInteger(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","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 Object.assign(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","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\n ])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$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(Number.isInteger(datasource[propName])) {\n getter = datasource[propName];\n if(Number.isInteger(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// WEBPACK FOOTER //\n// ./src/ui-scroll.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 36a3010ad66560b7fc51","webpack:///./src/ui-scroll.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/modules/adapter.js"],"names":["angular","module","service","run","jqLiteExtras","window","jQuery","registerFor","element","directive","restrict","controller","scope","container","viewport","forEach","children","child","tagName","toLowerCase","console","$injector","$rootScope","$timeout","$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","adapter","doAdjust","reload","isDatasourceValid","Object","prototype","toString","call","get","onRenderHandlers","onRenderHandlersRunner","handler","persistDatasourceIndex","propName","getter","Number","isInteger","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","JQLiteExtras","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","addCSSRule","sheet","selector","rules","insertRule","addRule","ElementRoutines","$animate","has","isAngularVersionLessThen1_3","version","major","minor","styleSheets","addClass","removeClass","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","ScrollBuffer","create","Array","assign","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","isTop","splice","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","elements","MAX_VALUE","bottom","NEGATIVE_INFINITY","Viewport","topPadding","bottomPadding","bufferPadding","getScope","template","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","Padding","Adapter","viewportScope","startScope","$parent","publicContext","assignAdapter","generatePublicContext","adapterAttr","replace","adapterOnScope","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 36a3010ad66560b7fc51","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\n ])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$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(Number.isInteger(datasource[propName])) {\n getter = datasource[propName];\n if(Number.isInteger(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// 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 (Number.isInteger(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\nfunction addCSSRule(sheet, selector, rules, index) {\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\nexport default class ElementRoutines {\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n addCSSRule(document.styleSheets[0], '.' + hideClassToken, 'display: none');\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 Object.assign(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 (Number.isInteger(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}\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 Object.assign(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 Object.assign(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(Array.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 (!Array.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;\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 e227a8ee..7d0d9f39 100644 --- a/dist/ui-scroll.min.js +++ b/dist/ui-scroll.min.js @@ -1,8 +1,8 @@ -/*! - * angular-ui-scroll (compressed) - * https://github.com/angular-ui/ui-scroll - * Version: 1.7.0-rc.6 -- 2017-11-17T18:27:05.969Z - * License: MIT +/*! + * angular-ui-scroll + * https://github.com/angular-ui/ui-scroll + * Version: 1.7.0-rc.6 -- 2017-11-19T07:39:04.374Z + * 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.i=function(e){return e},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=7)}([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()&&Array.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(Array.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,t,n){"use strict";function i(e,t,n){var i=Object.create(Array.prototype);return Object.assign(i,{size:t,reset:function(e){i.remove(0,i.length),i.eof=!1,i.bof=!1,i.first=e,i.next=e,i.minIndex=e,i.maxIndex=e,i.minIndexUser=null,i.maxIndexUser=null},append:function(e){e.forEach(function(e){++i.next,i.insert("append",e)}),i.maxIndex=i.eof?i.next-1:Math.max(i.next-1,i.maxIndex)},prepend:function(e){e.reverse().forEach(function(e){--i.first,i.insert("prepend",e)}),i.minIndex=i.bof?i.minIndex=i.first:Math.min(i.first,i.minIndex)},insert:function(e,t,n){var r={item:t};if(e%1==0)r.op="insert",i.splice(e,0,r),n?i.first--:i.next++;else switch(r.op=e,e){case"append":i.push(r);break;case"prepend":i.unshift(r)}},remove:function(t,n){if(Number.isInteger(t)){for(var r=t;ri.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){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t,n,i){"insertRule"in e?e.insertRule(t+"{"+n+"}",i):"addRule"in e&&e.addRule(t,n,i)}Object.defineProperty(t,"__esModule",{value:!0});var 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?(Number.isInteger(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,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"}),Object.assign(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){return e&&e.__esModule?e:{default:e}}var r=n(3),o=i(r),a=n(2),u=i(a),s=n(1),l=i(s),c=n(4),f=i(c),d=n(0),h=i(d);angular.module("ui.scroll",[]).service("jqLiteExtras",function(){return new o.default}).run(["jqLiteExtras",function(e){return window.jQuery?null:e.registerFor(angular.element)}]).directive("uiScrollViewport",function(){return{restrict:"A",controller:["$scope","$element",function(e,t){var n=this;return this.container=t,this.viewport=t,this.scope=e,angular.forEach(t.children(),function(e){"tbody"===e.tagName.toLowerCase()&&(n.viewport=angular.element(e))}),this}]}}).directive("uiScroll",["$log","$injector","$rootScope","$timeout","$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(){J.forEach(function(e){return e.run()}),J=[]}function v(e,t){var n=void 0;Number.isInteger(e[t])&&(n=e[t],Number.isInteger(n)&&(J=J.filter(function(e){return e.id!==t}),J.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&&!X.length)return void v(e,t);X[n]=i;var o=Y.topDataPos();Y.adjustPaddings(),"minIndex"===t&&Y.onAfterMinIndexSet(o)},get:function(){return r}})}}function x(t){return t&&t!==q||e.$$destroyed}function y(){Y.bind("resize",V),Y.bind("scroll",V)}function w(){Y.unbind("resize",V),Y.unbind("scroll",V)}function I(){Y.resetTopPadding(),Y.resetBottomPadding(),arguments.length&&(W=arguments[0]),X.reset(W),v(C,"minIndex"),v(C,"maxIndex"),M()}function E(e){return e.element.height()&&e.element[0].offsetParent}function P(e){E(e)&&(X.forEach(function(e){"function"==typeof e.unregisterVisibilityWatcher&&(e.unregisterVisibilityWatcher(),delete e.unregisterVisibilityWatcher)}),z.length||i(function(){return M()}))}function $(e,t){T(e,t,Y.insertElement),E(e)||(e.unregisterVisibilityWatcher=e.scope.$watch(function(){return P(e)})),R.hideElement(e)}function T(e,t,n){var i=null,r=t>0?X[t-1].element:void 0;if(p(function(t,o){i=n(t,r),e.element=t,e.scope=o,o[H]=e.item}),G.transform){var o=e.scope.uiScrollTdInitializer;o&&o.linking?G.transform(e.scope,e.element):e.scope.uiScrollTdInitializer={onLink:function(){return G.transform(e.scope,e.element)},scope:e.scope}}return i}function O(){var e=[],t=[],n=[],i=[];return X.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,Y.insertElementAnimated)),r.op="none",i.push(r);break;case"remove":n.push(r)}}),n.forEach(function(t){return e=e.concat(Y.removeItem(t))}),t.length&&t.forEach(function(e){$(e),e.op="none"}),X.forEach(function(e,t){return e.scope.$index=X.first+t}),{prepended:t,removed:n,inserted:i,animated:e}}function j(e,t){t.animated.length?o.all(t.animated).then(function(){Y.adjustPaddings(),M(e)}):Y.adjustPaddings()}function A(e,t){Y.shouldLoadBottom()?(!t||X.effectiveHeight(t.inserted)>0)&&1===z.push(!0)&&(G.loading(!0),S(e)):Y.shouldLoadTop()&&(!t||X.effectiveHeight(t.prepended)>0||z[0])&&1===z.push(!1)&&(G.loading(!0),S(e))}function k(){var t=O();return!e.$$phase&&!n.$$phase&&e.$digest(),t.inserted.forEach(function(e){return R.showElement(e)}),t.prepended.forEach(function(e){return R.showElement(e)}),t}function M(e){e||(z=[],e=++q);var t=k();x(e)||(j(e,t),A(e),z.length||G.calculateProperties())}function U(e){var t=k();Y.onAfterPrepend(t),x(e)||(j(e,t),g(),A(e,t),z.shift(),z.length?S(e):(G.loading(!1),y(),G.calculateProperties()))}function S(e){z[0]?X.length&&!Y.shouldLoadBottom()?U(e):K(function(t){x(e)||(t.length0&&(Y.clipTop(),X.append(t)),U(e))}):X.length&&!Y.shouldLoadTop()?U(e):Z(function(t){x(e)||(t.length0&&(X.length&&Y.clipBottom(),X.prepend(t)),U(e))})}function V(){n.$$phase||G.isLoading||G.disabled||(A(q),z.length?w():(G.calculateProperties(),!e.$$phase&&e.$digest()))}function _(e){if(!G.disabled){var t=Y[0].scrollTop,n=Y[0].scrollHeight-Y[0].clientHeight;(0===t&&!X.bof||t===n&&!X.eof)&&e.preventDefault()}}var L=c.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!L)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+c.uiScroll+"'");var C=null,H=L[1],N=L[2],B=d[0],D=Math.max(3,m(c.bufferSize,10)),F=Math.max(.3,m(c.padding,.5)),W=m(c.startIndex,1),q=0,z=[],R=new u.default(t,o),X=new l.default(R,D,W),Y=new f.default(R,X,s,B,n,F),G=new h.default(e,a,c,Y,X,M,I);B&&(B.adapter=G);var Q=function(){return"[object Object]"===Object.prototype.toString.call(C)&&"function"==typeof C.get};if(C=a(N)(e),!Q()&&(C=t.get(N),!Q()))throw new Error(N+" is not a valid datasource");var J=[];b(C,"minIndex","minIndexUser"),b(C,"maxIndex","maxIndexUser");var K=2!==C.get.length?function(e){return C.get(X.next,D,e)}:function(e){C.get({index:X.next,append:X.length?X[X.length-1].item:void 0,count:D},e)},Z=2!==C.get.length?function(e){return C.get(X.first-D,D,e)}:function(e){C.get({index:X.first-D,prepend:X.length?X[0].item:void 0,count:D},e)};p(function(e,t){Y.createPaddingElements(e[0]),t.$destroy(),e.remove()}),e.$on("$destroy",function(){w(),Y.unbind("mousewheel",_)}),Y.bind("mousewheel",_),function(){var e=0;if(Y.applyContainerStyle())M();else var t=r(function(){if(e++,Y.applyContainerStyle()&&(r.cancel(t),M()),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){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",[]).service("jqLiteExtras",function(){return new o.default}).run(["jqLiteExtras",function(e){return window.jQuery?null:e.registerFor(angular.element)}]).directive("uiScrollViewport",function(){return{restrict:"A",controller:["$scope","$element",function(e,t){var n=this;return this.container=t,this.viewport=t,this.scope=e,angular.forEach(t.children(),function(e){"tbody"===e.tagName.toLowerCase()&&(n.viewport=angular.element(e))}),this}]}}).directive("uiScroll",["$log","$injector","$rootScope","$timeout","$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(){J.forEach(function(e){return e.run()}),J=[]}function v(e,t){var n=void 0;Number.isInteger(e[t])&&(n=e[t],Number.isInteger(n)&&(J=J.filter(function(e){return e.id!==t}),J.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&&!X.length)return void v(e,t);X[n]=i;var o=Y.topDataPos();Y.adjustPaddings(),"minIndex"===t&&Y.onAfterMinIndexSet(o)},get:function(){return r}})}}function x(t){return t&&t!==q||e.$$destroyed}function y(){Y.bind("resize",V),Y.bind("scroll",V)}function w(){Y.unbind("resize",V),Y.unbind("scroll",V)}function I(){Y.resetTopPadding(),Y.resetBottomPadding(),arguments.length&&(W=arguments[0]),X.reset(W),v(C,"minIndex"),v(C,"maxIndex"),M()}function E(e){return e.element.height()&&e.element[0].offsetParent}function P(e){E(e)&&(X.forEach(function(e){"function"==typeof e.unregisterVisibilityWatcher&&(e.unregisterVisibilityWatcher(),delete e.unregisterVisibilityWatcher)}),z.length||i(function(){return M()}))}function $(e,t){T(e,t,Y.insertElement),E(e)||(e.unregisterVisibilityWatcher=e.scope.$watch(function(){return P(e)})),R.hideElement(e)}function T(e,t,n){var i=null,r=t>0?X[t-1].element:void 0;if(p(function(t,o){i=n(t,r),e.element=t,e.scope=o,o[H]=e.item}),G.transform){var o=e.scope.uiScrollTdInitializer;o&&o.linking?G.transform(e.scope,e.element):e.scope.uiScrollTdInitializer={onLink:function(){return G.transform(e.scope,e.element)},scope:e.scope}}return i}function O(){var e=[],t=[],n=[],i=[];return X.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,Y.insertElementAnimated)),r.op="none",i.push(r);break;case"remove":n.push(r)}}),n.forEach(function(t){return e=e.concat(Y.removeItem(t))}),t.length&&t.forEach(function(e){$(e),e.op="none"}),X.forEach(function(e,t){return e.scope.$index=X.first+t}),{prepended:t,removed:n,inserted:i,animated:e}}function j(e,t){t.animated.length?o.all(t.animated).then(function(){Y.adjustPaddings(),M(e)}):Y.adjustPaddings()}function A(e,t){Y.shouldLoadBottom()?(!t||X.effectiveHeight(t.inserted)>0)&&1===z.push(!0)&&(G.loading(!0),S(e)):Y.shouldLoadTop()&&(!t||X.effectiveHeight(t.prepended)>0||z[0])&&1===z.push(!1)&&(G.loading(!0),S(e))}function k(){var t=O();return!e.$$phase&&!n.$$phase&&e.$digest(),t.inserted.forEach(function(e){return R.showElement(e)}),t.prepended.forEach(function(e){return R.showElement(e)}),t}function M(e){e||(z=[],e=++q);var t=k();x(e)||(j(e,t),A(e),z.length||G.calculateProperties())}function U(e){var t=k();Y.onAfterPrepend(t),x(e)||(j(e,t),g(),A(e,t),z.shift(),z.length?S(e):(G.loading(!1),y(),G.calculateProperties()))}function S(e){z[0]?X.length&&!Y.shouldLoadBottom()?U(e):K(function(t){x(e)||(t.length0&&(Y.clipTop(),X.append(t)),U(e))}):X.length&&!Y.shouldLoadTop()?U(e):Z(function(t){x(e)||(t.length0&&(X.length&&Y.clipBottom(),X.prepend(t)),U(e))})}function V(){n.$$phase||G.isLoading||G.disabled||(A(q),z.length?w():(G.calculateProperties(),!e.$$phase&&e.$digest()))}function _(e){if(!G.disabled){var t=Y[0].scrollTop,n=Y[0].scrollHeight-Y[0].clientHeight;(0===t&&!X.bof||t===n&&!X.eof)&&e.preventDefault()}}var L=c.uiScroll.match(/^\s*(\w+)\s+in\s+([(\w|\$)\.]+)\s*$/);if(!L)throw new Error("Expected uiScroll in form of '_item_ in _datasource_' but got '"+c.uiScroll+"'");var C=null,H=L[1],N=L[2],B=d[0],D=Math.max(3,m(c.bufferSize,10)),F=Math.max(.3,m(c.padding,.5)),W=m(c.startIndex,1),q=0,z=[],R=new u.default(t,o),X=new l.default(R,D,W),Y=new f.default(R,X,s,B,n,F),G=new h.default(e,a,c,Y,X,M,I);B&&(B.adapter=G);var Q=function(){return"[object Object]"===Object.prototype.toString.call(C)&&"function"==typeof C.get};if(C=a(N)(e),!Q()&&(C=t.get(N),!Q()))throw new Error(N+" is not a valid datasource");var J=[];b(C,"minIndex","minIndexUser"),b(C,"maxIndex","maxIndexUser");var K=2!==C.get.length?function(e){return C.get(X.next,D,e)}:function(e){C.get({index:X.next,append:X.length?X[X.length-1].item:void 0,count:D},e)},Z=2!==C.get.length?function(e){return C.get(X.first-D,D,e)}:function(e){C.get({index:X.first-D,prepend:X.length?X[0].item:void 0,count:D},e)};p(function(e,t){Y.createPaddingElements(e[0]),t.$destroy(),e.remove()}),e.$on("$destroy",function(){w(),Y.unbind("mousewheel",_)}),Y.bind("mousewheel",_),function(){var e=0;if(Y.applyContainerStyle())M();else var t=r(function(){if(e++,Y.applyContainerStyle()&&(r.cancel(t),M()),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?(Number.isInteger(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")}function r(e,t,n,i){"insertRule"in e?e.insertRule(t+"{"+n+"}",i):"addRule"in e&&e.addRule(t,n,i)}Object.defineProperty(t,"__esModule",{value:!0});var o=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"}),Object.assign(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()&&Array.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(Array.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}]); //# 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 eda280b4..81dc3c79 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 ff58afc7647583ed56f1","webpack:///./src/modules/adapter.js","webpack:///./src/modules/buffer.js","webpack:///./src/modules/elementRoutines.js","webpack:///./src/modules/jqLiteExtras.js","webpack:///./src/modules/viewport.js","webpack:///./src/modules/padding.js","webpack:///./src/ui-scroll.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","length","descriptor","writable","key","protoProps","staticProps","Adapter","$scope","$parse","$attr","viewport","buffer","doAdjust","reload","this","isLoading","disabled","viewportScope","getScope","startScope","$parent","publicContext","assignAdapter","adapter","generatePublicContext","adapterAttr","replace","adapterOnScope","assign","error","message","_this","publicMethods","bind","publicProps","attr","set","bof","eof","newItems","append","clipTop","clipBottom","prepend","arg1","arg2","applyUpdatesFunc","applyUpdatesIndex","cb","_this2","slice","forEach","wrapper","applyUpdate","item","scope","element","index","Error","_index","first","getAbsMinIndex","getAbsMaxIndex","Array","isArray","removeCacheItem","minIndex","incrementMinIndex","decrementMaxIndex","_this3","position","indexOf","reverse","some","newItem","op","_op","insert","rowTop","topHeight","topDone","bottomDone","itemTop","offset","top","itemHeight","outerHeight","topDataPos","topVisiblePos","bottomVisiblePos","isEOF","default","ScrollBuffer","elementRoutines","bufferSize","startIndex","create","size","reset","remove","next","maxIndex","minIndexUser","maxIndexUser","items","Math","max","min","operation","isTop","splice","push","unshift","Number","isInteger","removeElement","removeElementAnimated","effectiveHeight","elements","MAX_VALUE","bottom","NEGATIVE_INFINITY","offsetParent","addCSSRule","sheet","selector","rules","insertRule","addRule","hideClassToken","ElementRoutines","$injector","$q","$animate","has","isAngularVersionLessThen1_3","angular","version","major","minor","document","styleSheets","addClass","removeClass","newElement","previousElement","after","$destroy","insertElement","deferred","defer","enter","resolve","promise","leave","then","_slicedToArray","sliceIterator","arr","_arr","_n","_d","_e","undefined","_s","_i","Symbol","iterator","done","err","JQLiteExtras","scrollTo","self","direction","elem","_top$left$direction","left","method","prop","preserve","isValueDefined","isWindow","documentElement","getMeasurements","measure","base","borderA","borderB","computedMarginA","computedMarginB","computedStyle","dirA","dirB","marginA","marginB","paddingA","paddingB","height","width","padding","border","margin","_width$height$measure","offsetWidth","offsetHeight","getStyle","convertToPx","getWidthHeight","result","measurements","outer","outerfull","style","parseFloat","css","nodeType","obj","location","alert","setInterval","window","getComputedStyle","currentStyle","rs","rsLeft","core_pnum","source","RegExp","test","runtimeStyle","pixelLeft","before","newElem","children","j","parent","ref","contents","outerHTML","option","outerWidth","docElem","win","box","doc","ownerDocument","arguments","getBoundingClientRect","defaultView","parentWindow","pageYOffset","scrollTop","clientTop","pageXOffset","scrollLeft","clientLeft","Viewport","viewportController","$rootScope","bufferPadding","topPadding","bottomPadding","container","overflow-anchor","overflow-y","display","createPaddingElements","template","_padding2","applyContainerStyle","bottomDataPos","scrollHeight","e","sibling","insertElementAnimated","shouldLoadBottom","overage","overageHeight","emptySpaceHeight","cache","add","adjustPaddings","shouldLoadTop","visibleItemsHeight","reduce","summ","topPaddingHeight","topCount","bottomPaddingHeight","bottomCount","totalHeight","averageItemHeight","adjustTopPadding","adjustBottomPadding","topPaddingHeightAdd","bottomPaddingHeightAdd","onAfterMinIndexSet","topPaddingHeightOld","diff","onAfterPrepend","updates","prepended","paddingHeight","resetTopPadding","clear","resetBottomPadding","removeItem","_padding","Cache","apply","setPrototypeOf","generateElement","Node","ELEMENT_NODE","tagName","toLowerCase","find","CacheProto","$index","sort","a","b","argument","_isTop","getOwnPropertyNames","methodName","Padding","_interopRequireDefault","_jqLiteExtras","_jqLiteExtras2","_elementRoutines","_elementRoutines2","_buffer","_buffer2","_viewport","_viewport2","_adapter","_adapter2","service","run","jqLiteExtras","jQuery","registerFor","directive","restrict","controller","child","console","$timeout","$interval","link","controllers","linker","parseNumericAttr","defaultValue","isNaN","onRenderHandlersRunner","onRenderHandlers","handler","persistDatasourceIndex","datasource","propName","filter","id","defineDatasourceIndex","propUserName","getOwnPropertyDescriptor","pending","isInvalid","rid","ridActual","$$destroyed","bindEvents","resizeAndScrollHandler","unbindEvents","unbind","isElementVisible","visibilityWatcher","unregisterVisibilityWatcher","insertWrapperContent","insertAfter","createElement","$watch","hideElement","promises","clone","itemName","transform","tdInitializer","uiScrollTdInitializer","linking","onLink","updateDOM","toBePrepended","toBeRemoved","inserted","concat","removed","animated","updatePaddings","all","enqueueFetch","loading","fetch","processUpdates","$$phase","$digest","w","showElement","calculateProperties","doAdjustAfterFetch","shift","fetchNext","fetchPrevious","wheelHandler","event","yMax","clientHeight","preventDefault","match","uiScroll","datasourceName","isDatasourceValid","toString","success","count","$on","tryCount","timer","cancel","require","transclude","priority","terminal"],"mappings":"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","file":"ui-scroll.min.js","sourcesContent":["/*!\r\n * angular-ui-scroll (uncompressed)\r\n * https://github.com/angular-ui/ui-scroll\r\n * Version: 1.7.0-rc.6 -- 2017-11-17T18:27:05.558Z\r\n * License: MIT\r\n */\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \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// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\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/* 0 */\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 Object.assign(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 (Array.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 (!Array.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/* 1 */\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 Object.assign(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 (Number.isInteger(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/* 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\nfunction addCSSRule(sheet, selector, rules, index) {\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\nvar ElementRoutines = function () {\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 addCSSRule(document.styleSheets[0], '.' + hideClassToken, 'display: none');\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});\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 (Number.isInteger(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/* 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 Object.assign(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/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _jqLiteExtras = __webpack_require__(3);\n\nvar _jqLiteExtras2 = _interopRequireDefault(_jqLiteExtras);\n\nvar _elementRoutines = __webpack_require__(2);\n\nvar _elementRoutines2 = _interopRequireDefault(_elementRoutines);\n\nvar _buffer = __webpack_require__(1);\n\nvar _buffer2 = _interopRequireDefault(_buffer);\n\nvar _viewport = __webpack_require__(4);\n\nvar _viewport2 = _interopRequireDefault(_viewport);\n\nvar _adapter = __webpack_require__(0);\n\nvar _adapter2 = _interopRequireDefault(_adapter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nangular.module('ui.scroll', []).service('jqLiteExtras', function () {\n return new _jqLiteExtras2.default();\n}).run(['jqLiteExtras', function (jqLiteExtras) {\n return !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null;\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 (Number.isInteger(datasource[propName])) {\n getter = datasource[propName];\n if (Number.isInteger(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/******/ ]);\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// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\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 ff58afc7647583ed56f1","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 Object.assign(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(Array.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 (!Array.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;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js","export default function ScrollBuffer(elementRoutines, bufferSize, startIndex) {\r\n const buffer = Object.create(Array.prototype);\r\n\r\n Object.assign(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 (Number.isInteger(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}\n\n\n// WEBPACK FOOTER //\n// ./src/modules/buffer.js","const hideClassToken = 'ng-ui-scroll-hide';\r\n\r\nfunction addCSSRule(sheet, selector, rules, index) {\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\nexport default class ElementRoutines {\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n addCSSRule(document.styleSheets[0], '.' + hideClassToken, 'display: none');\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","/*!\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 (Number.isInteger(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","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 Object.assign(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","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\n ])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$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(Number.isInteger(datasource[propName])) {\n getter = datasource[propName];\n if(Number.isInteger(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// WEBPACK FOOTER //\n// ./src/ui-scroll.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///ui-scroll.min.js","webpack:///webpack/bootstrap 36a3010ad66560b7fc51","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","service","run","jqLiteExtras","window","jQuery","registerFor","element","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","Number","isInteger","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","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","JQLiteExtras","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","addCSSRule","sheet","selector","rules","insertRule","addRule","hideClassToken","ElementRoutines","$animate","has","isAngularVersionLessThen1_3","version","major","minor","styleSheets","addClass","removeClass","newElement","previousElement","deferred","defer","enter","resolve","promise","removeElement","leave","ScrollBuffer","create","assign","size","minIndex","maxIndex","minIndexUser","maxIndexUser","items","insert","reverse","min","operation","isTop","splice","arg1","arg2","indexOf","_op","getAbsMinIndex","incrementMinIndex","decrementMaxIndex","removeElementAnimated","getAbsMaxIndex","elements","MAX_VALUE","bottom","NEGATIVE_INFINITY","Viewport","bufferPadding","topPadding","bottomPadding","overflow-anchor","overflow-y","display","getScope","template","_padding2","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","Cache","apply","setPrototypeOf","generateElement","Node","ELEMENT_NODE","find","CacheProto","sort","a","b","argument","_isTop","getOwnPropertyNames","methodName","Padding","Adapter","viewportScope","startScope","$parent","publicContext","assignAdapter","generatePublicContext","adapterAttr","replace","adapterOnScope","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', []).service('jqLiteExtras', function () {\n return new _jqLiteExtras2.default();\n}).run(['jqLiteExtras', function (jqLiteExtras) {\n return !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null;\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 (Number.isInteger(datasource[propName])) {\n getter = datasource[propName];\n if (Number.isInteger(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 (Number.isInteger(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\nfunction addCSSRule(sheet, selector, rules, index) {\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\nvar ElementRoutines = function () {\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 addCSSRule(document.styleSheets[0], '.' + hideClassToken, 'display: none');\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 Object.assign(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 (Number.isInteger(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 Object.assign(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 Object.assign(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 (Array.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 (!Array.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 36a3010ad66560b7fc51","import JQLiteExtras from './modules/jqLiteExtras';\nimport ElementRoutines from './modules/elementRoutines.js';\nimport ScrollBuffer from './modules/buffer.js';\nimport Viewport from './modules/viewport.js';\nimport Adapter from './modules/adapter.js';\n\nangular.module('ui.scroll', [])\n\n .service('jqLiteExtras', () => new JQLiteExtras())\n .run(['jqLiteExtras', (jqLiteExtras) =>\n !window.jQuery ? jqLiteExtras.registerFor(angular.element) : null\n ])\n\n .directive('uiScrollViewport', function () {\n return {\n restrict: 'A',\n controller: [\n '$scope',\n '$element',\n function (scope, element) {\n this.container = element;\n this.viewport = element;\n this.scope = scope;\n\n angular.forEach(element.children(), child => {\n if (child.tagName.toLowerCase() === 'tbody') {\n this.viewport = angular.element(child);\n }\n });\n\n return this;\n }\n ]\n };\n })\n\n .directive('uiScroll', [\n '$log',\n '$injector',\n '$rootScope',\n '$timeout',\n '$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(Number.isInteger(datasource[propName])) {\n getter = datasource[propName];\n if(Number.isInteger(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// 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 (Number.isInteger(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\nfunction addCSSRule(sheet, selector, rules, index) {\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\nexport default class ElementRoutines {\r\n\r\n constructor($injector, $q) {\r\n this.$animate = ($injector.has && $injector.has('$animate')) ? $injector.get('$animate') : null;\r\n this.isAngularVersionLessThen1_3 = angular.version.major === 1 && angular.version.minor < 3;\r\n this.$q = $q;\r\n addCSSRule(document.styleSheets[0], '.' + hideClassToken, 'display: none');\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 Object.assign(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 (Number.isInteger(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}\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 Object.assign(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 Object.assign(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(Array.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 (!Array.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;\n\n\n// WEBPACK FOOTER //\n// ./src/modules/adapter.js"],"sourceRoot":""} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 1cea8dd1..3a2ba65e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,13 @@ { "name": "angular-ui-scroll", - "version": "1.7.0-rc.2", + "version": "1.7.0-rc.6", "lockfileVersion": 1, "requires": true, "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", "dev": true, "requires": { "mime-types": "2.1.17", @@ -21,9 +15,9 @@ } }, "acorn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", "dev": true }, "acorn-dynamic-import": { @@ -50,19 +44,21 @@ "dev": true }, "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", "dev": true, "requires": { "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "dev": true }, "align-text": { @@ -76,6 +72,12 @@ "repeat-string": "1.6.1" } }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -98,15 +100,6 @@ "normalize-path": "2.1.1" } }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", @@ -122,6 +115,12 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -129,9 +128,31 @@ "dev": true }, "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0" + } + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", "dev": true }, "array-slice": { @@ -140,6 +161,21 @@ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", "dev": true }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", @@ -153,9 +189,9 @@ "dev": true }, "asn1.js": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", "dev": true, "requires": { "bn.js": "4.11.8", @@ -173,10 +209,13 @@ } }, "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } }, "async-each": { "version": "1.0.1", @@ -341,15 +380,14 @@ } }, "babel-loader": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", - "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", + "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", "dev": true, "requires": { - "find-cache-dir": "0.1.1", - "loader-utils": "0.2.17", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" + "find-cache-dir": "1.0.0", + "loader-utils": "1.1.0", + "mkdirp": "0.5.1" } }, "babel-messages": { @@ -758,15 +796,6 @@ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "dev": true }, - "basic-auth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", - "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -830,6 +859,20 @@ "type-is": "1.6.15" } }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.1.1", + "multicast-dns-service-types": "1.1.0" + } + }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -936,16 +979,14 @@ "base64-js": "1.2.1", "ieee754": "1.1.8", "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } } }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -977,9 +1018,9 @@ "dev": true }, "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true }, "camelcase-keys": { @@ -990,6 +1031,14 @@ "requires": { "camelcase": "2.1.1", "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } } }, "center-align": { @@ -1091,10 +1140,19 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "coffee-script": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz", - "integrity": "sha1-EpOLz5vhlI+gBvkuDEyegXBRCMA=", + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "colors": { @@ -1112,12 +1170,6 @@ "lodash": "4.17.4" } }, - "commander": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", - "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=", - "dev": true - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1142,90 +1194,48 @@ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "compressible": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", + "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } }, - "concurrently": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-3.5.0.tgz", - "integrity": "sha1-jPG3cHppFqeKT/W3e7BN7FSzebI=", + "compression": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", + "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", "dev": true, "requires": { - "chalk": "0.5.1", - "commander": "2.6.0", - "date-fns": "1.29.0", - "lodash": "4.17.4", - "rx": "2.3.24", - "spawn-command": "0.0.2-1", - "supports-color": "3.2.3", - "tree-kill": "1.2.0" + "accepts": "1.3.4", + "bytes": "3.0.0", + "compressible": "2.0.12", + "debug": "2.6.9", + "on-headers": "1.0.1", + "safe-buffer": "5.1.1", + "vary": "1.1.2" }, "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true, - "requires": { - "ansi-styles": "1.1.0", - "escape-string-regexp": "1.0.5", - "has-ansi": "0.1.0", - "strip-ansi": "0.3.0", - "supports-color": "0.2.0" - }, - "dependencies": { - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - } - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true, - "requires": { - "ansi-regex": "0.2.1" - } - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true, - "requires": { - "ansi-regex": "0.2.1" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", "dev": true, "requires": { - "has-flag": "1.0.0" + "mime-types": "2.1.17", + "negotiator": "0.6.1" } } } }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, "connect": { "version": "3.6.5", "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz", @@ -1236,29 +1246,12 @@ "finalhandler": "1.0.6", "parseurl": "1.3.2", "utils-merge": "1.0.1" - }, - "dependencies": { - "finalhandler": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", - "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" - } - } } }, - "connect-livereload": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", - "integrity": "sha1-gBV9E3HJ83zBQDmrGJWXDRGdw7w=", + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", "dev": true }, "console-browserify": { @@ -1306,6 +1299,51 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "copy-webpack-plugin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.2.0.tgz", + "integrity": "sha512-eZERim02YjJcepLjrToQMapOoRLfiXewJi9zJON6xXNNJSUhkGzL1L/yFjOufS0KxsnWUzc2szg9t8ZaZKJXAg==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "fs-extra": "4.0.2", + "glob": "7.1.2", + "is-glob": "4.0.0", + "loader-utils": "0.2.17", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "node-dir": "0.1.17" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.0" + } + } + } + }, "core-js": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", @@ -1354,10 +1392,33 @@ "sha.js": "2.4.9" } }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + } + } + }, "crypto-browserify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { "browserify-cipher": "1.0.0", @@ -1369,7 +1430,8 @@ "inherits": "2.0.3", "pbkdf2": "3.0.14", "public-encrypt": "4.0.0", - "randombytes": "2.0.5" + "randombytes": "2.0.5", + "randomfill": "1.0.3" } }, "currently-unhandled": { @@ -1387,11 +1449,14 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", - "dev": true + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.35" + } }, "date-now": { "version": "0.1.4", @@ -1399,16 +1464,6 @@ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1424,6 +1479,36 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" + } + }, "depd": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", @@ -1455,6 +1540,12 @@ "repeating": "2.0.1" } }, + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true + }, "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -1472,6 +1563,31 @@ "randombytes": "2.0.5" } }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.2.2.tgz", + "integrity": "sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg==", + "dev": true, + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "1.1.1" + } + }, "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -1539,6 +1655,12 @@ "domelementtype": "1.3.0" } }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1586,16 +1708,6 @@ "ws": "1.1.2" }, "dependencies": { - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "dev": true, - "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" - } - }, "debug": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", @@ -1678,7 +1790,7 @@ "requires": { "graceful-fs": "4.1.11", "memory-fs": "0.4.1", - "object-assign": "4.1.1", + "object-assign": "4.1.0", "tapable": "0.2.8" } }, @@ -1712,22 +1824,138 @@ "is-arrayish": "0.2.1" } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "es-abstract": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", + "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "es5-ext": { + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", + "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, "esutils": { @@ -1742,11 +1970,30 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } }, "eventemitter3": { "version": "1.2.0", @@ -1760,6 +2007,15 @@ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": "1.0.0" + } + }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -1770,6 +2026,21 @@ "safe-buffer": "5.1.1" } }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -1874,6 +2145,51 @@ "type-is": "1.6.15", "utils-merge": "1.0.1", "vary": "1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } } }, "extend": { @@ -1891,6 +2207,18 @@ "is-extglob": "1.0.0" } }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -1900,12 +2228,6 @@ "websocket-driver": "0.7.0" } }, - "file-sync-cmp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", - "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", - "dev": true - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -1926,9 +2248,9 @@ } }, "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", "dev": true, "requires": { "debug": "2.6.9", @@ -1938,51 +2260,34 @@ "parseurl": "1.3.2", "statuses": "1.3.1", "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } } }, "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" + "make-dir": "1.1.0", + "pkg-dir": "2.0.0" } }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "glob": "5.0.15" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "locate-path": "2.0.0" } }, "for-in": { @@ -2000,6 +2305,12 @@ "for-in": "1.0.2" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -2012,6 +2323,12 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, "fs-access": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", @@ -2021,20 +2338,28 @@ "null-check": "1.0.0" } }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "gaze": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", - "dev": true, - "requires": { - "globule": "1.2.0" - } + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "get-caller-file": { "version": "1.0.2", @@ -2048,10 +2373,10 @@ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, "glob": { @@ -2093,15 +2418,25 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, - "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { + "array-union": "1.0.2", "glob": "7.1.2", - "lodash": "4.17.4", - "minimatch": "3.0.4" + "object-assign": "4.1.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, "graceful-fs": { @@ -2110,224 +2445,19 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, - "grunt": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz", - "integrity": "sha1-6HeHZOlEsY8yuw8QuQeEdcnftWs=", - "dev": true, - "requires": { - "coffee-script": "1.10.0", - "dateformat": "1.0.12", - "eventemitter2": "0.4.14", - "exit": "0.1.2", - "findup-sync": "0.3.0", - "glob": "7.0.6", - "grunt-cli": "1.2.0", - "grunt-known-options": "1.1.0", - "grunt-legacy-log": "1.0.0", - "grunt-legacy-util": "1.0.0", - "iconv-lite": "0.4.19", - "js-yaml": "3.5.5", - "minimatch": "3.0.4", - "nopt": "3.0.6", - "path-is-absolute": "1.0.1", - "rimraf": "2.2.8" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", - "dev": true, - "requires": { - "findup-sync": "0.3.0", - "grunt-known-options": "1.1.0", - "nopt": "3.0.6", - "resolve": "1.1.7" - } - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, - "grunt-contrib-clean": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", - "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=", - "dev": true, - "requires": { - "async": "1.5.2", - "rimraf": "2.6.2" - } - }, - "grunt-contrib-connect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-1.0.2.tgz", - "integrity": "sha1-XPkzuRpnOGBEJzwLJERgPNmIebo=", - "dev": true, - "requires": { - "async": "1.5.2", - "connect": "3.6.5", - "connect-livereload": "0.5.4", - "http2": "3.3.7", - "morgan": "1.9.0", - "opn": "4.0.2", - "portscanner": "1.2.0", - "serve-index": "1.9.1", - "serve-static": "1.13.1" - } - }, - "grunt-contrib-copy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", - "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "file-sync-cmp": "0.1.1" - } - }, - "grunt-contrib-jshint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", - "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "hooker": "0.2.3", - "jshint": "2.9.5" - } - }, - "grunt-contrib-watch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz", - "integrity": "sha1-hKGnodar0m7VaEE0lscxM+mQAY8=", - "dev": true, - "requires": { - "async": "1.5.2", - "gaze": "1.1.2", - "lodash": "3.10.1", - "tiny-lr": "0.2.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } - }, - "grunt-karma": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-karma/-/grunt-karma-2.0.0.tgz", - "integrity": "sha1-dTWD0RXf3AVf5X5Y+W1rPH5hIRg=", - "dev": true, - "requires": { - "lodash": "3.10.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } - }, - "grunt-known-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", "dev": true }, - "grunt-legacy-log": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz", - "integrity": "sha1-+4bxgJhHvAfcR4Q/ns1srLYt8tU=", - "dev": true, - "requires": { - "colors": "1.1.2", - "grunt-legacy-log-utils": "1.0.0", - "hooker": "0.2.3", - "lodash": "3.10.1", - "underscore.string": "3.2.3" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } - }, - "grunt-legacy-log-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", - "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "lodash": "4.3.0" - }, - "dependencies": { - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - } - } - }, - "grunt-legacy-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", - "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", - "dev": true, - "requires": { - "async": "1.5.2", - "exit": "0.1.2", - "getobject": "0.1.0", - "hooker": "0.2.3", - "lodash": "4.3.0", - "underscore.string": "3.2.3", - "which": "1.2.14" - }, - "dependencies": { - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - } - } - }, - "grunt-webpack": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-webpack/-/grunt-webpack-2.0.1.tgz", - "integrity": "sha1-hMXZNzreiEaChd54cCHEKpfVMGw=", + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "lodash": "4.17.4" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -2346,6 +2476,14 @@ "dev": true, "requires": { "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } } }, "has-cors": { @@ -2354,12 +2492,6 @@ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", "dev": true }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, "hash-base": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", @@ -2400,18 +2532,30 @@ "os-tmpdir": "1.0.2" } }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", "dev": true }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "wbuf": "1.7.2" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, "htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", @@ -2423,8 +2567,40 @@ "domutils": "1.5.1", "entities": "1.0.0", "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } } }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, "http-errors": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", @@ -2434,15 +2610,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.3.1" - }, - "dependencies": { - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } + "statuses": "1.4.0" } }, "http-parser-js": { @@ -2461,11 +2629,34 @@ "requires-port": "1.0.0" } }, - "http2": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/http2/-/http2-3.3.7.tgz", - "integrity": "sha512-puSi8M8WNlFJm9Pk4c/Mbz9Gwparuj3gO9/RRO5zv6piQ0FY+9Qywp0PdWshYgsMJSalixFY7eC6oPu0zRxLAQ==", - "dev": true + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "requires": { + "http-proxy": "1.16.2", + "is-glob": "3.1.0", + "lodash": "4.17.4", + "micromatch": "2.3.11" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } }, "https-browserify": { "version": "0.0.1", @@ -2485,6 +2676,16 @@ "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", "dev": true }, + "import-local": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", + "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -2516,6 +2717,15 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "3.7.0" + } + }, "interpret": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", @@ -2537,6 +2747,12 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, "ipaddr.js": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", @@ -2559,9 +2775,9 @@ } }, "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-builtin-module": { @@ -2573,6 +2789,18 @@ "builtin-modules": "1.1.1" } }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", @@ -2636,6 +2864,30 @@ "kind-of": "3.2.2" } }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", @@ -2648,16 +2900,43 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isbinaryfile": { @@ -2679,14 +2958,6 @@ "dev": true, "requires": { "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } } }, "jasmine-core": { @@ -2701,16 +2972,6 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "js-yaml": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", - "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" - } - }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", @@ -2741,20 +3002,42 @@ } } }, + "jshint-loader": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/jshint-loader/-/jshint-loader-0.8.4.tgz", + "integrity": "sha1-tD7kXRN3adVliUChH479mg7c1Hs=", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "rcloader": "0.1.2", + "strip-json-comments": "0.1.3" + }, + "dependencies": { + "strip-json-comments": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz", + "integrity": "sha1-Fkxk43Coo8wAyeAbU55WmCPw7lQ=", + "dev": true + } + } + }, "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, - "json-stable-stringify": { + "json-parse-better-errors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true }, "json3": { "version": "3.3.2", @@ -2768,6 +3051,15 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -2824,7 +3116,7 @@ "dev": true, "requires": { "fs-access": "1.0.1", - "which": "1.2.14" + "which": "1.3.0" } }, "karma-firefox-launcher": { @@ -2833,28 +3125,73 @@ "integrity": "sha1-zlj0fCATqIFW1VpdYTN8CZz1u1E=", "dev": true }, - "karma-ie-launcher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/karma-ie-launcher/-/karma-ie-launcher-1.0.0.tgz", - "integrity": "sha1-SXmGhCxJAZA0bNifVJTKmDDG1Zw=", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, "karma-jasmine": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.0.tgz", "integrity": "sha1-IuTAa/mhguUpTR9wXjczgRuBCs8=", "dev": true }, + "karma-sourcemap-loader": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", + "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "karma-webpack": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.6.tgz", + "integrity": "sha512-dcKvtiW00caWrceCKwIvlKwHQu8zI+e3zWZYDLk7kr7nl1lYSp8uP+8fQoBvRCnZiPUGuwU5Psm20NbEIn7KlA==", + "dev": true, + "requires": { + "async": "0.9.2", + "loader-utils": "0.2.17", + "lodash": "3.10.1", + "source-map": "0.5.7", + "webpack-dev-middleware": "1.12.0" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } }, "lazy-cache": { @@ -2872,23 +3209,24 @@ "invert-kv": "1.0.0" } }, - "livereload-js": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz", - "integrity": "sha1-bIclfmSKtHW8JOoldFftzB+NC8I=", - "dev": true - }, "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "2.2.0", "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "strip-bom": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, "loader-runner": { @@ -2898,15 +3236,24 @@ "dev": true }, "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { "big.js": "3.2.0", "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "json5": "0.5.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" } }, "lodash": { @@ -2915,6 +3262,12 @@ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, "log4js": { "version": "0.6.38", "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", @@ -2925,6 +3278,12 @@ "semver": "4.3.6" }, "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -2937,14 +3296,20 @@ "string_decoder": "0.10.31" } }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true } } }, + "loglevel": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.0.tgz", + "integrity": "sha1-rgyqVhERSYxboTcj1vtjHSQAOTQ=", + "dev": true + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -2976,12 +3341,27 @@ "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", "dev": true }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -3010,6 +3390,15 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -3018,40 +3407,14 @@ "requires": { "errno": "0.1.4", "readable-stream": "2.3.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } } }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", @@ -3064,17 +3427,96 @@ "map-obj": "1.0.1", "minimist": "1.2.0", "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", + "object-assign": "4.1.0", "read-pkg-up": "1.0.1", "redent": "1.0.0", "trim-newlines": "1.0.0" }, "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } } } }, @@ -3142,6 +3584,12 @@ "mime-db": "1.30.0" } }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, "minimalistic-assert": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", @@ -3178,31 +3626,49 @@ "minimist": "0.0.8" } }, - "morgan": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", - "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", - "dev": true, - "requires": { - "basic-auth": "2.0.0", - "debug": "2.6.9", - "depd": "1.1.1", - "on-finished": "2.3.0", - "on-headers": "1.0.1" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "multicast-dns": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", + "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", + "dev": true, + "requires": { + "dns-packet": "1.2.2", + "thunky": "0.1.0" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", + "dev": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "node-forge": { + "version": "0.6.33", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", + "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", + "dev": true + }, "node-libs-browser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", @@ -3214,7 +3680,7 @@ "buffer": "4.9.1", "console-browserify": "1.1.0", "constants-browserify": "1.0.0", - "crypto-browserify": "3.11.1", + "crypto-browserify": "3.12.0", "domain-browser": "1.1.7", "events": "1.1.1", "https-browserify": "0.0.1", @@ -3234,49 +3700,14 @@ "vm-browserify": "0.0.4" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } } } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1.1.1" - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -3285,7 +3716,7 @@ "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", - "semver": "5.4.1", + "semver": "4.3.6", "validate-npm-package-license": "3.0.1" } }, @@ -3298,6 +3729,111 @@ "remove-trailing-separator": "1.1.0" } }, + "npm-run-all": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.2.tgz", + "integrity": "sha512-Z2aRlajMK4SQ8u19ZA75NZZu7wupfCNQWdYosIi8S6FgBdGf/8Y6Hgyjdc8zU2cYmIRVCx1nM80tJPkdEd+UYg==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "chalk": "2.3.0", + "cross-spawn": "5.1.0", + "memorystream": "0.3.1", + "minimatch": "3.0.4", + "ps-tree": "1.1.0", + "read-pkg": "3.0.0", + "shell-quote": "1.6.1", + "string.prototype.padend": "3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, "null-check": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", @@ -3311,9 +3847,9 @@ "dev": true }, "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", "dev": true }, "object-component": { @@ -3322,6 +3858,12 @@ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", "dev": true }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -3332,6 +3874,12 @@ "is-extendable": "0.1.1" } }, + "obuf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", + "dev": true + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -3357,13 +3905,12 @@ } }, "opn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", "dev": true, "requires": { - "object-assign": "4.1.1", - "pinkie-promise": "2.0.1" + "is-wsl": "1.1.0" } }, "optimist": { @@ -3382,6 +3929,27 @@ "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", "dev": true }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.5" + }, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.4", + "requires-port": "1.0.0" + } + } + } + }, "os-browserify": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", @@ -3395,12 +3963,14 @@ "dev": true }, "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "lcid": "1.0.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "os-tmpdir": { @@ -3409,6 +3979,33 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, "pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -3421,7 +4018,7 @@ "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", "dev": true, "requires": { - "asn1.js": "4.9.1", + "asn1.js": "4.9.2", "browserify-aes": "1.1.1", "create-hash": "1.1.3", "evp_bytestokey": "1.0.3", @@ -3489,13 +4086,10 @@ "dev": true }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -3503,6 +4097,18 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -3510,14 +4116,29 @@ "dev": true }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" } }, "pbkdf2": { @@ -3534,9 +4155,9 @@ } }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pinkie": { @@ -3555,21 +4176,31 @@ } }, "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "2.1.0" } }, - "portscanner": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.2.0.tgz", - "integrity": "sha1-sUu9olfRTDEPqcwJaCrwLUCWGAI=", + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", "dev": true, "requires": { - "async": "1.5.2" + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } } }, "preserve": { @@ -3612,6 +4243,21 @@ "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", "dev": true }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "dev": true, + "requires": { + "event-stream": "3.3.4" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, "public-encrypt": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", @@ -3655,6 +4301,12 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", @@ -3680,7 +4332,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } } } @@ -3691,7 +4343,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } } } @@ -3705,6 +4357,16 @@ "safe-buffer": "5.1.1" } }, + "randomfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", + "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "dev": true, + "requires": { + "randombytes": "2.0.5", + "safe-buffer": "5.1.1" + } + }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -3723,37 +4385,67 @@ "unpipe": "1.0.0" } }, + "rcfinder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", + "integrity": "sha1-8+gPOH3fmugK4wpBADKWQuroERU=", + "dev": true, + "requires": { + "lodash.clonedeep": "4.5.0" + } + }, + "rcloader": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/rcloader/-/rcloader-0.1.2.tgz", + "integrity": "sha1-oJY6ZDfQnvjLktky0trUl7DRc2w=", + "dev": true, + "requires": { + "lodash": "2.4.2", + "rcfinder": "0.1.9" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + } + } + }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "1.1.0", + "load-json-file": "2.0.0", "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "path-type": "2.0.0" } }, "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "2.1.0", + "read-pkg": "2.0.0" } }, "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "readdirp": { @@ -3766,38 +4458,6 @@ "minimatch": "3.0.4", "readable-stream": "2.3.3", "set-immediate-shim": "1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } } }, "redent": { @@ -3921,10 +4581,19 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, "right-align": { @@ -3955,22 +4624,31 @@ "inherits": "2.0.3" } }, - "rx": { - "version": "2.3.24", - "resolved": "https://registry.npmjs.org/rx/-/rx-2.3.24.tgz", - "integrity": "sha1-FPlQpCF9fjXapxu8vljv9o6ksrc=", - "dev": true - }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", + "integrity": "sha1-v4y3uDJWxFUeMTR8YxF3jbme7FI=", + "dev": true, + "requires": { + "node-forge": "0.6.33" + } + }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", "dev": true }, "send": { @@ -3992,6 +4670,14 @@ "on-finished": "2.3.0", "range-parser": "1.2.0", "statuses": "1.3.1" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } } }, "serve-index": { @@ -4007,6 +4693,18 @@ "http-errors": "1.6.2", "mime-types": "2.1.17", "parseurl": "1.3.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + } } }, "serve-static": { @@ -4040,9 +4738,9 @@ "dev": true }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", "dev": true }, "sha.js": { @@ -4055,6 +4753,33 @@ "safe-buffer": "5.1.1" } }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + }, "shelljs": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", @@ -4102,12 +4827,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true } } }, @@ -4201,6 +4920,12 @@ "ms": "0.7.1" } }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, "ms": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", @@ -4209,6 +4934,41 @@ } } }, + "sockjs": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", + "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "dev": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "2.0.3" + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.2.0" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + } + } + }, "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", @@ -4230,12 +4990,6 @@ "source-map": "0.5.7" } }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", - "dev": true - }, "spdx-correct": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", @@ -4257,16 +5011,48 @@ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.1", + "select-hose": "2.0.0", + "spdy-transport": "2.0.20" + } + }, + "spdy-transport": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", + "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "dev": true, + "requires": { + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "safe-buffer": "5.1.1", + "wbuf": "1.7.2" + } + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } }, "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true }, "stream-browserify": { @@ -4277,38 +5063,15 @@ "requires": { "inherits": "2.0.3", "readable-stream": "2.3.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } + } + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" } }, "stream-http": { @@ -4322,55 +5085,59 @@ "readable-stream": "2.3.3", "to-arraybuffer": "1.0.1", "xtend": "4.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "ansi-regex": "3.0.0" } } } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "define-properties": "1.1.2", + "es-abstract": "1.9.0", + "function-bind": "1.1.1" } }, "strip-ansi": { @@ -4383,13 +5150,16 @@ } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true }, "strip-indent": { "version": "1.0.1", @@ -4418,6 +5188,24 @@ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "thunky": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", + "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + }, "timers-browserify": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", @@ -4427,110 +5215,6 @@ "setimmediate": "1.0.5" } }, - "tiny-lr": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", - "integrity": "sha1-s/26gC5dVqM8L28QeUsy5Hescp0=", - "dev": true, - "requires": { - "body-parser": "1.14.2", - "debug": "2.2.0", - "faye-websocket": "0.10.0", - "livereload-js": "2.2.2", - "parseurl": "1.3.2", - "qs": "5.1.0" - }, - "dependencies": { - "body-parser": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", - "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", - "dev": true, - "requires": { - "bytes": "2.2.0", - "content-type": "1.0.4", - "debug": "2.2.0", - "depd": "1.1.1", - "http-errors": "1.3.1", - "iconv-lite": "0.4.13", - "on-finished": "2.3.0", - "qs": "5.2.0", - "raw-body": "2.1.7", - "type-is": "1.6.15" - }, - "dependencies": { - "qs": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", - "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", - "dev": true - } - } - }, - "bytes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", - "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "http-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "statuses": "1.3.1" - } - }, - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "qs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", - "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", - "dev": true - }, - "raw-body": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", - "dev": true, - "requires": { - "bytes": "2.4.0", - "iconv-lite": "0.4.13", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", - "dev": true - } - } - } - } - }, "tmp": { "version": "0.0.31", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", @@ -4558,12 +5242,6 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, - "tree-kill": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", - "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", - "dev": true - }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -4603,12 +5281,6 @@ "yargs": "3.10.0" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", @@ -4630,16 +5302,27 @@ "dev": true, "optional": true }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.0.2" + } + }, "ultron": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", "dev": true }, - "underscore.string": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", - "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", "dev": true }, "unpipe": { @@ -4666,6 +5349,24 @@ } } }, + "url-parse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "dev": true, + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + }, + "dependencies": { + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + } + } + }, "useragent": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", @@ -4705,6 +5406,12 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", @@ -4742,79 +5449,309 @@ "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", "dev": true, "requires": { - "async": "2.5.0", + "async": "2.6.0", "chokidar": "1.7.0", "graceful-fs": "4.1.11" - }, - "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - } + } + }, + "wbuf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", + "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "dev": true, + "requires": { + "minimalistic-assert": "1.0.0" } }, "webpack": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", - "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", + "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", "dev": true, "requires": { - "acorn": "5.1.2", + "acorn": "5.2.1", "acorn-dynamic-import": "2.0.2", - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "async": "2.5.0", + "ajv": "5.3.0", + "ajv-keywords": "2.1.1", + "async": "2.6.0", "enhanced-resolve": "3.4.1", + "escope": "3.6.0", "interpret": "1.0.4", "json-loader": "0.5.7", "json5": "0.5.1", "loader-runner": "2.3.0", - "loader-utils": "0.2.17", + "loader-utils": "1.1.0", "memory-fs": "0.4.1", "mkdirp": "0.5.1", "node-libs-browser": "2.0.0", "source-map": "0.5.7", - "supports-color": "3.2.3", + "supports-color": "4.5.0", "tapable": "0.2.8", - "uglify-js": "2.8.29", + "uglifyjs-webpack-plugin": "0.4.6", "watchpack": "1.4.0", - "webpack-sources": "1.0.1", + "webpack-sources": "1.0.2", + "yargs": "8.0.2" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", + "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", + "dev": true, + "requires": { + "memory-fs": "0.4.1", + "mime": "1.4.1", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + } + }, + "webpack-dev-server": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.9.4.tgz", + "integrity": "sha512-thrqC0EQEoSjXeYgP6pUXcUCZ+LNrKsDPn+mItLnn5VyyNZOJKd06hUP5vqkYwL8nWWXsii0loSF9NHNccT6ow==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "3.0.3", + "bonjour": "3.5.0", + "chokidar": "1.7.0", + "compression": "1.7.1", + "connect-history-api-fallback": "1.5.0", + "debug": "3.1.0", + "del": "3.0.0", + "express": "4.16.2", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.17.4", + "import-local": "0.1.1", + "internal-ip": "1.2.0", + "ip": "1.1.5", + "killable": "1.0.0", + "loglevel": "1.6.0", + "opn": "5.1.0", + "portfinder": "1.0.13", + "selfsigned": "1.10.1", + "serve-index": "1.9.1", + "sockjs": "0.3.18", + "sockjs-client": "1.1.4", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "4.5.0", + "webpack-dev-middleware": "1.12.0", "yargs": "6.6.0" }, "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "lodash": "4.17.4" + "is-utf8": "0.2.1" } }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { - "has-flag": "1.0.0" + "camelcase": "3.0.0" } } } }, "webpack-sources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.2.tgz", + "integrity": "sha512-Y7UddMCv6dGjy81nBv6nuQeFFIt5aalHm7uyDsAsW86nZwfOVPGRr3XMjEQLaT+WKo8rlzhC9qtbJvYKLtAwaw==", "dev": true, "requires": { "source-list-map": "2.0.0", - "source-map": "0.5.7" + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "websocket-driver": { @@ -4824,28 +5761,28 @@ "dev": true, "requires": { "http-parser-js": "0.4.9", - "websocket-extensions": "0.1.2" + "websocket-extensions": "0.1.3" } }, "websocket-extensions": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.2.tgz", - "integrity": "sha1-Dhh4HeYpoYMIzhSBZQ9n/6JpOl0=", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { "isexe": "2.0.0" } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "window-size": { @@ -4868,6 +5805,19 @@ "requires": { "string-width": "1.0.2", "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } } }, "wrappy": { @@ -4910,31 +5860,37 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "3.0.0", + "camelcase": "4.1.0", "cliui": "3.2.0", "decamelize": "1.2.0", "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", "require-directory": "2.1.1", "require-main-filename": "1.0.1", "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", "y18n": "3.2.1", - "yargs-parser": "4.2.1" + "yargs-parser": "7.0.0" }, "dependencies": { "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, "cliui": { @@ -4946,23 +5902,36 @@ "string-width": "1.0.2", "strip-ansi": "3.0.1", "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } } } } }, "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "3.0.0" + "camelcase": "4.1.0" }, "dependencies": { "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true } } diff --git a/package.json b/package.json index 0a6d903b..04b1c725 100644 --- a/package.json +++ b/package.json @@ -19,33 +19,34 @@ }, "license": "MIT", "scripts": { - "start": "grunt", - "test": "grunt test", - "dev": "concurrently --kill-others --raw \"grunt server\" \"grunt test\"", - "build": "grunt build" + "prod-build": "webpack", + "prod-test": "karma start test/config/karma.conf.js", + "dev-server": "webpack-dev-server", + "dev-test": "karma start test/config/karma.conf.js", + "hint-tests": "jshint --verbose test", + "build": "npm run hint-tests && npm run prod-build && npm run prod-test", + "dev": "npm-run-all --parallel dev-server dev-test", + "test": "npm run dev-test", + "start": "npm run dev-server" }, "devDependencies": { - "babel-core": "^6.22.1", - "babel-loader": "^6.2.10", - "babel-preset-es2015": "^6.22.0", - "clean-webpack-plugin": "^0.1.15", - "concurrently": "^3.4.0", - "express": "^4.14.0", - "grunt": "^1.0.1", - "grunt-contrib-clean": "^1.0.0", - "grunt-contrib-connect": "^1.0.2", - "grunt-contrib-copy": "^1.0.0", - "grunt-contrib-jshint": "^1.1.0", - "grunt-contrib-watch": "^1.0.0", - "grunt-karma": "^2.0.0", - "grunt-webpack": "^2.0.1", - "jasmine-core": "^2.5.2", - "karma": "^1.4.0", - "karma-chrome-launcher": "^2.0.0", + "babel-core": "^6.24.1", + "babel-loader": "^7.1.2", + "babel-preset-es2015": "^6.24.1", + "clean-webpack-plugin": "^0.1.17", + "copy-webpack-plugin": "^4.2.0", + "jasmine-core": "^2.8.0", + "jshint": "^2.9.2", + "jshint-loader": "^0.8.4", + "karma": "^1.7.1", + "karma-chrome-launcher": "^2.2.0", "karma-firefox-launcher": "^1.0.1", - "karma-ie-launcher": "^1.0.0", "karma-jasmine": "^1.1.0", - "webpack": "^2.6.1" + "karma-sourcemap-loader": "^0.3.7", + "karma-webpack": "^2.0.6", + "npm-run-all": "^4.1.2", + "webpack": "^3.8.1", + "webpack-dev-server": "^2.9.4" }, "keywords": [ "angular", diff --git a/src/.jshintrc b/src/.jshintrc deleted file mode 100644 index da64ed08..00000000 --- a/src/.jshintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "esversion": 6, - "expr": true, - "strict": false -} diff --git a/test/.jshintrc b/test/.jshintrc new file mode 100644 index 00000000..70cbca97 --- /dev/null +++ b/test/.jshintrc @@ -0,0 +1,33 @@ +{ + "bitwise": true, + "curly": true, + "browser": true, + "eqeqeq": true, + "expr": true, + "esversion": 6, + "forin": true, + "freeze": true, + "futurehostile": true, + "iterator": true, + "jasmine": true, + "jquery": true, + "latedef": true, + "noarg": true, + "nocomma": true, + "node": true, + "nonbsp": true, + "nonew": true, + "smarttabs": true, + "strict": true, + "sub": true, + "trailing": true, + "undef": true, + "unused": true, + "globals": { + "angular": false, + "inject": false, + "runTest": true, + "runGridTest": false, + "Helper": true + } +} diff --git a/test/AdapterTestsSpec.js b/test/AdapterTestsSpec.js index ec3e1392..aefb5ec8 100644 --- a/test/AdapterTestsSpec.js +++ b/test/AdapterTestsSpec.js @@ -1,4 +1,3 @@ -/*global describe, beforeEach, module, it, expect, runTest */ describe('uiScroll', function () { 'use strict'; @@ -37,7 +36,7 @@ describe('uiScroll', function () { function (viewport, scope) { scope.adapter.applyUpdates( - function (item, scope) { + function(item, scope){ return [item + ' *' + scope.$index]; } ); @@ -68,8 +67,9 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item, scope) { - if (item === 'one') + if (item === 'one') { return [item + ' *' + scope.$index]; + } } ); @@ -100,8 +100,9 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item, scope) { - if (item === 'two') + if (item === 'two') { return [item + ' *' + scope.$index]; + } } ); @@ -132,8 +133,9 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item, scope) { - if (item === 'three') + if (item === 'three') { return [item + ' *' + scope.$index]; + } } ); @@ -164,8 +166,9 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item) { - if (item === 'one') + if (item === 'one') { return []; + } } ); @@ -192,8 +195,9 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item) { - if (item === 'two') + if (item === 'two') { return []; + } } ); @@ -220,8 +224,9 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item) { - if (item === 'three') + if (item === 'three') { return []; + } } ); @@ -248,8 +253,9 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item) { - if (item === 'one') + if (item === 'one') { return ['before one', item]; + } } ); @@ -285,8 +291,9 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item) { - if (item.text === 'one') + if (item.text === 'one') { return [item, {text: 'after one'}]; + } } ); @@ -321,8 +328,9 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item) { - if (item === 'two') + if (item === 'two') { return ['before two', item]; + } } ); @@ -357,8 +365,9 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item) { - if (item === 'three') + if (item === 'three') { return [item, 'after three']; + } } ); @@ -799,7 +808,7 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item, scope) { - if (scope.$index == 1) { + if (scope.$index === 1) { item.text += ' *' + scope.$index; return [ {text: item.text + ' before 1'}, @@ -856,7 +865,7 @@ describe('uiScroll', function () { scope.adapter.applyUpdates( function (item, scope) { - if (scope.$index == 2) { + if (scope.$index === 2) { item.text += ' *' + scope.$index; return [ {text: item.text + ' before 1'}, @@ -1252,4 +1261,4 @@ describe('uiScroll', function () { }); -}); \ No newline at end of file +}); diff --git a/test/AssigningSpec.js b/test/AssigningSpec.js index 12c2edce..9f08b778 100644 --- a/test/AssigningSpec.js +++ b/test/AssigningSpec.js @@ -1,4 +1,3 @@ -/*global describe, beforeEach, module, it, expect */ describe('uiScroll', function () { 'use strict'; diff --git a/test/BasicSetupSpec.js b/test/BasicSetupSpec.js index d732b31d..ffceaeb1 100644 --- a/test/BasicSetupSpec.js +++ b/test/BasicSetupSpec.js @@ -1,4 +1,3 @@ -/*global describe, beforeEach, module, inject, it, spyOn, expect, $, runTest, Helper */ describe('uiScroll', function() { 'use strict'; @@ -108,4 +107,4 @@ describe('uiScroll', function() { ); }); }); -}); \ No newline at end of file +}); diff --git a/test/BasicTestsSpec.js b/test/BasicTestsSpec.js index 01789725..af792169 100644 --- a/test/BasicTestsSpec.js +++ b/test/BasicTestsSpec.js @@ -1,4 +1,3 @@ -/*global describe, beforeEach, module, inject, it, spyOn, expect, runTest, Helper */ describe('uiScroll', function () { 'use strict'; @@ -799,4 +798,4 @@ describe('uiScroll', function () { }); }); -}); \ No newline at end of file +}); diff --git a/test/GridTestsSpec.js b/test/GridTestsSpec.js index 2aeb76a9..e57212e9 100644 --- a/test/GridTestsSpec.js +++ b/test/GridTestsSpec.js @@ -1,4 +1,3 @@ -/*global describe, beforeEach, module, it, expect, runGridTest */ describe('uiScroll', function () { 'use strict'; @@ -421,4 +420,4 @@ describe('uiScroll', function () { }); }); -}); \ No newline at end of file +}); diff --git a/test/PaddingsSpec.js b/test/PaddingsSpec.js index 5cb241eb..df80b4b1 100644 --- a/test/PaddingsSpec.js +++ b/test/PaddingsSpec.js @@ -1,4 +1,3 @@ -/*global describe, beforeEach, module, it, expect, runTest, Helper */ describe('uiScroll Paddings spec.', () => { 'use strict'; @@ -56,7 +55,7 @@ describe('uiScroll Paddings spec.', () => { } else { datasource.max--; - } + } } } } @@ -402,4 +401,4 @@ describe('uiScroll Paddings spec.', () => { ); }); -}); \ No newline at end of file +}); diff --git a/test/VisibilitySwitchingSpec.js b/test/VisibilitySwitchingSpec.js index 5cee1876..5774052a 100644 --- a/test/VisibilitySwitchingSpec.js +++ b/test/VisibilitySwitchingSpec.js @@ -1,4 +1,3 @@ -/*global describe, beforeEach, module, it, expect, runTest */ describe('uiScroll visibility.', () => { 'use strict'; diff --git a/test/config/karma.conf.files.js b/test/config/karma.conf.files.js index e89da37c..3570fb61 100644 --- a/test/config/karma.conf.files.js +++ b/test/config/karma.conf.files.js @@ -1,26 +1,31 @@ -var scrollerPath = '../../temp/' - -var files = [ - 'http://code.jquery.com/jquery-1.9.1.js', - 'https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.js', - 'https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-mocks.js', +const files = [ + 'https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js', + 'https://ajax.googleapis.com/ajax/libs/angularjs/1.6.5/angular.js', + 'https://ajax.googleapis.com/ajax/libs/angularjs/1.6.5/angular-mocks.js', '../misc/test.css', '../misc/datasources.js', '../misc/scaffolding*.js', '../misc/helpers.js', - '../*Spec.js', { - pattern: scrollerPath + '*.js.map', - included: false + pattern: '../*Spec.js', + watched: false, + served: true, + included: true } ]; -module.exports.defaultFiles = files.concat([ - scrollerPath + 'ui-scroll.js', - scrollerPath + 'ui-scroll-grid.js' -]); +module.exports.development = [ + ...files, + '../../src/ui-scroll.js', + '../../src/ui-scroll-grid.js' +]; -module.exports.compressedFiles = files.concat([ - scrollerPath + 'ui-scroll.min.js', - scrollerPath + 'ui-scroll-grid.min.js' -]); +module.exports.production = [ + ...files, + '../../dist/ui-scroll.min.js', + '../../dist/ui-scroll-grid.min.js', + { + pattern: '../../dist/*.js.map', + included: false + } +]; diff --git a/test/config/karma.conf.js b/test/config/karma.conf.js index 01af418f..26011fef 100644 --- a/test/config/karma.conf.js +++ b/test/config/karma.conf.js @@ -1,73 +1,48 @@ -// Karma configuration -// Generated on Sat Aug 10 2013 19:47:03 GMT-0500 (Central Daylight Time) +const chrome = process.platform === 'linux' ? 'Chromium' : 'Chrome'; -module.exports = function (config) { - config.set({ +const ENV = (process.env.npm_lifecycle_event.indexOf('dev') === 0) ? 'development' : 'production'; - // base path, that will be used to resolve files and exclude - basePath: '', +const webpackSettings = ENV === 'development' ? { + preprocessors: { + '../../src/ui-scroll*.js': ['webpack', 'sourcemap'] + }, + webpack: require('../../webpack.config.js') +} : {}; +module.exports = function (config) { + 'use strict'; - // frameworks to use - frameworks: ['jasmine'], + config.set(Object.assign({ + basePath: '', - // list of files / patterns to load in the browser - files: require('./karma.conf.files.js').defaultFiles, + frameworks: ['jasmine'], + files: [ + ...require('./karma.conf.files.js')[ENV] + ], - // list of files to exclude exclude: [], - - // test results reporter to use - // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage' reporters: ['dots'], + port: ENV === 'development' ? 9100 : 8082, - // web server port - port: 8082, - - - // enable / disable colors in the output (reporters and logs) colors: true, - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG logLevel: config.LOG_INFO, + autoWatch: ENV === 'development', - // enable / disable watching file and executing tests whenever any file changes - autoWatch: true, - + keepalive: ENV === 'development', - keepalive: true, - - - // Start these browsers, currently available: - // - Chrome - // - ChromeCanary - // - Firefox - // - Opera - // - Safari (only Mac) - // - PhantomJS - // - IE (only Windows) browsers: process.env.TRAVIS ? - ['Firefox'] : - //['Chrome', 'IE', 'Firefox'], - ['Chrome'], - //browsers: ['Firefox'], - //browsers = ['Chrome']; - //browsers = ['IE']; - + ['Firefox', chrome] : + [chrome], - // If browser does not capture in given timeout [ms], kill it captureTimeout: 60000, + singleRun: ENV !== 'development' - // Continuous Integration mode - // if true, it capture browsers, run tests and exit - singleRun: false - }); + }, webpackSettings)); }; diff --git a/test/jqliteExtrasSpec.js b/test/jqliteExtrasSpec.js index 45045cdb..c1b5ed3e 100644 --- a/test/jqliteExtrasSpec.js +++ b/test/jqliteExtrasSpec.js @@ -89,16 +89,12 @@ describe('\njqLite: testing against jQuery\n', function () { '
    some text w padding
    ', '
    some text w margin
    ', '
    some text w margin
    ', - '
    some text w margin
    ', - '
    some text w line height
    ' + '
    some text w margin
    ' ], function(element) { - /*function validateHeight(element) { - expect(extras.prototype.height.call(element)).toBe(element.height()); - var h = element.height(); - extras.prototype.height.call(element, h*2); - expect(extras.prototype.height.call(element)).toBe(h*2); - }*/ + // Since jQuery v3 the .hegth() results don't being rounded (https://github.com/jquery/jquery/pull/2454). + // So the element '
    some text w line height
    ' will cause the error -- + // Expected 18 to be 17.6 it('height(value) for ' + element, function() { (function (element) { diff --git a/test/misc/datasources.js b/test/misc/datasources.js index 4330d17e..d983fa6e 100644 --- a/test/misc/datasources.js +++ b/test/misc/datasources.js @@ -1,220 +1,228 @@ -angular.module('ui.scroll.test.datasources', []) - - .factory('myEmptyDatasource', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(index, count, success) { - success([]); - } - }; - } - ]) - - .factory('myDescriptoEmptyDatasource', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(descriptor, success) { - success([]); - } - }; - } - ]) - - .factory('myOnePageDatasource', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(index, count, success) { - if (index === 1) { - success(['one', 'two', 'three']); - } else { +(function() { + 'use strict'; + + angular.module('ui.scroll.test.datasources', []) + + .factory('myEmptyDatasource', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(index, count, success) { success([]); } - } - }; - } - ]) - - .factory('myOneBigPageDatasource', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(index, count, success) { - if (index === 1) { - var resultList = []; - for (var i = 1; i < 100; i++) { - resultList.push('item' + i); - } - success(resultList); - } else { + }; + } + ]) + + .factory('myDescriptoEmptyDatasource', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(descriptor, success) { success([]); } - } - }; - } - ]) - - .factory('myDescriptorOnePageDatasource', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(descriptor, success) { - if (descriptor.index === 1) { - success(['one', 'two', 'three']); - } else { - success([]); + }; + } + ]) + + .factory('myOnePageDatasource', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(index, count, success) { + if (index === 1) { + success(['one', 'two', 'three']); + } else { + success([]); + } } - } + }; } - } - ]) - - .factory('myObjectDatasource', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(index, count, success) { - if (index === 1) { - success([{ text: 'one' }, { text: 'two' }, { text: 'three' }]); - } else { - success([]); + ]) + + .factory('myOneBigPageDatasource', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(index, count, success) { + if (index === 1) { + var resultList = []; + for (var i = 1; i < 100; i++) { + resultList.push('item' + i); + } + success(resultList); + } else { + success([]); + } } - } - }; - } - ]) - - .factory('myMultipageDatasource', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(index, count, success) { - var result = []; - for (var i = index; i < index + count; i++) { - if (i > 0 && i <= 20) - result.push('item' + i); + }; + } + ]) + + .factory('myDescriptorOnePageDatasource', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(descriptor, success) { + if (descriptor.index === 1) { + success(['one', 'two', 'three']); + } else { + success([]); + } } - success(result); - } - }; - } - ]) - - .factory('anotherDatasource', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(index, count, success) { - var result = []; - for (var i = index; i < index + count; i++) { - if (i > -3 && i < 1) - result.push('item' + i); + }; + } + ]) + + .factory('myObjectDatasource', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(index, count, success) { + if (index === 1) { + success([{ text: 'one' }, { text: 'two' }, { text: 'three' }]); + } else { + success([]); + } } - success(result); - } - }; - } - ]) - - .factory('myEdgeDatasource', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(index, count, success) { - var result = []; - for (var i = index; i < index + count; i++) { - if (i > -6 && i <= 6) - result.push('item' + i); + }; + } + ]) + + .factory('myMultipageDatasource', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(index, count, success) { + var result = []; + for (var i = index; i < index + count; i++) { + if (i > 0 && i <= 20) { + result.push('item' + i); + } + } + success(result); } - success(result); - } - }; - } - ]) - - .factory('myDatasourceToPreventScrollBubbling', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(index, count, success) { - var result = []; - for (var i = index; i < index + count; i++) { - if (i < -6 || i > 20) { - break; + }; + } + ]) + + .factory('anotherDatasource', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(index, count, success) { + var result = []; + for (var i = index; i < index + count; i++) { + if (i > -3 && i < 1) { + result.push('item' + i); + } } - result.push('item' + i); + success(result); } - success(result); - } - }; - } - ]) - - .factory('myInfiniteDatasource', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(index, count, success) { - var result = []; - for (var i = index; i < index + count; i++) { - result.push('item' + i); + }; + } + ]) + + .factory('myEdgeDatasource', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(index, count, success) { + var result = []; + for (var i = index; i < index + count; i++) { + if (i > -6 && i <= 6) { + result.push('item' + i); + } + } + success(result); } - success(result); - } - }; - } - ]) - - .factory('myGridDatasource', [ - '$log', '$timeout', '$rootScope', - function() { - return { - get: function(index, count, success) { - var result = []; - for (var i = index; i < index + count; i++) { - result.push({ - col0: 'col0', - col1: 'col1', - col2: 'col2', - col3: 'col3' - }); + }; + } + ]) + + .factory('myDatasourceToPreventScrollBubbling', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(index, count, success) { + var result = []; + for (var i = index; i < index + count; i++) { + if (i < -6 || i > 20) { + break; + } + result.push('item' + i); + } + success(result); } - success(result); - } - }; - } - ]) - - - .factory('myResponsiveDatasource', function() { - var datasource = { - data: [], - min: 1, - max: 30, - init: function() { - this.data = []; - for (var i = this.min; i <= this.max; i++) { - this.data.push('item' + i); + }; + } + ]) + + .factory('myInfiniteDatasource', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(index, count, success) { + var result = []; + for (var i = index; i < index + count; i++) { + result.push('item' + i); + } + success(result); } - }, - getItem: function(index) { - return this.data[index - this.min]; - }, - get: function(index, count, success) { - var result = []; - var start = Math.max(this.min, index); - var end = Math.min(index + count - 1, this.max); - if (start <= end) { - for (var i = start; i <= end; i++) { - result.push(this.getItem(i)); + }; + } + ]) + + .factory('myGridDatasource', [ + '$log', '$timeout', '$rootScope', + function() { + return { + get: function(index, count, success) { + var result = []; + for (var i = index; i < index + count; i++) { + result.push({ + col0: 'col0', + col1: 'col1', + col2: 'col2', + col3: 'col3' + }); } + success(result); } - success(result); - } - }; - datasource.init(); - return datasource; - } - ); \ No newline at end of file + }; + } + ]) + + + .factory('myResponsiveDatasource', function() { + var datasource = { + data: [], + min: 1, + max: 30, + init: function() { + this.data = []; + for (var i = this.min; i <= this.max; i++) { + this.data.push('item' + i); + } + }, + getItem: function(index) { + return this.data[index - this.min]; + }, + get: function(index, count, success) { + var result = []; + var start = Math.max(this.min, index); + var end = Math.min(index + count - 1, this.max); + if (start <= end) { + for (var i = start; i <= end; i++) { + result.push(this.getItem(i)); + } + } + success(result); + } + }; + datasource.init(); + return datasource; + } + ); + +})(); \ No newline at end of file diff --git a/test/misc/helpers.js b/test/misc/helpers.js index c2380cd5..cf272a17 100644 --- a/test/misc/helpers.js +++ b/test/misc/helpers.js @@ -1,15 +1,24 @@ -const Helper = { - getTopPadding(viewport) { - const viewportChildren = viewport.children(); - const topPadding = viewportChildren[0]; - return parseInt(topPadding.style.height, 10); - }, - getBottomPadding: (viewport) => { - const viewportChildren = viewport.children(); - const bottomPadding = viewportChildren[viewportChildren.length - 1]; - return parseInt(bottomPadding.style.height, 10); - } +let Helper; -}; \ No newline at end of file +(function() { + 'use strict'; + + Helper = { + + getTopPadding: (viewport) => { + const viewportChildren = viewport.children(); + const topPadding = viewportChildren[0]; + return parseInt(topPadding.style.height, 10); + }, + + getBottomPadding: (viewport) => { + const viewportChildren = viewport.children(); + const bottomPadding = viewportChildren[viewportChildren.length - 1]; + return parseInt(bottomPadding.style.height, 10); + } + + }; + +})(); diff --git a/test/misc/scaffolding.js b/test/misc/scaffolding.js index a63d00cf..a4e426a9 100644 --- a/test/misc/scaffolding.js +++ b/test/misc/scaffolding.js @@ -1,4 +1,7 @@ +/* exported runTest */ + function createHtml(settings) { + 'use strict'; var viewportStyle = ' style="height:' + (settings.viewportHeight || 200) + 'px"'; var itemStyle = settings.itemHeight ? ' style="height:' + settings.itemHeight + 'px"' : ''; var bufferSize = settings.bufferSize ? ' buffer-size="' + settings.bufferSize + '"' : ''; @@ -21,7 +24,9 @@ function createHtml(settings) { ''; } -function finalize(scroller, options = {}, scope, $timeout) { +function finalize(scroller, options, scope, $timeout) { + 'use strict'; + options = options || {}; scroller.remove(); if (typeof options.cleanupTest === 'function') { @@ -29,7 +34,9 @@ function finalize(scroller, options = {}, scope, $timeout) { } } -function runTest(scrollSettings, run, options = {}) { +function runTest(scrollSettings, run, options) { + 'use strict'; + options = options || {}; inject(function($rootScope, $compile, $window, $timeout) { var scroller = angular.element(createHtml(scrollSettings)); var scope = $rootScope.$new(); diff --git a/test/misc/scaffoldingGrid.js b/test/misc/scaffoldingGrid.js index fd32b7ee..5f9a3408 100644 --- a/test/misc/scaffoldingGrid.js +++ b/test/misc/scaffoldingGrid.js @@ -1,4 +1,7 @@ +/* exported runGridTest */ + function createGridHtml (settings) { + 'use strict'; var viewportStyle = ' style="height:' + (settings.viewportHeight || 200) + 'px"'; var columns = ['col0', 'col1', 'col2', 'col3']; @@ -26,7 +29,9 @@ function createGridHtml (settings) { return html; } -function finalize(scroller, options = {}, scope, $timeout) { +function finalize(scroller, options, scope, $timeout) { + 'use strict'; + options = options || {}; scroller.remove(); if (typeof options.cleanupTest === 'function') { @@ -34,7 +39,9 @@ function finalize(scroller, options = {}, scope, $timeout) { } } -function runGridTest(scrollSettings, run, options = {}) { +function runGridTest(scrollSettings, run, options) { + 'use strict'; + options = options || {}; inject(function($rootScope, $compile, $window, $timeout) { var scroller = angular.element(createGridHtml(scrollSettings)); var scope = $rootScope.$new(); diff --git a/webpack.config.js b/webpack.config.js index 21caae19..55b46462 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,49 +1,162 @@ -var path = require('path'); -var webpack = require('webpack'); - -var packageJSON = require('./package.json'); - -var getBanner = function (compressed) { - return packageJSON.name + (compressed ? ' (compressed)' : ' (uncompressed)') + '\n' + - packageJSON.homepage + '\n' + - 'Version: ' + packageJSON.version + ' -- ' + (new Date()).toISOString() + '\n' + - 'License: ' + packageJSON.license; -}; - -module.exports.config = { - entry: { - 'ui-scroll': './src/ui-scroll.js', - 'ui-scroll-grid': './src/ui-scroll-grid.js' - }, - output: { - path: path.join(__dirname, 'temp'), - filename: '[name].js' - }, - cache: false, - devtool: 'source-map', - module: { - loaders: [ - { - test: /\.js$/, - exclude: /node_modules/, - loader: 'babel-loader?presets[]=es2015' - } - ] - }, - plugins: [ - new webpack.BannerPlugin(getBanner(false)) - ] -}; - -module.exports.compressedPlugins = [ - new webpack.optimize.UglifyJsPlugin({ - sourceMap: true, - compress: { - warnings: true, - }, - output: { - comments: false, - }, - }), - new webpack.BannerPlugin(getBanner(true)) -]; +const path = require('path'); +const fs = require('fs'); +const glob = require('glob'); +const webpack = require('webpack'); +const CleanWebpackPlugin = require('clean-webpack-plugin'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); + +const packageJSON = require('./package.json'); + +const getBanner = () => + packageJSON.name + '\n' + + packageJSON.homepage + '\n' + + 'Version: ' + packageJSON.version + ' -- ' + (new Date()).toISOString() + '\n' + + 'License: ' + packageJSON.license; + +const scriptName = process.env.npm_lifecycle_event; +const ENV = scriptName.indexOf('dev') === 0 ? 'development' : 'production'; +const isTest = scriptName.indexOf('test') >= 0 ? true : false; +console.log('***** webpack runs in ' + ENV + (isTest ? ' (test)' : '') + ' environment\n'); + +const devServerPort = 5005; +const devServerHost = 'localhost'; +let configEnv; + +if (ENV === 'development') { + configEnv = { + entry: { + 'test': glob.sync(path.resolve(__dirname, 'test/*.js')) + }, + + output: { + filename: '[name].js', + publicPath: '/' + }, + + rules: [{ + enforce: 'pre', + test: /\.js$/, + include: path.resolve(__dirname, 'test'), + use: [{ + loader: 'jshint-loader' + }] + }], + + devtool: 'inline-source-map', + + plugins: [], + + devServer: !isTest ? { + historyApiFallback: { + rewrites: [ + { from: /\/*\/*\.html$/, to: (context) => '/demo' + context.parsedUrl.pathname }, + { from: /\/*\/*\.css$/, to: (context) => '/demo' + context.parsedUrl.pathname }, + { from: /\/*\/*\.js$/, to: (context) => '/demo' + context.parsedUrl.pathname }, + { from: /\/ui-scroll-demo\.gif$/, to: '/demo/ui-scroll-demo.gif' }, + { from: /^\/$/, to: '/demo/index.html' } + ] + }, + proxy: { + '/dist': { + target: 'http://' + devServerHost + ':' + devServerPort, + pathRewrite: {'^/dist' : ''} + } + }, + inline: true, + quiet: false, + stats: { + modules: false, + errors: true, + warnings: true + }, + port: devServerPort, + host: devServerHost, + publicPath: '/' + } : {}, + + watch: true + } +} + +if (ENV === 'production') { + configEnv = { + entry: { + 'ui-scroll.min': path.resolve(__dirname, 'src/ui-scroll.js'), + 'ui-scroll-grid.min': path.resolve(__dirname, 'src/ui-scroll-grid.js') + }, + + output: { + path: path.join(__dirname, 'dist'), + filename: '[name].js' + }, + + rules: [], + + devtool: 'source-map', + + plugins: [ + new CleanWebpackPlugin('dist', { + root: __dirname + }), + new webpack.optimize.UglifyJsPlugin({ + sourceMap: true, + compress: { + warnings: true, + }, + output: { + comments: false, + }, + include: /\.min\.js$/ + }), + new CopyWebpackPlugin([ + { from: 'src/ui-scroll-jqlite.js', to: 'ui-scroll-jqlite.min.js' }, + { from: 'src/ui-scroll-jqlite.js', to: 'ui-scroll-jqlite.js' } + ], { copyUnmodified: true }), + new webpack.BannerPlugin(getBanner()) + ], + + devServer: {}, + + watch: false + } +} + +module.exports = { + entry: Object.assign({ + 'ui-scroll': path.resolve(__dirname, 'src/ui-scroll.js'), + 'ui-scroll-grid': path.resolve(__dirname, 'src/ui-scroll-grid.js') + }, configEnv.entry), + + output: configEnv.output, + + cache: false, + + devtool: configEnv.devtool, + + module: { + rules: [...configEnv.rules, + { + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel-loader', + options: { + presets: ['es2015'] + } + }, + { + enforce: 'pre', + test: /\.js$/, + include: path.resolve(__dirname, 'src'), + use: [{ + loader: 'jshint-loader' + }] + } + ] + }, + + plugins: configEnv.plugins, + + devServer: configEnv.devServer, + + watch: configEnv.watch +}; \ No newline at end of file