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) FESM5
3
- * Version: 1.4.2 (2021-11-15T04:26:41.052Z)
3
+ * Version: 1.4.3 (2021-11-30T02:54:00.541Z)
4
4
  * Author: Denis Hilt
5
5
  * License: MIT
6
6
  */
@@ -343,7 +343,7 @@ var reactiveConfigStorage = new Map();
343
343
 
344
344
  var core = {
345
345
  name: 'vscroll',
346
- version: '1.4.2'
346
+ version: '1.4.3'
347
347
  };
348
348
 
349
349
  var instanceCount$1 = 0;
@@ -1350,10 +1350,10 @@ var Init = /** @class */ (function (_super) {
1350
1350
  return _super !== null && _super.apply(this, arguments) || this;
1351
1351
  }
1352
1352
  Init.run = function (scroller, process) {
1353
- var cycle = scroller.state.cycle, workflow = scroller.workflow;
1353
+ var state = scroller.state, workflow = scroller.workflow;
1354
1354
  var isInitial = initProcesses.includes(process);
1355
1355
  scroller.logger.logCycle(true);
1356
- cycle.start(isInitial, process);
1356
+ state.startWorkflowCycle(isInitial, process);
1357
1357
  workflow.call({
1358
1358
  process: Init.process,
1359
1359
  status: ProcessStatus.next
@@ -1379,16 +1379,16 @@ var Scroll = /** @class */ (function (_super) {
1379
1379
  });
1380
1380
  };
1381
1381
  Scroll.onSynthetic = function (scroller, position) {
1382
- var scrollState = scroller.state.scrollState;
1383
- var synthPos = scrollState.syntheticPosition;
1382
+ var scroll = scroller.state.scroll;
1383
+ var synthPos = scroll.syntheticPosition;
1384
1384
  if (synthPos !== null) {
1385
- if (scrollState.syntheticFulfill) {
1386
- scrollState.syntheticPosition = null;
1385
+ if (scroll.syntheticFulfill) {
1386
+ scroll.syntheticPosition = null;
1387
1387
  }
1388
- if (!scrollState.syntheticFulfill || synthPos === position) {
1388
+ if (!scroll.syntheticFulfill || synthPos === position) {
1389
1389
  scroller.logger.log(function () { return [
1390
1390
  'skipping scroll', position,
1391
- "[" + (scrollState.syntheticFulfill ? '' : 'pre-') + "synthetic]"
1391
+ "[" + (scroll.syntheticFulfill ? '' : 'pre-') + "synthetic]"
1392
1392
  ]; });
1393
1393
  return true;
1394
1394
  }
@@ -1399,13 +1399,13 @@ var Scroll = /** @class */ (function (_super) {
1399
1399
  return false;
1400
1400
  };
1401
1401
  Scroll.onThrottle = function (scroller, position, done) {
1402
- var scrollState = scroller.state.scrollState, throttle = scroller.settings.throttle, logger = scroller.logger;
1403
- scrollState.current = Scroll.getScrollEvent(position, scrollState.previous);
1404
- var _a = scrollState.current, direction = _a.direction, time = _a.time;
1405
- var timeDiff = scrollState.previous ? time - scrollState.previous.time : Infinity;
1402
+ var scroll = scroller.state.scroll, throttle = scroller.settings.throttle, logger = scroller.logger;
1403
+ scroll.current = Scroll.getScrollEvent(position, scroll.previous);
1404
+ var _a = scroll.current, direction = _a.direction, time = _a.time;
1405
+ var timeDiff = scroll.previous ? time - scroll.previous.time : Infinity;
1406
1406
  var delta = throttle - timeDiff;
1407
1407
  var shouldDelay = isFinite(delta) && delta > 0;
1408
- var alreadyDelayed = !!scrollState.scrollTimer;
1408
+ var alreadyDelayed = !!scroll.scrollTimer;
1409
1409
  logger.log(function () { return [
1410
1410
  direction === Direction.backward ? '\u2934' : '\u2935',
1411
1411
  position,
@@ -1413,17 +1413,17 @@ var Scroll = /** @class */ (function (_super) {
1413
1413
  shouldDelay ? (alreadyDelayed ? 'delayed' : "/ " + delta + "ms delay") : ''
1414
1414
  ]; });
1415
1415
  if (!shouldDelay) {
1416
- if (scrollState.scrollTimer) {
1417
- clearTimeout(scrollState.scrollTimer);
1418
- scrollState.scrollTimer = null;
1416
+ if (scroll.scrollTimer) {
1417
+ clearTimeout(scroll.scrollTimer);
1418
+ scroll.scrollTimer = null;
1419
1419
  }
1420
1420
  done();
1421
1421
  return;
1422
1422
  }
1423
1423
  if (!alreadyDelayed) {
1424
- scrollState.scrollTimer = setTimeout(function () {
1424
+ scroll.scrollTimer = setTimeout(function () {
1425
1425
  logger.log(function () {
1426
- var curr = Scroll.getScrollEvent(scroller.viewport.scrollPosition, scrollState.current);
1426
+ var curr = Scroll.getScrollEvent(scroller.viewport.scrollPosition, scroll.current);
1427
1427
  return [
1428
1428
  curr.direction === Direction.backward ? '\u2934' : '\u2935',
1429
1429
  curr.position,
@@ -1432,7 +1432,7 @@ var Scroll = /** @class */ (function (_super) {
1432
1432
  position
1433
1433
  ];
1434
1434
  });
1435
- scrollState.scrollTimer = null;
1435
+ scroll.scrollTimer = null;
1436
1436
  done();
1437
1437
  }, delta);
1438
1438
  }
@@ -1451,11 +1451,11 @@ var Scroll = /** @class */ (function (_super) {
1451
1451
  return { position: position, direction: direction, time: time };
1452
1452
  };
1453
1453
  Scroll.onScroll = function (scroller, workflow) {
1454
- var _a = scroller.state, scrollState = _a.scrollState, cycle = _a.cycle;
1455
- scrollState.previous = __assign({}, scrollState.current);
1456
- scrollState.current = null;
1454
+ var _a = scroller.state, scroll = _a.scroll, cycle = _a.cycle;
1455
+ scroll.previous = __assign({}, scroll.current);
1456
+ scroll.current = null;
1457
1457
  if (cycle.busy.get()) {
1458
- scroller.logger.log(function () { return ['skipping scroll', scrollState.previous.position, '[pending]']; });
1458
+ scroller.logger.log(function () { return ['skipping scroll', scroll.previous.position, '[pending]']; });
1459
1459
  return;
1460
1460
  }
1461
1461
  workflow.call({
@@ -1516,7 +1516,7 @@ var Reload = /** @class */ (function (_super) {
1516
1516
  viewport.reset(buffer.startIndex);
1517
1517
  var payload = {};
1518
1518
  if (state.cycle.busy.get()) {
1519
- state.scrollState.stop();
1519
+ state.scroll.stop();
1520
1520
  payload.finalize = true;
1521
1521
  state.cycle.interrupter = Reload.process;
1522
1522
  }
@@ -2371,9 +2371,9 @@ var Fetch = /** @class */ (function (_super) {
2371
2371
  }
2372
2372
  }
2373
2373
  else {
2374
- var _b = scroller.state, scrollState = _b.scrollState, fetch_1 = _b.fetch, viewport = scroller.viewport;
2375
- if (scrollState.positionBeforeAsync === null) {
2376
- scrollState.positionBeforeAsync = viewport.scrollPosition;
2374
+ var _b = scroller.state, scroll_1 = _b.scroll, fetch_1 = _b.fetch, viewport = scroller.viewport;
2375
+ if (scroll_1.positionBeforeAsync === null) {
2376
+ scroll_1.positionBeforeAsync = viewport.scrollPosition;
2377
2377
  }
2378
2378
  fetch_1.cancel = function () {
2379
2379
  box.success = function () { return null; };
@@ -2505,10 +2505,10 @@ var Render = /** @class */ (function (_super) {
2505
2505
  return _super !== null && _super.apply(this, arguments) || this;
2506
2506
  }
2507
2507
  Render.run = function (scroller) {
2508
- var workflow = scroller.workflow, _a = scroller.state, cycle = _a.cycle, render = _a.render, scrollState = _a.scrollState, viewport = scroller.viewport, routines = scroller.routines;
2508
+ var workflow = scroller.workflow, _a = scroller.state, cycle = _a.cycle, render = _a.render, scroll = _a.scroll, viewport = scroller.viewport, routines = scroller.routines;
2509
2509
  scroller.logger.stat('before new items render');
2510
- if (scrollState.positionBeforeAsync === null) {
2511
- scrollState.positionBeforeAsync = viewport.scrollPosition;
2510
+ if (scroll.positionBeforeAsync === null) {
2511
+ scroll.positionBeforeAsync = viewport.scrollPosition;
2512
2512
  }
2513
2513
  render.cancel = routines.render(function () {
2514
2514
  render.cancel = null;
@@ -2560,18 +2560,92 @@ var Render = /** @class */ (function (_super) {
2560
2560
  return Render;
2561
2561
  }(BaseProcessFactory(CommonProcess.render)));
2562
2562
 
2563
+ var isInterrupted = function (_a) {
2564
+ var call = _a.call;
2565
+ return !!call.interrupted;
2566
+ };
2567
+ var End = /** @class */ (function (_super) {
2568
+ __extends(End, _super);
2569
+ function End() {
2570
+ return _super !== null && _super.apply(this, arguments) || this;
2571
+ }
2572
+ End.run = function (scroller, _a) {
2573
+ var _b = _a === void 0 ? {} : _a, error = _b.error;
2574
+ var workflow = scroller.workflow, interrupter = scroller.state.cycle.interrupter;
2575
+ if (!error && !interrupter) {
2576
+ // set out params accessible via Adapter
2577
+ End.calculateParams(scroller, workflow);
2578
+ }
2579
+ // explicit interruption for we don't want to go through the inner loop finalizing
2580
+ if (isInterrupted(workflow)) {
2581
+ workflow.call({ process: End.process, status: ProcessStatus.done });
2582
+ return;
2583
+ }
2584
+ var next = End.shouldContinueRun(scroller, error);
2585
+ scroller.state.endInnerLoop();
2586
+ workflow.call({
2587
+ process: End.process,
2588
+ status: next ? ProcessStatus.next : ProcessStatus.done,
2589
+ payload: __assign({}, (interrupter ? { process: interrupter } : {}))
2590
+ });
2591
+ };
2592
+ End.calculateParams = function (scroller, workflow) {
2593
+ var adapter = scroller.adapter, viewport = scroller.viewport, items = scroller.buffer.items;
2594
+ if (adapter.wanted.firstVisible) {
2595
+ var item = viewport.getEdgeVisibleItem(items, Direction.backward).item;
2596
+ if (!item || item.element !== adapter.firstVisible.element) {
2597
+ adapter.firstVisible = item ? item.get() : EMPTY_ITEM;
2598
+ }
2599
+ }
2600
+ // the workflow can be interrupter on firstVisible change
2601
+ if (adapter.wanted.lastVisible && !isInterrupted(workflow)) {
2602
+ var item = viewport.getEdgeVisibleItem(items, Direction.forward).item;
2603
+ if (!item || item.element !== adapter.lastVisible.element) {
2604
+ adapter.lastVisible = item ? item.get() : EMPTY_ITEM;
2605
+ }
2606
+ }
2607
+ };
2608
+ End.shouldContinueRun = function (scroller, error) {
2609
+ var _a = scroller.state, cycle = _a.cycle, fetch = _a.fetch, render = _a.render;
2610
+ // Adapter.reload or Adapter.reset
2611
+ if (cycle.interrupter) {
2612
+ return true;
2613
+ }
2614
+ // critical error
2615
+ if (error) {
2616
+ return false;
2617
+ }
2618
+ // Adapter.check
2619
+ if (fetch.simulate && fetch.isCheck && !render.noSize) {
2620
+ return true;
2621
+ }
2622
+ // Adapter.remove or Adapter.update with clip
2623
+ if (fetch.simulate && fetch.doRemove) {
2624
+ return true;
2625
+ }
2626
+ // common inner loop (App start, scroll, Adapter.clip) with full fetch
2627
+ if (!fetch.simulate && ((fetch.hasNewItems && !render.noSize) || fetch.hasAnotherPack)) {
2628
+ return true;
2629
+ }
2630
+ return false;
2631
+ };
2632
+ return End;
2633
+ }(BaseProcessFactory(CommonProcess.end)));
2634
+
2563
2635
  var Adjust = /** @class */ (function (_super) {
2564
2636
  __extends(Adjust, _super);
2565
2637
  function Adjust() {
2566
2638
  return _super !== null && _super.apply(this, arguments) || this;
2567
2639
  }
2568
2640
  Adjust.run = function (scroller) {
2569
- var workflow = scroller.workflow, viewport = scroller.viewport, scrollState = scroller.state.scrollState;
2570
- scrollState.positionBeforeAdjust = viewport.scrollPosition;
2641
+ var workflow = scroller.workflow, viewport = scroller.viewport, scroll = scroller.state.scroll;
2642
+ scroll.positionBeforeAdjust = viewport.scrollPosition;
2571
2643
  Adjust.setPaddings(scroller);
2572
- scrollState.positionAfterAdjust = viewport.scrollPosition;
2644
+ scroll.positionAfterAdjust = viewport.scrollPosition;
2573
2645
  // scroll position adjustments
2574
2646
  var position = Adjust.calculatePosition(scroller);
2647
+ // additional adjustment if the position can't be reached during the initial cycle
2648
+ Adjust.setAdditionalForwardPadding(scroller, position);
2575
2649
  // set new position using animation frame
2576
2650
  Adjust.setPosition(scroller, position, function () {
2577
2651
  return workflow.call({
@@ -2604,7 +2678,8 @@ var Adjust = /** @class */ (function (_super) {
2604
2678
  }
2605
2679
  // lack of items case
2606
2680
  var bufferSize = viewport.getScrollableSize() - forward.size - backward.size;
2607
- var viewportSizeDiff = viewport.getSize() - (bwdSize + bufferSize + fwdSize);
2681
+ var scrollSize = bwdSize + bufferSize + fwdSize;
2682
+ var viewportSizeDiff = viewport.getSize() - scrollSize;
2608
2683
  if (viewportSizeDiff > 0) {
2609
2684
  if (inverse) {
2610
2685
  bwdSize += viewportSizeDiff;
@@ -2621,7 +2696,7 @@ var Adjust = /** @class */ (function (_super) {
2621
2696
  scroller.logger.stat('after paddings adjustments');
2622
2697
  };
2623
2698
  Adjust.calculatePosition = function (scroller) {
2624
- var viewport = scroller.viewport, buffer = scroller.buffer, _a = scroller.state, fetch = _a.fetch, render = _a.render, scrollState = _a.scrollState;
2699
+ var viewport = scroller.viewport, buffer = scroller.buffer, _a = scroller.state, fetch = _a.fetch, render = _a.render, scroll = _a.scroll;
2625
2700
  var position = viewport.paddings.backward.size;
2626
2701
  // increase the position to meet the expectation of the first visible item
2627
2702
  if (!isNaN(fetch.firstVisible.index) && !isNaN(buffer.firstIndex)) {
@@ -2644,8 +2719,8 @@ var Adjust = /** @class */ (function (_super) {
2644
2719
  });
2645
2720
  }
2646
2721
  // slow fetch/render case
2647
- if (scrollState.positionBeforeAsync !== null) {
2648
- var diff = render.positionBefore - scrollState.positionBeforeAsync;
2722
+ if (scroll.positionBeforeAsync !== null) {
2723
+ var diff = render.positionBefore - scroll.positionBeforeAsync;
2649
2724
  if (diff !== 0) {
2650
2725
  scroller.logger.log("shift position due to fetch-render difference (" + diff + ")");
2651
2726
  position += diff;
@@ -2657,23 +2732,47 @@ var Adjust = /** @class */ (function (_super) {
2657
2732
  }
2658
2733
  return Math.round(position);
2659
2734
  };
2735
+ Adjust.setAdditionalForwardPadding = function (scroller, position) {
2736
+ var viewport = scroller.viewport, buffer = scroller.buffer, cycle = scroller.state.cycle;
2737
+ if (!cycle.isInitial || !End.shouldContinueRun(scroller, null)) {
2738
+ return;
2739
+ }
2740
+ var diff = position - viewport.getMaxScrollPosition();
2741
+ if (diff <= 0) {
2742
+ return;
2743
+ }
2744
+ var last = buffer.getLastVisibleItem();
2745
+ if (!last) {
2746
+ return;
2747
+ }
2748
+ var size = 0;
2749
+ var index = last.$index + 1;
2750
+ while (size <= diff && index <= buffer.absMaxIndex) {
2751
+ size += buffer.getSizeByIndex(index++);
2752
+ }
2753
+ var shift = Math.min(size, diff);
2754
+ if (shift) {
2755
+ viewport.paddings.forward.size += shift;
2756
+ scroller.logger.log("increase fwd padding due to lack of items (" + diff + " -> " + shift + ")");
2757
+ }
2758
+ };
2660
2759
  Adjust.setPosition = function (scroller, position, done) {
2661
- var scrollState = scroller.state.scrollState, viewport = scroller.viewport, routines = scroller.routines;
2662
- if (!scrollState.hasPositionChanged(position)) {
2760
+ var scroll = scroller.state.scroll, viewport = scroller.viewport, routines = scroller.routines;
2761
+ if (!scroll.hasPositionChanged(position)) {
2663
2762
  return done();
2664
2763
  }
2665
- scrollState.syntheticPosition = position;
2666
- scrollState.syntheticFulfill = false;
2667
- scrollState.cancelAnimation = routines.animate(function () {
2668
- scrollState.cancelAnimation = null;
2669
- var inertiaDiff = scrollState.positionAfterAdjust - viewport.scrollPosition;
2764
+ scroll.syntheticPosition = position;
2765
+ scroll.syntheticFulfill = false;
2766
+ scroll.cancelAnimation = routines.animate(function () {
2767
+ scroll.cancelAnimation = null;
2768
+ var inertiaDiff = scroll.positionAfterAdjust - viewport.scrollPosition;
2670
2769
  var diffLog = '';
2671
2770
  if (inertiaDiff > 0) {
2672
2771
  position -= inertiaDiff;
2673
- scrollState.syntheticPosition = position;
2772
+ scroll.syntheticPosition = position;
2674
2773
  diffLog = " (-" + inertiaDiff + ")";
2675
2774
  }
2676
- scrollState.syntheticFulfill = true;
2775
+ scroll.syntheticFulfill = true;
2677
2776
  viewport.scrollPosition = position;
2678
2777
  scroller.logger.stat('after scroll adjustment' + diffLog);
2679
2778
  done();
@@ -2830,76 +2929,6 @@ var Clip = /** @class */ (function (_super) {
2830
2929
  return Clip;
2831
2930
  }(BaseProcessFactory(CommonProcess.clip)));
2832
2931
 
2833
- var isInterrupted = function (_a) {
2834
- var call = _a.call;
2835
- return !!call.interrupted;
2836
- };
2837
- var End = /** @class */ (function (_super) {
2838
- __extends(End, _super);
2839
- function End() {
2840
- return _super !== null && _super.apply(this, arguments) || this;
2841
- }
2842
- End.run = function (scroller, _a) {
2843
- var _b = _a === void 0 ? {} : _a, error = _b.error;
2844
- var workflow = scroller.workflow, interrupter = scroller.state.cycle.interrupter;
2845
- if (!error && !interrupter) {
2846
- // set out params accessible via Adapter
2847
- End.calculateParams(scroller, workflow);
2848
- }
2849
- // explicit interruption for we don't want to go through the inner loop finalizing
2850
- if (isInterrupted(workflow)) {
2851
- workflow.call({ process: End.process, status: ProcessStatus.done });
2852
- return;
2853
- }
2854
- var next = End.finalizeInnerLoop(scroller, error);
2855
- workflow.call({
2856
- process: End.process,
2857
- status: next ? ProcessStatus.next : ProcessStatus.done,
2858
- payload: __assign({}, (interrupter ? { process: interrupter } : {}))
2859
- });
2860
- };
2861
- End.calculateParams = function (scroller, workflow) {
2862
- var adapter = scroller.adapter, viewport = scroller.viewport, items = scroller.buffer.items;
2863
- if (adapter.wanted.firstVisible) {
2864
- var item = viewport.getEdgeVisibleItem(items, Direction.backward).item;
2865
- if (!item || item.element !== adapter.firstVisible.element) {
2866
- adapter.firstVisible = item ? item.get() : EMPTY_ITEM;
2867
- }
2868
- }
2869
- // the workflow can be interrupter on firstVisible change
2870
- if (adapter.wanted.lastVisible && !isInterrupted(workflow)) {
2871
- var item = viewport.getEdgeVisibleItem(items, Direction.forward).item;
2872
- if (!item || item.element !== adapter.lastVisible.element) {
2873
- adapter.lastVisible = item ? item.get() : EMPTY_ITEM;
2874
- }
2875
- }
2876
- };
2877
- End.finalizeInnerLoop = function (scroller, error) {
2878
- var state = scroller.state, _a = scroller.state, cycle = _a.cycle, clip = _a.clip, fetch = _a.fetch;
2879
- var next = !!cycle.interrupter || (error ? false : End.getNext(scroller));
2880
- cycle.innerLoop.isInitial = false;
2881
- fetch.stopSimulate();
2882
- clip.reset(true);
2883
- state.endInnerLoop();
2884
- return next;
2885
- };
2886
- End.getNext = function (scroller) {
2887
- var _a = scroller.state, fetch = _a.fetch, render = _a.render;
2888
- if (fetch.simulate && fetch.isCheck && !render.noSize) { // Adapter.check
2889
- return true;
2890
- }
2891
- if (fetch.simulate && fetch.doRemove) { // Adapter.remove or Adapter.update with clip
2892
- return true;
2893
- }
2894
- if ( // common inner loop (App start, Scroll, Adapter.clip) accompanied by fetch
2895
- !fetch.simulate && ((fetch.hasNewItems && !render.noSize) || fetch.hasAnotherPack)) {
2896
- return true;
2897
- }
2898
- return false;
2899
- };
2900
- return End;
2901
- }(BaseProcessFactory(CommonProcess.end)));
2902
-
2903
2932
  var Logger = /** @class */ (function () {
2904
2933
  function Logger(scroller, packageInfo, adapter) {
2905
2934
  var _this = this;
@@ -3350,7 +3379,7 @@ var Viewport = /** @class */ (function () {
3350
3379
  this.setOffset();
3351
3380
  this.paddings.reset(this.getSize(), startIndex, this.offset);
3352
3381
  this.scrollPosition = this.paddings.backward.size || 0;
3353
- this.state.scrollState.reset();
3382
+ this.state.scroll.reset();
3354
3383
  };
3355
3384
  Viewport.prototype.setPosition = function (value) {
3356
3385
  var oldPosition = this.scrollPosition;
@@ -3381,6 +3410,9 @@ var Viewport = /** @class */ (function () {
3381
3410
  Viewport.prototype.getScrollableSize = function () {
3382
3411
  return this.routines.getSize(this.element);
3383
3412
  };
3413
+ Viewport.prototype.getMaxScrollPosition = function () {
3414
+ return this.getScrollableSize() - this.getSize();
3415
+ };
3384
3416
  Viewport.prototype.getBufferPadding = function () {
3385
3417
  return this.getSize() * this.settings.padding;
3386
3418
  };
@@ -4290,6 +4322,7 @@ var InnerLoopModel = /** @class */ (function () {
4290
4322
  configurable: true
4291
4323
  });
4292
4324
  InnerLoopModel.prototype.done = function () {
4325
+ this.isInitial = false;
4293
4326
  this.count++;
4294
4327
  this.total++;
4295
4328
  this.busy.set(false);
@@ -4310,7 +4343,7 @@ var WorkflowCycleModel = /** @class */ (function () {
4310
4343
  this.innerLoop = new InnerLoopModel(loopCount);
4311
4344
  this.interrupter = null;
4312
4345
  this.busy = new Reactive(false);
4313
- this.done(cycleCount);
4346
+ this.end(cycleCount);
4314
4347
  }
4315
4348
  Object.defineProperty(WorkflowCycleModel.prototype, "loopId", {
4316
4349
  get: function () {
@@ -4326,11 +4359,6 @@ var WorkflowCycleModel = /** @class */ (function () {
4326
4359
  enumerable: false,
4327
4360
  configurable: true
4328
4361
  });
4329
- WorkflowCycleModel.prototype.done = function (count) {
4330
- this.count = count;
4331
- this.isInitial = false;
4332
- this.busy.set(false);
4333
- };
4334
4362
  WorkflowCycleModel.prototype.start = function (isInitial, initiator) {
4335
4363
  this.isInitial = isInitial;
4336
4364
  this.initiator = initiator;
@@ -4339,6 +4367,11 @@ var WorkflowCycleModel = /** @class */ (function () {
4339
4367
  this.interrupter = null;
4340
4368
  this.busy.set(true);
4341
4369
  };
4370
+ WorkflowCycleModel.prototype.end = function (count) {
4371
+ this.count = count;
4372
+ this.isInitial = false;
4373
+ this.busy.set(false);
4374
+ };
4342
4375
  WorkflowCycleModel.prototype.dispose = function (forever) {
4343
4376
  if (forever) {
4344
4377
  // otherwise the value will be persisted during re-instantiation
@@ -4538,11 +4571,11 @@ var RenderModel = /** @class */ (function () {
4538
4571
  return RenderModel;
4539
4572
  }());
4540
4573
 
4541
- var ScrollState = /** @class */ (function () {
4542
- function ScrollState() {
4574
+ var ScrollModel = /** @class */ (function () {
4575
+ function ScrollModel() {
4543
4576
  this.reset();
4544
4577
  }
4545
- ScrollState.prototype.reset = function () {
4578
+ ScrollModel.prototype.reset = function () {
4546
4579
  this.previous = null;
4547
4580
  this.current = null;
4548
4581
  this.syntheticPosition = null;
@@ -4552,7 +4585,7 @@ var ScrollState = /** @class */ (function () {
4552
4585
  this.positionAfterAdjust = null;
4553
4586
  this.stop();
4554
4587
  };
4555
- ScrollState.prototype.stop = function () {
4588
+ ScrollModel.prototype.stop = function () {
4556
4589
  if (this.scrollTimer) {
4557
4590
  clearTimeout(this.scrollTimer);
4558
4591
  this.scrollTimer = null;
@@ -4562,12 +4595,12 @@ var ScrollState = /** @class */ (function () {
4562
4595
  this.cancelAnimation = null;
4563
4596
  }
4564
4597
  };
4565
- ScrollState.prototype.hasPositionChanged = function (position) {
4598
+ ScrollModel.prototype.hasPositionChanged = function (position) {
4566
4599
  var before = this.positionBeforeAdjust;
4567
4600
  var after = this.positionAfterAdjust;
4568
4601
  return before === null || before !== position || after === null || after !== position;
4569
4602
  };
4570
- return ScrollState;
4603
+ return ScrollModel;
4571
4604
  }());
4572
4605
 
4573
4606
  var State = /** @class */ (function () {
@@ -4579,7 +4612,7 @@ var State = /** @class */ (function () {
4579
4612
  this.fetch = new FetchModel(settings.directionPriority);
4580
4613
  this.clip = new ClipModel();
4581
4614
  this.render = new RenderModel();
4582
- this.scrollState = new ScrollState();
4615
+ this.scroll = new ScrollModel();
4583
4616
  }
4584
4617
  Object.defineProperty(State.prototype, "time", {
4585
4618
  get: function () {
@@ -4588,20 +4621,14 @@ var State = /** @class */ (function () {
4588
4621
  enumerable: false,
4589
4622
  configurable: true
4590
4623
  });
4591
- State.prototype.endInnerLoop = function () {
4592
- var _a = this, fetch = _a.fetch, render = _a.render, cycle = _a.cycle;
4593
- if (fetch.cancel) {
4594
- fetch.cancel();
4595
- fetch.cancel = null;
4596
- }
4597
- if (render.cancel) {
4598
- render.cancel();
4599
- render.cancel = null;
4600
- }
4601
- cycle.innerLoop.done();
4624
+ State.prototype.startWorkflowCycle = function (isInitial, initiator) {
4625
+ this.cycle.start(isInitial, initiator);
4626
+ };
4627
+ State.prototype.endWorkflowCycle = function (count) {
4628
+ this.cycle.end(count);
4602
4629
  };
4603
4630
  State.prototype.startInnerLoop = function () {
4604
- var _a = this, cycle = _a.cycle, scroll = _a.scrollState, fetch = _a.fetch, render = _a.render, clip = _a.clip;
4631
+ var _a = this, cycle = _a.cycle, scroll = _a.scroll, fetch = _a.fetch, render = _a.render, clip = _a.clip;
4605
4632
  cycle.innerLoop.start();
4606
4633
  scroll.positionBeforeAsync = null;
4607
4634
  if (!fetch.simulate) {
@@ -4614,10 +4641,24 @@ var State = /** @class */ (function () {
4614
4641
  doRender: fetch.simulate && fetch.items.length > 0
4615
4642
  } : {}));
4616
4643
  };
4644
+ State.prototype.endInnerLoop = function () {
4645
+ var _a = this, fetch = _a.fetch, clip = _a.clip, render = _a.render, cycle = _a.cycle;
4646
+ fetch.stopSimulate();
4647
+ clip.reset(true);
4648
+ if (fetch.cancel) {
4649
+ fetch.cancel();
4650
+ fetch.cancel = null;
4651
+ }
4652
+ if (render.cancel) {
4653
+ render.cancel();
4654
+ render.cancel = null;
4655
+ }
4656
+ cycle.innerLoop.done();
4657
+ };
4617
4658
  State.prototype.dispose = function () {
4659
+ this.scroll.stop();
4618
4660
  this.cycle.dispose();
4619
4661
  this.endInnerLoop();
4620
- this.scrollState.stop();
4621
4662
  };
4622
4663
  return State;
4623
4664
  }());
@@ -5492,7 +5533,7 @@ var Workflow = /** @class */ (function () {
5492
5533
  var _a = this.scroller, state = _a.state, logger = _a.logger;
5493
5534
  this.cyclesDone++;
5494
5535
  logger.logCycle(false);
5495
- state.cycle.done(this.cyclesDone + 1);
5536
+ state.endWorkflowCycle(this.cyclesDone + 1);
5496
5537
  this.finalize();
5497
5538
  };
5498
5539
  Workflow.prototype.dispose = function () {