UNPKG

20.2 kBJavaScriptView Raw
1System.registerDynamic('src/infinite-scroll', ['@angular/core', './position-resolver', './scroll-register', './scroll-resolver'], true, function ($__require, exports, module) {
2 "use strict";
3
4 var global = this || self,
5 GLOBAL = global;
6 var core_1 = $__require('@angular/core');
7 var position_resolver_1 = $__require('./position-resolver');
8 var scroll_register_1 = $__require('./scroll-register');
9 var scroll_resolver_1 = $__require('./scroll-resolver');
10 var InfiniteScroll = function () {
11 function InfiniteScroll(element, zone, positionResolverFactory, scrollRegister, scrollerResolver) {
12 this.element = element;
13 this.zone = zone;
14 this.positionResolverFactory = positionResolverFactory;
15 this.scrollRegister = scrollRegister;
16 this.scrollerResolver = scrollerResolver;
17 this.scrolled = new core_1.EventEmitter();
18 this.scrolledUp = new core_1.EventEmitter();
19 this._distanceDown = 2;
20 this._distanceUp = 1.5;
21 this._throttle = 300;
22 this._disabled = false;
23 this._container = null;
24 this.scrollWindow = true;
25 this._immediate = false;
26 this._horizontal = false;
27 this._alwaysCallback = false;
28 this.throttleType = 'throttle';
29 }
30 Object.defineProperty(InfiniteScroll.prototype, "debounce", {
31 set: function (value) {
32 this.throttleType = value === '' || !!value ? 'debounce' : 'throttle';
33 },
34 enumerable: true,
35 configurable: true
36 });
37 InfiniteScroll.prototype.ngOnInit = function () {
38 var _this = this;
39 if (typeof window !== 'undefined') {
40 var containerElement = this.resolveContainerElement();
41 var positionResolver_1 = this.positionResolverFactory.create({
42 windowElement: containerElement,
43 horizontal: this._horizontal
44 });
45 var options = {
46 container: positionResolver_1.container,
47 throttleType: this.throttleType,
48 throttleDuration: this._throttle,
49 filterBefore: function () {
50 return !_this._disabled;
51 },
52 mergeMap: function () {
53 return positionResolver_1.calculatePoints(_this.element);
54 },
55 scrollHandler: function (container) {
56 return _this.handleOnScroll(container);
57 }
58 };
59 this.disposeScroller = this.scrollRegister.attachEvent(options);
60 }
61 };
62 InfiniteScroll.prototype.handleOnScroll = function (container) {
63 var scrollResolverConfig = {
64 distance: {
65 down: this._distanceDown,
66 up: this._distanceUp
67 }
68 };
69 var scrollStats = this.scrollerResolver.getScrollStats(container, scrollResolverConfig);
70 if (this.shouldTriggerEvents(scrollStats.shouldScroll)) {
71 var infiniteScrollEvent = {
72 currentScrollPosition: container.scrolledUntilNow
73 };
74 if (scrollStats.isScrollingDown) {
75 this.onScrollDown(infiniteScrollEvent);
76 } else {
77 this.onScrollUp(infiniteScrollEvent);
78 }
79 }
80 };
81 InfiniteScroll.prototype.shouldTriggerEvents = function (shouldScroll) {
82 return (this._alwaysCallback || shouldScroll) && !this._disabled;
83 };
84 InfiniteScroll.prototype.ngOnDestroy = function () {
85 if (this.disposeScroller) {
86 this.disposeScroller.unsubscribe();
87 }
88 };
89 InfiniteScroll.prototype.onScrollDown = function (data) {
90 var _this = this;
91 if (data === void 0) {
92 data = { currentScrollPosition: 0 };
93 }
94 this.zone.run(function () {
95 return _this.scrolled.emit(data);
96 });
97 };
98 InfiniteScroll.prototype.onScrollUp = function (data) {
99 var _this = this;
100 if (data === void 0) {
101 data = { currentScrollPosition: 0 };
102 }
103 this.zone.run(function () {
104 return _this.scrolledUp.emit(data);
105 });
106 };
107 InfiniteScroll.prototype.resolveContainerElement = function () {
108 if (this._container) {
109 return typeof this._container === 'string' ? window.document.querySelector(this._container) : this._container;
110 } else {
111 return this.scrollWindow ? window : this.element;
112 }
113 };
114 InfiniteScroll.decorators = [{ type: core_1.Directive, args: [{
115 selector: '[infinite-scroll]'
116 }] }];
117 /** @nocollapse */
118 InfiniteScroll.ctorParameters = function () {
119 return [{ type: core_1.ElementRef }, { type: core_1.NgZone }, { type: position_resolver_1.PositionResolverFactory }, { type: scroll_register_1.ScrollRegister }, { type: scroll_resolver_1.ScrollResolver }];
120 };
121 InfiniteScroll.propDecorators = {
122 'scrolled': [{ type: core_1.Output }],
123 'scrolledUp': [{ type: core_1.Output }],
124 '_distanceDown': [{ type: core_1.Input, args: ['infiniteScrollDistance'] }],
125 '_distanceUp': [{ type: core_1.Input, args: ['infiniteScrollUpDistance'] }],
126 '_throttle': [{ type: core_1.Input, args: ['infiniteScrollThrottle'] }],
127 '_disabled': [{ type: core_1.Input, args: ['infiniteScrollDisabled'] }],
128 '_container': [{ type: core_1.Input, args: ['infiniteScrollContainer'] }],
129 'scrollWindow': [{ type: core_1.Input, args: ['scrollWindow'] }],
130 '_immediate': [{ type: core_1.Input, args: ['immediateCheck'] }],
131 '_horizontal': [{ type: core_1.Input, args: ['horizontal'] }],
132 '_alwaysCallback': [{ type: core_1.Input, args: ['alwaysCallback'] }],
133 'debounce': [{ type: core_1.Input }]
134 };
135 return InfiniteScroll;
136 }();
137 exports.InfiniteScroll = InfiniteScroll;
138});
139System.registerDynamic('src/axis-resolver', ['@angular/core'], true, function ($__require, exports, module) {
140 "use strict";
141
142 var global = this || self,
143 GLOBAL = global;
144 var core_1 = $__require('@angular/core');
145 var AxisResolverFactory = function () {
146 function AxisResolverFactory() {}
147 AxisResolverFactory.prototype.create = function (vertical) {
148 if (vertical === void 0) {
149 vertical = true;
150 }
151 return new AxisResolver(vertical);
152 };
153 AxisResolverFactory.decorators = [{ type: core_1.Injectable }];
154 /** @nocollapse */
155 AxisResolverFactory.ctorParameters = function () {
156 return [];
157 };
158 return AxisResolverFactory;
159 }();
160 exports.AxisResolverFactory = AxisResolverFactory;
161 var AxisResolver = function () {
162 function AxisResolver(vertical) {
163 if (vertical === void 0) {
164 vertical = true;
165 }
166 this.vertical = vertical;
167 }
168 AxisResolver.prototype.clientHeightKey = function () {
169 return this.vertical ? 'clientHeight' : 'clientWidth';
170 };
171 AxisResolver.prototype.offsetHeightKey = function () {
172 return this.vertical ? 'offsetHeight' : 'offsetWidth';
173 };
174 AxisResolver.prototype.scrollHeightKey = function () {
175 return this.vertical ? 'scrollHeight' : 'scrollWidth';
176 };
177 AxisResolver.prototype.pageYOffsetKey = function () {
178 return this.vertical ? 'pageYOffset' : 'pageXOffset';
179 };
180 AxisResolver.prototype.offsetTopKey = function () {
181 return this.vertical ? 'offsetTop' : 'offsetLeft';
182 };
183 AxisResolver.prototype.scrollTopKey = function () {
184 return this.vertical ? 'scrollTop' : 'scrollLeft';
185 };
186 AxisResolver.prototype.topKey = function () {
187 return this.vertical ? 'top' : 'left';
188 };
189 return AxisResolver;
190 }();
191 exports.AxisResolver = AxisResolver;
192});
193System.registerDynamic('src/position-resolver', ['@angular/core', './axis-resolver'], true, function ($__require, exports, module) {
194 "use strict";
195
196 var global = this || self,
197 GLOBAL = global;
198 var core_1 = $__require('@angular/core');
199 var axis_resolver_1 = $__require('./axis-resolver');
200 var PositionResolverFactory = function () {
201 function PositionResolverFactory(axisResolver) {
202 this.axisResolver = axisResolver;
203 }
204 PositionResolverFactory.prototype.create = function (options) {
205 return new PositionResolver(this.axisResolver.create(!options.horizontal), options);
206 };
207 PositionResolverFactory.decorators = [{ type: core_1.Injectable }];
208 /** @nocollapse */
209 PositionResolverFactory.ctorParameters = function () {
210 return [{ type: axis_resolver_1.AxisResolverFactory }];
211 };
212 return PositionResolverFactory;
213 }();
214 exports.PositionResolverFactory = PositionResolverFactory;
215 var PositionResolver = function () {
216 function PositionResolver(axis, options) {
217 this.axis = axis;
218 this.options = options;
219 this.resolveContainer(this.options.windowElement);
220 this.defineContainer(this.options.windowElement);
221 }
222 PositionResolver.prototype.defineContainer = function (windowElement) {
223 if (this.resolveContainer(windowElement) || !windowElement.nativeElement) {
224 this.container = windowElement;
225 } else {
226 this.container = windowElement.nativeElement;
227 }
228 return this.container;
229 };
230 PositionResolver.prototype.resolveContainer = function (windowElement) {
231 var isContainerWindow = Object.prototype.toString.call(windowElement).includes('Window');
232 this.isContainerWindow = isContainerWindow;
233 return isContainerWindow;
234 };
235 PositionResolver.prototype.getDocumentElement = function () {
236 return this.isContainerWindow ? this.options.windowElement.document.documentElement : null;
237 };
238 PositionResolver.prototype.calculatePoints = function (element) {
239 return this.isContainerWindow ? this.calculatePointsForWindow(element) : this.calculatePointsForElement(element);
240 };
241 PositionResolver.prototype.calculatePointsForWindow = function (element) {
242 // container's height
243 var height = this.height(this.container);
244 // scrolled until now / current y point
245 var scrolledUntilNow = height + this.pageYOffset(this.getDocumentElement());
246 // total height / most bottom y point
247 var totalToScroll = this.offsetTop(element.nativeElement) + this.height(element.nativeElement);
248 return { height: height, scrolledUntilNow: scrolledUntilNow, totalToScroll: totalToScroll };
249 };
250 PositionResolver.prototype.calculatePointsForElement = function (element) {
251 var scrollTop = this.axis.scrollTopKey();
252 var scrollHeight = this.axis.scrollHeightKey();
253 var container = this.container;
254 var height = this.height(container);
255 // perhaps use this.container.offsetTop instead of 'scrollTop'
256 var scrolledUntilNow = container[scrollTop];
257 var containerTopOffset = 0;
258 var offsetTop = this.offsetTop(container);
259 if (offsetTop !== void 0) {
260 containerTopOffset = offsetTop;
261 }
262 var totalToScroll = container[scrollHeight];
263 return { height: height, scrolledUntilNow: scrolledUntilNow, totalToScroll: totalToScroll };
264 };
265 PositionResolver.prototype.height = function (elem) {
266 var offsetHeight = this.axis.offsetHeightKey();
267 var clientHeight = this.axis.clientHeightKey();
268 // elem = elem.nativeElement;
269 if (isNaN(elem[offsetHeight])) {
270 return this.getDocumentElement()[clientHeight];
271 } else {
272 return elem[offsetHeight];
273 }
274 };
275 PositionResolver.prototype.offsetTop = function (elem) {
276 var top = this.axis.topKey();
277 // elem = elem.nativeElement;
278 if (!elem.getBoundingClientRect) {
279 return;
280 }
281 return elem.getBoundingClientRect()[top] + this.pageYOffset(elem);
282 };
283 PositionResolver.prototype.pageYOffset = function (elem) {
284 var pageYOffset = this.axis.pageYOffsetKey();
285 var scrollTop = this.axis.scrollTopKey();
286 var offsetTop = this.axis.offsetTopKey();
287 // elem = elem.nativeElement;
288 if (isNaN(window[pageYOffset])) {
289 return this.getDocumentElement()[scrollTop];
290 } else if (elem.ownerDocument) {
291 return elem.ownerDocument.defaultView[pageYOffset];
292 } else {
293 return elem[offsetTop];
294 }
295 };
296 return PositionResolver;
297 }();
298 exports.PositionResolver = PositionResolver;
299});
300System.registerDynamic('src/index', ['@angular/core', './infinite-scroll', './axis-resolver', './position-resolver', './scroll-register', './scroll-resolver'], true, function ($__require, exports, module) {
301 "use strict";
302
303 var global = this || self,
304 GLOBAL = global;
305 var core_1 = $__require('@angular/core');
306 var infinite_scroll_1 = $__require('./infinite-scroll');
307 var axis_resolver_1 = $__require('./axis-resolver');
308 var position_resolver_1 = $__require('./position-resolver');
309 var scroll_register_1 = $__require('./scroll-register');
310 var scroll_resolver_1 = $__require('./scroll-resolver');
311 var InfiniteScrollModule = function () {
312 function InfiniteScrollModule() {}
313 InfiniteScrollModule.decorators = [{ type: core_1.NgModule, args: [{
314 imports: [],
315 declarations: [infinite_scroll_1.InfiniteScroll],
316 exports: [infinite_scroll_1.InfiniteScroll],
317 providers: [axis_resolver_1.AxisResolverFactory, position_resolver_1.PositionResolverFactory, scroll_register_1.ScrollRegister, scroll_resolver_1.ScrollResolver]
318 }] }];
319 /** @nocollapse */
320 InfiniteScrollModule.ctorParameters = function () {
321 return [];
322 };
323 return InfiniteScrollModule;
324 }();
325 exports.InfiniteScrollModule = InfiniteScrollModule;
326});
327System.registerDynamic('src/scroll-register', ['@angular/core', 'rxjs/Observable', 'rxjs/add/observable/fromEvent', 'rxjs/add/observable/timer', 'rxjs/add/observable/of', 'rxjs/add/operator/debounce', 'rxjs/add/operator/throttle', 'rxjs/add/operator/filter', 'rxjs/add/operator/mergeMap'], true, function ($__require, exports, module) {
328 "use strict";
329
330 var global = this || self,
331 GLOBAL = global;
332 var core_1 = $__require('@angular/core');
333 var Observable_1 = $__require('rxjs/Observable');
334 $__require('rxjs/add/observable/fromEvent');
335 $__require('rxjs/add/observable/timer');
336 $__require('rxjs/add/observable/of');
337 $__require('rxjs/add/operator/debounce');
338 $__require('rxjs/add/operator/throttle');
339 $__require('rxjs/add/operator/filter');
340 $__require('rxjs/add/operator/mergeMap');
341 var ScrollRegister = function () {
342 function ScrollRegister() {}
343 ScrollRegister.prototype.attachEvent = function (options) {
344 var scroller$ = Observable_1.Observable.fromEvent(options.container, 'scroll')[options.throttleType](function () {
345 return Observable_1.Observable.timer(options.throttleDuration);
346 }).filter(options.filterBefore).mergeMap(function (ev) {
347 return Observable_1.Observable.of(options.mergeMap(ev));
348 }).subscribe(options.scrollHandler);
349 return scroller$;
350 };
351 ScrollRegister.decorators = [{ type: core_1.Injectable }];
352 /** @nocollapse */
353 ScrollRegister.ctorParameters = function () {
354 return [];
355 };
356 return ScrollRegister;
357 }();
358 exports.ScrollRegister = ScrollRegister;
359});
360System.registerDynamic("src/scroll-resolver", ["@angular/core"], true, function ($__require, exports, module) {
361 "use strict";
362
363 var global = this || self,
364 GLOBAL = global;
365 var core_1 = $__require('@angular/core');
366 var ScrollResolver = function () {
367 function ScrollResolver() {
368 this.lastScrollPosition = 0;
369 }
370 ScrollResolver.prototype.shouldScroll = function (container, config, scrollingDown) {
371 var distance = config.distance;
372 var remaining;
373 var containerBreakpoint;
374 if (scrollingDown) {
375 remaining = container.totalToScroll - container.scrolledUntilNow;
376 containerBreakpoint = container.height * distance.down + 1;
377 } else {
378 remaining = container.scrolledUntilNow;
379 containerBreakpoint = container.height * distance.up + 1;
380 }
381 var shouldScroll = remaining <= containerBreakpoint;
382 this.lastScrollPosition = container.scrolledUntilNow;
383 return shouldScroll;
384 };
385 ScrollResolver.prototype.isScrollingDown = function (container) {
386 return this.lastScrollPosition < container.scrolledUntilNow;
387 };
388 ScrollResolver.prototype.getScrollStats = function (container, config) {
389 var isScrollingDown = this.isScrollingDown(container);
390 var shouldScroll = this.shouldScroll(container, config, isScrollingDown);
391 return { isScrollingDown: isScrollingDown, shouldScroll: shouldScroll };
392 };
393 ScrollResolver.decorators = [{ type: core_1.Injectable }];
394 /** @nocollapse */
395 ScrollResolver.ctorParameters = function () {
396 return [];
397 };
398 return ScrollResolver;
399 }();
400 exports.ScrollResolver = ScrollResolver;
401});
402System.registerDynamic('angular2-infinite-scroll', ['./src/infinite-scroll', './src/position-resolver', './src/axis-resolver', './src/index', './src/scroll-register', './src/scroll-resolver'], true, function ($__require, exports, module) {
403 "use strict";
404
405 var global = this || self,
406 GLOBAL = global;
407 var infinite_scroll_1 = $__require('./src/infinite-scroll');
408 var position_resolver_1 = $__require('./src/position-resolver');
409 var axis_resolver_1 = $__require('./src/axis-resolver');
410 var infinite_scroll_2 = $__require('./src/infinite-scroll');
411 exports.InfiniteScroll = infinite_scroll_2.InfiniteScroll;
412 var position_resolver_2 = $__require('./src/position-resolver');
413 exports.PositionResolver = position_resolver_2.PositionResolver;
414 exports.PositionResolverFactory = position_resolver_2.PositionResolverFactory;
415 var axis_resolver_2 = $__require('./src/axis-resolver');
416 exports.AxisResolver = axis_resolver_2.AxisResolver;
417 exports.AxisResolverFactory = axis_resolver_2.AxisResolverFactory;
418 var index_1 = $__require('./src/index');
419 exports.InfiniteScrollModule = index_1.InfiniteScrollModule;
420 var scroll_register_1 = $__require('./src/scroll-register');
421 exports.ScrollRegister = scroll_register_1.ScrollRegister;
422 var scroll_resolver_1 = $__require('./src/scroll-resolver');
423 exports.ScrollResolver = scroll_resolver_1.ScrollResolver;
424 Object.defineProperty(exports, "__esModule", { value: true });
425 exports.default = {
426 directives: [infinite_scroll_1.InfiniteScroll, axis_resolver_1.AxisResolver, position_resolver_1.PositionResolver]
427 };
428});
\No newline at end of file