Skip to content

Commit 40bedd7

Browse files
committed
feat(collectionRepeat): in grid, use height of tallest item in row
Closes #3387.
1 parent 0e1689d commit 40bedd7

File tree

3 files changed

+22
-18
lines changed

3 files changed

+22
-18
lines changed

Diff for: js/angular/directive/collectionRepeat.js

+18-10
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ function CollectionRepeatDirective($ionicCollectionManager, $parse, $window, $$r
394394

395395
RepeatManagerFactory.$inject = ['$rootScope', '$window', '$$rAF'];
396396
function RepeatManagerFactory($rootScope, $window, $$rAF) {
397-
var EMPTY_DIMENSION = { primaryPos: 0, secondaryPos: 0, primarySize: 0, secondarySize: 0 };
397+
var EMPTY_DIMENSION = { primaryPos: 0, secondaryPos: 0, primarySize: 0, secondarySize: 0, rowPrimarySize: 0 };
398398

399399
return function RepeatController(options) {
400400
var afterItemsNode = options.afterItemsNode;
@@ -482,6 +482,7 @@ function RepeatManagerFactory($rootScope, $window, $$rAF) {
482482
scrollView.__$callback = scrollView.__callback;
483483
scrollView.__callback = function(transformLeft, transformTop, zoom, wasResize) {
484484
var scrollValue = view.getScrollValue();
485+
if(window.d)dump('_-callback render', scrollValue, view.scrollPrimarySize + renderAfterBoundary);
485486
if (renderStartIndex === -1 ||
486487
scrollValue + view.scrollPrimarySize > renderAfterBoundary ||
487488
scrollValue < renderBeforeBoundary) {
@@ -641,6 +642,7 @@ function RepeatManagerFactory($rootScope, $window, $$rAF) {
641642
if (item.secondarySize !== dim.secondarySize || item.primarySize !== dim.primarySize) {
642643
item.node.style.cssText = item.node.style.cssText
643644
.replace(WIDTH_HEIGHT_REGEX, WIDTH_HEIGHT_TEMPLATE_STR
645+
//TODO fix item.primarySize + 1 hack
644646
.replace(PRIMARY, (item.primarySize = dim.primarySize) + 1)
645647
.replace(SECONDARY, (item.secondarySize = dim.secondarySize))
646648
);
@@ -858,14 +860,22 @@ function RepeatManagerFactory($rootScope, $window, $$rAF) {
858860
dim.secondaryPos = prevDimension.secondaryPos + prevDimension.secondarySize;
859861

860862
if (i === 0 || dim.secondaryPos + dim.secondarySize > self.scrollSecondarySize) {
861-
dim.rowStartIndex = i;
862863
dim.secondaryPos = 0;
863864
dim.primarySize = self.getItemPrimarySize(i, data[i]);
864-
dim.primaryPos = prevDimension.primaryPos + prevDimension.primarySize;
865+
dim.primaryPos = prevDimension.primaryPos + prevDimension.rowPrimarySize;
866+
867+
dim.rowStartIndex = i;
868+
dim.rowPrimarySize = dim.primarySize;
865869
} else {
866-
dim.rowStartIndex = prevDimension.rowStartIndex;
867-
dim.primarySize = prevDimension.primarySize;
870+
dim.primarySize = self.getItemPrimarySize(i, data[i]);
868871
dim.primaryPos = prevDimension.primaryPos;
872+
dim.rowStartIndex = prevDimension.rowStartIndex;
873+
874+
dimensions[dim.rowStartIndex].rowPrimarySize = dim.rowPrimarySize = Math.max(
875+
dimensions[dim.rowStartIndex].rowPrimarySize,
876+
dim.primarySize
877+
);
878+
dim.rowPrimarySize = Math.max(dim.primarySize, dim.rowPrimarySize);
869879
}
870880
}
871881
}
@@ -929,7 +939,7 @@ function RepeatManagerFactory($rootScope, $window, $$rAF) {
929939
// scrolling down
930940
} else if (scrollValue >= oldScrollValue) {
931941
for (i = oldRenderStartIndex, len = data.length; i < len; i++) {
932-
if ((dim = this.getDimensions(i)) && dim.primaryPos + dim.primarySize >= scrollValue) {
942+
if ((dim = this.getDimensions(i)) && dim.primaryPos + dim.rowPrimarySize >= scrollValue) {
933943
break;
934944
}
935945
}
@@ -950,7 +960,7 @@ function RepeatManagerFactory($rootScope, $window, $$rAF) {
950960
// -- Calculate renderEndIndex
951961
var lastRowDim;
952962
for (i = renderStartIndex + 1, len = data.length; i < len; i++) {
953-
if ((dim = this.getDimensions(i)) && dim.primaryPos + dim.primarySize > scrollValueEnd) {
963+
if ((dim = this.getDimensions(i)) && dim.primaryPos + dim.rowPrimarySize > scrollValueEnd) {
954964

955965
// Go all the way to the end of the row if we're in a grid
956966
if (isGridView) {
@@ -966,7 +976,7 @@ function RepeatManagerFactory($rootScope, $window, $$rAF) {
966976

967977
renderEndIndex = Math.min(i, data.length - 1);
968978
renderAfterBoundary = renderEndIndex !== -1 ?
969-
((dim = this.getDimensions(renderEndIndex)).primaryPos + dim.primarySize) :
979+
((dim = this.getDimensions(renderEndIndex)).primaryPos + (dim.rowPrimarySize || dim.primarySize)) :
970980
-1;
971981

972982
oldScrollValue = scrollValue;
@@ -978,5 +988,3 @@ function RepeatManagerFactory($rootScope, $window, $$rAF) {
978988
};
979989

980990
}
981-
982-

Diff for: test/html/collection-repeat/basic-grid.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ <h1 class="title">Basic Grid: Dynamic Dimensions</h1>
1919
<ion-list can-swipe="true">
2020
<ion-item class="item"
2121
collection-repeat="item in items"
22-
collection-item-height="75 + ($index % 40)*2"
22+
collection-item-height="65 + (($index % 3) * 10)"
2323
collection-item-width="(10 + ($index % 10))+ '%'">
2424
<h2>{{item.text}}</h2>
2525
</ion-item>

Diff for: test/unit/angular/directive/collectionRepeat.unit.js

+3-7
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ describe('collectionRepeat', function() {
409409
var dim = activeItemDimensions();
410410
//Row 0
411411
expect(dim[0]).toBe('x:0,y:0,w:16,h:50');
412-
expect(dim[1]).toBe('x:16,y:0,w:32,h:50');
412+
expect(dim[1]).toBe('x:16,y:0,w:32,h:25');
413413
expect(dim[2]).toBe('x:48,y:0,w:48,h:50');
414414
// Row 1
415415
expect(dim[3]).toBe('x:0,y:50,w:64,h:25');
@@ -429,21 +429,17 @@ describe('collectionRepeat', function() {
429429
expect(dim[0]).toBe('x:0,y:50,w:64,h:25');
430430
//Row 2
431431
expect(dim[1]).toBe('x:0,y:75,w:80,h:50');
432-
expect(dim[2]).toBe('x:80,y:75,w:16,h:50');
432+
expect(dim[2]).toBe('x:80,y:75,w:16,h:25');
433433

434434
// row 3, index 6: 50 height, 2 items (width 32%, 48%)
435435

436436
//Scroll past row 2 and row 3 to the end
437437
scrollTo(176);
438-
// row 4, index 8: 50 height, 1 item (width 64%)
439-
// row 5, index 9: 25 height, 2 items (width 80%, 16%)
440438
expect(activeItems().length).toBe(2);
441-
expect(activeItemContents()).toEqual(['8', '9']);
439+
expect(activeItemContents()).toEqual(['8','9']);
442440

443441
dim = activeItemDimensions();
444-
//Row 3
445442
expect(dim[0]).toBe('x:0,y:175,w:64,h:50');
446-
//Row 4
447443
expect(dim[1]).toBe('x:0,y:225,w:80,h:25');
448444
});
449445

0 commit comments

Comments
 (0)