Compare commits
1 Commits
master
...
feature/op
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e82c52cb5e |
@ -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
|
||||
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -24,10 +24,7 @@ export interface IScrollerDistance {
|
||||
export interface IScrollState {
|
||||
lastTotalToScroll: number;
|
||||
totalToScroll: number;
|
||||
triggered: {
|
||||
down: number;
|
||||
up: number;
|
||||
};
|
||||
triggered: IScrollerDistance;
|
||||
lastScrollPosition: number;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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)
|
||||
);
|
||||
|
||||
45
src/services/scroll-state.ts
Normal file
45
src/services/scroll-state.ts
Normal 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;
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
Loading…
Reference in New Issue
Block a user