Compare commits

...

1 Commits

Author SHA1 Message Date
Oren Farhi
e82c52cb5e updated version and code 2019-03-10 10:15:36 -04:00
9 changed files with 141 additions and 90 deletions

View File

@ -1,3 +1,10 @@
## v 7.1.0 (2019/03/10)
- [FIX] - 'alwaysCallback' to trigger only when past distance point
- [UPGRADE] - unit tests with puppeteer
- [UPGRADE] - scorll state is now handled within a class
- [FIX] - using now opencollective-postinstall #296
## v 7.0.1 (2019/01/04)
- [FIX] - build fix adding correct version of Typescript 3

View File

@ -12,24 +12,26 @@
},
"private": true,
"dependencies": {
"@angular/animations": "^6.0.2",
"@angular/common": "^6.0.2",
"@angular/compiler": "^6.0.2",
"@angular/core": "^6.0.2",
"@angular/forms": "^6.0.2",
"@angular/http": "^6.0.2",
"@angular/platform-browser": "^6.0.2",
"@angular/platform-browser-dynamic": "^6.0.2",
"@angular/router": "^6.0.2",
"@angular/animations": "^7.0.0",
"@angular/common": "^7.0.0",
"@angular/compiler": "^7.0.0",
"@angular/core": "^7.0.0",
"@angular/forms": "^7.0.0",
"@angular/http": "^7.0.0",
"@angular/platform-browser": "^7.0.0",
"@angular/platform-browser-dynamic": "^7.0.0",
"@angular/router": "^7.0.0",
"core-js": "^2.4.1",
"rxjs": "6.1.0",
"ngx-infinite-scroll": "file:../ngx-infinite-scroll-7.0.1.tgz",
"rxjs": "6.4.0",
"rxjs-compat": "^6.0.0-rc.0",
"zone.js": "^0.8.26"
},
"devDependencies": {
"@angular/cli": "6.0.3",
"@angular/compiler-cli": "^6.0.2",
"@angular/language-service": "^6.0.2",
"@angular-devkit/build-angular": "~0.6.3",
"@angular/cli": "^7.0.0",
"@angular/compiler-cli": "^7.0.0",
"@angular/language-service": "^7.0.0",
"@types/jasmine": "~2.5.53",
"@types/jasminewd2": "~2.0.2",
"@types/node": "~6.0.60",
@ -45,7 +47,6 @@
"protractor": "~5.1.2",
"ts-node": "~3.2.0",
"tslint": "~5.7.0",
"typescript": "~2.7.2",
"@angular-devkit/build-angular": "~0.6.3"
"typescript": "3.1.1"
}
}

View File

@ -1,4 +1,6 @@
// Karma configuration for Unit testing
const puppeteer = require('puppeteer');
process.env.CHROME_BIN = puppeteer.executablePath();
module.exports = function(config) {
var configuration = {
@ -71,7 +73,13 @@ module.exports = function(config) {
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: ['Chrome'],
browsers: ['ChromeHeadlessNoSandbox'],
customLaunchers: {
ChromeHeadlessNoSandbox: {
base: 'ChromeHeadless',
flags: ['--no-sandbox']
}
},
// Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits

View File

@ -1,6 +1,6 @@
{
"name": "ngx-infinite-scroll",
"version": "7.0.1",
"version": "7.1.0",
"description": "An infinite scroll directive for Angular compatible with AoT compilation and Tree shaking",
"main": "./bundles/ngx-infinite-scroll.umd.js",
"module": "./modules/ngx-infinite-scroll.es5.js",
@ -48,18 +48,19 @@
"@angular/platform-browser-dynamic": "^7.0.0",
"@angular/platform-server": "^7.0.0",
"@compodoc/compodoc": "^1.1.2",
"@types/jasmine": "2.8.8",
"@types/jasmine": "3.3.9",
"@types/node": "7.0.10",
"chalk": "1.1.3",
"codelyzer": "^4.3.0",
"core-js": "2.4.1",
"jasmine-core": "2.5.2",
"karma": "1.5.0",
"karma-chrome-launcher": "2.0.0",
"karma-chrome-launcher": "2.2.0",
"karma-jasmine": "1.1.0",
"karma-sourcemap-loader": "0.3.7",
"karma-spec-reporter": "0.0.30",
"karma-webpack": "2.0.3",
"karma-webpack": "3.0.5",
"puppeteer": "1.13.0",
"reflect-metadata": "0.1.10",
"rollup": "0.41.6",
"rxjs": "^6.1.0",

View File

@ -24,10 +24,7 @@ export interface IScrollerDistance {
export interface IScrollState {
lastTotalToScroll: number;
totalToScroll: number;
triggered: {
down: number;
up: number;
};
triggered: IScrollerDistance;
lastScrollPosition: number;
}

View File

@ -1,9 +1,7 @@
import { InfiniteScrollEvent, IPositionStats } from '../models';
export interface IScrollerProps {
export interface IScrollerProps extends IDistanceRange {
container: IPositionStats;
down: number;
up: number;
alwaysCallback: boolean;
disabled: boolean;
}
@ -26,6 +24,13 @@ export interface IScrollConfig {
export function shouldTriggerEvents(
alwaysCallback: boolean,
shouldFireScrollEvent: boolean,
isTriggeredCurrentTotal: boolean) {
return (alwaysCallback || shouldFireScrollEvent) && !isTriggeredCurrentTotal;
isTriggeredCurrentTotal: boolean
) {
if (alwaysCallback && shouldFireScrollEvent) {
return true;
}
if (!isTriggeredCurrentTotal && shouldFireScrollEvent) {
return true;
}
return false;
}

View File

@ -1,19 +1,13 @@
import { Observable, of, fromEvent } from 'rxjs';
import {
map,
mergeMap,
tap,
sampleTime,
filter,
pairwise
} from 'rxjs/operators';
import { map, mergeMap, tap, sampleTime, filter } from 'rxjs/operators';
import * as Models from '../models';
import { AxisResolver } from './axis-resolver';
import { shouldTriggerEvents, IScrollConfig } from './event-trigger';
import { shouldTriggerEvents } from './event-trigger';
import { resolveContainerElement } from './ngx-ins-utils';
import { calculatePoints, createResolver } from './position-resolver';
import * as ScrollResolver from './scroll-resolver';
import { ScrollState } from './scroll-state';
export function createScroller(config: Models.IScroller) {
const { scrollContainer, scrollWindow, element, fromRoot } = config;
@ -26,16 +20,9 @@ export function createScroller(config: Models.IScroller) {
fromRoot
)
});
const { totalToScroll: startWithTotal } = calculatePoints(element, resolver);
const scrollState: Models.IScrollState = {
lastScrollPosition: 0,
lastTotalToScroll: 0,
totalToScroll: startWithTotal,
triggered: {
down: 0,
up: 0
}
};
const scrollState = new ScrollState({
totalToScroll: calculatePoints(element, resolver)
});
const options: Models.IScrollRegisterConfig = {
container: resolver.container,
throttle: config.throttle
@ -53,32 +40,19 @@ export function createScroller(config: Models.IScroller) {
distance
)
),
tap(({ stats, scrollDown }: Models.IScrollParams) =>
ScrollResolver.updateScrollState(
scrollState,
stats.scrolled,
stats.totalToScroll
)
tap(({ stats }: Models.IScrollParams) =>
scrollState.updateScroll(stats.scrolled, stats.totalToScroll)
),
filter(
({ fire, scrollDown, stats: { totalToScroll } }: Models.IScrollParams) =>
shouldTriggerEvents(
config.alwaysCallback,
fire,
ScrollResolver.isTriggeredScroll(
totalToScroll,
scrollState,
scrollDown
)
scrollState.isTriggeredScroll(totalToScroll, scrollDown)
)
),
tap(({ scrollDown, stats: { totalToScroll } }: Models.IScrollParams) => {
ScrollResolver.updateTriggeredFlag(
totalToScroll,
scrollState,
true,
scrollDown
);
scrollState.updateTriggeredFlag(totalToScroll, scrollDown);
}),
map(toInfiniteScrollAction)
);

View File

@ -0,0 +1,45 @@
import { IScrollState, IScrollerDistance } from '../models';
export class ScrollState implements IScrollState {
lastScrollPosition = 0;
lastTotalToScroll = 0;
totalToScroll = 0;
triggered: IScrollerDistance = {
down: 0,
up: 0
};
constructor({ totalToScroll }) {
this.totalToScroll = totalToScroll;
}
updateScrollPosition(position: number) {
return (this.lastScrollPosition = position);
}
updateTotalToScroll(totalToScroll: number) {
if (this.lastTotalToScroll !== totalToScroll) {
this.lastTotalToScroll = this.totalToScroll;
this.totalToScroll = totalToScroll;
}
}
updateScroll(scrolledUntilNow: number, totalToScroll: number) {
this.updateScrollPosition(scrolledUntilNow);
this.updateTotalToScroll(totalToScroll);
}
updateTriggeredFlag(scroll, isScrollingDown: boolean) {
if (isScrollingDown) {
this.triggered.down = scroll;
} else {
this.triggered.up = scroll;
}
}
isTriggeredScroll(totalToScroll, isScrollingDown: boolean) {
return isScrollingDown
? this.triggered.down === totalToScroll
: this.triggered.up === totalToScroll;
}
}

View File

@ -1,4 +1,7 @@
import { IScrollerProps, shouldTriggerEvents } from '../../src/services/event-trigger';
import {
IScrollerProps,
shouldTriggerEvents
} from '../../src/services/event-trigger';
const props = {
alwaysCallback: true,
@ -10,24 +13,6 @@ const props = {
describe('EventTrigger', () => {
[
{
it: 'should return TRUE when alwaysCallback',
params: {
alwaysCallback: true,
shouldFireScrollEvent: false,
isTriggeredTotal: false
},
expected: true
},
{
it: 'should return FALSE when alwaysCallback, isTriggeredTotal',
params: {
alwaysCallback: true,
shouldFireScrollEvent: false,
isTriggeredTotal: true
},
expected: false
},
{
it: 'should return TRUE when alwaysCallback, shouldFireScrollEvent',
params: {
@ -38,13 +23,32 @@ describe('EventTrigger', () => {
expected: true
},
{
it: 'should return FALSE when alwaysCallback, shouldFireScrollEvent, isTriggeredTotal',
it: 'should return FALSE when alwaysCallback, NOT shouldFireScrollEvent',
params: {
alwaysCallback: true,
shouldFireScrollEvent: false,
isTriggeredTotal: true
},
expected: false
},
{
it: 'should return FALSE when alwaysCallback',
params: {
alwaysCallback: true,
shouldFireScrollEvent: false,
isTriggeredTotal: false
},
expected: false
},
{
it:
'should return TRUE when alwaysCallback, shouldFireScrollEvent, isTriggeredTotal',
params: {
alwaysCallback: true,
shouldFireScrollEvent: true,
isTriggeredTotal: true
},
expected: false
expected: true
},
{
it: 'should return TRUE when shouldFireScrollEvent ONLY',
@ -65,7 +69,8 @@ describe('EventTrigger', () => {
expected: false
},
{
it: 'should return FALSE when not alwaysCallback, shouldFireScrollEvent is false',
it:
'should return FALSE when not alwaysCallback, shouldFireScrollEvent is false',
params: {
alwaysCallback: false,
shouldFireScrollEvent: false,
@ -82,10 +87,18 @@ describe('EventTrigger', () => {
},
expected: false
}
].forEach((spec) => {
].forEach(spec => {
it(spec.it, () => {
const { isTriggeredTotal, alwaysCallback, shouldFireScrollEvent } = spec.params;
const actual = shouldTriggerEvents(alwaysCallback, shouldFireScrollEvent, isTriggeredTotal);
const {
isTriggeredTotal,
alwaysCallback,
shouldFireScrollEvent
} = spec.params;
const actual = shouldTriggerEvents(
alwaysCallback,
shouldFireScrollEvent,
isTriggeredTotal
);
expect(actual).toBe(spec.expected);
});
});