diff --git a/addon/components/ember-scrollable.js b/addon/components/ember-scrollable.js index 1aca9086..ae969492 100644 --- a/addon/components/ember-scrollable.js +++ b/addon/components/ember-scrollable.js @@ -369,7 +369,12 @@ export default Component.extend(InboundActionsMixin, DomMixin, { }, resizeScrollbar() { - this.createScrollbarAndShowIfNecessary(); + if (this.get('horizontalScrollbar')) { + this.updateScrollbarAndSetupProperties(this.get('scrollToX'), 'horizontal'); + } + if (this.get('verticalScrollbar')) { + this.updateScrollbarAndSetupProperties(this.get('scrollToY'), 'vertical'); + } }, showScrollbar() { diff --git a/package.json b/package.json index 52865387..61b78fb8 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "ember-cli-sri": "^2.1.0", "ember-cli-uglify": "^2.0.0", "ember-code-snippet": "2.0.0", + "ember-composable-helpers": "^2.1.0", "ember-disable-prototype-extensions": "^1.1.2", "ember-drag-drop": "0.4.6", "ember-export-application-global": "^2.0.0", diff --git a/tests/acceptance/index-test.js b/tests/acceptance/index-test.js index f269b555..857c4339 100644 --- a/tests/acceptance/index-test.js +++ b/tests/acceptance/index-test.js @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; -import { visit, currentURL } from '@ember/test-helpers'; +import { visit, currentURL, triggerEvent as triggerEventTestHelper, settled } from '@ember/test-helpers'; import { click, fillIn, find, triggerEvent } from 'ember-native-dom-helpers'; import { timeout } from 'ember-scrollable/util/timeout'; import { THROTTLE_TIME_LESS_THAN_60_FPS_IN_MS } from 'ember-scrollable/components/ember-scrollable'; @@ -75,4 +75,25 @@ module('Acceptance | ember-scrollbar', function(hooks) { assert.equal(elementHeight(scrollArea), 18); assert.ok(find('.no-scrollbar-demo .ember-scrollable .drag-handle:not(.visible)'), 'handle goes away when overflow is gone'); }); + + test('Scrollbar is resized and correctly positioned during infinite scroll', async function(assert) { + await visit('/'); + + let dragHandle = await find('.infinite-scroll-demo .drag-handle'); + const dragHandleHeightBeforeScroll = parseInt(dragHandle.style.height); + + const scrollContent = await find('.infinite-scroll-demo .tse-scroll-content'); + // Move scrollbar to bottom + scrollContent.scrollTop = + scrollContent.scrollHeight - scrollContent.offsetHeight; + await triggerEventTestHelper('.tse-scroll-content', 'scroll'); + // Wait for scroll event handler adds more scroll content + await settled(); + + dragHandle = await find('.infinite-scroll-demo .drag-handle'); + // Drag handle size should be shorter than before since there is now more scroll content + assert.ok(parseInt(dragHandle.style.height) < dragHandleHeightBeforeScroll); + // Drag handle should not be reset back to the top + assert.ok(parseInt(dragHandle.style.top) !== 0); + }); }); diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index 278cb637..08aa1d3b 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -4,12 +4,20 @@ import Controller from '@ember/controller'; export default Controller.extend({ isShort: true, + infiniteScrollItems: 20, + infiniteScrollPage: 1, + actions: { log(message) { console.log(message); }, toggleHeight() { this.toggleProperty('isShort'); + }, + loadMore() { + const items = ++this.infiniteScrollPage * 20; + console.log(`Load up to ${items} items`); + this.set('infiniteScrollItems', items); } } }); diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 83fbbdef..d6852163 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -256,3 +256,23 @@ {{code-snippet name="event-and-setter.hbs"}} + +
+

Infinite Scroll

+ +
+ {{!-- BEGIN-SNIPPET infinite-scroll --}} +
+ {{#ember-scrollable onScrolledToBottom=(action 'loadMore') as |scrollable|}} + {{#each (repeat (compute scrollable.update infiniteScrollItems)) as |empty|}} +

Some Content

+ {{/each}} + {{/ember-scrollable}} +
+ {{!-- END-SNIPPET --}} +
+ +
+ {{code-snippet name="infinite-scroll.hbs"}} +
+
\ No newline at end of file