{"action":"created","comment":{"url":"https://api.github.com/repos/angular-ui/ui-grid/pulls/comments/83857880","pull_request_review_id":4672463,"id":83857880,"diff_hunk":"@@ -1,793 +1,808 @@\n (function(){\n \n-angular.module('ui.grid')\n-\n-  /**\n-   * @ngdoc function\n-   * @name ui.grid.class:GridRenderContainer\n-   * @description The grid has render containers, allowing the ability to have pinned columns.  If the grid\n-   * is right-to-left then there may be a right render container, if left-to-right then there may\n-   * be a left render container.  There is always a body render container.\n-   * @param {string} name The name of the render container ('body', 'left', or 'right')\n-   * @param {Grid} grid the grid the render container is in\n-   * @param {object} options the render container options\n-   */\n-.factory('GridRenderContainer', ['gridUtil', 'uiGridConstants', function(gridUtil, uiGridConstants) {\n-  function GridRenderContainer(name, grid, options) {\n-    var self = this;\n-\n-    // if (gridUtil.type(grid) !== 'Grid') {\n-    //   throw new Error('Grid argument is not a Grid object');\n-    // }\n-\n-    self.name = name;\n-\n-    self.grid = grid;\n-\n-    // self.rowCache = [];\n-    // self.columnCache = [];\n-\n-    self.visibleRowCache = [];\n-    self.visibleColumnCache = [];\n-\n-    self.renderedRows = [];\n-    self.renderedColumns = [];\n-\n-    self.prevScrollTop = 0;\n-    self.prevScrolltopPercentage = 0;\n-    self.prevRowScrollIndex = 0;\n-\n-    self.prevScrollLeft = 0;\n-    self.prevScrollleftPercentage = 0;\n-    self.prevColumnScrollIndex = 0;\n-\n-    self.columnStyles = \"\";\n-\n-    self.viewportAdjusters = [];\n-\n-    /**\n-     *  @ngdoc boolean\n-     *  @name hasHScrollbar\n-     *  @propertyOf  ui.grid.class:GridRenderContainer\n-     *  @description flag to signal that container has a horizontal scrollbar\n-     */\n-    self.hasHScrollbar = false;\n-\n-    /**\n-     *  @ngdoc boolean\n-     *  @name hasVScrollbar\n-     *  @propertyOf  ui.grid.class:GridRenderContainer\n-     *  @description flag to signal that container has a vertical scrollbar\n-     */\n-    self.hasVScrollbar = false;\n-\n-    /**\n-     *  @ngdoc boolean\n-     *  @name canvasHeightShouldUpdate\n-     *  @propertyOf  ui.grid.class:GridRenderContainer\n-     *  @description flag to signal that container should recalculate the canvas size\n-     */\n-    self.canvasHeightShouldUpdate = true;\n+  angular.module('ui.grid')\n \n     /**\n-     *  @ngdoc boolean\n-     *  @name canvasHeight\n-     *  @propertyOf  ui.grid.class:GridRenderContainer\n-     *  @description last calculated canvas height value\n+     * @ngdoc function\n+     * @name ui.grid.class:GridRenderContainer\n+     * @description The grid has render containers, allowing the ability to have pinned columns.  If the grid\n+     * is right-to-left then there may be a right render container, if left-to-right then there may\n+     * be a left render container.  There is always a body render container.\n+     * @param {string} name The name of the render container ('body', 'left', or 'right')\n+     * @param {Grid} grid the grid the render container is in\n+     * @param {object} options the render container options\n      */\n-    self.$$canvasHeight = 0;\n-\n-    if (options && angular.isObject(options)) {\n-      angular.extend(self, options);\n-    }\n+    .factory('GridRenderContainer', ['gridUtil', 'uiGridConstants', function(gridUtil, uiGridConstants) {\n+      function GridRenderContainer(name, grid, options) {\n+        var self = this;\n+\n+        // if (gridUtil.type(grid) !== 'Grid') {\n+        //   throw new Error('Grid argument is not a Grid object');\n+        // }\n+\n+        self.name = name;\n+\n+        self.grid = grid;\n+\n+        // self.rowCache = [];\n+        // self.columnCache = [];\n+\n+        self.visibleRowCache = [];\n+        self.visibleColumnCache = [];\n+\n+        self.renderedRows = [];\n+        self.renderedColumns = [];\n+\n+        self.prevScrollTop = 0;\n+        self.prevScrolltopPercentage = 0;\n+        self.prevRowScrollIndex = 0;\n+\n+        self.prevScrollLeft = 0;\n+        self.prevScrollleftPercentage = 0;\n+        self.prevColumnScrollIndex = 0;\n+\n+        self.columnStyles = \"\";\n+\n+        self.viewportAdjusters = [];\n+\n+        /**\n+         *  @ngdoc boolean\n+         *  @name hasHScrollbar\n+         *  @propertyOf  ui.grid.class:GridRenderContainer\n+         *  @description flag to signal that container has a horizontal scrollbar\n+         */\n+        self.hasHScrollbar = false;\n+\n+        /**\n+         *  @ngdoc boolean\n+         *  @name hasVScrollbar\n+         *  @propertyOf  ui.grid.class:GridRenderContainer\n+         *  @description flag to signal that container has a vertical scrollbar\n+         */\n+        self.hasVScrollbar = false;\n+\n+        /**\n+         *  @ngdoc boolean\n+         *  @name canvasHeightShouldUpdate\n+         *  @propertyOf  ui.grid.class:GridRenderContainer\n+         *  @description flag to signal that container should recalculate the canvas size\n+         */\n+        self.canvasHeightShouldUpdate = true;\n+\n+        /**\n+         *  @ngdoc boolean\n+         *  @name canvasHeight\n+         *  @propertyOf  ui.grid.class:GridRenderContainer\n+         *  @description last calculated canvas height value\n+         */\n+        self.$$canvasHeight = 0;\n+\n+        if (options && angular.isObject(options)) {\n+          angular.extend(self, options);\n+        }\n \n-    grid.registerStyleComputation({\n-      priority: 5,\n-      func: function () {\n-        self.updateColumnWidths();\n-        return self.columnStyles;\n+        grid.registerStyleComputation({\n+          priority: 5,\n+          func: function () {\n+            self.updateColumnWidths();\n+            return self.columnStyles;\n+          }\n+        });\n       }\n-    });\n-  }\n-\n-\n-  GridRenderContainer.prototype.reset = function reset() {\n-    // this.rowCache.length = 0;\n-    // this.columnCache.length = 0;\n-\n-    this.visibleColumnCache.length = 0;\n-    this.visibleRowCache.length = 0;\n \n-    this.renderedRows.length = 0;\n-    this.renderedColumns.length = 0;\n-  };\n \n-  // TODO(c0bra): calculate size?? Should this be in a stackable directive?\n+      GridRenderContainer.prototype.reset = function reset() {\n+        // this.rowCache.length = 0;\n+        // this.columnCache.length = 0;\n \n+        this.visibleColumnCache.length = 0;\n+        this.visibleRowCache.length = 0;\n \n-  GridRenderContainer.prototype.containsColumn = function (col) {\n-     return this.visibleColumnCache.indexOf(col) !== -1;\n-  };\n+        this.renderedRows.length = 0;\n+        this.renderedColumns.length = 0;\n+      };\n \n-  GridRenderContainer.prototype.minRowsToRender = function minRowsToRender() {\n-    var self = this;\n-    var minRows = 0;\n-    var rowAddedHeight = 0;\n-    var viewPortHeight = self.getViewportHeight();\n-    for (var i = self.visibleRowCache.length - 1; rowAddedHeight < viewPortHeight && i >= 0; i--) {\n-      rowAddedHeight += self.visibleRowCache[i].height;\n-      minRows++;\n-    }\n-    return minRows;\n-  };\n+      // TODO(c0bra): calculate size?? Should this be in a stackable directive?\n \n-  GridRenderContainer.prototype.minColumnsToRender = function minColumnsToRender() {\n-    var self = this;\n-    var viewportWidth = this.getViewportWidth();\n \n-    var min = 0;\n-    var totalWidth = 0;\n-    // self.columns.forEach(function(col, i) {\n-    for (var i = 0; i < self.visibleColumnCache.length; i++) {\n-      var col = self.visibleColumnCache[i];\n+      GridRenderContainer.prototype.containsColumn = function (col) {\n+        return this.visibleColumnCache.indexOf(col) !== -1;\n+      };\n \n-      if (totalWidth < viewportWidth) {\n-        totalWidth += col.drawnWidth ? col.drawnWidth : 0;\n-        min++;\n-      }\n-      else {\n-        var currWidth = 0;\n-        for (var j = i; j >= i - min; j--) {\n-          currWidth += self.visibleColumnCache[j].drawnWidth ? self.visibleColumnCache[j].drawnWidth : 0;\n+      GridRenderContainer.prototype.minRowsToRender = function minRowsToRender() {\n+        var self = this;\n+        var minRows = 0;\n+        var rowAddedHeight = 0;\n+        var viewPortHeight = self.getViewportHeight();\n+        for (var i = self.visibleRowCache.length - 1; rowAddedHeight < viewPortHeight && i >= 0; i--) {\n+          rowAddedHeight += self.visibleRowCache[i].height;\n+          minRows++;\n         }\n-        if (currWidth < viewportWidth) {\n-          min++;\n+        return minRows;\n+      };\n+\n+      GridRenderContainer.prototype.minColumnsToRender = function minColumnsToRender() {\n+        var self = this;\n+        var viewportWidth = this.getViewportWidth();\n+\n+        var min = 0;\n+        var totalWidth = 0;\n+        // self.columns.forEach(function(col, i) {\n+        for (var i = 0; i < self.visibleColumnCache.length; i++) {\n+          var col = self.visibleColumnCache[i];\n+\n+          if (totalWidth < viewportWidth) {\n+            totalWidth += col.drawnWidth ? col.drawnWidth : 0;\n+            min++;\n+          }\n+          else {\n+            var currWidth = 0;\n+            for (var j = i; j >= i - min; j--) {\n+              currWidth += self.visibleColumnCache[j].drawnWidth ? self.visibleColumnCache[j].drawnWidth : 0;\n+            }\n+            if (currWidth < viewportWidth) {\n+              min++;\n+            }\n+          }\n         }\n-      }\n-    }\n-\n-    return min;\n-  };\n-\n-  GridRenderContainer.prototype.getVisibleRowCount = function getVisibleRowCount() {\n-    return this.visibleRowCache.length;\n-  };\n-\n-  /**\n-   * @ngdoc function\n-   * @name registerViewportAdjuster\n-   * @methodOf ui.grid.class:GridRenderContainer\n-   * @description Registers an adjuster to the render container's available width or height.  Adjusters are used\n-   * to tell the render container that there is something else consuming space, and to adjust it's size\n-   * appropriately.\n-   * @param {function} func the adjuster function we want to register\n-   */\n-\n-  GridRenderContainer.prototype.registerViewportAdjuster = function registerViewportAdjuster(func) {\n-    this.viewportAdjusters.push(func);\n-  };\n-\n-  /**\n-   * @ngdoc function\n-   * @name removeViewportAdjuster\n-   * @methodOf ui.grid.class:GridRenderContainer\n-   * @description Removes an adjuster, should be used when your element is destroyed\n-   * @param {function} func the adjuster function we want to remove\n-   */\n-  GridRenderContainer.prototype.removeViewportAdjuster = function removeViewportAdjuster(func) {\n-    var idx = this.viewportAdjusters.indexOf(func);\n-\n-    if (idx > -1) {\n-      this.viewportAdjusters.splice(idx, 1);\n-    }\n-  };\n-\n-  /**\n-   * @ngdoc function\n-   * @name getViewportAdjustment\n-   * @methodOf ui.grid.class:GridRenderContainer\n-   * @description Gets the adjustment based on the viewportAdjusters.\n-   * @returns {object} a hash of { height: x, width: y }.  Usually the values will be negative\n-   */\n-  GridRenderContainer.prototype.getViewportAdjustment = function getViewportAdjustment() {\n-    var self = this;\n-\n-    var adjustment = { height: 0, width: 0 };\n-\n-    self.viewportAdjusters.forEach(function (func) {\n-      adjustment = func.call(this, adjustment);\n-    });\n-\n-    return adjustment;\n-  };\n-\n-  GridRenderContainer.prototype.getMargin = function getMargin(side) {\n-    var self = this;\n-\n-    var amount = 0;\n-\n-    self.viewportAdjusters.forEach(function (func) {\n-      var adjustment = func.call(this, { height: 0, width: 0 });\n-\n-      if (adjustment.side && adjustment.side === side) {\n-        amount += adjustment.width * -1;\n-      }\n-    });\n-\n-    return amount;\n-  };\n-\n-  GridRenderContainer.prototype.getViewportHeight = function getViewportHeight() {\n-    var self = this;\n \n-    var headerHeight = (self.headerHeight) ? self.headerHeight : self.grid.headerHeight;\n-\n-    var viewPortHeight = self.grid.gridHeight - headerHeight - self.grid.footerHeight;\n-\n-\n-    var adjustment = self.getViewportAdjustment();\n+        return min;\n+      };\n+\n+      GridRenderContainer.prototype.getVisibleRowCount = function getVisibleRowCount() {\n+        return this.visibleRowCache.length;\n+      };\n+\n+      /**\n+       * @ngdoc function\n+       * @name registerViewportAdjuster\n+       * @methodOf ui.grid.class:GridRenderContainer\n+       * @description Registers an adjuster to the render container's available width or height.  Adjusters are used\n+       * to tell the render container that there is something else consuming space, and to adjust it's size\n+       * appropriately.\n+       * @param {function} func the adjuster function we want to register\n+       */\n+\n+      GridRenderContainer.prototype.registerViewportAdjuster = function registerViewportAdjuster(func) {\n+        this.viewportAdjusters.push(func);\n+      };\n+\n+      /**\n+       * @ngdoc function\n+       * @name removeViewportAdjuster\n+       * @methodOf ui.grid.class:GridRenderContainer\n+       * @description Removes an adjuster, should be used when your element is destroyed\n+       * @param {function} func the adjuster function we want to remove\n+       */\n+      GridRenderContainer.prototype.removeViewportAdjuster = function removeViewportAdjuster(func) {\n+        var idx = this.viewportAdjusters.indexOf(func);\n+\n+        if (idx > -1) {\n+          this.viewportAdjusters.splice(idx, 1);\n+        }\n+      };\n \n-    viewPortHeight = viewPortHeight + adjustment.height;\n+      /**\n+       * @ngdoc function\n+       * @name getViewportAdjustment\n+       * @methodOf ui.grid.class:GridRenderContainer\n+       * @description Gets the adjustment based on the viewportAdjusters.\n+       * @returns {object} a hash of { height: x, width: y }.  Usually the values will be negative\n+       */\n+      GridRenderContainer.prototype.getViewportAdjustment = function getViewportAdjustment() {\n+        var self = this;\n \n-    return viewPortHeight;\n-  };\n+        var adjustment = { height: 0, width: 0 };\n \n-  GridRenderContainer.prototype.getViewportWidth = function getViewportWidth() {\n-    var self = this;\n+        self.viewportAdjusters.forEach(function (func) {\n+          adjustment = func.call(this, adjustment);\n+        });\n \n-    var viewportWidth = self.grid.gridWidth;\n+        return adjustment;\n+      };\n \n-    //if (typeof(self.grid.verticalScrollbarWidth) !== 'undefined' && self.grid.verticalScrollbarWidth !== undefined && self.grid.verticalScrollbarWidth > 0) {\n-    //  viewPortWidth = viewPortWidth - self.grid.verticalScrollbarWidth;\n-    //}\n+      GridRenderContainer.prototype.getMargin = function getMargin(side) {\n+        var self = this;\n \n-    // var viewportWidth = 0;\\\n-    // self.visibleColumnCache.forEach(function (column) {\n-    //   viewportWidth += column.drawnWidth;\n-    // });\n+        var amount = 0;\n \n-    var adjustment = self.getViewportAdjustment();\n+        self.viewportAdjusters.forEach(function (func) {\n+          var adjustment = func.call(this, { height: 0, width: 0 });\n \n-    viewportWidth = viewportWidth + adjustment.width;\n+          if (adjustment.side && adjustment.side === side) {\n+            amount += adjustment.width * -1;\n+          }\n+        });\n \n-    return viewportWidth;\n-  };\n+        return amount;\n+      };\n \n-  GridRenderContainer.prototype.getHeaderViewportWidth = function getHeaderViewportWidth() {\n-    var self = this;\n+      GridRenderContainer.prototype.getViewportHeight = function getViewportHeight() {\n+        var self = this;\n \n-    var viewportWidth = this.getViewportWidth();\n+        var headerHeight = (self.headerHeight) ? self.headerHeight : self.grid.headerHeight;\n \n-    //if (typeof(self.grid.verticalScrollbarWidth) !== 'undefined' && self.grid.verticalScrollbarWidth !== undefined && self.grid.verticalScrollbarWidth > 0) {\n-    //  viewPortWidth = viewPortWidth + self.grid.verticalScrollbarWidth;\n-    //}\n+        var viewPortHeight = self.grid.gridHeight - headerHeight - self.grid.footerHeight;\n \n-    // var adjustment = self.getViewportAdjustment();\n-    // viewPortWidth = viewPortWidth + adjustment.width;\n \n-    return viewportWidth;\n-  };\n+        var adjustment = self.getViewportAdjustment();\n \n+        viewPortHeight = viewPortHeight + adjustment.height;\n \n-  /**\n-   * @ngdoc function\n-   * @name getCanvasHeight\n-   * @methodOf ui.grid.class:GridRenderContainer\n-   * @description Returns the total canvas height.   Only recalculates if canvasHeightShouldUpdate = false\n-   * @returns {number} total height of all the visible rows in the container\n-   */\n-  GridRenderContainer.prototype.getCanvasHeight = function getCanvasHeight() {\n-    var self = this;\n+        return viewPortHeight;\n+      };\n \n-    if (!self.canvasHeightShouldUpdate) {\n-      return self.$$canvasHeight;\n-    }\n+      GridRenderContainer.prototype.getViewportWidth = function getViewportWidth() {\n+        var self = this;\n \n-    var oldCanvasHeight = self.$$canvasHeight;\n+        var viewportWidth = self.grid.gridWidth;\n \n-    self.$$canvasHeight =  0;\n+        //if (typeof(self.grid.verticalScrollbarWidth) !== 'undefined' && self.grid.verticalScrollbarWidth !== undefined && self.grid.verticalScrollbarWidth > 0) {\n+        //  viewPortWidth = viewPortWidth - self.grid.verticalScrollbarWidth;\n+        //}\n \n-    self.visibleRowCache.forEach(function(row){\n-      self.$$canvasHeight += row.height;\n-    });\n+        // var viewportWidth = 0;\\\n+        // self.visibleColumnCache.forEach(function (column) {\n+        //   viewportWidth += column.drawnWidth;\n+        // });\n \n+        var adjustment = self.getViewportAdjustment();\n \n-    self.canvasHeightShouldUpdate = false;\n+        viewportWidth = viewportWidth + adjustment.width;\n \n-    self.grid.api.core.raise.canvasHeightChanged(oldCanvasHeight, self.$$canvasHeight);\n+        return viewportWidth;\n+      };\n \n-    return self.$$canvasHeight;\n-  };\n+      GridRenderContainer.prototype.getHeaderViewportWidth = function getHeaderViewportWidth() {\n+        var self = this;\n \n-  GridRenderContainer.prototype.getVerticalScrollLength = function getVerticalScrollLength() {\n-    return this.getCanvasHeight() - this.getViewportHeight() + this.grid.scrollbarHeight;\n-  };\n+        var viewportWidth = this.getViewportWidth();\n \n-  GridRenderContainer.prototype.getHorizontalScrollLength = function getHorizontalScrollLength() {\n-    return this.getCanvasWidth() - this.getViewportWidth() + this.grid.scrollbarWidth;\n-  };\n+        //if (typeof(self.grid.verticalScrollbarWidth) !== 'undefined' && self.grid.verticalScrollbarWidth !== undefined && self.grid.verticalScrollbarWidth > 0) {\n+        //  viewPortWidth = viewPortWidth + self.grid.verticalScrollbarWidth;\n+        //}\n \n-  GridRenderContainer.prototype.getCanvasWidth = function getCanvasWidth() {\n-    var self = this;\n+        // var adjustment = self.getViewportAdjustment();\n+        // viewPortWidth = viewPortWidth + adjustment.width;\n \n-    var ret = self.canvasWidth;\n+        return viewportWidth;\n+      };\n \n-    return ret;\n-  };\n \n-  GridRenderContainer.prototype.setRenderedRows = function setRenderedRows(newRows) {\n-    this.renderedRows.length = newRows.length;\n-    for (var i = 0; i < newRows.length; i++) {\n-      this.renderedRows[i] = newRows[i];\n-    }\n-  };\n+      /**\n+       * @ngdoc function\n+       * @name getCanvasHeight\n+       * @methodOf ui.grid.class:GridRenderContainer\n+       * @description Returns the total canvas height.   Only recalculates if canvasHeightShouldUpdate = false\n+       * @returns {number} total height of all the visible rows in the container\n+       */\n+      GridRenderContainer.prototype.getCanvasHeight = function getCanvasHeight() {\n+        var self = this;\n \n-  GridRenderContainer.prototype.setRenderedColumns = function setRenderedColumns(newColumns) {\n-    var self = this;\n+        if (!self.canvasHeightShouldUpdate) {\n+          return self.$$canvasHeight;\n+        }\n \n-    // OLD:\n-    this.renderedColumns.length = newColumns.length;\n-    for (var i = 0; i < newColumns.length; i++) {\n-      this.renderedColumns[i] = newColumns[i];\n-    }\n+        var oldCanvasHeight = self.$$canvasHeight;\n \n-    this.updateColumnOffset();\n-  };\n+        self.$$canvasHeight =  0;\n \n-  GridRenderContainer.prototype.updateColumnOffset = function updateColumnOffset() {\n-    // Calculate the width of the columns on the left side that are no longer rendered.\n-    //  That will be the offset for the columns as we scroll horizontally.\n-    var hiddenColumnsWidth = 0;\n-    for (var i = 0; i < this.currentFirstColumn; i++) {\n-      hiddenColumnsWidth += this.visibleColumnCache[i].drawnWidth;\n-    }\n+        self.visibleRowCache.forEach(function(row){\n+          self.$$canvasHeight += row.height;\n+        });\n \n-    this.columnOffset = hiddenColumnsWidth;\n-  };\n \n-  GridRenderContainer.prototype.scrollVertical = function (newScrollTop) {\n-    var vertScrollPercentage = -1;\n+        self.canvasHeightShouldUpdate = false;\n \n-    if (newScrollTop !== this.prevScrollTop) {\n-      var yDiff = newScrollTop - this.prevScrollTop;\n+        self.grid.api.core.raise.canvasHeightChanged(oldCanvasHeight, self.$$canvasHeight);\n \n-      if (yDiff > 0 ) { this.grid.scrollDirection = uiGridConstants.scrollDirection.DOWN; }\n-      if (yDiff < 0 ) { this.grid.scrollDirection = uiGridConstants.scrollDirection.UP; }\n+        return self.$$canvasHeight;\n+      };\n \n-      var vertScrollLength = this.getVerticalScrollLength();\n+      GridRenderContainer.prototype.getVerticalScrollLength = function getVerticalScrollLength() {\n+        return this.getCanvasHeight() - this.getViewportHeight() + this.grid.scrollbarHeight;\n+      };\n \n-      vertScrollPercentage = newScrollTop / vertScrollLength;\n+      GridRenderContainer.prototype.getHorizontalScrollLength = function getHorizontalScrollLength() {\n+        return this.getCanvasWidth() - this.getViewportWidth() + this.grid.scrollbarWidth;\n+      };\n \n-      // console.log('vert', vertScrollPercentage, newScrollTop, vertScrollLength);\n+      GridRenderContainer.prototype.getCanvasWidth = function getCanvasWidth() {\n+        var self = this;\n \n-      if (vertScrollPercentage > 1) { vertScrollPercentage = 1; }\n-      if (vertScrollPercentage < 0) { vertScrollPercentage = 0; }\n+        var ret = self.canvasWidth;\n \n-      this.adjustScrollVertical(newScrollTop, vertScrollPercentage);\n-      return vertScrollPercentage;\n-    }\n-  };\n+        return ret;\n+      };\n \n-  GridRenderContainer.prototype.scrollHorizontal = function(newScrollLeft){\n-    var horizScrollPercentage = -1;\n+      GridRenderContainer.prototype.setRenderedRows = function setRenderedRows(newRows) {\n+        this.renderedRows.length = newRows.length;\n+        for (var i = 0; i < newRows.length; i++) {\n+          this.renderedRows[i] = newRows[i];\n+        }\n+      };\n \n-    // Handle RTL here\n+      GridRenderContainer.prototype.setRenderedColumns = function setRenderedColumns(newColumns) {\n+        var self = this;\n \n-    if (newScrollLeft !== this.prevScrollLeft) {\n-      var xDiff = newScrollLeft - this.prevScrollLeft;\n+        // OLD:\n+        this.renderedColumns.length = newColumns.length;\n+        for (var i = 0; i < newColumns.length; i++) {\n+          this.renderedColumns[i] = newColumns[i];\n+        }\n \n-      if (xDiff > 0) { this.grid.scrollDirection = uiGridConstants.scrollDirection.RIGHT; }\n-      if (xDiff < 0) { this.grid.scrollDirection = uiGridConstants.scrollDirection.LEFT; }\n+        this.updateColumnOffset();\n+      };\n \n-      var horizScrollLength = this.getHorizontalScrollLength();\n-      if (horizScrollLength !== 0) {\n-        horizScrollPercentage = newScrollLeft / horizScrollLength;\n-      }\n-      else {\n-        horizScrollPercentage = 0;\n-      }\n+      GridRenderContainer.prototype.updateColumnOffset = function updateColumnOffset() {\n+        // Calculate the width of the columns on the left side that are no longer rendered.\n+        //  That will be the offset for the columns as we scroll horizontally.\n+        var hiddenColumnsWidth = 0;\n+        for (var i = 0; i < this.currentFirstColumn; i++) {\n+          hiddenColumnsWidth += this.visibleColumnCache[i].drawnWidth;\n+        }\n \n-      this.adjustScrollHorizontal(newScrollLeft, horizScrollPercentage);\n-      return horizScrollPercentage;\n-    }\n-  };\n+        this.columnOffset = hiddenColumnsWidth;\n+      };\n \n-  GridRenderContainer.prototype.adjustScrollVertical = function adjustScrollVertical(scrollTop, scrollPercentage, force) {\n-    if (this.prevScrollTop === scrollTop && !force) {\n-      return;\n-    }\n+      GridRenderContainer.prototype.scrollVertical = function (newScrollTop) {\n+        var vertScrollPercentage = -1;\n \n-    if (typeof(scrollTop) === 'undefined' || scrollTop === undefined || scrollTop === null) {\n-      scrollTop = (this.getCanvasHeight() - this.getViewportHeight()) * scrollPercentage;\n-    }\n+        if (newScrollTop !== this.prevScrollTop) {\n+          var yDiff = newScrollTop - this.prevScrollTop;\n \n-    this.adjustRows(scrollTop, scrollPercentage, false);\n+          if (yDiff > 0 ) { this.grid.scrollDirection = uiGridConstants.scrollDirection.DOWN; }\n+          if (yDiff < 0 ) { this.grid.scrollDirection = uiGridConstants.scrollDirection.UP; }\n \n-    this.prevScrollTop = scrollTop;\n-    this.prevScrolltopPercentage = scrollPercentage;\n+          var vertScrollLength = this.getVerticalScrollLength();\n \n-    this.grid.queueRefresh();\n-  };\n+          vertScrollPercentage = newScrollTop / vertScrollLength;\n \n-  GridRenderContainer.prototype.adjustScrollHorizontal = function adjustScrollHorizontal(scrollLeft, scrollPercentage, force) {\n-    if (this.prevScrollLeft === scrollLeft && !force) {\n-      return;\n-    }\n+          // console.log('vert', vertScrollPercentage, newScrollTop, vertScrollLength);\n \n-    if (typeof(scrollLeft) === 'undefined' || scrollLeft === undefined || scrollLeft === null) {\n-      scrollLeft = (this.getCanvasWidth() - this.getViewportWidth()) * scrollPercentage;\n-    }\n+          if (vertScrollPercentage > 1) { vertScrollPercentage = 1; }\n+          if (vertScrollPercentage < 0) { vertScrollPercentage = 0; }\n \n-    this.adjustColumns(scrollLeft, scrollPercentage);\n+          this.adjustScrollVertical(newScrollTop, vertScrollPercentage);\n+          return vertScrollPercentage;\n+        }\n+      };\n \n-    this.prevScrollLeft = scrollLeft;\n-    this.prevScrollleftPercentage = scrollPercentage;\n+      GridRenderContainer.prototype.scrollHorizontal = function(newScrollLeft){\n+        var horizScrollPercentage = -1;\n \n-    this.grid.queueRefresh();\n-  };\n+        // Handle RTL here\n \n-  GridRenderContainer.prototype.adjustRows = function adjustRows(scrollTop, scrollPercentage, postDataLoaded) {\n-    var self = this;\n+        if (newScrollLeft !== this.prevScrollLeft) {\n+          var xDiff = newScrollLeft - this.prevScrollLeft;\n \n-    var minRows = self.minRowsToRender();\n+          if (xDiff > 0) { this.grid.scrollDirection = uiGridConstants.scrollDirection.RIGHT; }\n+          if (xDiff < 0) { this.grid.scrollDirection = uiGridConstants.scrollDirection.LEFT; }\n \n-    var rowCache = self.visibleRowCache;\n+          var horizScrollLength = this.getHorizontalScrollLength();\n+          if (horizScrollLength !== 0) {\n+            horizScrollPercentage = newScrollLeft / horizScrollLength;\n+          }\n+          else {\n+            horizScrollPercentage = 0;\n+          }\n \n-    var maxRowIndex = rowCache.length - minRows;\n+          this.adjustScrollHorizontal(newScrollLeft, horizScrollPercentage);\n+          return horizScrollPercentage;\n+        }\n+      };\n \n-    // console.log('scroll%1', scrollPercentage);\n+      GridRenderContainer.prototype.adjustScrollVertical = function adjustScrollVertical(scrollTop, scrollPercentage, force) {\n+        if (this.prevScrollTop === scrollTop && !force) {\n+          return;\n+        }\n \n-    // Calculate the scroll percentage according to the scrollTop location, if no percentage was provided\n-    if ((typeof(scrollPercentage) === 'undefined' || scrollPercentage === null) && scrollTop) {\n-      scrollPercentage = scrollTop / self.getVerticalScrollLength();\n-    }\n+        if (typeof(scrollTop) === 'undefined' || scrollTop === undefined || scrollTop === null) {\n+          scrollTop = (this.getCanvasHeight() - this.getViewportHeight()) * scrollPercentage;\n+        }\n \n-    var rowIndex = Math.ceil(Math.min(maxRowIndex, maxRowIndex * scrollPercentage));\n+        this.adjustRows(scrollTop, scrollPercentage, false);\n \n-    // console.log('maxRowIndex / scroll%', maxRowIndex, scrollPercentage, rowIndex);\n+        this.prevScrollTop = scrollTop;\n+        this.prevScrolltopPercentage = scrollPercentage;\n \n-    // Define a max row index that we can't scroll past\n-    if (rowIndex > maxRowIndex) {\n-      rowIndex = maxRowIndex;\n-    }\n+        this.grid.queueRefresh();\n+      };\n \n-    var newRange = [];\n-    if (rowCache.length > self.grid.options.virtualizationThreshold) {\n-      if (!(typeof(scrollTop) === 'undefined' || scrollTop === null)) {\n-        // Have we hit the threshold going down?\n-        if ( !self.grid.suppressParentScrollDown && self.prevScrollTop < scrollTop && rowIndex < self.prevRowScrollIndex + self.grid.options.scrollThreshold && rowIndex < maxRowIndex) {\n-          return;\n-        }\n-        //Have we hit the threshold going up?\n-        if ( !self.grid.suppressParentScrollUp && self.prevScrollTop > scrollTop && rowIndex > self.prevRowScrollIndex - self.grid.options.scrollThreshold && rowIndex < maxRowIndex) {\n+      GridRenderContainer.prototype.adjustScrollHorizontal = function adjustScrollHorizontal(scrollLeft, scrollPercentage, force) {\n+        if (this.prevScrollLeft === scrollLeft && !force) {\n           return;\n         }\n-      }\n-      var rangeStart = {};\n-      var rangeEnd = {};\n \n-      rangeStart = Math.max(0, rowIndex - self.grid.options.excessRows);\n-      rangeEnd = Math.min(rowCache.length, rowIndex + minRows + self.grid.options.excessRows);\n+        if (typeof(scrollLeft) === 'undefined' || scrollLeft === undefined || scrollLeft === null) {\n+          scrollLeft = (this.getCanvasWidth() - this.getViewportWidth()) * scrollPercentage;\n+        }\n \n-      newRange = [rangeStart, rangeEnd];\n-    }\n-    else {\n-      var maxLen = self.visibleRowCache.length;\n-      newRange = [0, Math.max(maxLen, minRows + self.grid.options.excessRows)];\n-    }\n+        this.adjustColumns(scrollLeft, scrollPercentage);\n \n-    self.updateViewableRowRange(newRange);\n+        this.prevScrollLeft = scrollLeft;\n+        this.prevScrollleftPercentage = scrollPercentage;\n \n-    self.prevRowScrollIndex = rowIndex;\n-  };\n+        this.grid.queueRefresh();\n+      };\n \n-  GridRenderContainer.prototype.adjustColumns = function adjustColumns(scrollLeft, scrollPercentage) {\n-    var self = this;\n+      GridRenderContainer.prototype.adjustRows = function adjustRows(scrollTop, scrollPercentage, postDataLoaded) {\n+        var self = this;\n \n-    var minCols = self.minColumnsToRender();\n+        var minRows = self.minRowsToRender();\n+        var rowCache = self.visibleRowCache;\n+        var maxRowIndex = rowCache.length - minRows;\n+        var vertLen = self.getVerticalScrollLength();\n \n-    var columnCache = self.visibleColumnCache;\n-    var maxColumnIndex = columnCache.length - minCols;\n+        //// Calculate the scroll percentage according to the scrollTop location, if no percentage was provided\n+        if ((typeof(scrollPercentage) === 'undefined' || scrollPercentage === null) && scrollTop) {\n+          scrollPercentage = scrollTop / vertLen ;\n+        }\n \n-    // Calculate the scroll percentage according to the scrollLeft location, if no percentage was provided\n-    if ((typeof(scrollPercentage) === 'undefined' || scrollPercentage === null) && scrollLeft) {\n-      scrollPercentage = scrollLeft / self.getHorizontalScrollLength();\n-    }\n+        var theoreticalRowIndex = 0;\n+        var heightAtFirstRow = 0;\n+        var currentHeight = 0;\n+        var i = 0;\n+\n+        rowCache.forEach(function(r){\n+          if ( scrollTop > currentHeight && scrollTop < currentHeight + r.height){\n+            theoreticalRowIndex = i;\n+            heightAtFirstRow = currentHeight;\n+          }\n+\n+          currentHeight+= r.height;\n+          i++;\n+        });\n+\n+        var rowIndex = 0; // OLD = Math.ceil(Math.min(maxRowIndex, maxRowIndex * scrollPercentage));\n+        rowIndex = Math.min(maxRowIndex,theoreticalRowIndex);\n+\n+        //TODO: do we need to fix here?\n+        // Define a max row index that we can't scroll past\n+        // if (rowIndex > maxRowIndex) {\n+        //   rowIndex = maxRowIndex;\n+        // }\n+\n+        var newRange = [];\n+        if (rowCache.length > self.grid.options.virtualizationThreshold) {\n+\n+          if (!(typeof(scrollTop) === 'undefined' || scrollTop === null)) {\n+            // Have we hit the threshold going down?\n+            if ( !self.grid.suppressParentScrollDown && self.prevScrollTop < scrollTop && rowIndex < self.prevRowScrollIndex + self.grid.options.scrollThreshold && rowIndex < maxRowIndex) {\n+              console.log('returning first bail');","path":"src/js/core/factories/GridRenderContainer.js","position":870,"original_position":870,"commit_id":"dc183a1eeda5d19dbb5472c658cb78ef54c54fa2","original_commit_id":"dc183a1eeda5d19dbb5472c658cb78ef54c54fa2","user":{"login":"mportuga","id":6733275,"avatar_url":"https://avatars.githubusercontent.com/u/6733275?v=3","gravatar_id":"","url":"https://api.github.com/users/mportuga","html_url":"https://github.com/mportuga","followers_url":"https://api.github.com/users/mportuga/followers","following_url":"https://api.github.com/users/mportuga/following{/other_user}","gists_url":"https://api.github.com/users/mportuga/gists{/gist_id}","starred_url":"https://api.github.com/users/mportuga/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mportuga/subscriptions","organizations_url":"https://api.github.com/users/mportuga/orgs","repos_url":"https://api.github.com/users/mportuga/repos","events_url":"https://api.github.com/users/mportuga/events{/privacy}","received_events_url":"https://api.github.com/users/mportuga/received_events","type":"User","site_admin":false},"body":"You should comment this out, we don't want the grid logging this in production.","created_at":"2016-10-18T13:51:07Z","updated_at":"2016-10-18T13:51:07Z","html_url":"https://github.com/angular-ui/ui-grid/pull/5395#discussion_r83857880","pull_request_url":"https://api.github.com/repos/angular-ui/ui-grid/pulls/5395","_links":{"self":{"href":"https://api.github.com/repos/angular-ui/ui-grid/pulls/comments/83857880"},"html":{"href":"https://github.com/angular-ui/ui-grid/pull/5395#discussion_r83857880"},"pull_request":{"href":"https://api.github.com/repos/angular-ui/ui-grid/pulls/5395"}}},"pull_request":{"url":"https://api.github.com/repos/angular-ui/ui-grid/pulls/5395","id":69588604,"html_url":"https://github.com/angular-ui/ui-grid/pull/5395","diff_url":"https://github.com/angular-ui/ui-grid/pull/5395.diff","patch_url":"https://github.com/angular-ui/ui-grid/pull/5395.patch","issue_url":"https://api.github.com/repos/angular-ui/ui-grid/issues/5395","number":5395,"state":"open","locked":false,"title":"fixed scrollPercent calculation for GridRenderContainer and InfiniteScroll Feature","user":{"login":"vance","id":145471,"avatar_url":"https://avatars.githubusercontent.com/u/145471?v=3","gravatar_id":"","url":"https://api.github.com/users/vance","html_url":"https://github.com/vance","followers_url":"https://api.github.com/users/vance/followers","following_url":"https://api.github.com/users/vance/following{/other_user}","gists_url":"https://api.github.com/users/vance/gists{/gist_id}","starred_url":"https://api.github.com/users/vance/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vance/subscriptions","organizations_url":"https://api.github.com/users/vance/orgs","repos_url":"https://api.github.com/users/vance/repos","events_url":"https://api.github.com/users/vance/events{/privacy}","received_events_url":"https://api.github.com/users/vance/received_events","type":"User","site_admin":false},"body":"fixed scrollPercent calculation for GridRenderContainer and InfiniteScroll Feature\r\n\r\nfixes for\r\n https://github.com/angular-ui/ui-grid/issues/5211 \r\nand \r\nhttps://github.com/angular-ui/ui-grid/issues/4508","created_at":"2016-05-10T22:29:36Z","updated_at":"2016-10-18T13:51:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6f67db848b1242af53bd130602b51ef711850f79","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/angular-ui/ui-grid/pulls/5395/commits","review_comments_url":"https://api.github.com/repos/angular-ui/ui-grid/pulls/5395/comments","review_comment_url":"https://api.github.com/repos/angular-ui/ui-grid/pulls/comments{/number}","comments_url":"https://api.github.com/repos/angular-ui/ui-grid/issues/5395/comments","statuses_url":"https://api.github.com/repos/angular-ui/ui-grid/statuses/dc183a1eeda5d19dbb5472c658cb78ef54c54fa2","head":{"label":"vance:master","ref":"master","sha":"dc183a1eeda5d19dbb5472c658cb78ef54c54fa2","user":{"login":"vance","id":145471,"avatar_url":"https://avatars.githubusercontent.com/u/145471?v=3","gravatar_id":"","url":"https://api.github.com/users/vance","html_url":"https://github.com/vance","followers_url":"https://api.github.com/users/vance/followers","following_url":"https://api.github.com/users/vance/following{/other_user}","gists_url":"https://api.github.com/users/vance/gists{/gist_id}","starred_url":"https://api.github.com/users/vance/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vance/subscriptions","organizations_url":"https://api.github.com/users/vance/orgs","repos_url":"https://api.github.com/users/vance/repos","events_url":"https://api.github.com/users/vance/events{/privacy}","received_events_url":"https://api.github.com/users/vance/received_events","type":"User","site_admin":false},"repo":{"id":58496848,"name":"ui-grid","full_name":"vance/ui-grid","owner":{"login":"vance","id":145471,"avatar_url":"https://avatars.githubusercontent.com/u/145471?v=3","gravatar_id":"","url":"https://api.github.com/users/vance","html_url":"https://github.com/vance","followers_url":"https://api.github.com/users/vance/followers","following_url":"https://api.github.com/users/vance/following{/other_user}","gists_url":"https://api.github.com/users/vance/gists{/gist_id}","starred_url":"https://api.github.com/users/vance/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vance/subscriptions","organizations_url":"https://api.github.com/users/vance/orgs","repos_url":"https://api.github.com/users/vance/repos","events_url":"https://api.github.com/users/vance/events{/privacy}","received_events_url":"https://api.github.com/users/vance/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/vance/ui-grid","description":"UI Grid: an Angular Data Grid","fork":true,"url":"https://api.github.com/repos/vance/ui-grid","forks_url":"https://api.github.com/repos/vance/ui-grid/forks","keys_url":"https://api.github.com/repos/vance/ui-grid/keys{/key_id}","collaborators_url":"https://api.github.com/repos/vance/ui-grid/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/vance/ui-grid/teams","hooks_url":"https://api.github.com/repos/vance/ui-grid/hooks","issue_events_url":"https://api.github.com/repos/vance/ui-grid/issues/events{/number}","events_url":"https://api.github.com/repos/vance/ui-grid/events","assignees_url":"https://api.github.com/repos/vance/ui-grid/assignees{/user}","branches_url":"https://api.github.com/repos/vance/ui-grid/branches{/branch}","tags_url":"https://api.github.com/repos/vance/ui-grid/tags","blobs_url":"https://api.github.com/repos/vance/ui-grid/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/vance/ui-grid/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/vance/ui-grid/git/refs{/sha}","trees_url":"https://api.github.com/repos/vance/ui-grid/git/trees{/sha}","statuses_url":"https://api.github.com/repos/vance/ui-grid/statuses/{sha}","languages_url":"https://api.github.com/repos/vance/ui-grid/languages","stargazers_url":"https://api.github.com/repos/vance/ui-grid/stargazers","contributors_url":"https://api.github.com/repos/vance/ui-grid/contributors","subscribers_url":"https://api.github.com/repos/vance/ui-grid/subscribers","subscription_url":"https://api.github.com/repos/vance/ui-grid/subscription","commits_url":"https://api.github.com/repos/vance/ui-grid/commits{/sha}","git_commits_url":"https://api.github.com/repos/vance/ui-grid/git/commits{/sha}","comments_url":"https://api.github.com/repos/vance/ui-grid/comments{/number}","issue_comment_url":"https://api.github.com/repos/vance/ui-grid/issues/comments{/number}","contents_url":"https://api.github.com/repos/vance/ui-grid/contents/{+path}","compare_url":"https://api.github.com/repos/vance/ui-grid/compare/{base}...{head}","merges_url":"https://api.github.com/repos/vance/ui-grid/merges","archive_url":"https://api.github.com/repos/vance/ui-grid/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/vance/ui-grid/downloads","issues_url":"https://api.github.com/repos/vance/ui-grid/issues{/number}","pulls_url":"https://api.github.com/repos/vance/ui-grid/pulls{/number}","milestones_url":"https://api.github.com/repos/vance/ui-grid/milestones{/number}","notifications_url":"https://api.github.com/repos/vance/ui-grid/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/vance/ui-grid/labels{/name}","releases_url":"https://api.github.com/repos/vance/ui-grid/releases{/id}","deployments_url":"https://api.github.com/repos/vance/ui-grid/deployments","created_at":"2016-05-10T22:16:14Z","updated_at":"2016-05-10T22:16:17Z","pushed_at":"2016-05-10T22:27:39Z","git_url":"git://github.com/vance/ui-grid.git","ssh_url":"git@github.com:vance/ui-grid.git","clone_url":"https://github.com/vance/ui-grid.git","svn_url":"https://github.com/vance/ui-grid","homepage":"http://ui-grid.info","size":15640,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"angular-ui:master","ref":"master","sha":"68681d71823fc0c1b9f45e9fa7832de71233c7ab","user":{"login":"angular-ui","id":1530011,"avatar_url":"https://avatars.githubusercontent.com/u/1530011?v=3","gravatar_id":"","url":"https://api.github.com/users/angular-ui","html_url":"https://github.com/angular-ui","followers_url":"https://api.github.com/users/angular-ui/followers","following_url":"https://api.github.com/users/angular-ui/following{/other_user}","gists_url":"https://api.github.com/users/angular-ui/gists{/gist_id}","starred_url":"https://api.github.com/users/angular-ui/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular-ui/subscriptions","organizations_url":"https://api.github.com/users/angular-ui/orgs","repos_url":"https://api.github.com/users/angular-ui/repos","events_url":"https://api.github.com/users/angular-ui/events{/privacy}","received_events_url":"https://api.github.com/users/angular-ui/received_events","type":"Organization","site_admin":false},"repo":{"id":6198699,"name":"ui-grid","full_name":"angular-ui/ui-grid","owner":{"login":"angular-ui","id":1530011,"avatar_url":"https://avatars.githubusercontent.com/u/1530011?v=3","gravatar_id":"","url":"https://api.github.com/users/angular-ui","html_url":"https://github.com/angular-ui","followers_url":"https://api.github.com/users/angular-ui/followers","following_url":"https://api.github.com/users/angular-ui/following{/other_user}","gists_url":"https://api.github.com/users/angular-ui/gists{/gist_id}","starred_url":"https://api.github.com/users/angular-ui/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular-ui/subscriptions","organizations_url":"https://api.github.com/users/angular-ui/orgs","repos_url":"https://api.github.com/users/angular-ui/repos","events_url":"https://api.github.com/users/angular-ui/events{/privacy}","received_events_url":"https://api.github.com/users/angular-ui/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/angular-ui/ui-grid","description":"UI Grid: an Angular Data Grid","fork":false,"url":"https://api.github.com/repos/angular-ui/ui-grid","forks_url":"https://api.github.com/repos/angular-ui/ui-grid/forks","keys_url":"https://api.github.com/repos/angular-ui/ui-grid/keys{/key_id}","collaborators_url":"https://api.github.com/repos/angular-ui/ui-grid/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/angular-ui/ui-grid/teams","hooks_url":"https://api.github.com/repos/angular-ui/ui-grid/hooks","issue_events_url":"https://api.github.com/repos/angular-ui/ui-grid/issues/events{/number}","events_url":"https://api.github.com/repos/angular-ui/ui-grid/events","assignees_url":"https://api.github.com/repos/angular-ui/ui-grid/assignees{/user}","branches_url":"https://api.github.com/repos/angular-ui/ui-grid/branches{/branch}","tags_url":"https://api.github.com/repos/angular-ui/ui-grid/tags","blobs_url":"https://api.github.com/repos/angular-ui/ui-grid/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/angular-ui/ui-grid/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/angular-ui/ui-grid/git/refs{/sha}","trees_url":"https://api.github.com/repos/angular-ui/ui-grid/git/trees{/sha}","statuses_url":"https://api.github.com/repos/angular-ui/ui-grid/statuses/{sha}","languages_url":"https://api.github.com/repos/angular-ui/ui-grid/languages","stargazers_url":"https://api.github.com/repos/angular-ui/ui-grid/stargazers","contributors_url":"https://api.github.com/repos/angular-ui/ui-grid/contributors","subscribers_url":"https://api.github.com/repos/angular-ui/ui-grid/subscribers","subscription_url":"https://api.github.com/repos/angular-ui/ui-grid/subscription","commits_url":"https://api.github.com/repos/angular-ui/ui-grid/commits{/sha}","git_commits_url":"https://api.github.com/repos/angular-ui/ui-grid/git/commits{/sha}","comments_url":"https://api.github.com/repos/angular-ui/ui-grid/comments{/number}","issue_comment_url":"https://api.github.com/repos/angular-ui/ui-grid/issues/comments{/number}","contents_url":"https://api.github.com/repos/angular-ui/ui-grid/contents/{+path}","compare_url":"https://api.github.com/repos/angular-ui/ui-grid/compare/{base}...{head}","merges_url":"https://api.github.com/repos/angular-ui/ui-grid/merges","archive_url":"https://api.github.com/repos/angular-ui/ui-grid/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/angular-ui/ui-grid/downloads","issues_url":"https://api.github.com/repos/angular-ui/ui-grid/issues{/number}","pulls_url":"https://api.github.com/repos/angular-ui/ui-grid/pulls{/number}","milestones_url":"https://api.github.com/repos/angular-ui/ui-grid/milestones{/number}","notifications_url":"https://api.github.com/repos/angular-ui/ui-grid/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/angular-ui/ui-grid/labels{/name}","releases_url":"https://api.github.com/repos/angular-ui/ui-grid/releases{/id}","deployments_url":"https://api.github.com/repos/angular-ui/ui-grid/deployments","created_at":"2012-10-13T01:39:25Z","updated_at":"2016-10-18T09:25:20Z","pushed_at":"2016-10-18T13:19:11Z","git_url":"git://github.com/angular-ui/ui-grid.git","ssh_url":"git@github.com:angular-ui/ui-grid.git","clone_url":"https://github.com/angular-ui/ui-grid.git","svn_url":"https://github.com/angular-ui/ui-grid","homepage":"http://ui-grid.info","size":21315,"stargazers_count":4386,"watchers_count":4386,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2196,"mirror_url":null,"open_issues_count":1242,"forks":2196,"open_issues":1242,"watchers":4386,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/angular-ui/ui-grid/pulls/5395"},"html":{"href":"https://github.com/angular-ui/ui-grid/pull/5395"},"issue":{"href":"https://api.github.com/repos/angular-ui/ui-grid/issues/5395"},"comments":{"href":"https://api.github.com/repos/angular-ui/ui-grid/issues/5395/comments"},"review_comments":{"href":"https://api.github.com/repos/angular-ui/ui-grid/pulls/5395/comments"},"review_comment":{"href":"https://api.github.com/repos/angular-ui/ui-grid/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/angular-ui/ui-grid/pulls/5395/commits"},"statuses":{"href":"https://api.github.com/repos/angular-ui/ui-grid/statuses/dc183a1eeda5d19dbb5472c658cb78ef54c54fa2"}}}}
{"actor":{"display_login":"mportuga"}}