|
@@ -7,28 +7,6 @@ BlazeComponent.extendComponent({
|
|
|
this.cardlimit = new ReactiveVar(InfiniteScrollIter);
|
|
|
},
|
|
|
|
|
|
- onRendered() {
|
|
|
- const domElement = this.find('.js-perfect-scrollbar');
|
|
|
-
|
|
|
- this.$(domElement).on('scroll', () => this.updateList(domElement));
|
|
|
- $(window).on(`resize.${this.data().listId}`, () => this.updateList(domElement));
|
|
|
-
|
|
|
- // we add a Mutation Observer to allow propagations of cardlimit
|
|
|
- // when the spinner stays in the current view (infinite scrolling)
|
|
|
- this.mutationObserver = new MutationObserver(() => this.updateList(domElement));
|
|
|
-
|
|
|
- this.mutationObserver.observe(domElement, {
|
|
|
- childList: true,
|
|
|
- });
|
|
|
-
|
|
|
- this.updateList(domElement);
|
|
|
- },
|
|
|
-
|
|
|
- onDestroyed() {
|
|
|
- $(window).off(`resize.${this.data().listId}`);
|
|
|
- this.mutationObserver.disconnect();
|
|
|
- },
|
|
|
-
|
|
|
mixins() {
|
|
|
return [Mixins.PerfectScrollbar];
|
|
|
},
|
|
@@ -191,38 +169,11 @@ BlazeComponent.extendComponent({
|
|
|
});
|
|
|
},
|
|
|
|
|
|
- spinnerInView(container) {
|
|
|
- const parentViewHeight = container.clientHeight;
|
|
|
- const bottomViewPosition = container.scrollTop + parentViewHeight;
|
|
|
-
|
|
|
- const spinner = this.find('.sk-spinner-list');
|
|
|
-
|
|
|
- const threshold = spinner.offsetTop;
|
|
|
-
|
|
|
- return bottomViewPosition > threshold;
|
|
|
- },
|
|
|
-
|
|
|
showSpinner(swimlaneId) {
|
|
|
const list = Template.currentData();
|
|
|
return list.cards(swimlaneId).count() > this.cardlimit.get();
|
|
|
},
|
|
|
|
|
|
- updateList(container) {
|
|
|
- // first, if the spinner is not rendered, we have reached the end of
|
|
|
- // the list of cards, so skip and disable firing the events
|
|
|
- const target = this.find('.sk-spinner-list');
|
|
|
- if (!target) {
|
|
|
- this.$(container).off('scroll');
|
|
|
- $(window).off(`resize.${this.data().listId}`);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (this.spinnerInView(container)) {
|
|
|
- this.cardlimit.set(this.cardlimit.get() + InfiniteScrollIter);
|
|
|
- Ps.update(container);
|
|
|
- }
|
|
|
- },
|
|
|
-
|
|
|
canSeeAddCard() {
|
|
|
return !this.reachedWipLimit() && Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
|
|
|
},
|
|
@@ -661,3 +612,43 @@ BlazeComponent.extendComponent({
|
|
|
}];
|
|
|
},
|
|
|
}).register('searchElementPopup');
|
|
|
+
|
|
|
+BlazeComponent.extendComponent({
|
|
|
+ onCreated() {
|
|
|
+ this.spinnerShown = false;
|
|
|
+ this.cardlimit = this.parentComponent().cardlimit;
|
|
|
+ },
|
|
|
+
|
|
|
+ onRendered() {
|
|
|
+ const spinner = this.find('.sk-spinner-list');
|
|
|
+
|
|
|
+ if (spinner) {
|
|
|
+ const options = {
|
|
|
+ root: null, // we check if the spinner is on the current viewport
|
|
|
+ rootMargin: '0px',
|
|
|
+ threshold: 0.25,
|
|
|
+ };
|
|
|
+
|
|
|
+ this.observer = new IntersectionObserver((entries) => {
|
|
|
+ entries.forEach((entry) => {
|
|
|
+ this.spinnerShown = entry.isIntersecting;
|
|
|
+ this.updateList();
|
|
|
+ });
|
|
|
+ }, options);
|
|
|
+
|
|
|
+ this.observer.observe(spinner);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ onDestroyed() {
|
|
|
+ this.observer.disconnect();
|
|
|
+ },
|
|
|
+
|
|
|
+ updateList() {
|
|
|
+ if (this.spinnerShown) {
|
|
|
+ this.cardlimit.set(this.cardlimit.get() + InfiniteScrollIter);
|
|
|
+ window.requestIdleCallback(() => this.updateList());
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+}).register('spinnerList');
|