vscroll 1.7.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles/vscroll.esm5.js +518 -368
- package/dist/bundles/vscroll.esm5.js.map +1 -1
- package/dist/bundles/vscroll.esm5.min.js +2 -2
- package/dist/bundles/vscroll.esm5.min.js.map +1 -1
- package/dist/bundles/vscroll.esm6.js +408 -260
- package/dist/bundles/vscroll.esm6.js.map +1 -1
- package/dist/bundles/vscroll.esm6.min.js +2 -2
- package/dist/bundles/vscroll.esm6.min.js.map +1 -1
- package/dist/bundles/vscroll.umd.js +519 -369
- package/dist/bundles/vscroll.umd.js.map +1 -1
- package/dist/bundles/vscroll.umd.min.js +2 -2
- package/dist/bundles/vscroll.umd.min.js.map +1 -1
- package/dist/esm2015/classes/adapter/context.js +2 -1
- package/dist/esm2015/classes/adapter/context.js.map +1 -1
- package/dist/esm2015/classes/adapter/props.js +2 -2
- package/dist/esm2015/classes/adapter/props.js.map +1 -1
- package/dist/esm2015/classes/adapter.js +17 -18
- package/dist/esm2015/classes/adapter.js.map +1 -1
- package/dist/esm2015/classes/buffer/cache.js +11 -8
- package/dist/esm2015/classes/buffer/cache.js.map +1 -1
- package/dist/esm2015/classes/buffer/checkCall.js +4 -5
- package/dist/esm2015/classes/buffer/checkCall.js.map +1 -1
- package/dist/esm2015/classes/buffer/defaultSize.js +2 -1
- package/dist/esm2015/classes/buffer/defaultSize.js.map +1 -1
- package/dist/esm2015/classes/buffer.js +12 -11
- package/dist/esm2015/classes/buffer.js.map +1 -1
- package/dist/esm2015/classes/datasource.js +16 -3
- package/dist/esm2015/classes/datasource.js.map +1 -1
- package/dist/esm2015/classes/domRoutines.js +14 -14
- package/dist/esm2015/classes/domRoutines.js.map +1 -1
- package/dist/esm2015/classes/logger.js +74 -31
- package/dist/esm2015/classes/logger.js.map +1 -1
- package/dist/esm2015/classes/paddings.js +6 -2
- package/dist/esm2015/classes/paddings.js.map +1 -1
- package/dist/esm2015/classes/reactive.js.map +1 -1
- package/dist/esm2015/classes/settings.js.map +1 -1
- package/dist/esm2015/classes/state/clip.js.map +1 -1
- package/dist/esm2015/classes/state/fetch.js +4 -2
- package/dist/esm2015/classes/state/fetch.js.map +1 -1
- package/dist/esm2015/classes/state.js +6 -4
- package/dist/esm2015/classes/state.js.map +1 -1
- package/dist/esm2015/classes/viewport.js +4 -2
- package/dist/esm2015/classes/viewport.js.map +1 -1
- package/dist/esm2015/index.js +1 -1
- package/dist/esm2015/index.js.map +1 -1
- package/dist/esm2015/inputs/adapter.js +44 -24
- package/dist/esm2015/inputs/adapter.js.map +1 -1
- package/dist/esm2015/inputs/datasource.js.map +1 -1
- package/dist/esm2015/inputs/index.js +1 -1
- package/dist/esm2015/inputs/index.js.map +1 -1
- package/dist/esm2015/inputs/settings.js +8 -3
- package/dist/esm2015/inputs/settings.js.map +1 -1
- package/dist/esm2015/inputs/validation.js +8 -14
- package/dist/esm2015/inputs/validation.js.map +1 -1
- package/dist/esm2015/inputs/workflow.js.map +1 -1
- package/dist/esm2015/interfaces/datasource.js.map +1 -1
- package/dist/esm2015/interfaces/index.js.map +1 -1
- package/dist/esm2015/interfaces/process.js.map +1 -1
- package/dist/esm2015/interfaces/routines.js.map +1 -1
- package/dist/esm2015/interfaces/settings.js.map +1 -1
- package/dist/esm2015/interfaces/validation.js.map +1 -1
- package/dist/esm2015/interfaces/workflow.js.map +1 -1
- package/dist/esm2015/processes/adapter/append.js +2 -1
- package/dist/esm2015/processes/adapter/append.js.map +1 -1
- package/dist/esm2015/processes/adapter/check.js +2 -1
- package/dist/esm2015/processes/adapter/check.js.map +1 -1
- package/dist/esm2015/processes/adapter/clip.js.map +1 -1
- package/dist/esm2015/processes/adapter/fix.js +4 -2
- package/dist/esm2015/processes/adapter/fix.js.map +1 -1
- package/dist/esm2015/processes/adapter/insert.js +4 -3
- package/dist/esm2015/processes/adapter/insert.js.map +1 -1
- package/dist/esm2015/processes/adapter/pause.js.map +1 -1
- package/dist/esm2015/processes/adapter/reload.js.map +1 -1
- package/dist/esm2015/processes/adapter/remove.js +8 -5
- package/dist/esm2015/processes/adapter/remove.js.map +1 -1
- package/dist/esm2015/processes/adapter/replace.js +1 -1
- package/dist/esm2015/processes/adapter/replace.js.map +1 -1
- package/dist/esm2015/processes/adapter/reset.js +5 -5
- package/dist/esm2015/processes/adapter/reset.js.map +1 -1
- package/dist/esm2015/processes/adapter/update.js +4 -3
- package/dist/esm2015/processes/adapter/update.js.map +1 -1
- package/dist/esm2015/processes/adjust.js +15 -10
- package/dist/esm2015/processes/adjust.js.map +1 -1
- package/dist/esm2015/processes/clip.js +4 -4
- package/dist/esm2015/processes/clip.js.map +1 -1
- package/dist/esm2015/processes/end.js +2 -1
- package/dist/esm2015/processes/end.js.map +1 -1
- package/dist/esm2015/processes/fetch.js +6 -4
- package/dist/esm2015/processes/fetch.js.map +1 -1
- package/dist/esm2015/processes/index.js +1 -1
- package/dist/esm2015/processes/index.js.map +1 -1
- package/dist/esm2015/processes/init.js.map +1 -1
- package/dist/esm2015/processes/misc/base.js +1 -2
- package/dist/esm2015/processes/misc/base.js.map +1 -1
- package/dist/esm2015/processes/misc/enums.js.map +1 -1
- package/dist/esm2015/processes/postFetch.js +13 -12
- package/dist/esm2015/processes/postFetch.js.map +1 -1
- package/dist/esm2015/processes/preClip.js +6 -5
- package/dist/esm2015/processes/preClip.js.map +1 -1
- package/dist/esm2015/processes/preFetch.js +28 -15
- package/dist/esm2015/processes/preFetch.js.map +1 -1
- package/dist/esm2015/processes/render.js +6 -4
- package/dist/esm2015/processes/render.js.map +1 -1
- package/dist/esm2015/processes/scroll.js +19 -10
- package/dist/esm2015/processes/scroll.js.map +1 -1
- package/dist/esm2015/processes/start.js.map +1 -1
- package/dist/esm2015/scroller.js +14 -9
- package/dist/esm2015/scroller.js.map +1 -1
- package/dist/esm2015/version.js +1 -1
- package/dist/esm2015/version.js.map +1 -1
- package/dist/esm2015/workflow-transducer.js +3 -2
- package/dist/esm2015/workflow-transducer.js.map +1 -1
- package/dist/esm2015/workflow.js +28 -17
- package/dist/esm2015/workflow.js.map +1 -1
- package/dist/esm5/classes/adapter/context.js +2 -1
- package/dist/esm5/classes/adapter/context.js.map +1 -1
- package/dist/esm5/classes/adapter/props.js +2 -2
- package/dist/esm5/classes/adapter/props.js.map +1 -1
- package/dist/esm5/classes/adapter.js +22 -19
- package/dist/esm5/classes/adapter.js.map +1 -1
- package/dist/esm5/classes/buffer/cache.js +11 -9
- package/dist/esm5/classes/buffer/cache.js.map +1 -1
- package/dist/esm5/classes/buffer/checkCall.js +4 -7
- package/dist/esm5/classes/buffer/checkCall.js.map +1 -1
- package/dist/esm5/classes/buffer/defaultSize.js +2 -1
- package/dist/esm5/classes/buffer/defaultSize.js.map +1 -1
- package/dist/esm5/classes/buffer.js +15 -14
- package/dist/esm5/classes/buffer.js.map +1 -1
- package/dist/esm5/classes/datasource.js +20 -3
- package/dist/esm5/classes/datasource.js.map +1 -1
- package/dist/esm5/classes/domRoutines.js +14 -14
- package/dist/esm5/classes/domRoutines.js.map +1 -1
- package/dist/esm5/classes/logger.js +75 -34
- package/dist/esm5/classes/logger.js.map +1 -1
- package/dist/esm5/classes/paddings.js +6 -2
- package/dist/esm5/classes/paddings.js.map +1 -1
- package/dist/esm5/classes/reactive.js.map +1 -1
- package/dist/esm5/classes/settings.js.map +1 -1
- package/dist/esm5/classes/state/clip.js.map +1 -1
- package/dist/esm5/classes/state/fetch.js +4 -2
- package/dist/esm5/classes/state/fetch.js.map +1 -1
- package/dist/esm5/classes/state.js +6 -4
- package/dist/esm5/classes/state.js.map +1 -1
- package/dist/esm5/classes/viewport.js +3 -2
- package/dist/esm5/classes/viewport.js.map +1 -1
- package/dist/esm5/index.js +1 -1
- package/dist/esm5/index.js.map +1 -1
- package/dist/esm5/inputs/adapter.js +32 -12
- package/dist/esm5/inputs/adapter.js.map +1 -1
- package/dist/esm5/inputs/datasource.js.map +1 -1
- package/dist/esm5/inputs/index.js +1 -1
- package/dist/esm5/inputs/index.js.map +1 -1
- package/dist/esm5/inputs/settings.js +5 -0
- package/dist/esm5/inputs/settings.js.map +1 -1
- package/dist/esm5/inputs/validation.js +99 -93
- package/dist/esm5/inputs/validation.js.map +1 -1
- package/dist/esm5/inputs/workflow.js.map +1 -1
- package/dist/esm5/interfaces/datasource.js.map +1 -1
- package/dist/esm5/interfaces/index.js.map +1 -1
- package/dist/esm5/interfaces/process.js.map +1 -1
- package/dist/esm5/interfaces/routines.js.map +1 -1
- package/dist/esm5/interfaces/settings.js.map +1 -1
- package/dist/esm5/interfaces/validation.js.map +1 -1
- package/dist/esm5/interfaces/workflow.js.map +1 -1
- package/dist/esm5/processes/adapter/append.js +2 -1
- package/dist/esm5/processes/adapter/append.js.map +1 -1
- package/dist/esm5/processes/adapter/check.js +7 -6
- package/dist/esm5/processes/adapter/check.js.map +1 -1
- package/dist/esm5/processes/adapter/clip.js.map +1 -1
- package/dist/esm5/processes/adapter/fix.js +4 -2
- package/dist/esm5/processes/adapter/fix.js.map +1 -1
- package/dist/esm5/processes/adapter/insert.js +4 -3
- package/dist/esm5/processes/adapter/insert.js.map +1 -1
- package/dist/esm5/processes/adapter/pause.js.map +1 -1
- package/dist/esm5/processes/adapter/reload.js.map +1 -1
- package/dist/esm5/processes/adapter/remove.js +11 -10
- package/dist/esm5/processes/adapter/remove.js.map +1 -1
- package/dist/esm5/processes/adapter/replace.js +1 -1
- package/dist/esm5/processes/adapter/replace.js.map +1 -1
- package/dist/esm5/processes/adapter/reset.js +5 -5
- package/dist/esm5/processes/adapter/reset.js.map +1 -1
- package/dist/esm5/processes/adapter/update.js +20 -15
- package/dist/esm5/processes/adapter/update.js.map +1 -1
- package/dist/esm5/processes/adjust.js +16 -11
- package/dist/esm5/processes/adjust.js.map +1 -1
- package/dist/esm5/processes/clip.js +4 -4
- package/dist/esm5/processes/clip.js.map +1 -1
- package/dist/esm5/processes/end.js +2 -1
- package/dist/esm5/processes/end.js.map +1 -1
- package/dist/esm5/processes/fetch.js +5 -3
- package/dist/esm5/processes/fetch.js.map +1 -1
- package/dist/esm5/processes/index.js +1 -1
- package/dist/esm5/processes/index.js.map +1 -1
- package/dist/esm5/processes/init.js.map +1 -1
- package/dist/esm5/processes/misc/base.js +1 -2
- package/dist/esm5/processes/misc/base.js.map +1 -1
- package/dist/esm5/processes/misc/enums.js.map +1 -1
- package/dist/esm5/processes/postFetch.js +14 -15
- package/dist/esm5/processes/postFetch.js.map +1 -1
- package/dist/esm5/processes/preClip.js +5 -4
- package/dist/esm5/processes/preClip.js.map +1 -1
- package/dist/esm5/processes/preFetch.js +26 -14
- package/dist/esm5/processes/preFetch.js.map +1 -1
- package/dist/esm5/processes/render.js +7 -7
- package/dist/esm5/processes/render.js.map +1 -1
- package/dist/esm5/processes/scroll.js +18 -12
- package/dist/esm5/processes/scroll.js.map +1 -1
- package/dist/esm5/processes/start.js.map +1 -1
- package/dist/esm5/scroller.js +11 -7
- package/dist/esm5/scroller.js.map +1 -1
- package/dist/esm5/version.js +1 -1
- package/dist/esm5/version.js.map +1 -1
- package/dist/esm5/workflow-transducer.js +3 -2
- package/dist/esm5/workflow-transducer.js.map +1 -1
- package/dist/esm5/workflow.js +31 -25
- package/dist/esm5/workflow.js.map +1 -1
- package/dist/typings/classes/buffer/cache.d.ts +0 -1
- package/dist/typings/classes/datasource.d.ts +1 -1
- package/dist/typings/classes/domRoutines.d.ts +1 -1
- package/dist/typings/classes/logger.d.ts +4 -0
- package/dist/typings/classes/settings.d.ts +7 -0
- package/dist/typings/index.d.ts +3 -3
- package/dist/typings/inputs/index.d.ts +1 -1
- package/dist/typings/inputs/settings.d.ts +1 -0
- package/dist/typings/interfaces/index.d.ts +10 -10
- package/dist/typings/interfaces/settings.d.ts +1 -0
- package/dist/typings/processes/index.d.ts +1 -1
- package/dist/typings/processes/scroll.d.ts +1 -1
- package/dist/typings/workflow.d.ts +1 -0
- package/package.json +23 -22
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* vscroll (https://github.com/dhilt/vscroll) FESM2015
|
|
3
|
-
* Version: 1.
|
|
3
|
+
* Version: 1.8.1 (2026-02-07T22:49:10.471Z)
|
|
4
4
|
* Author: Denis Hilt
|
|
5
5
|
* License: MIT
|
|
6
6
|
*/
|
|
@@ -139,7 +139,7 @@ const bufferInfoDefault = {
|
|
|
139
139
|
maxIndex: NaN,
|
|
140
140
|
absMinIndex: -Infinity,
|
|
141
141
|
absMaxIndex: +Infinity,
|
|
142
|
-
defaultSize: NaN
|
|
142
|
+
defaultSize: NaN
|
|
143
143
|
};
|
|
144
144
|
const EMPTY_ITEM = {
|
|
145
145
|
data: {},
|
|
@@ -308,7 +308,7 @@ const getDefaultAdapterProps = () => [
|
|
|
308
308
|
{
|
|
309
309
|
type: Type.Function,
|
|
310
310
|
name: Name.relax,
|
|
311
|
-
value:
|
|
311
|
+
value: noopWF
|
|
312
312
|
},
|
|
313
313
|
{
|
|
314
314
|
type: Type.Function,
|
|
@@ -362,7 +362,7 @@ const reactiveConfigStorage = new Map();
|
|
|
362
362
|
|
|
363
363
|
var core = {
|
|
364
364
|
name: 'vscroll',
|
|
365
|
-
version: '1.
|
|
365
|
+
version: '1.8.1'
|
|
366
366
|
};
|
|
367
367
|
|
|
368
368
|
const getBox = (id) => {
|
|
@@ -428,12 +428,25 @@ class AdapterContext {
|
|
|
428
428
|
return value;
|
|
429
429
|
} }, conf));
|
|
430
430
|
});
|
|
431
|
-
if (reactive) {
|
|
431
|
+
if (reactive) {
|
|
432
|
+
// save both configured and default reactive props in the store
|
|
432
433
|
reactiveConfigStorage.set(id, reactivePropsStore);
|
|
433
434
|
}
|
|
434
435
|
}
|
|
435
436
|
}
|
|
436
437
|
|
|
438
|
+
const getDefaultAdapterConfig = () => {
|
|
439
|
+
const reactive = getDefaultAdapterProps()
|
|
440
|
+
.filter(({ type }) => type === AdapterPropType.Reactive)
|
|
441
|
+
.reduce((acc, { name, value }) => {
|
|
442
|
+
acc[name] = {
|
|
443
|
+
source: value,
|
|
444
|
+
emit: (source, val) => source.set(val)
|
|
445
|
+
};
|
|
446
|
+
return acc;
|
|
447
|
+
}, {});
|
|
448
|
+
return { mock: false, reactive };
|
|
449
|
+
};
|
|
437
450
|
class DatasourceGeneric {
|
|
438
451
|
constructor(datasource, config) {
|
|
439
452
|
this.get = datasource.get;
|
|
@@ -442,14 +455,15 @@ class DatasourceGeneric {
|
|
|
442
455
|
const adapterContext = new AdapterContext(config || { mock: false });
|
|
443
456
|
this.adapter = adapterContext;
|
|
444
457
|
}
|
|
458
|
+
// todo: should it be published?
|
|
445
459
|
dispose() {
|
|
446
460
|
reactiveConfigStorage.delete(this.adapter.id);
|
|
447
461
|
wantedStorage.delete(this.adapter.id);
|
|
448
462
|
}
|
|
449
463
|
}
|
|
450
|
-
const makeDatasource = (
|
|
464
|
+
const makeDatasource = (getAdapterConfig) => class extends DatasourceGeneric {
|
|
451
465
|
constructor(datasource) {
|
|
452
|
-
const config = typeof
|
|
466
|
+
const config = typeof getAdapterConfig === 'function' ? getAdapterConfig() : getDefaultAdapterConfig();
|
|
453
467
|
super(datasource, config);
|
|
454
468
|
}
|
|
455
469
|
};
|
|
@@ -487,9 +501,7 @@ var ValidatorType;
|
|
|
487
501
|
ValidatorType["enum"] = "must belong to {arg1} list";
|
|
488
502
|
})(ValidatorType || (ValidatorType = {}));
|
|
489
503
|
const getError = (msg, args) => (args || ['']).reduce((acc, arg, index) => acc.replace(`{arg${index + 1}}`, arg), msg);
|
|
490
|
-
const getNumber = (value) => typeof value === 'number' || (typeof value === 'string' && value !== '')
|
|
491
|
-
? Number(value)
|
|
492
|
-
: NaN;
|
|
504
|
+
const getNumber = (value) => typeof value === 'number' || (typeof value === 'string' && value !== '') ? Number(value) : NaN;
|
|
493
505
|
const onNumber = (value) => {
|
|
494
506
|
const parsedValue = getNumber(value);
|
|
495
507
|
const errors = [];
|
|
@@ -670,7 +682,9 @@ const onOr = (validators) => (value) => {
|
|
|
670
682
|
};
|
|
671
683
|
const onEnum = (list) => (value) => {
|
|
672
684
|
const errors = [];
|
|
673
|
-
const values = Object.keys(list)
|
|
685
|
+
const values = Object.keys(list)
|
|
686
|
+
.filter(k => isNaN(Number(k)))
|
|
687
|
+
.map(k => list[k]);
|
|
674
688
|
if (!values.some(item => item === value)) {
|
|
675
689
|
errors.push(getError(ValidatorType.enum, ['[' + values.join(',') + ']']));
|
|
676
690
|
}
|
|
@@ -761,9 +775,7 @@ class ValidatedData {
|
|
|
761
775
|
this.context = context;
|
|
762
776
|
}
|
|
763
777
|
setValidity() {
|
|
764
|
-
this.errors = Object.keys(this.params).reduce((acc, key) => [
|
|
765
|
-
...acc, ...this.params[key].errors
|
|
766
|
-
], []);
|
|
778
|
+
this.errors = Object.keys(this.params).reduce((acc, key) => [...acc, ...this.params[key].errors], []);
|
|
767
779
|
this.isValid = !this.errors.length;
|
|
768
780
|
}
|
|
769
781
|
setCommonError(error) {
|
|
@@ -781,9 +793,7 @@ class ValidatedData {
|
|
|
781
793
|
this.setValidity();
|
|
782
794
|
}
|
|
783
795
|
showErrors() {
|
|
784
|
-
return this.errors.length
|
|
785
|
-
? 'validation failed: ' + this.errors.join(', ')
|
|
786
|
-
: '';
|
|
796
|
+
return this.errors.length ? 'validation failed: ' + this.errors.join(', ') : '';
|
|
787
797
|
}
|
|
788
798
|
}
|
|
789
799
|
const runValidator = (current, validator, context) => {
|
|
@@ -801,7 +811,7 @@ const getDefault = (value, prop) => {
|
|
|
801
811
|
const empty = value === void 0;
|
|
802
812
|
const auto = !prop.mandatory && prop.defaultValue !== void 0;
|
|
803
813
|
return {
|
|
804
|
-
value: !empty ? value :
|
|
814
|
+
value: !empty ? value : auto ? prop.defaultValue : void 0,
|
|
805
815
|
isSet: !empty || auto,
|
|
806
816
|
isValid: !empty || !prop.mandatory,
|
|
807
817
|
errors: []
|
|
@@ -833,9 +843,7 @@ const validateOne = (context, name, prop) => {
|
|
|
833
843
|
};
|
|
834
844
|
const validate = (context, params) => {
|
|
835
845
|
const data = new ValidatedData(context);
|
|
836
|
-
Object.entries(params).forEach(([key, prop]) => data.setParam(key, data.isValidContext
|
|
837
|
-
? validateOne(data.context, key, prop)
|
|
838
|
-
: getDefault(void 0, prop)));
|
|
846
|
+
Object.entries(params).forEach(([key, prop]) => data.setParam(key, data.isValidContext ? validateOne(data.context, key, prop) : getDefault(void 0, prop)));
|
|
839
847
|
return data;
|
|
840
848
|
};
|
|
841
849
|
|
|
@@ -883,6 +891,7 @@ var DevSettings;
|
|
|
883
891
|
DevSettings["immediateLog"] = "immediateLog";
|
|
884
892
|
DevSettings["logProcessRun"] = "logProcessRun";
|
|
885
893
|
DevSettings["logTime"] = "logTime";
|
|
894
|
+
DevSettings["logColor"] = "logColor";
|
|
886
895
|
DevSettings["throttle"] = "throttle";
|
|
887
896
|
DevSettings["initDelay"] = "initDelay";
|
|
888
897
|
DevSettings["initWindowDelay"] = "initWindowDelay";
|
|
@@ -897,7 +906,7 @@ const MIN = {
|
|
|
897
906
|
[Settings$1.padding]: 0.01,
|
|
898
907
|
[DevSettings.throttle]: 0,
|
|
899
908
|
[DevSettings.initDelay]: 0,
|
|
900
|
-
[DevSettings.initWindowDelay]: 0
|
|
909
|
+
[DevSettings.initWindowDelay]: 0
|
|
901
910
|
};
|
|
902
911
|
const SETTINGS = {
|
|
903
912
|
[Settings$1.adapter]: {
|
|
@@ -955,7 +964,7 @@ const SETTINGS = {
|
|
|
955
964
|
[Settings$1.sizeStrategy]: {
|
|
956
965
|
validators: [ENUM(SizeStrategy)],
|
|
957
966
|
defaultValue: SizeStrategy.Average
|
|
958
|
-
}
|
|
967
|
+
}
|
|
959
968
|
};
|
|
960
969
|
const DEV_SETTINGS = {
|
|
961
970
|
[DevSettings.debug]: {
|
|
@@ -974,6 +983,10 @@ const DEV_SETTINGS = {
|
|
|
974
983
|
validators: [BOOLEAN$1],
|
|
975
984
|
defaultValue: false
|
|
976
985
|
},
|
|
986
|
+
[DevSettings.logColor]: {
|
|
987
|
+
validators: [BOOLEAN$1],
|
|
988
|
+
defaultValue: true
|
|
989
|
+
},
|
|
977
990
|
[DevSettings.throttle]: {
|
|
978
991
|
validators: [INTEGER$1, MORE_OR_EQUAL(MIN[DevSettings.throttle], true)],
|
|
979
992
|
defaultValue: 40
|
|
@@ -1001,7 +1014,7 @@ const DEV_SETTINGS = {
|
|
|
1001
1014
|
[DevSettings.directionPriority]: {
|
|
1002
1015
|
validators: [ENUM(Direction)],
|
|
1003
1016
|
defaultValue: Direction.backward
|
|
1004
|
-
}
|
|
1017
|
+
}
|
|
1005
1018
|
};
|
|
1006
1019
|
|
|
1007
1020
|
var CommonProcess;
|
|
@@ -1041,7 +1054,7 @@ var ProcessStatus;
|
|
|
1041
1054
|
ProcessStatus["error"] = "error";
|
|
1042
1055
|
})(ProcessStatus || (ProcessStatus = {}));
|
|
1043
1056
|
|
|
1044
|
-
const { INTEGER, INTEGER_UNLIMITED, BOOLEAN, OBJECT: OBJECT$1, ITEM_LIST, FUNC_WITH_X_ARGUMENTS: FUNC_WITH_X_ARGUMENTS$1, FUNC_WITH_X_AND_MORE_ARGUMENTS, FUNC_WITH_X_TO_Y_ARGUMENTS, ONE_OF_MUST, ONE_OF_CAN, OR
|
|
1057
|
+
const { INTEGER, INTEGER_UNLIMITED, BOOLEAN, OBJECT: OBJECT$1, ITEM_LIST, FUNC_WITH_X_ARGUMENTS: FUNC_WITH_X_ARGUMENTS$1, FUNC_WITH_X_AND_MORE_ARGUMENTS, FUNC_WITH_X_TO_Y_ARGUMENTS, ONE_OF_MUST, ONE_OF_CAN, OR } = VALIDATORS;
|
|
1045
1058
|
var AdapterNoParams;
|
|
1046
1059
|
(function (AdapterNoParams) {
|
|
1047
1060
|
})(AdapterNoParams || (AdapterNoParams = {}));
|
|
@@ -1055,7 +1068,7 @@ const RESET_METHOD_PARAMS = {
|
|
|
1055
1068
|
},
|
|
1056
1069
|
[DatasourceProps.devSettings]: {
|
|
1057
1070
|
validators: [OBJECT$1]
|
|
1058
|
-
}
|
|
1071
|
+
}
|
|
1059
1072
|
};
|
|
1060
1073
|
var AdapterReloadParams;
|
|
1061
1074
|
(function (AdapterReloadParams) {
|
|
@@ -1064,7 +1077,7 @@ var AdapterReloadParams;
|
|
|
1064
1077
|
const RELOAD_METHOD_PARAMS = {
|
|
1065
1078
|
[AdapterReloadParams.reloadIndex]: {
|
|
1066
1079
|
validators: [INTEGER]
|
|
1067
|
-
}
|
|
1080
|
+
}
|
|
1068
1081
|
};
|
|
1069
1082
|
var AdapterPrependParams;
|
|
1070
1083
|
(function (AdapterPrependParams) {
|
|
@@ -1089,7 +1102,7 @@ const PREPEND_METHOD_PARAMS = {
|
|
|
1089
1102
|
[AdapterPrependParams.virtualize]: {
|
|
1090
1103
|
validators: [BOOLEAN, ONE_OF_CAN([AdapterPrependParams.bof])],
|
|
1091
1104
|
defaultValue: false
|
|
1092
|
-
}
|
|
1105
|
+
}
|
|
1093
1106
|
};
|
|
1094
1107
|
var AdapterAppendParams;
|
|
1095
1108
|
(function (AdapterAppendParams) {
|
|
@@ -1114,7 +1127,7 @@ const APPEND_METHOD_PARAMS = {
|
|
|
1114
1127
|
[AdapterPrependParams.virtualize]: {
|
|
1115
1128
|
validators: [BOOLEAN, ONE_OF_CAN([AdapterAppendParams.eof])],
|
|
1116
1129
|
defaultValue: false
|
|
1117
|
-
}
|
|
1130
|
+
}
|
|
1118
1131
|
};
|
|
1119
1132
|
var AdapterRemoveParams;
|
|
1120
1133
|
(function (AdapterRemoveParams) {
|
|
@@ -1132,7 +1145,7 @@ const REMOVE_METHOD_PARAMS = {
|
|
|
1132
1145
|
[AdapterRemoveParams.increase]: {
|
|
1133
1146
|
validators: [BOOLEAN],
|
|
1134
1147
|
defaultValue: false
|
|
1135
|
-
}
|
|
1148
|
+
}
|
|
1136
1149
|
};
|
|
1137
1150
|
var AdapterClipParams;
|
|
1138
1151
|
(function (AdapterClipParams) {
|
|
@@ -1147,7 +1160,7 @@ const CLIP_METHOD_PARAMS = {
|
|
|
1147
1160
|
[AdapterClipParams.forwardOnly]: {
|
|
1148
1161
|
validators: [BOOLEAN, ONE_OF_CAN([AdapterClipParams.backwardOnly])],
|
|
1149
1162
|
defaultValue: false
|
|
1150
|
-
}
|
|
1163
|
+
}
|
|
1151
1164
|
};
|
|
1152
1165
|
var AdapterInsertParams;
|
|
1153
1166
|
(function (AdapterInsertParams) {
|
|
@@ -1164,29 +1177,49 @@ const INSERT_METHOD_PARAMS = {
|
|
|
1164
1177
|
mandatory: true
|
|
1165
1178
|
},
|
|
1166
1179
|
[AdapterInsertParams.before]: {
|
|
1167
|
-
validators: [
|
|
1168
|
-
|
|
1169
|
-
|
|
1180
|
+
validators: [
|
|
1181
|
+
FUNC_WITH_X_ARGUMENTS$1(1),
|
|
1182
|
+
ONE_OF_MUST([
|
|
1183
|
+
AdapterInsertParams.after,
|
|
1184
|
+
AdapterInsertParams.beforeIndex,
|
|
1185
|
+
AdapterInsertParams.afterIndex
|
|
1186
|
+
])
|
|
1187
|
+
]
|
|
1170
1188
|
},
|
|
1171
1189
|
[AdapterInsertParams.after]: {
|
|
1172
|
-
validators: [
|
|
1173
|
-
|
|
1174
|
-
|
|
1190
|
+
validators: [
|
|
1191
|
+
FUNC_WITH_X_ARGUMENTS$1(1),
|
|
1192
|
+
ONE_OF_MUST([
|
|
1193
|
+
AdapterInsertParams.before,
|
|
1194
|
+
AdapterInsertParams.beforeIndex,
|
|
1195
|
+
AdapterInsertParams.afterIndex
|
|
1196
|
+
])
|
|
1197
|
+
]
|
|
1175
1198
|
},
|
|
1176
1199
|
[AdapterInsertParams.beforeIndex]: {
|
|
1177
|
-
validators: [
|
|
1178
|
-
|
|
1179
|
-
|
|
1200
|
+
validators: [
|
|
1201
|
+
INTEGER,
|
|
1202
|
+
ONE_OF_MUST([
|
|
1203
|
+
AdapterInsertParams.before,
|
|
1204
|
+
AdapterInsertParams.after,
|
|
1205
|
+
AdapterInsertParams.afterIndex
|
|
1206
|
+
])
|
|
1207
|
+
]
|
|
1180
1208
|
},
|
|
1181
1209
|
[AdapterInsertParams.afterIndex]: {
|
|
1182
|
-
validators: [
|
|
1183
|
-
|
|
1184
|
-
|
|
1210
|
+
validators: [
|
|
1211
|
+
INTEGER,
|
|
1212
|
+
ONE_OF_MUST([
|
|
1213
|
+
AdapterInsertParams.before,
|
|
1214
|
+
AdapterInsertParams.after,
|
|
1215
|
+
AdapterInsertParams.beforeIndex
|
|
1216
|
+
])
|
|
1217
|
+
]
|
|
1185
1218
|
},
|
|
1186
1219
|
[AdapterInsertParams.decrease]: {
|
|
1187
1220
|
validators: [BOOLEAN],
|
|
1188
1221
|
defaultValue: false
|
|
1189
|
-
}
|
|
1222
|
+
}
|
|
1190
1223
|
};
|
|
1191
1224
|
var AdapterReplaceParams;
|
|
1192
1225
|
(function (AdapterReplaceParams) {
|
|
@@ -1221,7 +1254,7 @@ const UPDATE_METHOD_PARAMS = {
|
|
|
1221
1254
|
[AdapterUpdateParams.fixRight]: {
|
|
1222
1255
|
validators: [BOOLEAN],
|
|
1223
1256
|
defaultValue: false
|
|
1224
|
-
}
|
|
1257
|
+
}
|
|
1225
1258
|
};
|
|
1226
1259
|
var AdapterFixParams;
|
|
1227
1260
|
(function (AdapterFixParams) {
|
|
@@ -1250,7 +1283,7 @@ const FIX_METHOD_PARAMS = {
|
|
|
1250
1283
|
},
|
|
1251
1284
|
[AdapterFixParams.scrollToItemOpt]: {
|
|
1252
1285
|
validators: [OR([BOOLEAN, OBJECT$1])]
|
|
1253
|
-
}
|
|
1286
|
+
}
|
|
1254
1287
|
};
|
|
1255
1288
|
const AdapterMethods = {
|
|
1256
1289
|
[AdapterProcess.reset]: DatasourceProps,
|
|
@@ -1264,7 +1297,7 @@ const AdapterMethods = {
|
|
|
1264
1297
|
[AdapterProcess.replace]: AdapterReplaceParams,
|
|
1265
1298
|
[AdapterProcess.update]: AdapterUpdateParams,
|
|
1266
1299
|
[AdapterProcess.pause]: AdapterNoParams,
|
|
1267
|
-
[AdapterProcess.fix]: AdapterFixParams
|
|
1300
|
+
[AdapterProcess.fix]: AdapterFixParams
|
|
1268
1301
|
};
|
|
1269
1302
|
const ADAPTER_METHODS = {
|
|
1270
1303
|
[AdapterProcess.reset]: RESET_METHOD_PARAMS,
|
|
@@ -1278,7 +1311,7 @@ const ADAPTER_METHODS = {
|
|
|
1278
1311
|
[AdapterProcess.replace]: REPLACE_METHOD_PARAMS,
|
|
1279
1312
|
[AdapterProcess.update]: UPDATE_METHOD_PARAMS,
|
|
1280
1313
|
[AdapterProcess.pause]: NO_METHOD_PARAMS,
|
|
1281
|
-
[AdapterProcess.fix]: FIX_METHOD_PARAMS
|
|
1314
|
+
[AdapterProcess.fix]: FIX_METHOD_PARAMS
|
|
1282
1315
|
};
|
|
1283
1316
|
|
|
1284
1317
|
const { ELEMENT, OBJECT, FUNC, FUNC_WITH_X_ARGUMENTS } = VALIDATORS;
|
|
@@ -1360,8 +1393,7 @@ const BaseAdapterProcessFactory = (process) => { var _a; return _a = class BaseA
|
|
|
1360
1393
|
data: validate(options, ADAPTER_METHODS[_process || process])
|
|
1361
1394
|
};
|
|
1362
1395
|
if (result.data.isValid) {
|
|
1363
|
-
result.params = Object.entries(result.data.params)
|
|
1364
|
-
.reduce((acc, [key, { value }]) => (Object.assign(Object.assign({}, acc), { [key]: value })), {});
|
|
1396
|
+
result.params = Object.entries(result.data.params).reduce((acc, [key, { value }]) => (Object.assign(Object.assign({}, acc), { [key]: value })), {});
|
|
1365
1397
|
}
|
|
1366
1398
|
else {
|
|
1367
1399
|
scroller.logger.log(() => result.data.showErrors());
|
|
@@ -1394,8 +1426,7 @@ class Init extends BaseProcessFactory(CommonProcess.init) {
|
|
|
1394
1426
|
}
|
|
1395
1427
|
|
|
1396
1428
|
class Scroll extends BaseProcessFactory(CommonProcess.scroll) {
|
|
1397
|
-
|
|
1398
|
-
static run(scroller, payload) {
|
|
1429
|
+
static run(scroller, _payload) {
|
|
1399
1430
|
const { workflow, viewport } = scroller;
|
|
1400
1431
|
const position = viewport.scrollPosition;
|
|
1401
1432
|
if (Scroll.onSynthetic(scroller, position)) {
|
|
@@ -1412,28 +1443,34 @@ class Scroll extends BaseProcessFactory(CommonProcess.scroll) {
|
|
|
1412
1443
|
}
|
|
1413
1444
|
if (!scroll.syntheticFulfill || synthPos === position) {
|
|
1414
1445
|
scroller.logger.log(() => [
|
|
1415
|
-
'skipping scroll',
|
|
1446
|
+
'skipping scroll',
|
|
1447
|
+
position,
|
|
1448
|
+
`[${scroll.syntheticFulfill ? '' : 'pre-'}synthetic]`
|
|
1416
1449
|
]);
|
|
1417
1450
|
return true;
|
|
1418
1451
|
}
|
|
1419
1452
|
scroller.logger.log(() => [
|
|
1420
|
-
'synthetic scroll has been fulfilled:',
|
|
1453
|
+
'synthetic scroll has been fulfilled:',
|
|
1454
|
+
position,
|
|
1455
|
+
position < synthPos ? '<' : '>',
|
|
1456
|
+
synthPos
|
|
1421
1457
|
]);
|
|
1422
1458
|
}
|
|
1423
1459
|
return false;
|
|
1424
1460
|
}
|
|
1425
1461
|
static onThrottle(scroller, position, done) {
|
|
1426
|
-
const { state
|
|
1462
|
+
const { state, settings, logger } = scroller;
|
|
1463
|
+
const { scroll } = state;
|
|
1427
1464
|
scroll.current = Scroll.getScrollEvent(position, scroll.previous);
|
|
1428
1465
|
const { direction, time } = scroll.current;
|
|
1429
1466
|
const timeDiff = scroll.previous ? time - scroll.previous.time : Infinity;
|
|
1430
|
-
const delta = throttle - timeDiff;
|
|
1467
|
+
const delta = settings.throttle - timeDiff;
|
|
1431
1468
|
const shouldDelay = isFinite(delta) && delta > 0;
|
|
1432
1469
|
const alreadyDelayed = !!scroll.scrollTimer;
|
|
1433
1470
|
logger.log(() => [
|
|
1434
1471
|
direction === Direction.backward ? '\u2934' : '\u2935',
|
|
1435
1472
|
position,
|
|
1436
|
-
shouldDelay ?
|
|
1473
|
+
shouldDelay ? timeDiff + 'ms' : '0ms',
|
|
1437
1474
|
shouldDelay ? (alreadyDelayed ? 'delayed' : `/ ${delta}ms delay`) : ''
|
|
1438
1475
|
]);
|
|
1439
1476
|
if (!shouldDelay) {
|
|
@@ -1451,7 +1488,7 @@ class Scroll extends BaseProcessFactory(CommonProcess.scroll) {
|
|
|
1451
1488
|
return [
|
|
1452
1489
|
curr.direction === Direction.backward ? '\u2934' : '\u2935',
|
|
1453
1490
|
curr.position,
|
|
1454
|
-
|
|
1491
|
+
curr.time - time + 'ms',
|
|
1455
1492
|
'triggered by timer set on',
|
|
1456
1493
|
position
|
|
1457
1494
|
];
|
|
@@ -1475,11 +1512,15 @@ class Scroll extends BaseProcessFactory(CommonProcess.scroll) {
|
|
|
1475
1512
|
return { position, direction, time };
|
|
1476
1513
|
}
|
|
1477
1514
|
static onScroll(scroller, workflow) {
|
|
1478
|
-
const {
|
|
1515
|
+
const { scroll, cycle } = scroller.state;
|
|
1479
1516
|
scroll.previous = Object.assign({}, scroll.current);
|
|
1480
1517
|
scroll.current = null;
|
|
1481
1518
|
if (cycle.busy.get()) {
|
|
1482
|
-
scroller.logger.log(() => [
|
|
1519
|
+
scroller.logger.log(() => [
|
|
1520
|
+
'skipping scroll',
|
|
1521
|
+
scroll.previous.position,
|
|
1522
|
+
'[pending]'
|
|
1523
|
+
]);
|
|
1483
1524
|
return;
|
|
1484
1525
|
}
|
|
1485
1526
|
workflow.call({
|
|
@@ -1491,7 +1532,7 @@ class Scroll extends BaseProcessFactory(CommonProcess.scroll) {
|
|
|
1491
1532
|
|
|
1492
1533
|
class Reset extends BaseAdapterProcessFactory(AdapterProcess.reset) {
|
|
1493
1534
|
static run(scroller, options) {
|
|
1494
|
-
const { datasource, buffer, viewport
|
|
1535
|
+
const { datasource, buffer, viewport, state } = scroller;
|
|
1495
1536
|
if (options) {
|
|
1496
1537
|
const { data } = Reset.parseInput(scroller, options);
|
|
1497
1538
|
if (!data.isValid) {
|
|
@@ -1507,12 +1548,12 @@ class Reset extends BaseAdapterProcessFactory(AdapterProcess.reset) {
|
|
|
1507
1548
|
});
|
|
1508
1549
|
}
|
|
1509
1550
|
buffer.reset(true);
|
|
1510
|
-
paddings.backward.reset();
|
|
1511
|
-
paddings.forward.reset();
|
|
1551
|
+
viewport.paddings.backward.reset();
|
|
1552
|
+
viewport.paddings.forward.reset();
|
|
1512
1553
|
const payload = { datasource };
|
|
1513
|
-
if (cycle.busy.get()) {
|
|
1554
|
+
if (state.cycle.busy.get()) {
|
|
1514
1555
|
payload.finalize = true;
|
|
1515
|
-
cycle.interrupter = Reset.process;
|
|
1556
|
+
state.cycle.interrupter = Reset.process;
|
|
1516
1557
|
}
|
|
1517
1558
|
scroller.workflow.call({
|
|
1518
1559
|
process: Reset.process,
|
|
@@ -1616,7 +1657,7 @@ class Update extends BaseAdapterProcessFactory(AdapterProcess.update) {
|
|
|
1616
1657
|
});
|
|
1617
1658
|
}
|
|
1618
1659
|
static doUpdate(scroller, params) {
|
|
1619
|
-
const { buffer, viewport, state
|
|
1660
|
+
const { buffer, viewport, state, routines, logger } = scroller;
|
|
1620
1661
|
if (!buffer.items) {
|
|
1621
1662
|
logger.log(() => 'no items in Buffer');
|
|
1622
1663
|
return false;
|
|
@@ -1632,14 +1673,15 @@ class Update extends BaseAdapterProcessFactory(AdapterProcess.update) {
|
|
|
1632
1673
|
logger.log(() => toRemove.length
|
|
1633
1674
|
? 'items to remove: [' + toRemove.map(({ $index }) => $index).join(',') + ']'
|
|
1634
1675
|
: 'no items to remove');
|
|
1635
|
-
if (toRemove.length) {
|
|
1676
|
+
if (toRemove.length) {
|
|
1677
|
+
// insertions will be processed on render
|
|
1636
1678
|
buffer.checkDefaultSize();
|
|
1637
1679
|
}
|
|
1638
1680
|
const toRender = buffer.items.filter(({ toInsert }) => toInsert);
|
|
1639
1681
|
logger.log(() => toRender.length
|
|
1640
1682
|
? 'items to render: [' + toRender.map(({ $index }) => $index).join(',') + ']'
|
|
1641
1683
|
: 'no items to render');
|
|
1642
|
-
fetch.update(trackedIndex, delta, toRender, toRemove);
|
|
1684
|
+
state.fetch.update(trackedIndex, delta, toRender, toRemove);
|
|
1643
1685
|
return !!toRemove.length || !!toRender.length;
|
|
1644
1686
|
}
|
|
1645
1687
|
}
|
|
@@ -1667,7 +1709,7 @@ class Insert extends BaseAdapterProcessFactory(AdapterProcess.insert) {
|
|
|
1667
1709
|
return true;
|
|
1668
1710
|
}
|
|
1669
1711
|
static insertEmpty(scroller, params) {
|
|
1670
|
-
const { buffer, routines, state
|
|
1712
|
+
const { buffer, routines, state } = scroller;
|
|
1671
1713
|
if (buffer.size) {
|
|
1672
1714
|
return false;
|
|
1673
1715
|
}
|
|
@@ -1675,7 +1717,7 @@ class Insert extends BaseAdapterProcessFactory(AdapterProcess.insert) {
|
|
|
1675
1717
|
if (!buffer.fillEmpty(items, beforeIndex, afterIndex, !!decrease, (index, data) => new Item(index, data, routines))) {
|
|
1676
1718
|
return false;
|
|
1677
1719
|
}
|
|
1678
|
-
fetch.fill(buffer.items, buffer.startIndex);
|
|
1720
|
+
state.fetch.fill(buffer.items, buffer.startIndex);
|
|
1679
1721
|
return true;
|
|
1680
1722
|
}
|
|
1681
1723
|
static insertInBuffer(scroller, params) {
|
|
@@ -1698,12 +1740,13 @@ class Insert extends BaseAdapterProcessFactory(AdapterProcess.insert) {
|
|
|
1698
1740
|
}
|
|
1699
1741
|
static insertVirtually(scroller, params) {
|
|
1700
1742
|
const { beforeIndex, afterIndex, items, decrease } = params;
|
|
1701
|
-
const { buffer, state
|
|
1743
|
+
const { buffer, state, viewport } = scroller;
|
|
1702
1744
|
const direction = Number.isInteger(beforeIndex) ? Direction.backward : Direction.forward;
|
|
1703
1745
|
const indexToInsert = (direction === Direction.backward ? beforeIndex : afterIndex);
|
|
1704
1746
|
if (!buffer.insertVirtually(items, indexToInsert, direction, !!decrease)) {
|
|
1705
1747
|
return false;
|
|
1706
1748
|
}
|
|
1749
|
+
const { fetch } = state;
|
|
1707
1750
|
const { index, diff } = viewport.getEdgeVisibleItem(buffer.items, Direction.backward);
|
|
1708
1751
|
fetch.firstVisible.index = index;
|
|
1709
1752
|
if (!isNaN(index)) {
|
|
@@ -1737,7 +1780,8 @@ class Append extends BaseAdapterProcessFactory(AdapterProcess.append) {
|
|
|
1737
1780
|
items = [...items].reverse();
|
|
1738
1781
|
}
|
|
1739
1782
|
else {
|
|
1740
|
-
afterIndex =
|
|
1783
|
+
afterIndex =
|
|
1784
|
+
(eof ? buffer.absMaxIndex : buffer.maxIndex) - (!buffer.size && !opposite ? 1 : 0);
|
|
1741
1785
|
}
|
|
1742
1786
|
return Insert.doInsert(scroller, {
|
|
1743
1787
|
items,
|
|
@@ -1751,7 +1795,7 @@ class Append extends BaseAdapterProcessFactory(AdapterProcess.append) {
|
|
|
1751
1795
|
|
|
1752
1796
|
class Check extends BaseAdapterProcessFactory(AdapterProcess.check) {
|
|
1753
1797
|
static run(scroller) {
|
|
1754
|
-
const { workflow, buffer, state
|
|
1798
|
+
const { workflow, buffer, state, viewport } = scroller;
|
|
1755
1799
|
let min = Infinity, max = -Infinity;
|
|
1756
1800
|
buffer.items.forEach(item => {
|
|
1757
1801
|
const size = item.size;
|
|
@@ -1763,6 +1807,7 @@ class Check extends BaseAdapterProcessFactory(AdapterProcess.check) {
|
|
|
1763
1807
|
}
|
|
1764
1808
|
});
|
|
1765
1809
|
if (Number.isFinite(min)) {
|
|
1810
|
+
const { fetch } = state;
|
|
1766
1811
|
fetch.first.indexBuffer = buffer.firstIndex;
|
|
1767
1812
|
fetch.last.indexBuffer = buffer.lastIndex;
|
|
1768
1813
|
const { index: firstIndex, diff } = viewport.getEdgeVisibleItem(buffer.items, Direction.backward);
|
|
@@ -1821,9 +1866,8 @@ class Remove extends BaseAdapterProcessFactory(AdapterProcess.remove) {
|
|
|
1821
1866
|
if (!predicate && !indexes) {
|
|
1822
1867
|
return [];
|
|
1823
1868
|
}
|
|
1824
|
-
const newPredicate = item => (predicate && predicate(item)) ||
|
|
1825
|
-
|
|
1826
|
-
const indexesToRemove = scroller.buffer.items.reduce((acc, item) => newPredicate(item) ? [...acc, item.$index] : acc, []);
|
|
1869
|
+
const newPredicate = item => (predicate && predicate(item)) || (!!indexes && indexes.includes(item.$index));
|
|
1870
|
+
const indexesToRemove = scroller.buffer.items.reduce((acc, item) => (newPredicate(item) ? [...acc, item.$index] : acc), []);
|
|
1827
1871
|
const updateOptions = {
|
|
1828
1872
|
predicate: item => !newPredicate(item),
|
|
1829
1873
|
fixRight: increase
|
|
@@ -1836,7 +1880,7 @@ class Remove extends BaseAdapterProcessFactory(AdapterProcess.remove) {
|
|
|
1836
1880
|
if (!indexes || !indexes.length) {
|
|
1837
1881
|
return false;
|
|
1838
1882
|
}
|
|
1839
|
-
const { buffer, viewport, state
|
|
1883
|
+
const { buffer, viewport, state } = scroller;
|
|
1840
1884
|
// get items to remove
|
|
1841
1885
|
const { finiteAbsMinIndex, firstIndex, finiteAbsMaxIndex, lastIndex } = buffer;
|
|
1842
1886
|
const toRemove = [];
|
|
@@ -1856,6 +1900,7 @@ class Remove extends BaseAdapterProcessFactory(AdapterProcess.remove) {
|
|
|
1856
1900
|
return false;
|
|
1857
1901
|
}
|
|
1858
1902
|
// what should be shown after remove; Buffer removal has priority
|
|
1903
|
+
const { fetch } = state;
|
|
1859
1904
|
if (isNaN(fetch.firstVisible.index)) {
|
|
1860
1905
|
const { index, diff } = viewport.getEdgeVisibleItem(buffer.items, Direction.backward);
|
|
1861
1906
|
fetch.firstVisible.index = index;
|
|
@@ -1875,7 +1920,10 @@ class Remove extends BaseAdapterProcessFactory(AdapterProcess.remove) {
|
|
|
1875
1920
|
if (isNaN(firstVisible.index)) {
|
|
1876
1921
|
return;
|
|
1877
1922
|
}
|
|
1878
|
-
const shift = listToRemove.reduce((acc, index) => acc +
|
|
1923
|
+
const shift = listToRemove.reduce((acc, index) => acc +
|
|
1924
|
+
((increase && index > firstVisible.index) || (!increase && index < firstVisible.index)
|
|
1925
|
+
? 1
|
|
1926
|
+
: 0), 0);
|
|
1879
1927
|
firstVisible.index = firstVisible.index + (increase ? shift : -shift);
|
|
1880
1928
|
}
|
|
1881
1929
|
}
|
|
@@ -1901,7 +1949,7 @@ class Replace extends BaseAdapterProcessFactory(AdapterProcess.replace) {
|
|
|
1901
1949
|
const shouldReplace = Replace.doReplace(scroller, params);
|
|
1902
1950
|
scroller.workflow.call({
|
|
1903
1951
|
process: Replace.process,
|
|
1904
|
-
status: shouldReplace ? ProcessStatus.next : ProcessStatus.done
|
|
1952
|
+
status: shouldReplace ? ProcessStatus.next : ProcessStatus.done
|
|
1905
1953
|
});
|
|
1906
1954
|
}
|
|
1907
1955
|
static doReplace(scroller, params) {
|
|
@@ -1983,7 +2031,9 @@ class Fix extends BaseAdapterProcessFactory(AdapterProcess.fix) {
|
|
|
1983
2031
|
case FixParams.scrollToItem:
|
|
1984
2032
|
if (methodData.params) {
|
|
1985
2033
|
const scrollToItemOpt = methodData.params[FixParams.scrollToItemOpt];
|
|
1986
|
-
const options = scrollToItemOpt
|
|
2034
|
+
const options = scrollToItemOpt
|
|
2035
|
+
? scrollToItemOpt.value
|
|
2036
|
+
: void 0;
|
|
1987
2037
|
return Fix.scrollToItem(scroller, value, options);
|
|
1988
2038
|
}
|
|
1989
2039
|
return;
|
|
@@ -2011,7 +2061,7 @@ class Fix extends BaseAdapterProcessFactory(AdapterProcess.fix) {
|
|
|
2011
2061
|
}
|
|
2012
2062
|
static updateItems({ buffer, logger }, value) {
|
|
2013
2063
|
let updateReference = false;
|
|
2014
|
-
const updater = () => updateReference = true;
|
|
2064
|
+
const updater = () => (updateReference = true);
|
|
2015
2065
|
buffer.items.forEach(item => value(item.get(), updater));
|
|
2016
2066
|
if (updateReference) {
|
|
2017
2067
|
logger.log(() => 'update Buffer.items reference');
|
|
@@ -2041,7 +2091,8 @@ class Start extends BaseProcessFactory(CommonProcess.start) {
|
|
|
2041
2091
|
|
|
2042
2092
|
class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
|
|
2043
2093
|
static run(scroller) {
|
|
2044
|
-
const { workflow, buffer, state
|
|
2094
|
+
const { workflow, buffer, state } = scroller;
|
|
2095
|
+
const { fetch, cycle } = state;
|
|
2045
2096
|
fetch.minIndex = buffer.minIndex;
|
|
2046
2097
|
// set first and last indexes of items to fetch
|
|
2047
2098
|
PreFetch.setPositionsAndIndexes(scroller);
|
|
@@ -2068,7 +2119,8 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
|
|
|
2068
2119
|
scroller.logger.fetch();
|
|
2069
2120
|
}
|
|
2070
2121
|
static setPositions(scroller) {
|
|
2071
|
-
const { state
|
|
2122
|
+
const { state, viewport } = scroller;
|
|
2123
|
+
const { positions } = state.fetch;
|
|
2072
2124
|
const paddingDelta = viewport.getBufferPadding();
|
|
2073
2125
|
positions.before = viewport.scrollPosition;
|
|
2074
2126
|
positions.startDelta = PreFetch.getStartDelta(scroller);
|
|
@@ -2077,7 +2129,9 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
|
|
|
2077
2129
|
positions.end = positions.relative + viewport.getSize() + paddingDelta;
|
|
2078
2130
|
}
|
|
2079
2131
|
static getStartDelta(scroller) {
|
|
2080
|
-
|
|
2132
|
+
// calculate size before start index
|
|
2133
|
+
const { buffer, viewport } = scroller;
|
|
2134
|
+
const { offset } = viewport;
|
|
2081
2135
|
let startDelta = 0;
|
|
2082
2136
|
if (offset) {
|
|
2083
2137
|
startDelta += offset;
|
|
@@ -2089,13 +2143,15 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
|
|
|
2089
2143
|
startDelta += buffer.getSizeByIndex(index);
|
|
2090
2144
|
}
|
|
2091
2145
|
scroller.logger.log(() => [
|
|
2092
|
-
`start delta is ${startDelta}`,
|
|
2146
|
+
`start delta is ${startDelta}`,
|
|
2147
|
+
...(offset ? [` (+${offset} offset)`] : [])
|
|
2093
2148
|
]);
|
|
2094
2149
|
return startDelta;
|
|
2095
2150
|
}
|
|
2096
2151
|
static setFirstIndex(scroller) {
|
|
2097
2152
|
const { state, buffer } = scroller;
|
|
2098
|
-
const { positions
|
|
2153
|
+
const { positions, first } = state.fetch;
|
|
2154
|
+
const { start } = positions;
|
|
2099
2155
|
let firstIndex = buffer.startIndex;
|
|
2100
2156
|
let firstIndexPosition = 0;
|
|
2101
2157
|
if (state.cycle.innerLoop.isInitial) {
|
|
@@ -2107,10 +2163,10 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
|
|
|
2107
2163
|
else {
|
|
2108
2164
|
let position = firstIndexPosition;
|
|
2109
2165
|
let index = firstIndex;
|
|
2110
|
-
while (
|
|
2166
|
+
while (true) {
|
|
2111
2167
|
if (start >= 0) {
|
|
2112
2168
|
const size = buffer.getSizeByIndex(index);
|
|
2113
|
-
const diff =
|
|
2169
|
+
const diff = position + size - start;
|
|
2114
2170
|
if (diff > 0) {
|
|
2115
2171
|
firstIndex = index;
|
|
2116
2172
|
firstIndexPosition = position;
|
|
@@ -2141,8 +2197,10 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
|
|
|
2141
2197
|
first.position = firstIndexPosition;
|
|
2142
2198
|
}
|
|
2143
2199
|
static setLastIndex(scroller) {
|
|
2144
|
-
const { state
|
|
2145
|
-
const {
|
|
2200
|
+
const { state, buffer, settings } = scroller;
|
|
2201
|
+
const { fetch, cycle } = state;
|
|
2202
|
+
const { firstVisible, positions, first, last } = fetch;
|
|
2203
|
+
const { relative, end } = positions;
|
|
2146
2204
|
let lastIndex;
|
|
2147
2205
|
if (!buffer.defaultSize) {
|
|
2148
2206
|
// just to fetch forward bufferSize items if neither averageItemSize nor itemSize are present
|
|
@@ -2153,7 +2211,7 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
|
|
|
2153
2211
|
let index = first.indexBuffer;
|
|
2154
2212
|
let position = first.position;
|
|
2155
2213
|
lastIndex = index;
|
|
2156
|
-
while (
|
|
2214
|
+
while (true) {
|
|
2157
2215
|
lastIndex = index;
|
|
2158
2216
|
const size = buffer.getSizeByIndex(index);
|
|
2159
2217
|
position += size;
|
|
@@ -2207,7 +2265,8 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
|
|
|
2207
2265
|
}
|
|
2208
2266
|
}
|
|
2209
2267
|
static checkBufferGaps(scroller) {
|
|
2210
|
-
const { buffer, state
|
|
2268
|
+
const { buffer, state } = scroller;
|
|
2269
|
+
const { fetch } = state;
|
|
2211
2270
|
if (!buffer.size) {
|
|
2212
2271
|
return;
|
|
2213
2272
|
}
|
|
@@ -2226,7 +2285,8 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
|
|
|
2226
2285
|
}
|
|
2227
2286
|
}
|
|
2228
2287
|
static checkFetchPackSize(scroller) {
|
|
2229
|
-
const { buffer, state
|
|
2288
|
+
const { buffer, state } = scroller;
|
|
2289
|
+
const { fetch } = state;
|
|
2230
2290
|
if (!fetch.shouldFetch) {
|
|
2231
2291
|
return;
|
|
2232
2292
|
}
|
|
@@ -2236,7 +2296,8 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
|
|
|
2236
2296
|
if (diff <= 0) {
|
|
2237
2297
|
return;
|
|
2238
2298
|
}
|
|
2239
|
-
if (!buffer.size || lastIndex > buffer.items[0].$index) {
|
|
2299
|
+
if (!buffer.size || lastIndex > buffer.items[0].$index) {
|
|
2300
|
+
// forward
|
|
2240
2301
|
const newLastIndex = Math.min(lastIndex + diff, buffer.absMaxIndex);
|
|
2241
2302
|
if (newLastIndex > lastIndex) {
|
|
2242
2303
|
fetch.last.index = fetch.last.indexBuffer = newLastIndex;
|
|
@@ -2254,11 +2315,13 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
|
|
|
2254
2315
|
}
|
|
2255
2316
|
}
|
|
2256
2317
|
static setFetchDirection(scroller) {
|
|
2257
|
-
const { buffer, state
|
|
2318
|
+
const { buffer, state } = scroller;
|
|
2319
|
+
const { fetch } = state;
|
|
2258
2320
|
if (fetch.last.index) {
|
|
2259
2321
|
let direction = Direction.forward;
|
|
2260
2322
|
if (buffer.size) {
|
|
2261
|
-
direction =
|
|
2323
|
+
direction =
|
|
2324
|
+
fetch.last.index < buffer.items[0].$index ? Direction.backward : Direction.forward;
|
|
2262
2325
|
}
|
|
2263
2326
|
fetch.direction = direction;
|
|
2264
2327
|
scroller.logger.log(() => `fetch direction is "${direction}"`);
|
|
@@ -2311,7 +2374,8 @@ class Fetch extends BaseProcessFactory(CommonProcess.fetch) {
|
|
|
2311
2374
|
}
|
|
2312
2375
|
}
|
|
2313
2376
|
else {
|
|
2314
|
-
const { state
|
|
2377
|
+
const { state, viewport } = scroller;
|
|
2378
|
+
const { scroll, fetch } = state;
|
|
2315
2379
|
if (scroll.positionBeforeAsync === null) {
|
|
2316
2380
|
scroll.positionBeforeAsync = viewport.scrollPosition;
|
|
2317
2381
|
}
|
|
@@ -2319,7 +2383,7 @@ class Fetch extends BaseProcessFactory(CommonProcess.fetch) {
|
|
|
2319
2383
|
box.success = () => null;
|
|
2320
2384
|
box.fail = () => null;
|
|
2321
2385
|
};
|
|
2322
|
-
result.then(
|
|
2386
|
+
result.then(data => box.success(data), error => box.fail(error));
|
|
2323
2387
|
}
|
|
2324
2388
|
}
|
|
2325
2389
|
static get(scroller) {
|
|
@@ -2355,9 +2419,10 @@ class Fetch extends BaseProcessFactory(CommonProcess.fetch) {
|
|
|
2355
2419
|
});
|
|
2356
2420
|
}
|
|
2357
2421
|
}
|
|
2358
|
-
if (immediateData || immediateError) {
|
|
2422
|
+
if (immediateData || immediateError) {
|
|
2423
|
+
// callback case or immediate observable
|
|
2359
2424
|
return {
|
|
2360
|
-
data: immediateError ? null :
|
|
2425
|
+
data: immediateError ? null : immediateData || [],
|
|
2361
2426
|
error: immediateError,
|
|
2362
2427
|
isError: !!immediateError
|
|
2363
2428
|
};
|
|
@@ -2376,44 +2441,45 @@ class PostFetch extends BaseProcessFactory(CommonProcess.postFetch) {
|
|
|
2376
2441
|
PostFetch.setBufferLimits(scroller);
|
|
2377
2442
|
workflow.call({
|
|
2378
2443
|
process: PostFetch.process,
|
|
2379
|
-
status: scroller.state.fetch.hasNewItems
|
|
2380
|
-
? ProcessStatus.next
|
|
2381
|
-
: ProcessStatus.done
|
|
2444
|
+
status: scroller.state.fetch.hasNewItems ? ProcessStatus.next : ProcessStatus.done
|
|
2382
2445
|
});
|
|
2383
2446
|
}
|
|
2384
2447
|
else {
|
|
2385
2448
|
workflow.call({
|
|
2386
2449
|
process: PostFetch.process,
|
|
2387
2450
|
status: ProcessStatus.error,
|
|
2388
|
-
payload: { error: 'Can
|
|
2451
|
+
payload: { error: 'Can not set buffer items' }
|
|
2389
2452
|
});
|
|
2390
2453
|
}
|
|
2391
2454
|
}
|
|
2392
2455
|
static setBufferLimits(scroller) {
|
|
2393
|
-
const { buffer, state
|
|
2394
|
-
const {
|
|
2456
|
+
const { buffer, state } = scroller;
|
|
2457
|
+
const { fetch, cycle } = state;
|
|
2458
|
+
const { items, first, last } = fetch;
|
|
2395
2459
|
if (!items.length) {
|
|
2396
|
-
if (last < buffer.minIndex || innerLoop.isInitial) {
|
|
2460
|
+
if (last.index < buffer.minIndex || cycle.innerLoop.isInitial) {
|
|
2397
2461
|
buffer.absMinIndex = buffer.minIndex;
|
|
2398
2462
|
}
|
|
2399
|
-
if (first > buffer.maxIndex || innerLoop.isInitial) {
|
|
2463
|
+
if (first.index > buffer.maxIndex || cycle.innerLoop.isInitial) {
|
|
2400
2464
|
buffer.absMaxIndex = buffer.maxIndex;
|
|
2401
2465
|
}
|
|
2402
2466
|
}
|
|
2403
2467
|
else {
|
|
2404
2468
|
const lastIndex = items.length - 1;
|
|
2405
|
-
if (first < items[0].$index) {
|
|
2469
|
+
if (first.index < items[0].$index) {
|
|
2406
2470
|
buffer.absMinIndex = items[0].$index;
|
|
2407
2471
|
}
|
|
2408
|
-
if (last > items[lastIndex].$index) {
|
|
2472
|
+
if (last.index > items[lastIndex].$index) {
|
|
2409
2473
|
buffer.absMaxIndex = items[lastIndex].$index;
|
|
2410
2474
|
}
|
|
2411
2475
|
}
|
|
2412
2476
|
}
|
|
2413
2477
|
static setItems(scroller) {
|
|
2414
|
-
const { buffer, state
|
|
2478
|
+
const { buffer, state } = scroller;
|
|
2479
|
+
const { fetch, cycle } = state;
|
|
2415
2480
|
const items = fetch.newItemsData;
|
|
2416
|
-
if (!items || !items.length) {
|
|
2481
|
+
if (!items || !items.length) {
|
|
2482
|
+
// empty result
|
|
2417
2483
|
return true;
|
|
2418
2484
|
}
|
|
2419
2485
|
// eof/bof case, need to shift fetch index if bof
|
|
@@ -2435,7 +2501,8 @@ class PostFetch extends BaseProcessFactory(CommonProcess.postFetch) {
|
|
|
2435
2501
|
|
|
2436
2502
|
class Render extends BaseProcessFactory(CommonProcess.render) {
|
|
2437
2503
|
static run(scroller) {
|
|
2438
|
-
const { workflow, state
|
|
2504
|
+
const { workflow, state, viewport, routines } = scroller;
|
|
2505
|
+
const { cycle, render, scroll, fetch } = state;
|
|
2439
2506
|
scroller.logger.stat('before new items render');
|
|
2440
2507
|
if (scroll.positionBeforeAsync === null) {
|
|
2441
2508
|
scroll.positionBeforeAsync = viewport.scrollPosition;
|
|
@@ -2453,13 +2520,14 @@ class Render extends BaseProcessFactory(CommonProcess.render) {
|
|
|
2453
2520
|
workflow.call({
|
|
2454
2521
|
process: Render.process,
|
|
2455
2522
|
status: ProcessStatus.error,
|
|
2456
|
-
payload: { error: 'Can
|
|
2523
|
+
payload: { error: 'Can not associate item with element' }
|
|
2457
2524
|
});
|
|
2458
2525
|
}
|
|
2459
2526
|
}, { items: fetch.items.map(i => i.get()) });
|
|
2460
2527
|
}
|
|
2461
2528
|
static doRender(scroller) {
|
|
2462
|
-
const { state
|
|
2529
|
+
const { state, viewport, buffer, logger } = scroller;
|
|
2530
|
+
const { fetch, render } = state;
|
|
2463
2531
|
render.positionBefore = viewport.scrollPosition;
|
|
2464
2532
|
if (!fetch.isCheck) {
|
|
2465
2533
|
render.sizeBefore = viewport.getScrollableSize();
|
|
@@ -2470,7 +2538,7 @@ class Render extends BaseProcessFactory(CommonProcess.render) {
|
|
|
2470
2538
|
buffer.checkDefaultSize();
|
|
2471
2539
|
render.sizeAfter = viewport.getScrollableSize();
|
|
2472
2540
|
logger.stat('after new items render');
|
|
2473
|
-
logger.log(() => render.noSize ? 'viewport size has not been changed' : void 0);
|
|
2541
|
+
logger.log(() => (render.noSize ? 'viewport size has not been changed' : void 0));
|
|
2474
2542
|
return true;
|
|
2475
2543
|
}
|
|
2476
2544
|
static processElement(scroller, item) {
|
|
@@ -2490,7 +2558,8 @@ class Render extends BaseProcessFactory(CommonProcess.render) {
|
|
|
2490
2558
|
const isInterrupted = ({ call }) => !!call.interrupted;
|
|
2491
2559
|
class End extends BaseProcessFactory(CommonProcess.end) {
|
|
2492
2560
|
static run(scroller, { error } = {}) {
|
|
2493
|
-
const { workflow, state
|
|
2561
|
+
const { workflow, state } = scroller;
|
|
2562
|
+
const { interrupter } = state.cycle;
|
|
2494
2563
|
if (!error && !interrupter) {
|
|
2495
2564
|
// set out params accessible via Adapter
|
|
2496
2565
|
End.calculateParams(scroller);
|
|
@@ -2541,10 +2610,10 @@ class End extends BaseProcessFactory(CommonProcess.end) {
|
|
|
2541
2610
|
|
|
2542
2611
|
class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
|
|
2543
2612
|
static run(scroller) {
|
|
2544
|
-
const { workflow, viewport, state
|
|
2545
|
-
scroll.positionBeforeAdjust = viewport.scrollPosition;
|
|
2613
|
+
const { workflow, viewport, state } = scroller;
|
|
2614
|
+
state.scroll.positionBeforeAdjust = viewport.scrollPosition;
|
|
2546
2615
|
Adjust.setPaddings(scroller);
|
|
2547
|
-
scroll.positionAfterAdjust = viewport.scrollPosition;
|
|
2616
|
+
state.scroll.positionAfterAdjust = viewport.scrollPosition;
|
|
2548
2617
|
// scroll position adjustments
|
|
2549
2618
|
const position = Adjust.calculatePosition(scroller);
|
|
2550
2619
|
// additional adjustment if the position can't be reached during the initial cycle
|
|
@@ -2556,7 +2625,7 @@ class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
|
|
|
2556
2625
|
}));
|
|
2557
2626
|
}
|
|
2558
2627
|
static setPaddings(scroller) {
|
|
2559
|
-
const { viewport, buffer, settings
|
|
2628
|
+
const { viewport, buffer, settings, state } = scroller;
|
|
2560
2629
|
const firstItem = buffer.getFirstVisibleItem();
|
|
2561
2630
|
const lastItem = buffer.getLastVisibleItem();
|
|
2562
2631
|
let first, last;
|
|
@@ -2565,6 +2634,7 @@ class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
|
|
|
2565
2634
|
last = lastItem.$index;
|
|
2566
2635
|
}
|
|
2567
2636
|
else {
|
|
2637
|
+
const { fetch } = state;
|
|
2568
2638
|
first = !isNaN(fetch.firstVisible.index) ? fetch.firstVisible.index : buffer.startIndex;
|
|
2569
2639
|
last = first - 1;
|
|
2570
2640
|
}
|
|
@@ -2582,20 +2652,23 @@ class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
|
|
|
2582
2652
|
const scrollSize = bwdSize + bufferSize + fwdSize;
|
|
2583
2653
|
const viewportSizeDiff = viewport.getSize() - scrollSize;
|
|
2584
2654
|
if (viewportSizeDiff > 0) {
|
|
2585
|
-
if (inverse) {
|
|
2655
|
+
if (settings.inverse) {
|
|
2586
2656
|
bwdSize += viewportSizeDiff;
|
|
2587
2657
|
}
|
|
2588
2658
|
else {
|
|
2589
2659
|
fwdSize += viewportSizeDiff;
|
|
2590
2660
|
}
|
|
2591
|
-
scroller.logger.log(() => inverse
|
|
2661
|
+
scroller.logger.log(() => settings.inverse
|
|
2662
|
+
? 'backward'
|
|
2663
|
+
: 'forward' + ` padding will be increased by ${viewportSizeDiff} to fill the viewport`);
|
|
2592
2664
|
}
|
|
2593
2665
|
backward.size = bwdSize;
|
|
2594
2666
|
forward.size = fwdSize;
|
|
2595
2667
|
scroller.logger.stat('after paddings adjustments');
|
|
2596
2668
|
}
|
|
2597
2669
|
static calculatePosition(scroller) {
|
|
2598
|
-
const { viewport, buffer, state
|
|
2670
|
+
const { viewport, buffer, state } = scroller;
|
|
2671
|
+
const { fetch, render, scroll } = state;
|
|
2599
2672
|
let position = viewport.paddings.backward.size;
|
|
2600
2673
|
// increase the position to meet the expectation of the first visible item
|
|
2601
2674
|
if (!isNaN(fetch.firstVisible.index) && !isNaN(buffer.firstIndex)) {
|
|
@@ -2632,8 +2705,8 @@ class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
|
|
|
2632
2705
|
return Math.round(position);
|
|
2633
2706
|
}
|
|
2634
2707
|
static setAdditionalForwardPadding(scroller, position) {
|
|
2635
|
-
const { viewport, buffer, state
|
|
2636
|
-
if (!cycle.isInitial || !End.shouldContinueRun(scroller, null)) {
|
|
2708
|
+
const { viewport, buffer, state } = scroller;
|
|
2709
|
+
if (!state.cycle.isInitial || !End.shouldContinueRun(scroller, null)) {
|
|
2637
2710
|
return;
|
|
2638
2711
|
}
|
|
2639
2712
|
const diff = position - viewport.getMaxScrollPosition();
|
|
@@ -2656,7 +2729,8 @@ class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
|
|
|
2656
2729
|
}
|
|
2657
2730
|
}
|
|
2658
2731
|
static setPosition(scroller, position, done) {
|
|
2659
|
-
const { state
|
|
2732
|
+
const { state, viewport, routines } = scroller;
|
|
2733
|
+
const { scroll } = state;
|
|
2660
2734
|
if (!scroll.hasPositionChanged(position)) {
|
|
2661
2735
|
return done();
|
|
2662
2736
|
}
|
|
@@ -2691,7 +2765,7 @@ class PreClip extends BaseProcessFactory(CommonProcess.preClip) {
|
|
|
2691
2765
|
});
|
|
2692
2766
|
}
|
|
2693
2767
|
static prepareClip(scroller) {
|
|
2694
|
-
const {
|
|
2768
|
+
const { fetch, clip } = scroller.state;
|
|
2695
2769
|
if (PreClip.shouldNotClip(scroller)) {
|
|
2696
2770
|
return;
|
|
2697
2771
|
}
|
|
@@ -2727,7 +2801,8 @@ class PreClip extends BaseProcessFactory(CommonProcess.preClip) {
|
|
|
2727
2801
|
return false;
|
|
2728
2802
|
}
|
|
2729
2803
|
static isBackward(scroller, firstIndex) {
|
|
2730
|
-
const { buffer, state
|
|
2804
|
+
const { buffer, state } = scroller;
|
|
2805
|
+
const { clip, fetch } = state;
|
|
2731
2806
|
if (clip.force) {
|
|
2732
2807
|
return clip.forceBackward;
|
|
2733
2808
|
}
|
|
@@ -2739,7 +2814,8 @@ class PreClip extends BaseProcessFactory(CommonProcess.preClip) {
|
|
|
2739
2814
|
return false;
|
|
2740
2815
|
}
|
|
2741
2816
|
static isForward(scroller, lastIndex) {
|
|
2742
|
-
const { buffer, state
|
|
2817
|
+
const { buffer, state } = scroller;
|
|
2818
|
+
const { clip, fetch } = state;
|
|
2743
2819
|
if (clip.force) {
|
|
2744
2820
|
return clip.forceForward;
|
|
2745
2821
|
}
|
|
@@ -2753,8 +2829,7 @@ class PreClip extends BaseProcessFactory(CommonProcess.preClip) {
|
|
|
2753
2829
|
static prepareClipByDirection(scroller, direction, edgeIndex) {
|
|
2754
2830
|
const forward = direction === Direction.forward;
|
|
2755
2831
|
scroller.buffer.items.forEach(item => {
|
|
2756
|
-
if ((!forward && item.$index < edgeIndex) ||
|
|
2757
|
-
(forward && item.$index > edgeIndex)) {
|
|
2832
|
+
if ((!forward && item.$index < edgeIndex) || (forward && item.$index > edgeIndex)) {
|
|
2758
2833
|
item.toRemove = true;
|
|
2759
2834
|
item.removeDirection = direction;
|
|
2760
2835
|
scroller.state.clip.doClip = true;
|
|
@@ -2773,9 +2848,9 @@ class Clip extends BaseProcessFactory(CommonProcess.clip) {
|
|
|
2773
2848
|
});
|
|
2774
2849
|
}
|
|
2775
2850
|
static doClip(scroller) {
|
|
2776
|
-
const { buffer, viewport
|
|
2851
|
+
const { buffer, viewport, state, logger } = scroller;
|
|
2777
2852
|
const size = { [Direction.backward]: 0, [Direction.forward]: 0 };
|
|
2778
|
-
logger.stat(`before clip (${++clip.callCount})`);
|
|
2853
|
+
logger.stat(`before clip (${++state.clip.callCount})`);
|
|
2779
2854
|
const itemsToRemove = buffer.items.filter(item => {
|
|
2780
2855
|
if (!item.toRemove) {
|
|
2781
2856
|
return false;
|
|
@@ -2786,10 +2861,10 @@ class Clip extends BaseProcessFactory(CommonProcess.clip) {
|
|
|
2786
2861
|
});
|
|
2787
2862
|
if (itemsToRemove.length) {
|
|
2788
2863
|
if (size[Direction.backward]) {
|
|
2789
|
-
paddings.byDirection(Direction.backward).size += size[Direction.backward];
|
|
2864
|
+
viewport.paddings.byDirection(Direction.backward).size += size[Direction.backward];
|
|
2790
2865
|
}
|
|
2791
2866
|
if (size[Direction.forward]) {
|
|
2792
|
-
paddings.byDirection(Direction.forward).size += size[Direction.forward];
|
|
2867
|
+
viewport.paddings.byDirection(Direction.forward).size += size[Direction.forward];
|
|
2793
2868
|
}
|
|
2794
2869
|
if (scroller.settings.onBeforeClip) {
|
|
2795
2870
|
scroller.settings.onBeforeClip(itemsToRemove.map(item => item.get()));
|
|
@@ -2818,7 +2893,7 @@ class Logger {
|
|
|
2818
2893
|
if (!this.debug) {
|
|
2819
2894
|
return;
|
|
2820
2895
|
}
|
|
2821
|
-
const params = (args === void 0 ? [] :
|
|
2896
|
+
const params = (args === void 0 ? [] : Array.isArray(args) ? args : [args])
|
|
2822
2897
|
.map((arg) => {
|
|
2823
2898
|
if (typeof arg === 'function') {
|
|
2824
2899
|
return 'func';
|
|
@@ -2838,24 +2913,36 @@ class Logger {
|
|
|
2838
2913
|
this.debug = settings.debug;
|
|
2839
2914
|
this.immediateLog = settings.immediateLog;
|
|
2840
2915
|
this.logTime = settings.logTime;
|
|
2916
|
+
this.logColor = settings.logColor;
|
|
2841
2917
|
this.getTime = () => scroller.state && ` // time: ${scroller.state.time}`;
|
|
2842
2918
|
this.getStat = () => {
|
|
2843
2919
|
const { buffer, viewport } = scroller;
|
|
2844
2920
|
const first = buffer.getFirstVisibleItem();
|
|
2845
2921
|
const last = buffer.getLastVisibleItem();
|
|
2846
|
-
return 'pos: ' +
|
|
2847
|
-
|
|
2848
|
-
'
|
|
2849
|
-
'
|
|
2850
|
-
|
|
2851
|
-
'
|
|
2852
|
-
'
|
|
2922
|
+
return ('pos: ' +
|
|
2923
|
+
viewport.scrollPosition +
|
|
2924
|
+
', ' +
|
|
2925
|
+
'size: ' +
|
|
2926
|
+
viewport.getScrollableSize() +
|
|
2927
|
+
', ' +
|
|
2928
|
+
'bwd_p: ' +
|
|
2929
|
+
viewport.paddings.backward.size +
|
|
2930
|
+
', ' +
|
|
2931
|
+
'fwd_p: ' +
|
|
2932
|
+
viewport.paddings.forward.size +
|
|
2933
|
+
', ' +
|
|
2934
|
+
'default: ' +
|
|
2935
|
+
(buffer.defaultSize || 'no') +
|
|
2936
|
+
', ' +
|
|
2937
|
+
'items: ' +
|
|
2938
|
+
buffer.getVisibleItemsCount() +
|
|
2939
|
+
', ' +
|
|
2940
|
+
'range: ' +
|
|
2941
|
+
(first && last ? `[${first.$index}..${last.$index}]` : 'no'));
|
|
2853
2942
|
};
|
|
2854
2943
|
this.getFetchRange = () => {
|
|
2855
2944
|
const { first: { index: first }, last: { index: last } } = scroller.state.fetch;
|
|
2856
|
-
return !Number.isNaN(first) && !Number.isNaN(last)
|
|
2857
|
-
? `[${first}..${last}]`
|
|
2858
|
-
: 'no';
|
|
2945
|
+
return !Number.isNaN(first) && !Number.isNaN(last) ? `[${first}..${last}]` : 'no';
|
|
2859
2946
|
};
|
|
2860
2947
|
this.getLoopId = () => scroller.state.cycle.loopId;
|
|
2861
2948
|
this.getLoopIdNext = () => scroller.state.cycle.loopIdNext;
|
|
@@ -2871,7 +2958,7 @@ class Logger {
|
|
|
2871
2958
|
this.log(() => [
|
|
2872
2959
|
str,
|
|
2873
2960
|
stringify
|
|
2874
|
-
? JSON.stringify(obj, (
|
|
2961
|
+
? JSON.stringify(obj, (_, v) => {
|
|
2875
2962
|
if (Number.isNaN(v)) {
|
|
2876
2963
|
return 'NaN';
|
|
2877
2964
|
}
|
|
@@ -2900,24 +2987,32 @@ class Logger {
|
|
|
2900
2987
|
}
|
|
2901
2988
|
stat(str) {
|
|
2902
2989
|
if (this.debug) {
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2990
|
+
if (this.logColor) {
|
|
2991
|
+
const logStyles = [
|
|
2992
|
+
'color: #888; border: dashed #888 0; border-bottom-width: 0px',
|
|
2993
|
+
'color: #000; border-width: 0'
|
|
2994
|
+
];
|
|
2995
|
+
this.log(() => ['%cstat' + (str ? ` ${str}` : '') + ',%c ' + this.getStat(), ...logStyles]);
|
|
2996
|
+
}
|
|
2997
|
+
else {
|
|
2998
|
+
this.log(() => ['stat' + (str ? ` ${str}` : '') + ', ' + this.getStat()]);
|
|
2999
|
+
}
|
|
2908
3000
|
}
|
|
2909
3001
|
}
|
|
2910
3002
|
fetch(str) {
|
|
2911
3003
|
if (this.debug) {
|
|
2912
3004
|
const _text = 'fetch interval' + (str ? ` ${str}` : '');
|
|
2913
|
-
|
|
2914
|
-
|
|
3005
|
+
if (this.logColor) {
|
|
3006
|
+
const logStyles = ['color: #888', 'color: #000'];
|
|
3007
|
+
this.log(() => [`%c${_text}: %c${this.getFetchRange()}`, ...logStyles]);
|
|
3008
|
+
}
|
|
3009
|
+
else {
|
|
3010
|
+
this.log(() => [`${_text}: ${this.getFetchRange()}`]);
|
|
3011
|
+
}
|
|
2915
3012
|
}
|
|
2916
3013
|
}
|
|
2917
3014
|
prepareForLog(data) {
|
|
2918
|
-
return data instanceof Event && data.target
|
|
2919
|
-
? this.getScrollPosition()
|
|
2920
|
-
: data;
|
|
3015
|
+
return data instanceof Event && data.target ? this.getScrollPosition() : data;
|
|
2921
3016
|
}
|
|
2922
3017
|
logProcess(data) {
|
|
2923
3018
|
if (!this.debug) {
|
|
@@ -2927,29 +3022,49 @@ class Logger {
|
|
|
2927
3022
|
// inner loop start-end log
|
|
2928
3023
|
const loopLog = [];
|
|
2929
3024
|
if (process === CommonProcess.init && status === ProcessStatus.next) {
|
|
2930
|
-
|
|
3025
|
+
const loopStart = `---=== loop ${this.getLoopIdNext()} start`;
|
|
3026
|
+
loopLog.push(this.logColor ? `%c${loopStart}` : loopStart);
|
|
2931
3027
|
}
|
|
2932
3028
|
else if (process === CommonProcess.end) {
|
|
2933
|
-
|
|
3029
|
+
const loopDone = `---=== loop ${this.getLoopId()} done`;
|
|
3030
|
+
loopLog.push(this.logColor ? `%c${loopDone}` : loopDone);
|
|
2934
3031
|
const parent = payload && payload.process;
|
|
2935
|
-
if (status === ProcessStatus.next &&
|
|
3032
|
+
if (status === ProcessStatus.next &&
|
|
3033
|
+
parent !== AdapterProcess.reset &&
|
|
3034
|
+
parent !== AdapterProcess.reload) {
|
|
2936
3035
|
loopLog[0] += `, loop ${this.getLoopIdNext()} start`;
|
|
2937
3036
|
}
|
|
2938
3037
|
}
|
|
2939
3038
|
if (loopLog.length) {
|
|
2940
|
-
this.log(() => [...loopLog, 'color: #006600;']);
|
|
3039
|
+
this.log(() => (this.logColor ? [...loopLog, 'color: #006600;'] : loopLog));
|
|
2941
3040
|
}
|
|
2942
3041
|
}
|
|
2943
3042
|
logCycle(start = true) {
|
|
2944
3043
|
const logData = this.getWorkflowCycleData();
|
|
2945
|
-
|
|
2946
|
-
|
|
2947
|
-
|
|
3044
|
+
if (this.logColor) {
|
|
3045
|
+
const border = start ? '1px 0 0 1px' : '0 0 1px 1px';
|
|
3046
|
+
const logStyles = `color: #0000aa; border: solid #555 1px; border-width: ${border}; margin-left: -2px`;
|
|
3047
|
+
this.log(() => [
|
|
3048
|
+
`%c ~~~ WF Cycle ${logData} ${start ? 'STARTED' : 'FINALIZED'} ~~~ `,
|
|
3049
|
+
logStyles
|
|
3050
|
+
]);
|
|
3051
|
+
}
|
|
3052
|
+
else {
|
|
3053
|
+
this.log(() => [` ~~~ WF Cycle ${logData} ${start ? 'STARTED' : 'FINALIZED'} ~~~ `]);
|
|
3054
|
+
}
|
|
2948
3055
|
}
|
|
2949
3056
|
logError(str) {
|
|
2950
3057
|
if (this.debug) {
|
|
2951
|
-
|
|
2952
|
-
|
|
3058
|
+
if (this.logColor) {
|
|
3059
|
+
const logStyles = ['color: #a00;', 'color: #000'];
|
|
3060
|
+
this.log(() => [
|
|
3061
|
+
'error:%c' + (str ? ` ${str}` : '') + `%c (loop ${this.getLoopIdNext()})`,
|
|
3062
|
+
...logStyles
|
|
3063
|
+
]);
|
|
3064
|
+
}
|
|
3065
|
+
else {
|
|
3066
|
+
this.log(() => ['error:' + (str ? ` ${str}` : '') + ` (loop ${this.getLoopIdNext()})`]);
|
|
3067
|
+
}
|
|
2953
3068
|
}
|
|
2954
3069
|
}
|
|
2955
3070
|
log(...args) {
|
|
@@ -2995,6 +3110,9 @@ class Logger {
|
|
|
2995
3110
|
}
|
|
2996
3111
|
}
|
|
2997
3112
|
}
|
|
3113
|
+
getLogs() {
|
|
3114
|
+
return this.logs;
|
|
3115
|
+
}
|
|
2998
3116
|
}
|
|
2999
3117
|
|
|
3000
3118
|
class Routines {
|
|
@@ -3073,17 +3191,18 @@ class Routines {
|
|
|
3073
3191
|
return element.getBoundingClientRect();
|
|
3074
3192
|
}
|
|
3075
3193
|
getWindowParams() {
|
|
3076
|
-
const
|
|
3194
|
+
const height = window.innerHeight;
|
|
3195
|
+
const width = window.innerWidth;
|
|
3077
3196
|
return {
|
|
3078
|
-
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
|
|
3082
|
-
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3086
|
-
|
|
3197
|
+
height: height,
|
|
3198
|
+
width: width,
|
|
3199
|
+
top: 0,
|
|
3200
|
+
bottom: height,
|
|
3201
|
+
left: 0,
|
|
3202
|
+
right: width,
|
|
3203
|
+
x: 0,
|
|
3204
|
+
y: 0,
|
|
3205
|
+
toJSON: () => null
|
|
3087
3206
|
};
|
|
3088
3207
|
}
|
|
3089
3208
|
getSize(element) {
|
|
@@ -3112,14 +3231,14 @@ class Routines {
|
|
|
3112
3231
|
const { horizontal } = this.settings;
|
|
3113
3232
|
const params = this.getElementParams(element);
|
|
3114
3233
|
const isFwd = direction === Direction.forward;
|
|
3115
|
-
return params[isFwd ? (horizontal ? 'right' : 'bottom') :
|
|
3234
|
+
return params[isFwd ? (horizontal ? 'right' : 'bottom') : horizontal ? 'left' : 'top'];
|
|
3116
3235
|
}
|
|
3117
3236
|
getViewportEdge(direction) {
|
|
3118
3237
|
const { window, horizontal } = this.settings;
|
|
3119
3238
|
if (window) {
|
|
3120
3239
|
const params = this.getWindowParams();
|
|
3121
3240
|
const isFwd = direction === Direction.forward;
|
|
3122
|
-
return params[isFwd ? (horizontal ? 'right' : 'bottom') :
|
|
3241
|
+
return params[isFwd ? (horizontal ? 'right' : 'bottom') : horizontal ? 'left' : 'top'];
|
|
3123
3242
|
}
|
|
3124
3243
|
return this.getEdge(this.viewport, direction);
|
|
3125
3244
|
}
|
|
@@ -3141,8 +3260,7 @@ class Routines {
|
|
|
3141
3260
|
this.checkElement(element);
|
|
3142
3261
|
element.scrollIntoView(argument);
|
|
3143
3262
|
}
|
|
3144
|
-
|
|
3145
|
-
render(cb, params) {
|
|
3263
|
+
render(cb, _params) {
|
|
3146
3264
|
const timeoutId = setTimeout(() => cb());
|
|
3147
3265
|
return () => clearTimeout(timeoutId);
|
|
3148
3266
|
}
|
|
@@ -3183,8 +3301,12 @@ class Paddings {
|
|
|
3183
3301
|
}
|
|
3184
3302
|
byDirection(direction, opposite) {
|
|
3185
3303
|
return direction === Direction.backward
|
|
3186
|
-
?
|
|
3187
|
-
|
|
3304
|
+
? opposite
|
|
3305
|
+
? this.forward
|
|
3306
|
+
: this.backward
|
|
3307
|
+
: opposite
|
|
3308
|
+
? this.backward
|
|
3309
|
+
: this.forward;
|
|
3188
3310
|
}
|
|
3189
3311
|
reset(viewportSize, startIndex, offset) {
|
|
3190
3312
|
const positive = this.getPositiveSize(startIndex, viewportSize, offset);
|
|
@@ -3252,7 +3374,9 @@ class Viewport {
|
|
|
3252
3374
|
this.routines.setScrollPosition(value);
|
|
3253
3375
|
const position = this.scrollPosition;
|
|
3254
3376
|
this.logger.log(() => [
|
|
3255
|
-
'setting scroll position at',
|
|
3377
|
+
'setting scroll position at',
|
|
3378
|
+
position,
|
|
3379
|
+
...(position !== value ? [`(${value})`] : [])
|
|
3256
3380
|
]);
|
|
3257
3381
|
return position;
|
|
3258
3382
|
}
|
|
@@ -3291,7 +3415,7 @@ class Viewport {
|
|
|
3291
3415
|
for (let i = bwd ? 0 : items.length - 1; bwd ? i <= items.length - 1 : i >= 0; i += bwd ? 1 : -1) {
|
|
3292
3416
|
const itemEdge = this.routines.getEdge(items[i].element, opposite);
|
|
3293
3417
|
diff = itemEdge - viewportEdge;
|
|
3294
|
-
if (bwd && diff > 0 || !bwd && diff < 0) {
|
|
3418
|
+
if ((bwd && diff > 0) || (!bwd && diff < 0)) {
|
|
3295
3419
|
item = items[i];
|
|
3296
3420
|
break;
|
|
3297
3421
|
}
|
|
@@ -3353,7 +3477,8 @@ class DefaultSize {
|
|
|
3353
3477
|
if (removed.length) {
|
|
3354
3478
|
const removedSize = removed.reduce((acc, item) => acc + item.size, 0);
|
|
3355
3479
|
const averageSize = this.averageSizeFloat || 0;
|
|
3356
|
-
this.averageSizeFloat =
|
|
3480
|
+
this.averageSizeFloat =
|
|
3481
|
+
((cacheSize + removed.length) * averageSize - removedSize) / cacheSize;
|
|
3357
3482
|
}
|
|
3358
3483
|
this.averageSize = Math.round(this.averageSizeFloat);
|
|
3359
3484
|
}
|
|
@@ -3465,7 +3590,7 @@ class Cache {
|
|
|
3465
3590
|
}
|
|
3466
3591
|
getSizeByIndex(index) {
|
|
3467
3592
|
const item = this.get(index);
|
|
3468
|
-
return item && item.size || this.defaultSize.get();
|
|
3593
|
+
return (item && item.size) || this.defaultSize.get();
|
|
3469
3594
|
}
|
|
3470
3595
|
getDefaultSize() {
|
|
3471
3596
|
return this.defaultSize.get();
|
|
@@ -3482,12 +3607,12 @@ class Cache {
|
|
|
3482
3607
|
* Maintains min/max indexes and default item size.
|
|
3483
3608
|
*
|
|
3484
3609
|
* @param {Item<Data>} item A Buffer item to be cached, an objects with { $index, data, size } props.
|
|
3485
|
-
*
|
|
3486
3610
|
* @returns {ItemCache<Data>} Cached item.
|
|
3487
3611
|
*/
|
|
3488
3612
|
add(item) {
|
|
3489
3613
|
let itemCache = this.get(item.$index);
|
|
3490
|
-
if (itemCache) {
|
|
3614
|
+
if (itemCache) {
|
|
3615
|
+
// adding item is already cached
|
|
3491
3616
|
if (this.saveData) {
|
|
3492
3617
|
itemCache.data = item.data;
|
|
3493
3618
|
}
|
|
@@ -3558,7 +3683,8 @@ class Cache {
|
|
|
3558
3683
|
}
|
|
3559
3684
|
set(item);
|
|
3560
3685
|
});
|
|
3561
|
-
if (this.saveData) {
|
|
3686
|
+
if (this.saveData) {
|
|
3687
|
+
// persist data with no sizes
|
|
3562
3688
|
toInsert.forEach((data, i) => {
|
|
3563
3689
|
const $index = index + i - (fixRight ? length : 0) + (direction === Direction.forward ? 1 : 0);
|
|
3564
3690
|
const item = new ItemCache({ $index, data }, this.saveData);
|
|
@@ -3630,19 +3756,21 @@ class Cache {
|
|
|
3630
3756
|
}
|
|
3631
3757
|
const items = new Map();
|
|
3632
3758
|
this.items.forEach(item => {
|
|
3633
|
-
if (item.$index < minB) {
|
|
3759
|
+
if (item.$index < minB) {
|
|
3760
|
+
// items to the left of the subset
|
|
3634
3761
|
item.changeIndex(item.$index + leftDiff);
|
|
3635
3762
|
items.set(item.$index, item);
|
|
3636
3763
|
return;
|
|
3637
3764
|
}
|
|
3638
|
-
else if (item.$index > maxB) {
|
|
3765
|
+
else if (item.$index > maxB) {
|
|
3766
|
+
// items to the right of the subset
|
|
3639
3767
|
item.changeIndex(item.$index + rightDiff);
|
|
3640
3768
|
items.set(item.$index, item);
|
|
3641
3769
|
return;
|
|
3642
3770
|
}
|
|
3643
3771
|
});
|
|
3644
|
-
after.forEach(item
|
|
3645
|
-
|
|
3772
|
+
after.forEach((item // subset items
|
|
3773
|
+
) => items.set(item.$index, new ItemCache(item, this.saveData)));
|
|
3646
3774
|
before // to maintain default size on remove
|
|
3647
3775
|
.filter(item => item.toRemove)
|
|
3648
3776
|
.forEach(item => this.defaultSize.setRemoved(item.size));
|
|
@@ -3690,11 +3818,10 @@ class CheckBufferCall {
|
|
|
3690
3818
|
return true;
|
|
3691
3819
|
}
|
|
3692
3820
|
insertInBuffer(predicate, before, after) {
|
|
3693
|
-
const index = Number.isInteger(before) ? before :
|
|
3694
|
-
const found = this.context.items.find(item => (predicate && predicate(item.get())) ||
|
|
3695
|
-
(Number.isInteger(index) && index === item.$index));
|
|
3821
|
+
const index = Number.isInteger(before) ? before : Number.isInteger(after) ? after : NaN;
|
|
3822
|
+
const found = this.context.items.find(item => (predicate && predicate(item.get())) || (Number.isInteger(index) && index === item.$index));
|
|
3696
3823
|
if (!found) {
|
|
3697
|
-
this.logger.log('no items to insert in buffer; empty predicate
|
|
3824
|
+
this.logger.log('no items to insert in buffer; empty predicate result');
|
|
3698
3825
|
return NaN;
|
|
3699
3826
|
}
|
|
3700
3827
|
return found.$index;
|
|
@@ -3712,7 +3839,7 @@ class CheckBufferCall {
|
|
|
3712
3839
|
}
|
|
3713
3840
|
const before = direction === Direction.backward;
|
|
3714
3841
|
if (!(index < firstIndex + (before ? 1 : 0) || index > lastIndex - (before ? 0 : 1))) {
|
|
3715
|
-
this.logger.log(
|
|
3842
|
+
this.logger.log(`no items to insert virtually; selected index (${index}) belongs Buffer [${firstIndex}..${lastIndex}]`);
|
|
3716
3843
|
return false;
|
|
3717
3844
|
}
|
|
3718
3845
|
this.logger.log(() => `going to insert ${items.length} item(s) virtually`);
|
|
@@ -3784,7 +3911,8 @@ class Buffer {
|
|
|
3784
3911
|
}
|
|
3785
3912
|
set absMinIndex(value) {
|
|
3786
3913
|
if (this._absMinIndex !== value) {
|
|
3787
|
-
this._absMinIndex =
|
|
3914
|
+
this._absMinIndex =
|
|
3915
|
+
Number.isFinite(this._absMaxIndex) && value > this._absMaxIndex ? this._absMaxIndex : value;
|
|
3788
3916
|
}
|
|
3789
3917
|
if (!this.pristine) {
|
|
3790
3918
|
this.checkBOF();
|
|
@@ -3795,7 +3923,8 @@ class Buffer {
|
|
|
3795
3923
|
}
|
|
3796
3924
|
set absMaxIndex(value) {
|
|
3797
3925
|
if (this._absMaxIndex !== value) {
|
|
3798
|
-
this._absMaxIndex =
|
|
3926
|
+
this._absMaxIndex =
|
|
3927
|
+
Number.isFinite(this._absMinIndex) && value < this._absMinIndex ? this._absMinIndex : value;
|
|
3799
3928
|
}
|
|
3800
3929
|
if (!this.pristine) {
|
|
3801
3930
|
this.checkEOF();
|
|
@@ -3807,14 +3936,14 @@ class Buffer {
|
|
|
3807
3936
|
checkBOF() {
|
|
3808
3937
|
// since bof has no setter, need to call checkBOF() on items and absMinIndex change
|
|
3809
3938
|
const bof = this.items.length
|
|
3810
|
-
?
|
|
3939
|
+
? this.items[0].$index === this.absMinIndex
|
|
3811
3940
|
: isFinite(this.absMinIndex);
|
|
3812
3941
|
this.bof.set(bof);
|
|
3813
3942
|
}
|
|
3814
3943
|
checkEOF() {
|
|
3815
3944
|
// since eof has no setter, need to call checkEOF() on items and absMaxIndex change
|
|
3816
3945
|
const eof = this.items.length
|
|
3817
|
-
?
|
|
3946
|
+
? this.items[this.items.length - 1].$index === this.absMaxIndex
|
|
3818
3947
|
: isFinite(this.absMaxIndex);
|
|
3819
3948
|
this.eof.set(eof);
|
|
3820
3949
|
}
|
|
@@ -3908,9 +4037,7 @@ class Buffer {
|
|
|
3908
4037
|
let shifted = false;
|
|
3909
4038
|
for (let i = fixRight ? length - 1 : 0; fixRight ? i >= 0 : i < length; fixRight ? i-- : i++) {
|
|
3910
4039
|
const item = this.items[i];
|
|
3911
|
-
const diff = indexes.reduce((acc, index) => acc + (fixRight
|
|
3912
|
-
? (item.$index < index ? 1 : 0)
|
|
3913
|
-
: (item.$index > index ? -1 : 0)), 0);
|
|
4040
|
+
const diff = indexes.reduce((acc, index) => acc + (fixRight ? (item.$index < index ? 1 : 0) : item.$index > index ? -1 : 0), 0);
|
|
3914
4041
|
shifted = shifted || !!diff;
|
|
3915
4042
|
item.updateIndex(item.$index + diff);
|
|
3916
4043
|
}
|
|
@@ -3926,7 +4053,7 @@ class Buffer {
|
|
|
3926
4053
|
}
|
|
3927
4054
|
const before = Number.isInteger(beforeIndex);
|
|
3928
4055
|
const index = (before ? beforeIndex : afterIndex);
|
|
3929
|
-
const shift =
|
|
4056
|
+
const shift = fixRight ? items.length : before ? 1 : 0;
|
|
3930
4057
|
this.items = items.map((data, i) => generator(index + i + (!before ? 1 : 0) - shift, data));
|
|
3931
4058
|
this._absMinIndex = this.items[0].$index;
|
|
3932
4059
|
this._absMaxIndex = this.items[this.size - 1].$index;
|
|
@@ -3956,7 +4083,7 @@ class Buffer {
|
|
|
3956
4083
|
// if predicate result is falsy or empty array -> delete
|
|
3957
4084
|
if (!result || (Array.isArray(result) && !result.length)) {
|
|
3958
4085
|
item.toRemove = true;
|
|
3959
|
-
trackedIndex += item.$index >= indexToTrack ? (fixRight ? 1 : 0) :
|
|
4086
|
+
trackedIndex += item.$index >= indexToTrack ? (fixRight ? 1 : 0) : fixRight ? 0 : -1;
|
|
3960
4087
|
this.shiftExtremum(-1, fixRight);
|
|
3961
4088
|
continue;
|
|
3962
4089
|
}
|
|
@@ -4045,8 +4172,9 @@ class Buffer {
|
|
|
4045
4172
|
return index >= 0 ? this.items[index] : void 0;
|
|
4046
4173
|
}
|
|
4047
4174
|
getEdgeVisibleItem(direction, opposite) {
|
|
4048
|
-
return direction === (!opposite ? Direction.forward : Direction.backward)
|
|
4049
|
-
this.getLastVisibleItem()
|
|
4175
|
+
return direction === (!opposite ? Direction.forward : Direction.backward)
|
|
4176
|
+
? this.getLastVisibleItem()
|
|
4177
|
+
: this.getFirstVisibleItem();
|
|
4050
4178
|
}
|
|
4051
4179
|
getVisibleItemsCount() {
|
|
4052
4180
|
return this.items.reduce((acc, item) => acc + (item.invisible ? 0 : 1), 0);
|
|
@@ -4193,13 +4321,15 @@ class FetchModel {
|
|
|
4193
4321
|
return !!this.count;
|
|
4194
4322
|
}
|
|
4195
4323
|
get hasNewItems() {
|
|
4196
|
-
return !!(
|
|
4324
|
+
return !!(this._newItemsData && this._newItemsData.length);
|
|
4197
4325
|
}
|
|
4198
4326
|
get index() {
|
|
4199
4327
|
return this.first.index;
|
|
4200
4328
|
}
|
|
4201
4329
|
get count() {
|
|
4202
|
-
return !isNaN(this.first.index) && !isNaN(this.last.index)
|
|
4330
|
+
return !isNaN(this.first.index) && !isNaN(this.last.index)
|
|
4331
|
+
? this.last.index - this.first.index + 1
|
|
4332
|
+
: 0;
|
|
4203
4333
|
}
|
|
4204
4334
|
shouldCheckPreSizeExpectation(lastBufferedIndex) {
|
|
4205
4335
|
if (this.directionPriority === Direction.backward) {
|
|
@@ -4334,10 +4464,12 @@ class State {
|
|
|
4334
4464
|
}
|
|
4335
4465
|
clip.reset(clip.force);
|
|
4336
4466
|
render.reset();
|
|
4337
|
-
return Object.assign({}, (cycle.innerLoop.first
|
|
4338
|
-
|
|
4339
|
-
|
|
4340
|
-
|
|
4467
|
+
return Object.assign({}, (cycle.innerLoop.first
|
|
4468
|
+
? {
|
|
4469
|
+
process: cycle.initiator,
|
|
4470
|
+
doRender: fetch.simulate && fetch.items.length > 0
|
|
4471
|
+
}
|
|
4472
|
+
: {}));
|
|
4341
4473
|
}
|
|
4342
4474
|
endInnerLoop() {
|
|
4343
4475
|
const { fetch, clip, render, cycle } = this;
|
|
@@ -4415,7 +4547,6 @@ class Adapter {
|
|
|
4415
4547
|
this.source = {}; // for Reactive props
|
|
4416
4548
|
this.box = {}; // for Scalars over Reactive props
|
|
4417
4549
|
this.demand = {}; // for Scalars on demand
|
|
4418
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4419
4550
|
this.setFirstOrLastVisible = (_) => { };
|
|
4420
4551
|
this.getWorkflow = getWorkflow;
|
|
4421
4552
|
this.logger = logger;
|
|
@@ -4424,7 +4555,7 @@ class Adapter {
|
|
|
4424
4555
|
this.reloadCounter = 0;
|
|
4425
4556
|
const contextId = (context === null || context === void 0 ? void 0 : context.id) || -1;
|
|
4426
4557
|
// public context (if exists) should provide access to Reactive props config by id
|
|
4427
|
-
const reactivePropsStore = context && reactiveConfigStorage.get(context.id) || {};
|
|
4558
|
+
const reactivePropsStore = (context && reactiveConfigStorage.get(context.id)) || {};
|
|
4428
4559
|
// the Adapter initialization should not trigger "wanted" props setting;
|
|
4429
4560
|
// after the initialization is completed, "wanted" functionality must be unblocked
|
|
4430
4561
|
wantedUtils.setBlock(true, contextId);
|
|
@@ -4439,7 +4570,7 @@ class Adapter {
|
|
|
4439
4570
|
value = reactiveProp.default; // boolean doesn't matter here
|
|
4440
4571
|
}
|
|
4441
4572
|
}
|
|
4442
|
-
return
|
|
4573
|
+
return Object.assign(Object.assign({}, prop), { value });
|
|
4443
4574
|
})
|
|
4444
4575
|
: getDefaultAdapterProps();
|
|
4445
4576
|
// restore default reactive props if they were configured
|
|
@@ -4471,10 +4602,12 @@ class Adapter {
|
|
|
4471
4602
|
// so this method should be called when accessing the "wanted" props through one of the following getters
|
|
4472
4603
|
const processWanted = (prop) => {
|
|
4473
4604
|
if (wantedUtils.setBox(prop, contextId)) {
|
|
4474
|
-
|
|
4605
|
+
const firstPropList = [AdapterPropName.firstVisible, AdapterPropName.firstVisible$];
|
|
4606
|
+
const lastPropList = [AdapterPropName.lastVisible, AdapterPropName.lastVisible$];
|
|
4607
|
+
if (firstPropList.some(n => n === prop.name)) {
|
|
4475
4608
|
this.setFirstOrLastVisible({ first: true });
|
|
4476
4609
|
}
|
|
4477
|
-
else if (
|
|
4610
|
+
else if (lastPropList.some(n => n === prop.name)) {
|
|
4478
4611
|
this.setFirstOrLastVisible({ last: true });
|
|
4479
4612
|
}
|
|
4480
4613
|
}
|
|
@@ -4523,8 +4656,7 @@ class Adapter {
|
|
|
4523
4656
|
return;
|
|
4524
4657
|
}
|
|
4525
4658
|
// Adapter public context augmentation
|
|
4526
|
-
adapterProps
|
|
4527
|
-
.forEach((prop) => {
|
|
4659
|
+
adapterProps.forEach((prop) => {
|
|
4528
4660
|
const { name, type, permanent } = prop;
|
|
4529
4661
|
let value = this[name];
|
|
4530
4662
|
if (type === AdapterPropType.Function) {
|
|
@@ -4567,23 +4699,23 @@ class Adapter {
|
|
|
4567
4699
|
maxIndex: buffer.maxIndex,
|
|
4568
4700
|
absMinIndex: buffer.absMinIndex,
|
|
4569
4701
|
absMaxIndex: buffer.absMaxIndex,
|
|
4570
|
-
defaultSize: buffer.defaultSize
|
|
4702
|
+
defaultSize: buffer.defaultSize
|
|
4571
4703
|
})
|
|
4572
4704
|
});
|
|
4573
4705
|
this.bof = buffer.bof.get();
|
|
4574
|
-
buffer.bof.on(bof => this.bof = bof);
|
|
4706
|
+
buffer.bof.on(bof => (this.bof = bof));
|
|
4575
4707
|
this.eof = buffer.eof.get();
|
|
4576
|
-
buffer.eof.on(eof => this.eof = eof);
|
|
4708
|
+
buffer.eof.on(eof => (this.eof = eof));
|
|
4577
4709
|
// state
|
|
4578
4710
|
Object.defineProperty(this.demand, AdapterPropName.packageInfo, {
|
|
4579
4711
|
get: () => state.packageInfo
|
|
4580
4712
|
});
|
|
4581
4713
|
this.loopPending = state.cycle.innerLoop.busy.get();
|
|
4582
|
-
state.cycle.innerLoop.busy.on(busy => this.loopPending = busy);
|
|
4714
|
+
state.cycle.innerLoop.busy.on(busy => (this.loopPending = busy));
|
|
4583
4715
|
this.isLoading = state.cycle.busy.get();
|
|
4584
|
-
state.cycle.busy.on(busy => this.isLoading = busy);
|
|
4716
|
+
state.cycle.busy.on(busy => (this.isLoading = busy));
|
|
4585
4717
|
this.paused = state.paused.get();
|
|
4586
|
-
state.paused.on(paused => this.paused = paused);
|
|
4718
|
+
state.paused.on(paused => (this.paused = paused));
|
|
4587
4719
|
//viewport
|
|
4588
4720
|
this.setFirstOrLastVisible = ({ first, last, workflow }) => {
|
|
4589
4721
|
var _a, _b, _c;
|
|
@@ -4654,8 +4786,7 @@ class Adapter {
|
|
|
4654
4786
|
resetContext() {
|
|
4655
4787
|
var _a;
|
|
4656
4788
|
const reactiveStore = reactiveConfigStorage.get((_a = this.externalContext) === null || _a === void 0 ? void 0 : _a.id);
|
|
4657
|
-
ADAPTER_PROPS_STUB
|
|
4658
|
-
.forEach(({ type, permanent, name, value }) => {
|
|
4789
|
+
ADAPTER_PROPS_STUB.forEach(({ type, permanent, name, value }) => {
|
|
4659
4790
|
// assign initial values to non-reactive non-permanent props
|
|
4660
4791
|
if (type !== AdapterPropType.Reactive && !permanent) {
|
|
4661
4792
|
Object.defineProperty(this.externalContext, name, {
|
|
@@ -4831,12 +4962,12 @@ class Adapter {
|
|
|
4831
4962
|
if (!this.init) {
|
|
4832
4963
|
return Promise.resolve(methodPreResult);
|
|
4833
4964
|
}
|
|
4834
|
-
return this.relaxRun = this.relaxRun
|
|
4965
|
+
return (this.relaxRun = this.relaxRun
|
|
4835
4966
|
? this.relaxRun.then(() => this.relaxUnchained(callback, reloadId))
|
|
4836
|
-
: this.relaxUnchained(callback, reloadId).then(
|
|
4967
|
+
: this.relaxUnchained(callback, reloadId).then(result => {
|
|
4837
4968
|
this.relaxRun = null;
|
|
4838
4969
|
return result;
|
|
4839
|
-
});
|
|
4970
|
+
}));
|
|
4840
4971
|
}
|
|
4841
4972
|
showLog() {
|
|
4842
4973
|
this.logger.logAdapterMethod('showLog');
|
|
@@ -4848,7 +4979,7 @@ const INVALID_DATASOURCE_PREFIX = 'Invalid datasource:';
|
|
|
4848
4979
|
let instanceCount = 0;
|
|
4849
4980
|
class Scroller {
|
|
4850
4981
|
constructor({ datasource, consumer, element, workflow, Routines: CustomRoutines, scroller }) {
|
|
4851
|
-
const {
|
|
4982
|
+
const { get } = validate(datasource, DATASOURCE).params;
|
|
4852
4983
|
if (!get.isValid) {
|
|
4853
4984
|
throw new Error(`${INVALID_DATASOURCE_PREFIX} ${get.errors[0]}`);
|
|
4854
4985
|
}
|
|
@@ -4862,7 +4993,8 @@ class Scroller {
|
|
|
4862
4993
|
}
|
|
4863
4994
|
Object.getOwnPropertyNames(CustomRoutines.prototype)
|
|
4864
4995
|
.filter(method => method !== 'constructor')
|
|
4865
|
-
.forEach(method => __Routines.prototype[method] =
|
|
4996
|
+
.forEach(method => (__Routines.prototype[method] =
|
|
4997
|
+
CustomRoutines === null || CustomRoutines === void 0 ? void 0 : CustomRoutines.prototype[method]));
|
|
4866
4998
|
CustomRoutines = __Routines;
|
|
4867
4999
|
}
|
|
4868
5000
|
this.workflow = workflow;
|
|
@@ -4876,7 +5008,8 @@ class Scroller {
|
|
|
4876
5008
|
this.initDatasource(datasource, scroller);
|
|
4877
5009
|
}
|
|
4878
5010
|
initDatasource(datasource, scroller) {
|
|
4879
|
-
if (scroller) {
|
|
5011
|
+
if (scroller) {
|
|
5012
|
+
// scroller re-instantiating case
|
|
4880
5013
|
this.datasource = datasource;
|
|
4881
5014
|
this.adapter = scroller.adapter;
|
|
4882
5015
|
// todo: what about (this.settings.adapter !== scroller.setting.adapter) case?
|
|
@@ -4885,10 +5018,12 @@ class Scroller {
|
|
|
4885
5018
|
// scroller is being instantiated for the first time
|
|
4886
5019
|
const constructed = datasource instanceof DatasourceGeneric;
|
|
4887
5020
|
const mockAdapter = !constructed && !this.settings.adapter;
|
|
4888
|
-
if (constructed) {
|
|
5021
|
+
if (constructed) {
|
|
5022
|
+
// datasource is already instantiated
|
|
4889
5023
|
this.datasource = datasource;
|
|
4890
5024
|
}
|
|
4891
|
-
else {
|
|
5025
|
+
else {
|
|
5026
|
+
// datasource as POJO
|
|
4892
5027
|
const DS = makeDatasource(() => ({ mock: mockAdapter }));
|
|
4893
5028
|
this.datasource = new DS(datasource);
|
|
4894
5029
|
if (this.settings.adapter) {
|
|
@@ -4905,20 +5040,21 @@ class Scroller {
|
|
|
4905
5040
|
buffer: this.buffer,
|
|
4906
5041
|
state: this.state,
|
|
4907
5042
|
viewport: this.viewport,
|
|
4908
|
-
logger: this.logger,
|
|
5043
|
+
logger: this.logger,
|
|
5044
|
+
adapterRun$,
|
|
4909
5045
|
getWorkflow: () => this.workflow
|
|
4910
5046
|
});
|
|
4911
5047
|
}
|
|
4912
5048
|
dispose(forever) {
|
|
4913
5049
|
this.logger.log(() => 'disposing scroller' + (forever ? ' (forever)' : ''));
|
|
4914
|
-
if (forever) {
|
|
5050
|
+
if (forever) {
|
|
5051
|
+
// Adapter is not re-instantiated on reset
|
|
4915
5052
|
this.adapter.dispose();
|
|
4916
5053
|
}
|
|
4917
5054
|
this.buffer.dispose();
|
|
4918
5055
|
this.state.dispose();
|
|
4919
5056
|
}
|
|
4920
|
-
finalize() {
|
|
4921
|
-
}
|
|
5057
|
+
finalize() { }
|
|
4922
5058
|
}
|
|
4923
5059
|
|
|
4924
5060
|
const runStateMachine = ({ input: { process, status, payload = {} }, methods: { run, interrupt, done, onError } }) => {
|
|
@@ -4932,7 +5068,8 @@ const runStateMachine = ({ input: { process, status, payload = {} }, methods: {
|
|
|
4932
5068
|
const { options } = payload;
|
|
4933
5069
|
switch (process) {
|
|
4934
5070
|
case CommonProcess.init:
|
|
4935
|
-
if (status === ProcessStatus.start) {
|
|
5071
|
+
if (status === ProcessStatus.start) {
|
|
5072
|
+
// App start
|
|
4936
5073
|
run(Init)(process);
|
|
4937
5074
|
}
|
|
4938
5075
|
if (status === ProcessStatus.next) {
|
|
@@ -5151,6 +5288,7 @@ class Workflow {
|
|
|
5151
5288
|
this.initTimer = null;
|
|
5152
5289
|
this.adapterRun$ = new Reactive();
|
|
5153
5290
|
this.cyclesDone = 0;
|
|
5291
|
+
this.cyclesDone$ = new Reactive(0);
|
|
5154
5292
|
this.interruptionCount = 0;
|
|
5155
5293
|
this.errors = [];
|
|
5156
5294
|
this.offScroll = () => null;
|
|
@@ -5162,7 +5300,11 @@ class Workflow {
|
|
|
5162
5300
|
onError: this.onError.bind(this)
|
|
5163
5301
|
};
|
|
5164
5302
|
this.scroller = new Scroller({
|
|
5165
|
-
element,
|
|
5303
|
+
element,
|
|
5304
|
+
datasource,
|
|
5305
|
+
consumer,
|
|
5306
|
+
workflow: this.getUpdater(),
|
|
5307
|
+
Routines
|
|
5166
5308
|
});
|
|
5167
5309
|
if (this.scroller.settings.initializeDelay) {
|
|
5168
5310
|
this.initTimer = setTimeout(() => {
|
|
@@ -5214,16 +5356,18 @@ class Workflow {
|
|
|
5214
5356
|
getUpdater() {
|
|
5215
5357
|
return {
|
|
5216
5358
|
call: this.callWorkflow.bind(this),
|
|
5217
|
-
onDataChanged: this.changeItems.bind(this)
|
|
5359
|
+
onDataChanged: this.changeItems.bind(this)
|
|
5218
5360
|
};
|
|
5219
5361
|
}
|
|
5220
5362
|
process(data) {
|
|
5221
5363
|
const { status, process, payload } = data;
|
|
5222
5364
|
if (this.scroller.settings.logProcessRun) {
|
|
5223
|
-
this.scroller.logger.log(() =>
|
|
5224
|
-
|
|
5225
|
-
|
|
5226
|
-
|
|
5365
|
+
this.scroller.logger.log(() => {
|
|
5366
|
+
const _fire = this.scroller.settings.logColor
|
|
5367
|
+
? ['%cfire%c', 'color: #cc7777;', 'color: #000000;']
|
|
5368
|
+
: ['fire'];
|
|
5369
|
+
return [..._fire, process, `"${status}"`, ...(payload !== void 0 ? [payload] : [])];
|
|
5370
|
+
});
|
|
5227
5371
|
}
|
|
5228
5372
|
this.scroller.logger.logProcess(data);
|
|
5229
5373
|
if (process === CommonProcess.end) {
|
|
@@ -5237,16 +5381,18 @@ class Workflow {
|
|
|
5237
5381
|
runProcess() {
|
|
5238
5382
|
return ({ run, process, name }) => (...args) => {
|
|
5239
5383
|
if (this.scroller.settings.logProcessRun) {
|
|
5240
|
-
this.scroller.logger.log(() =>
|
|
5241
|
-
|
|
5242
|
-
|
|
5243
|
-
|
|
5384
|
+
this.scroller.logger.log(() => {
|
|
5385
|
+
const _run = this.scroller.settings.logColor
|
|
5386
|
+
? ['%crun%c', 'color: #333399;', 'color: #000000;']
|
|
5387
|
+
: ['run'];
|
|
5388
|
+
return [..._run, process || name, ...args];
|
|
5389
|
+
});
|
|
5244
5390
|
}
|
|
5245
5391
|
run(this.scroller, ...args);
|
|
5246
5392
|
};
|
|
5247
5393
|
}
|
|
5248
5394
|
onError(process, payload) {
|
|
5249
|
-
const message = payload && String(payload.error) || '';
|
|
5395
|
+
const message = (payload && String(payload.error)) || '';
|
|
5250
5396
|
const { time, cycle } = this.scroller.state;
|
|
5251
5397
|
this.errors.push({
|
|
5252
5398
|
process,
|
|
@@ -5261,14 +5407,14 @@ class Workflow {
|
|
|
5261
5407
|
const { workflow, logger } = this.scroller;
|
|
5262
5408
|
// we are going to create a new reference for the scroller.workflow object
|
|
5263
5409
|
// calling the old version of the scroller.workflow by any outstanding async processes will be skipped
|
|
5264
|
-
workflow.call = (_) =>
|
|
5265
|
-
logger.log('[skip wf call]');
|
|
5410
|
+
workflow.call = (_) => logger.log('[skip wf call]');
|
|
5266
5411
|
workflow.call.interrupted = true;
|
|
5267
5412
|
this.scroller.workflow = this.getUpdater();
|
|
5268
5413
|
this.interruptionCount++;
|
|
5269
5414
|
logger.log(() => `workflow had been interrupted by the ${process} process (${this.interruptionCount})`);
|
|
5270
5415
|
}
|
|
5271
|
-
if (datasource) {
|
|
5416
|
+
if (datasource) {
|
|
5417
|
+
// Scroller re-initialization case
|
|
5272
5418
|
const reInit = () => {
|
|
5273
5419
|
this.scroller.logger.log('new Scroller instantiation');
|
|
5274
5420
|
const scroller = new Scroller({ datasource, scroller: this.scroller });
|
|
@@ -5288,6 +5434,7 @@ class Workflow {
|
|
|
5288
5434
|
done() {
|
|
5289
5435
|
const { state, logger } = this.scroller;
|
|
5290
5436
|
this.cyclesDone++;
|
|
5437
|
+
this.cyclesDone$.set(this.cyclesDone);
|
|
5291
5438
|
logger.logCycle(false);
|
|
5292
5439
|
state.endWorkflowCycle(this.cyclesDone + 1);
|
|
5293
5440
|
this.finalize();
|
|
@@ -5299,14 +5446,15 @@ class Workflow {
|
|
|
5299
5446
|
}
|
|
5300
5447
|
this.offScroll();
|
|
5301
5448
|
this.adapterRun$.dispose();
|
|
5449
|
+
this.cyclesDone$.dispose();
|
|
5302
5450
|
this.scroller.dispose(true);
|
|
5303
5451
|
Object.getOwnPropertyNames(this).forEach(prop => {
|
|
5304
5452
|
delete this[prop];
|
|
5305
5453
|
});
|
|
5454
|
+
this.isInitialized = false;
|
|
5306
5455
|
this.disposed = true;
|
|
5307
5456
|
}
|
|
5308
|
-
finalize() {
|
|
5309
|
-
}
|
|
5457
|
+
finalize() { }
|
|
5310
5458
|
}
|
|
5311
5459
|
|
|
5312
5460
|
export { AdapterPropName, Direction, EMPTY_ITEM, INVALID_DATASOURCE_PREFIX, Routines, SizeStrategy, Workflow, getDefaultAdapterProps, makeDatasource, core as packageInfo };
|