vscroll 1.4.2 → 1.4.3

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.
Files changed (77) hide show
  1. package/dist/bundles/vscroll.esm5.js +187 -146
  2. package/dist/bundles/vscroll.esm5.js.map +1 -1
  3. package/dist/bundles/vscroll.esm5.min.js +2 -2
  4. package/dist/bundles/vscroll.esm5.min.js.map +1 -1
  5. package/dist/bundles/vscroll.esm6.js +173 -132
  6. package/dist/bundles/vscroll.esm6.js.map +1 -1
  7. package/dist/bundles/vscroll.esm6.min.js +2 -2
  8. package/dist/bundles/vscroll.esm6.min.js.map +1 -1
  9. package/dist/bundles/vscroll.umd.js +188 -147
  10. package/dist/bundles/vscroll.umd.js.map +1 -1
  11. package/dist/bundles/vscroll.umd.min.js +2 -2
  12. package/dist/bundles/vscroll.umd.min.js.map +1 -1
  13. package/dist/esm2015/classes/state/cycle.js +7 -6
  14. package/dist/esm2015/classes/state/cycle.js.map +1 -1
  15. package/dist/esm2015/classes/state/scroll.js +1 -1
  16. package/dist/esm2015/classes/state/scroll.js.map +1 -1
  17. package/dist/esm2015/classes/state.js +23 -15
  18. package/dist/esm2015/classes/state.js.map +1 -1
  19. package/dist/esm2015/classes/viewport.js +4 -1
  20. package/dist/esm2015/classes/viewport.js.map +1 -1
  21. package/dist/esm2015/interfaces/index.js.map +1 -1
  22. package/dist/esm2015/interfaces/state.js.map +1 -1
  23. package/dist/esm2015/processes/adapter/reload.js +1 -1
  24. package/dist/esm2015/processes/adapter/reload.js.map +1 -1
  25. package/dist/esm2015/processes/adjust.js +44 -16
  26. package/dist/esm2015/processes/adjust.js.map +1 -1
  27. package/dist/esm2015/processes/end.js +18 -16
  28. package/dist/esm2015/processes/end.js.map +1 -1
  29. package/dist/esm2015/processes/fetch.js +3 -3
  30. package/dist/esm2015/processes/fetch.js.map +1 -1
  31. package/dist/esm2015/processes/init.js +2 -2
  32. package/dist/esm2015/processes/init.js.map +1 -1
  33. package/dist/esm2015/processes/render.js +3 -3
  34. package/dist/esm2015/processes/render.js.map +1 -1
  35. package/dist/esm2015/processes/scroll.js +21 -21
  36. package/dist/esm2015/processes/scroll.js.map +1 -1
  37. package/dist/esm2015/version.js +1 -1
  38. package/dist/esm2015/version.js.map +1 -1
  39. package/dist/esm2015/workflow.js +1 -1
  40. package/dist/esm2015/workflow.js.map +1 -1
  41. package/dist/esm5/classes/state/cycle.js +7 -6
  42. package/dist/esm5/classes/state/cycle.js.map +1 -1
  43. package/dist/esm5/classes/state/scroll.js +7 -7
  44. package/dist/esm5/classes/state/scroll.js.map +1 -1
  45. package/dist/esm5/classes/state.js +23 -15
  46. package/dist/esm5/classes/state.js.map +1 -1
  47. package/dist/esm5/classes/viewport.js +4 -1
  48. package/dist/esm5/classes/viewport.js.map +1 -1
  49. package/dist/esm5/interfaces/index.js.map +1 -1
  50. package/dist/esm5/interfaces/state.js.map +1 -1
  51. package/dist/esm5/processes/adapter/reload.js +1 -1
  52. package/dist/esm5/processes/adapter/reload.js.map +1 -1
  53. package/dist/esm5/processes/adjust.js +44 -16
  54. package/dist/esm5/processes/adjust.js.map +1 -1
  55. package/dist/esm5/processes/end.js +18 -16
  56. package/dist/esm5/processes/end.js.map +1 -1
  57. package/dist/esm5/processes/fetch.js +3 -3
  58. package/dist/esm5/processes/fetch.js.map +1 -1
  59. package/dist/esm5/processes/init.js +2 -2
  60. package/dist/esm5/processes/init.js.map +1 -1
  61. package/dist/esm5/processes/render.js +3 -3
  62. package/dist/esm5/processes/render.js.map +1 -1
  63. package/dist/esm5/processes/scroll.js +21 -21
  64. package/dist/esm5/processes/scroll.js.map +1 -1
  65. package/dist/esm5/version.js +1 -1
  66. package/dist/esm5/version.js.map +1 -1
  67. package/dist/esm5/workflow.js +1 -1
  68. package/dist/esm5/workflow.js.map +1 -1
  69. package/dist/typings/classes/state/cycle.d.ts +1 -1
  70. package/dist/typings/classes/state/scroll.d.ts +2 -2
  71. package/dist/typings/classes/state.d.ts +6 -3
  72. package/dist/typings/classes/viewport.d.ts +1 -0
  73. package/dist/typings/interfaces/index.d.ts +2 -2
  74. package/dist/typings/interfaces/state.d.ts +2 -15
  75. package/dist/typings/processes/adjust.d.ts +1 -0
  76. package/dist/typings/processes/end.d.ts +1 -2
  77. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * vscroll (https://github.com/dhilt/vscroll) UMD
3
- * Version: 1.4.2 (2021-11-15T04:26:47.079Z)
3
+ * Version: 1.4.3 (2021-11-30T02:54:04.845Z)
4
4
  * Author: Denis Hilt
5
5
  * License: MIT
6
6
  */
@@ -94,7 +94,7 @@
94
94
 
95
95
  /**
96
96
  * vscroll (https://github.com/dhilt/vscroll) FESM5
97
- * Version: 1.4.2 (2021-11-15T04:26:41.052Z)
97
+ * Version: 1.4.3 (2021-11-30T02:54:00.541Z)
98
98
  * Author: Denis Hilt
99
99
  * License: MIT
100
100
  */
@@ -435,7 +435,7 @@
435
435
 
436
436
  var core = {
437
437
  name: 'vscroll',
438
- version: '1.4.2'
438
+ version: '1.4.3'
439
439
  };
440
440
 
441
441
  var instanceCount$1 = 0;
@@ -1442,10 +1442,10 @@
1442
1442
  return _super !== null && _super.apply(this, arguments) || this;
1443
1443
  }
1444
1444
  Init.run = function (scroller, process) {
1445
- var cycle = scroller.state.cycle, workflow = scroller.workflow;
1445
+ var state = scroller.state, workflow = scroller.workflow;
1446
1446
  var isInitial = initProcesses.includes(process);
1447
1447
  scroller.logger.logCycle(true);
1448
- cycle.start(isInitial, process);
1448
+ state.startWorkflowCycle(isInitial, process);
1449
1449
  workflow.call({
1450
1450
  process: Init.process,
1451
1451
  status: ProcessStatus.next
@@ -1471,16 +1471,16 @@
1471
1471
  });
1472
1472
  };
1473
1473
  Scroll.onSynthetic = function (scroller, position) {
1474
- var scrollState = scroller.state.scrollState;
1475
- var synthPos = scrollState.syntheticPosition;
1474
+ var scroll = scroller.state.scroll;
1475
+ var synthPos = scroll.syntheticPosition;
1476
1476
  if (synthPos !== null) {
1477
- if (scrollState.syntheticFulfill) {
1478
- scrollState.syntheticPosition = null;
1477
+ if (scroll.syntheticFulfill) {
1478
+ scroll.syntheticPosition = null;
1479
1479
  }
1480
- if (!scrollState.syntheticFulfill || synthPos === position) {
1480
+ if (!scroll.syntheticFulfill || synthPos === position) {
1481
1481
  scroller.logger.log(function () { return [
1482
1482
  'skipping scroll', position,
1483
- "[" + (scrollState.syntheticFulfill ? '' : 'pre-') + "synthetic]"
1483
+ "[" + (scroll.syntheticFulfill ? '' : 'pre-') + "synthetic]"
1484
1484
  ]; });
1485
1485
  return true;
1486
1486
  }
@@ -1491,13 +1491,13 @@
1491
1491
  return false;
1492
1492
  };
1493
1493
  Scroll.onThrottle = function (scroller, position, done) {
1494
- var scrollState = scroller.state.scrollState, throttle = scroller.settings.throttle, logger = scroller.logger;
1495
- scrollState.current = Scroll.getScrollEvent(position, scrollState.previous);
1496
- var _a = scrollState.current, direction = _a.direction, time = _a.time;
1497
- var timeDiff = scrollState.previous ? time - scrollState.previous.time : Infinity;
1494
+ var scroll = scroller.state.scroll, throttle = scroller.settings.throttle, logger = scroller.logger;
1495
+ scroll.current = Scroll.getScrollEvent(position, scroll.previous);
1496
+ var _a = scroll.current, direction = _a.direction, time = _a.time;
1497
+ var timeDiff = scroll.previous ? time - scroll.previous.time : Infinity;
1498
1498
  var delta = throttle - timeDiff;
1499
1499
  var shouldDelay = isFinite(delta) && delta > 0;
1500
- var alreadyDelayed = !!scrollState.scrollTimer;
1500
+ var alreadyDelayed = !!scroll.scrollTimer;
1501
1501
  logger.log(function () { return [
1502
1502
  direction === exports.Direction.backward ? '\u2934' : '\u2935',
1503
1503
  position,
@@ -1505,17 +1505,17 @@
1505
1505
  shouldDelay ? (alreadyDelayed ? 'delayed' : "/ " + delta + "ms delay") : ''
1506
1506
  ]; });
1507
1507
  if (!shouldDelay) {
1508
- if (scrollState.scrollTimer) {
1509
- clearTimeout(scrollState.scrollTimer);
1510
- scrollState.scrollTimer = null;
1508
+ if (scroll.scrollTimer) {
1509
+ clearTimeout(scroll.scrollTimer);
1510
+ scroll.scrollTimer = null;
1511
1511
  }
1512
1512
  done();
1513
1513
  return;
1514
1514
  }
1515
1515
  if (!alreadyDelayed) {
1516
- scrollState.scrollTimer = setTimeout(function () {
1516
+ scroll.scrollTimer = setTimeout(function () {
1517
1517
  logger.log(function () {
1518
- var curr = Scroll.getScrollEvent(scroller.viewport.scrollPosition, scrollState.current);
1518
+ var curr = Scroll.getScrollEvent(scroller.viewport.scrollPosition, scroll.current);
1519
1519
  return [
1520
1520
  curr.direction === exports.Direction.backward ? '\u2934' : '\u2935',
1521
1521
  curr.position,
@@ -1524,7 +1524,7 @@
1524
1524
  position
1525
1525
  ];
1526
1526
  });
1527
- scrollState.scrollTimer = null;
1527
+ scroll.scrollTimer = null;
1528
1528
  done();
1529
1529
  }, delta);
1530
1530
  }
@@ -1543,11 +1543,11 @@
1543
1543
  return { position: position, direction: direction, time: time };
1544
1544
  };
1545
1545
  Scroll.onScroll = function (scroller, workflow) {
1546
- var _a = scroller.state, scrollState = _a.scrollState, cycle = _a.cycle;
1547
- scrollState.previous = __assign({}, scrollState.current);
1548
- scrollState.current = null;
1546
+ var _a = scroller.state, scroll = _a.scroll, cycle = _a.cycle;
1547
+ scroll.previous = __assign({}, scroll.current);
1548
+ scroll.current = null;
1549
1549
  if (cycle.busy.get()) {
1550
- scroller.logger.log(function () { return ['skipping scroll', scrollState.previous.position, '[pending]']; });
1550
+ scroller.logger.log(function () { return ['skipping scroll', scroll.previous.position, '[pending]']; });
1551
1551
  return;
1552
1552
  }
1553
1553
  workflow.call({
@@ -1608,7 +1608,7 @@
1608
1608
  viewport.reset(buffer.startIndex);
1609
1609
  var payload = {};
1610
1610
  if (state.cycle.busy.get()) {
1611
- state.scrollState.stop();
1611
+ state.scroll.stop();
1612
1612
  payload.finalize = true;
1613
1613
  state.cycle.interrupter = Reload.process;
1614
1614
  }
@@ -2463,9 +2463,9 @@
2463
2463
  }
2464
2464
  }
2465
2465
  else {
2466
- var _b = scroller.state, scrollState = _b.scrollState, fetch_1 = _b.fetch, viewport = scroller.viewport;
2467
- if (scrollState.positionBeforeAsync === null) {
2468
- scrollState.positionBeforeAsync = viewport.scrollPosition;
2466
+ var _b = scroller.state, scroll_1 = _b.scroll, fetch_1 = _b.fetch, viewport = scroller.viewport;
2467
+ if (scroll_1.positionBeforeAsync === null) {
2468
+ scroll_1.positionBeforeAsync = viewport.scrollPosition;
2469
2469
  }
2470
2470
  fetch_1.cancel = function () {
2471
2471
  box.success = function () { return null; };
@@ -2597,10 +2597,10 @@
2597
2597
  return _super !== null && _super.apply(this, arguments) || this;
2598
2598
  }
2599
2599
  Render.run = function (scroller) {
2600
- var workflow = scroller.workflow, _a = scroller.state, cycle = _a.cycle, render = _a.render, scrollState = _a.scrollState, viewport = scroller.viewport, routines = scroller.routines;
2600
+ var workflow = scroller.workflow, _a = scroller.state, cycle = _a.cycle, render = _a.render, scroll = _a.scroll, viewport = scroller.viewport, routines = scroller.routines;
2601
2601
  scroller.logger.stat('before new items render');
2602
- if (scrollState.positionBeforeAsync === null) {
2603
- scrollState.positionBeforeAsync = viewport.scrollPosition;
2602
+ if (scroll.positionBeforeAsync === null) {
2603
+ scroll.positionBeforeAsync = viewport.scrollPosition;
2604
2604
  }
2605
2605
  render.cancel = routines.render(function () {
2606
2606
  render.cancel = null;
@@ -2652,18 +2652,92 @@
2652
2652
  return Render;
2653
2653
  }(BaseProcessFactory(CommonProcess.render)));
2654
2654
 
2655
+ var isInterrupted = function (_a) {
2656
+ var call = _a.call;
2657
+ return !!call.interrupted;
2658
+ };
2659
+ var End = /** @class */ (function (_super) {
2660
+ __extends(End, _super);
2661
+ function End() {
2662
+ return _super !== null && _super.apply(this, arguments) || this;
2663
+ }
2664
+ End.run = function (scroller, _a) {
2665
+ var _b = _a === void 0 ? {} : _a, error = _b.error;
2666
+ var workflow = scroller.workflow, interrupter = scroller.state.cycle.interrupter;
2667
+ if (!error && !interrupter) {
2668
+ // set out params accessible via Adapter
2669
+ End.calculateParams(scroller, workflow);
2670
+ }
2671
+ // explicit interruption for we don't want to go through the inner loop finalizing
2672
+ if (isInterrupted(workflow)) {
2673
+ workflow.call({ process: End.process, status: ProcessStatus.done });
2674
+ return;
2675
+ }
2676
+ var next = End.shouldContinueRun(scroller, error);
2677
+ scroller.state.endInnerLoop();
2678
+ workflow.call({
2679
+ process: End.process,
2680
+ status: next ? ProcessStatus.next : ProcessStatus.done,
2681
+ payload: __assign({}, (interrupter ? { process: interrupter } : {}))
2682
+ });
2683
+ };
2684
+ End.calculateParams = function (scroller, workflow) {
2685
+ var adapter = scroller.adapter, viewport = scroller.viewport, items = scroller.buffer.items;
2686
+ if (adapter.wanted.firstVisible) {
2687
+ var item = viewport.getEdgeVisibleItem(items, exports.Direction.backward).item;
2688
+ if (!item || item.element !== adapter.firstVisible.element) {
2689
+ adapter.firstVisible = item ? item.get() : EMPTY_ITEM;
2690
+ }
2691
+ }
2692
+ // the workflow can be interrupter on firstVisible change
2693
+ if (adapter.wanted.lastVisible && !isInterrupted(workflow)) {
2694
+ var item = viewport.getEdgeVisibleItem(items, exports.Direction.forward).item;
2695
+ if (!item || item.element !== adapter.lastVisible.element) {
2696
+ adapter.lastVisible = item ? item.get() : EMPTY_ITEM;
2697
+ }
2698
+ }
2699
+ };
2700
+ End.shouldContinueRun = function (scroller, error) {
2701
+ var _a = scroller.state, cycle = _a.cycle, fetch = _a.fetch, render = _a.render;
2702
+ // Adapter.reload or Adapter.reset
2703
+ if (cycle.interrupter) {
2704
+ return true;
2705
+ }
2706
+ // critical error
2707
+ if (error) {
2708
+ return false;
2709
+ }
2710
+ // Adapter.check
2711
+ if (fetch.simulate && fetch.isCheck && !render.noSize) {
2712
+ return true;
2713
+ }
2714
+ // Adapter.remove or Adapter.update with clip
2715
+ if (fetch.simulate && fetch.doRemove) {
2716
+ return true;
2717
+ }
2718
+ // common inner loop (App start, scroll, Adapter.clip) with full fetch
2719
+ if (!fetch.simulate && ((fetch.hasNewItems && !render.noSize) || fetch.hasAnotherPack)) {
2720
+ return true;
2721
+ }
2722
+ return false;
2723
+ };
2724
+ return End;
2725
+ }(BaseProcessFactory(CommonProcess.end)));
2726
+
2655
2727
  var Adjust = /** @class */ (function (_super) {
2656
2728
  __extends(Adjust, _super);
2657
2729
  function Adjust() {
2658
2730
  return _super !== null && _super.apply(this, arguments) || this;
2659
2731
  }
2660
2732
  Adjust.run = function (scroller) {
2661
- var workflow = scroller.workflow, viewport = scroller.viewport, scrollState = scroller.state.scrollState;
2662
- scrollState.positionBeforeAdjust = viewport.scrollPosition;
2733
+ var workflow = scroller.workflow, viewport = scroller.viewport, scroll = scroller.state.scroll;
2734
+ scroll.positionBeforeAdjust = viewport.scrollPosition;
2663
2735
  Adjust.setPaddings(scroller);
2664
- scrollState.positionAfterAdjust = viewport.scrollPosition;
2736
+ scroll.positionAfterAdjust = viewport.scrollPosition;
2665
2737
  // scroll position adjustments
2666
2738
  var position = Adjust.calculatePosition(scroller);
2739
+ // additional adjustment if the position can't be reached during the initial cycle
2740
+ Adjust.setAdditionalForwardPadding(scroller, position);
2667
2741
  // set new position using animation frame
2668
2742
  Adjust.setPosition(scroller, position, function () {
2669
2743
  return workflow.call({
@@ -2696,7 +2770,8 @@
2696
2770
  }
2697
2771
  // lack of items case
2698
2772
  var bufferSize = viewport.getScrollableSize() - forward.size - backward.size;
2699
- var viewportSizeDiff = viewport.getSize() - (bwdSize + bufferSize + fwdSize);
2773
+ var scrollSize = bwdSize + bufferSize + fwdSize;
2774
+ var viewportSizeDiff = viewport.getSize() - scrollSize;
2700
2775
  if (viewportSizeDiff > 0) {
2701
2776
  if (inverse) {
2702
2777
  bwdSize += viewportSizeDiff;
@@ -2713,7 +2788,7 @@
2713
2788
  scroller.logger.stat('after paddings adjustments');
2714
2789
  };
2715
2790
  Adjust.calculatePosition = function (scroller) {
2716
- var viewport = scroller.viewport, buffer = scroller.buffer, _a = scroller.state, fetch = _a.fetch, render = _a.render, scrollState = _a.scrollState;
2791
+ var viewport = scroller.viewport, buffer = scroller.buffer, _a = scroller.state, fetch = _a.fetch, render = _a.render, scroll = _a.scroll;
2717
2792
  var position = viewport.paddings.backward.size;
2718
2793
  // increase the position to meet the expectation of the first visible item
2719
2794
  if (!isNaN(fetch.firstVisible.index) && !isNaN(buffer.firstIndex)) {
@@ -2736,8 +2811,8 @@
2736
2811
  });
2737
2812
  }
2738
2813
  // slow fetch/render case
2739
- if (scrollState.positionBeforeAsync !== null) {
2740
- var diff = render.positionBefore - scrollState.positionBeforeAsync;
2814
+ if (scroll.positionBeforeAsync !== null) {
2815
+ var diff = render.positionBefore - scroll.positionBeforeAsync;
2741
2816
  if (diff !== 0) {
2742
2817
  scroller.logger.log("shift position due to fetch-render difference (" + diff + ")");
2743
2818
  position += diff;
@@ -2749,23 +2824,47 @@
2749
2824
  }
2750
2825
  return Math.round(position);
2751
2826
  };
2827
+ Adjust.setAdditionalForwardPadding = function (scroller, position) {
2828
+ var viewport = scroller.viewport, buffer = scroller.buffer, cycle = scroller.state.cycle;
2829
+ if (!cycle.isInitial || !End.shouldContinueRun(scroller, null)) {
2830
+ return;
2831
+ }
2832
+ var diff = position - viewport.getMaxScrollPosition();
2833
+ if (diff <= 0) {
2834
+ return;
2835
+ }
2836
+ var last = buffer.getLastVisibleItem();
2837
+ if (!last) {
2838
+ return;
2839
+ }
2840
+ var size = 0;
2841
+ var index = last.$index + 1;
2842
+ while (size <= diff && index <= buffer.absMaxIndex) {
2843
+ size += buffer.getSizeByIndex(index++);
2844
+ }
2845
+ var shift = Math.min(size, diff);
2846
+ if (shift) {
2847
+ viewport.paddings.forward.size += shift;
2848
+ scroller.logger.log("increase fwd padding due to lack of items (" + diff + " -> " + shift + ")");
2849
+ }
2850
+ };
2752
2851
  Adjust.setPosition = function (scroller, position, done) {
2753
- var scrollState = scroller.state.scrollState, viewport = scroller.viewport, routines = scroller.routines;
2754
- if (!scrollState.hasPositionChanged(position)) {
2852
+ var scroll = scroller.state.scroll, viewport = scroller.viewport, routines = scroller.routines;
2853
+ if (!scroll.hasPositionChanged(position)) {
2755
2854
  return done();
2756
2855
  }
2757
- scrollState.syntheticPosition = position;
2758
- scrollState.syntheticFulfill = false;
2759
- scrollState.cancelAnimation = routines.animate(function () {
2760
- scrollState.cancelAnimation = null;
2761
- var inertiaDiff = scrollState.positionAfterAdjust - viewport.scrollPosition;
2856
+ scroll.syntheticPosition = position;
2857
+ scroll.syntheticFulfill = false;
2858
+ scroll.cancelAnimation = routines.animate(function () {
2859
+ scroll.cancelAnimation = null;
2860
+ var inertiaDiff = scroll.positionAfterAdjust - viewport.scrollPosition;
2762
2861
  var diffLog = '';
2763
2862
  if (inertiaDiff > 0) {
2764
2863
  position -= inertiaDiff;
2765
- scrollState.syntheticPosition = position;
2864
+ scroll.syntheticPosition = position;
2766
2865
  diffLog = " (-" + inertiaDiff + ")";
2767
2866
  }
2768
- scrollState.syntheticFulfill = true;
2867
+ scroll.syntheticFulfill = true;
2769
2868
  viewport.scrollPosition = position;
2770
2869
  scroller.logger.stat('after scroll adjustment' + diffLog);
2771
2870
  done();
@@ -2922,76 +3021,6 @@
2922
3021
  return Clip;
2923
3022
  }(BaseProcessFactory(CommonProcess.clip)));
2924
3023
 
2925
- var isInterrupted = function (_a) {
2926
- var call = _a.call;
2927
- return !!call.interrupted;
2928
- };
2929
- var End = /** @class */ (function (_super) {
2930
- __extends(End, _super);
2931
- function End() {
2932
- return _super !== null && _super.apply(this, arguments) || this;
2933
- }
2934
- End.run = function (scroller, _a) {
2935
- var _b = _a === void 0 ? {} : _a, error = _b.error;
2936
- var workflow = scroller.workflow, interrupter = scroller.state.cycle.interrupter;
2937
- if (!error && !interrupter) {
2938
- // set out params accessible via Adapter
2939
- End.calculateParams(scroller, workflow);
2940
- }
2941
- // explicit interruption for we don't want to go through the inner loop finalizing
2942
- if (isInterrupted(workflow)) {
2943
- workflow.call({ process: End.process, status: ProcessStatus.done });
2944
- return;
2945
- }
2946
- var next = End.finalizeInnerLoop(scroller, error);
2947
- workflow.call({
2948
- process: End.process,
2949
- status: next ? ProcessStatus.next : ProcessStatus.done,
2950
- payload: __assign({}, (interrupter ? { process: interrupter } : {}))
2951
- });
2952
- };
2953
- End.calculateParams = function (scroller, workflow) {
2954
- var adapter = scroller.adapter, viewport = scroller.viewport, items = scroller.buffer.items;
2955
- if (adapter.wanted.firstVisible) {
2956
- var item = viewport.getEdgeVisibleItem(items, exports.Direction.backward).item;
2957
- if (!item || item.element !== adapter.firstVisible.element) {
2958
- adapter.firstVisible = item ? item.get() : EMPTY_ITEM;
2959
- }
2960
- }
2961
- // the workflow can be interrupter on firstVisible change
2962
- if (adapter.wanted.lastVisible && !isInterrupted(workflow)) {
2963
- var item = viewport.getEdgeVisibleItem(items, exports.Direction.forward).item;
2964
- if (!item || item.element !== adapter.lastVisible.element) {
2965
- adapter.lastVisible = item ? item.get() : EMPTY_ITEM;
2966
- }
2967
- }
2968
- };
2969
- End.finalizeInnerLoop = function (scroller, error) {
2970
- var state = scroller.state, _a = scroller.state, cycle = _a.cycle, clip = _a.clip, fetch = _a.fetch;
2971
- var next = !!cycle.interrupter || (error ? false : End.getNext(scroller));
2972
- cycle.innerLoop.isInitial = false;
2973
- fetch.stopSimulate();
2974
- clip.reset(true);
2975
- state.endInnerLoop();
2976
- return next;
2977
- };
2978
- End.getNext = function (scroller) {
2979
- var _a = scroller.state, fetch = _a.fetch, render = _a.render;
2980
- if (fetch.simulate && fetch.isCheck && !render.noSize) { // Adapter.check
2981
- return true;
2982
- }
2983
- if (fetch.simulate && fetch.doRemove) { // Adapter.remove or Adapter.update with clip
2984
- return true;
2985
- }
2986
- if ( // common inner loop (App start, Scroll, Adapter.clip) accompanied by fetch
2987
- !fetch.simulate && ((fetch.hasNewItems && !render.noSize) || fetch.hasAnotherPack)) {
2988
- return true;
2989
- }
2990
- return false;
2991
- };
2992
- return End;
2993
- }(BaseProcessFactory(CommonProcess.end)));
2994
-
2995
3024
  var Logger = /** @class */ (function () {
2996
3025
  function Logger(scroller, packageInfo, adapter) {
2997
3026
  var _this = this;
@@ -3442,7 +3471,7 @@
3442
3471
  this.setOffset();
3443
3472
  this.paddings.reset(this.getSize(), startIndex, this.offset);
3444
3473
  this.scrollPosition = this.paddings.backward.size || 0;
3445
- this.state.scrollState.reset();
3474
+ this.state.scroll.reset();
3446
3475
  };
3447
3476
  Viewport.prototype.setPosition = function (value) {
3448
3477
  var oldPosition = this.scrollPosition;
@@ -3473,6 +3502,9 @@
3473
3502
  Viewport.prototype.getScrollableSize = function () {
3474
3503
  return this.routines.getSize(this.element);
3475
3504
  };
3505
+ Viewport.prototype.getMaxScrollPosition = function () {
3506
+ return this.getScrollableSize() - this.getSize();
3507
+ };
3476
3508
  Viewport.prototype.getBufferPadding = function () {
3477
3509
  return this.getSize() * this.settings.padding;
3478
3510
  };
@@ -4382,6 +4414,7 @@
4382
4414
  configurable: true
4383
4415
  });
4384
4416
  InnerLoopModel.prototype.done = function () {
4417
+ this.isInitial = false;
4385
4418
  this.count++;
4386
4419
  this.total++;
4387
4420
  this.busy.set(false);
@@ -4402,7 +4435,7 @@
4402
4435
  this.innerLoop = new InnerLoopModel(loopCount);
4403
4436
  this.interrupter = null;
4404
4437
  this.busy = new Reactive(false);
4405
- this.done(cycleCount);
4438
+ this.end(cycleCount);
4406
4439
  }
4407
4440
  Object.defineProperty(WorkflowCycleModel.prototype, "loopId", {
4408
4441
  get: function () {
@@ -4418,11 +4451,6 @@
4418
4451
  enumerable: false,
4419
4452
  configurable: true
4420
4453
  });
4421
- WorkflowCycleModel.prototype.done = function (count) {
4422
- this.count = count;
4423
- this.isInitial = false;
4424
- this.busy.set(false);
4425
- };
4426
4454
  WorkflowCycleModel.prototype.start = function (isInitial, initiator) {
4427
4455
  this.isInitial = isInitial;
4428
4456
  this.initiator = initiator;
@@ -4431,6 +4459,11 @@
4431
4459
  this.interrupter = null;
4432
4460
  this.busy.set(true);
4433
4461
  };
4462
+ WorkflowCycleModel.prototype.end = function (count) {
4463
+ this.count = count;
4464
+ this.isInitial = false;
4465
+ this.busy.set(false);
4466
+ };
4434
4467
  WorkflowCycleModel.prototype.dispose = function (forever) {
4435
4468
  if (forever) {
4436
4469
  // otherwise the value will be persisted during re-instantiation
@@ -4630,11 +4663,11 @@
4630
4663
  return RenderModel;
4631
4664
  }());
4632
4665
 
4633
- var ScrollState = /** @class */ (function () {
4634
- function ScrollState() {
4666
+ var ScrollModel = /** @class */ (function () {
4667
+ function ScrollModel() {
4635
4668
  this.reset();
4636
4669
  }
4637
- ScrollState.prototype.reset = function () {
4670
+ ScrollModel.prototype.reset = function () {
4638
4671
  this.previous = null;
4639
4672
  this.current = null;
4640
4673
  this.syntheticPosition = null;
@@ -4644,7 +4677,7 @@
4644
4677
  this.positionAfterAdjust = null;
4645
4678
  this.stop();
4646
4679
  };
4647
- ScrollState.prototype.stop = function () {
4680
+ ScrollModel.prototype.stop = function () {
4648
4681
  if (this.scrollTimer) {
4649
4682
  clearTimeout(this.scrollTimer);
4650
4683
  this.scrollTimer = null;
@@ -4654,12 +4687,12 @@
4654
4687
  this.cancelAnimation = null;
4655
4688
  }
4656
4689
  };
4657
- ScrollState.prototype.hasPositionChanged = function (position) {
4690
+ ScrollModel.prototype.hasPositionChanged = function (position) {
4658
4691
  var before = this.positionBeforeAdjust;
4659
4692
  var after = this.positionAfterAdjust;
4660
4693
  return before === null || before !== position || after === null || after !== position;
4661
4694
  };
4662
- return ScrollState;
4695
+ return ScrollModel;
4663
4696
  }());
4664
4697
 
4665
4698
  var State = /** @class */ (function () {
@@ -4671,7 +4704,7 @@
4671
4704
  this.fetch = new FetchModel(settings.directionPriority);
4672
4705
  this.clip = new ClipModel();
4673
4706
  this.render = new RenderModel();
4674
- this.scrollState = new ScrollState();
4707
+ this.scroll = new ScrollModel();
4675
4708
  }
4676
4709
  Object.defineProperty(State.prototype, "time", {
4677
4710
  get: function () {
@@ -4680,20 +4713,14 @@
4680
4713
  enumerable: false,
4681
4714
  configurable: true
4682
4715
  });
4683
- State.prototype.endInnerLoop = function () {
4684
- var _a = this, fetch = _a.fetch, render = _a.render, cycle = _a.cycle;
4685
- if (fetch.cancel) {
4686
- fetch.cancel();
4687
- fetch.cancel = null;
4688
- }
4689
- if (render.cancel) {
4690
- render.cancel();
4691
- render.cancel = null;
4692
- }
4693
- cycle.innerLoop.done();
4716
+ State.prototype.startWorkflowCycle = function (isInitial, initiator) {
4717
+ this.cycle.start(isInitial, initiator);
4718
+ };
4719
+ State.prototype.endWorkflowCycle = function (count) {
4720
+ this.cycle.end(count);
4694
4721
  };
4695
4722
  State.prototype.startInnerLoop = function () {
4696
- var _a = this, cycle = _a.cycle, scroll = _a.scrollState, fetch = _a.fetch, render = _a.render, clip = _a.clip;
4723
+ var _a = this, cycle = _a.cycle, scroll = _a.scroll, fetch = _a.fetch, render = _a.render, clip = _a.clip;
4697
4724
  cycle.innerLoop.start();
4698
4725
  scroll.positionBeforeAsync = null;
4699
4726
  if (!fetch.simulate) {
@@ -4706,10 +4733,24 @@
4706
4733
  doRender: fetch.simulate && fetch.items.length > 0
4707
4734
  } : {}));
4708
4735
  };
4736
+ State.prototype.endInnerLoop = function () {
4737
+ var _a = this, fetch = _a.fetch, clip = _a.clip, render = _a.render, cycle = _a.cycle;
4738
+ fetch.stopSimulate();
4739
+ clip.reset(true);
4740
+ if (fetch.cancel) {
4741
+ fetch.cancel();
4742
+ fetch.cancel = null;
4743
+ }
4744
+ if (render.cancel) {
4745
+ render.cancel();
4746
+ render.cancel = null;
4747
+ }
4748
+ cycle.innerLoop.done();
4749
+ };
4709
4750
  State.prototype.dispose = function () {
4751
+ this.scroll.stop();
4710
4752
  this.cycle.dispose();
4711
4753
  this.endInnerLoop();
4712
- this.scrollState.stop();
4713
4754
  };
4714
4755
  return State;
4715
4756
  }());
@@ -5584,7 +5625,7 @@
5584
5625
  var _a = this.scroller, state = _a.state, logger = _a.logger;
5585
5626
  this.cyclesDone++;
5586
5627
  logger.logCycle(false);
5587
- state.cycle.done(this.cyclesDone + 1);
5628
+ state.endWorkflowCycle(this.cyclesDone + 1);
5588
5629
  this.finalize();
5589
5630
  };
5590
5631
  Workflow.prototype.dispose = function () {