vscroll 1.4.1 → 1.5.0

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 (136) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +17 -16
  3. package/dist/bundles/vscroll.esm5.js +403 -321
  4. package/dist/bundles/vscroll.esm5.js.map +1 -1
  5. package/dist/bundles/vscroll.esm5.min.js +2 -2
  6. package/dist/bundles/vscroll.esm5.min.js.map +1 -1
  7. package/dist/bundles/vscroll.esm6.js +310 -244
  8. package/dist/bundles/vscroll.esm6.js.map +1 -1
  9. package/dist/bundles/vscroll.esm6.min.js +2 -2
  10. package/dist/bundles/vscroll.esm6.min.js.map +1 -1
  11. package/dist/bundles/vscroll.umd.js +404 -322
  12. package/dist/bundles/vscroll.umd.js.map +1 -1
  13. package/dist/bundles/vscroll.umd.min.js +2 -2
  14. package/dist/bundles/vscroll.umd.min.js.map +1 -1
  15. package/dist/esm2015/classes/domRoutines.js +101 -66
  16. package/dist/esm2015/classes/domRoutines.js.map +1 -1
  17. package/dist/esm2015/classes/logger.js +2 -2
  18. package/dist/esm2015/classes/logger.js.map +1 -1
  19. package/dist/esm2015/classes/paddings.js +5 -5
  20. package/dist/esm2015/classes/paddings.js.map +1 -1
  21. package/dist/esm2015/classes/state/cycle.js +7 -6
  22. package/dist/esm2015/classes/state/cycle.js.map +1 -1
  23. package/dist/esm2015/classes/state/render.js +1 -1
  24. package/dist/esm2015/classes/state/render.js.map +1 -1
  25. package/dist/esm2015/classes/state/scroll.js +6 -6
  26. package/dist/esm2015/classes/state/scroll.js.map +1 -1
  27. package/dist/esm2015/classes/state.js +23 -15
  28. package/dist/esm2015/classes/state.js.map +1 -1
  29. package/dist/esm2015/classes/viewport.js +13 -22
  30. package/dist/esm2015/classes/viewport.js.map +1 -1
  31. package/dist/esm2015/index.js.map +1 -1
  32. package/dist/esm2015/interfaces/index.js.map +1 -1
  33. package/dist/esm2015/interfaces/routines.js +2 -0
  34. package/dist/esm2015/interfaces/routines.js.map +1 -0
  35. package/dist/esm2015/interfaces/state.js.map +1 -1
  36. package/dist/esm2015/interfaces/workflow.js.map +1 -1
  37. package/dist/esm2015/processes/adapter/reload.js +1 -1
  38. package/dist/esm2015/processes/adapter/reload.js.map +1 -1
  39. package/dist/esm2015/processes/adjust.js +44 -15
  40. package/dist/esm2015/processes/adjust.js.map +1 -1
  41. package/dist/esm2015/processes/end.js +18 -16
  42. package/dist/esm2015/processes/end.js.map +1 -1
  43. package/dist/esm2015/processes/fetch.js +3 -3
  44. package/dist/esm2015/processes/fetch.js.map +1 -1
  45. package/dist/esm2015/processes/init.js +2 -2
  46. package/dist/esm2015/processes/init.js.map +1 -1
  47. package/dist/esm2015/processes/render.js +6 -6
  48. package/dist/esm2015/processes/render.js.map +1 -1
  49. package/dist/esm2015/processes/scroll.js +21 -21
  50. package/dist/esm2015/processes/scroll.js.map +1 -1
  51. package/dist/esm2015/scroller.js +4 -4
  52. package/dist/esm2015/scroller.js.map +1 -1
  53. package/dist/esm2015/version.js +1 -1
  54. package/dist/esm2015/version.js.map +1 -1
  55. package/dist/esm2015/workflow.js +9 -8
  56. package/dist/esm2015/workflow.js.map +1 -1
  57. package/dist/esm5/classes/adapter.js +4 -4
  58. package/dist/esm5/classes/adapter.js.map +1 -1
  59. package/dist/esm5/classes/buffer/cache.js +1 -1
  60. package/dist/esm5/classes/buffer/cache.js.map +1 -1
  61. package/dist/esm5/classes/buffer/checkCall.js +4 -4
  62. package/dist/esm5/classes/buffer/checkCall.js.map +1 -1
  63. package/dist/esm5/classes/buffer.js +3 -3
  64. package/dist/esm5/classes/buffer.js.map +1 -1
  65. package/dist/esm5/classes/domRoutines.js +115 -66
  66. package/dist/esm5/classes/domRoutines.js.map +1 -1
  67. package/dist/esm5/classes/logger.js +21 -21
  68. package/dist/esm5/classes/logger.js.map +1 -1
  69. package/dist/esm5/classes/paddings.js +5 -5
  70. package/dist/esm5/classes/paddings.js.map +1 -1
  71. package/dist/esm5/classes/state/cycle.js +9 -8
  72. package/dist/esm5/classes/state/cycle.js.map +1 -1
  73. package/dist/esm5/classes/state/render.js +1 -1
  74. package/dist/esm5/classes/state/render.js.map +1 -1
  75. package/dist/esm5/classes/state/scroll.js +11 -11
  76. package/dist/esm5/classes/state/scroll.js.map +1 -1
  77. package/dist/esm5/classes/state.js +23 -15
  78. package/dist/esm5/classes/state.js.map +1 -1
  79. package/dist/esm5/classes/viewport.js +14 -23
  80. package/dist/esm5/classes/viewport.js.map +1 -1
  81. package/dist/esm5/index.js.map +1 -1
  82. package/dist/esm5/inputs/validation.js +4 -4
  83. package/dist/esm5/inputs/validation.js.map +1 -1
  84. package/dist/esm5/interfaces/index.js.map +1 -1
  85. package/dist/esm5/interfaces/routines.js +2 -0
  86. package/dist/esm5/interfaces/routines.js.map +1 -0
  87. package/dist/esm5/interfaces/state.js.map +1 -1
  88. package/dist/esm5/interfaces/workflow.js.map +1 -1
  89. package/dist/esm5/processes/adapter/reload.js +1 -1
  90. package/dist/esm5/processes/adapter/reload.js.map +1 -1
  91. package/dist/esm5/processes/adapter/remove.js +1 -1
  92. package/dist/esm5/processes/adapter/remove.js.map +1 -1
  93. package/dist/esm5/processes/adjust.js +48 -19
  94. package/dist/esm5/processes/adjust.js.map +1 -1
  95. package/dist/esm5/processes/clip.js +5 -5
  96. package/dist/esm5/processes/clip.js.map +1 -1
  97. package/dist/esm5/processes/end.js +18 -16
  98. package/dist/esm5/processes/end.js.map +1 -1
  99. package/dist/esm5/processes/fetch.js +5 -5
  100. package/dist/esm5/processes/fetch.js.map +1 -1
  101. package/dist/esm5/processes/init.js +2 -2
  102. package/dist/esm5/processes/init.js.map +1 -1
  103. package/dist/esm5/processes/misc/base.js +1 -1
  104. package/dist/esm5/processes/misc/base.js.map +1 -1
  105. package/dist/esm5/processes/preClip.js +2 -2
  106. package/dist/esm5/processes/preClip.js.map +1 -1
  107. package/dist/esm5/processes/preFetch.js +5 -5
  108. package/dist/esm5/processes/preFetch.js.map +1 -1
  109. package/dist/esm5/processes/render.js +6 -6
  110. package/dist/esm5/processes/render.js.map +1 -1
  111. package/dist/esm5/processes/scroll.js +22 -22
  112. package/dist/esm5/processes/scroll.js.map +1 -1
  113. package/dist/esm5/scroller.js +5 -5
  114. package/dist/esm5/scroller.js.map +1 -1
  115. package/dist/esm5/version.js +1 -1
  116. package/dist/esm5/version.js.map +1 -1
  117. package/dist/esm5/workflow.js +15 -12
  118. package/dist/esm5/workflow.js.map +1 -1
  119. package/dist/typings/classes/domRoutines.d.ts +23 -18
  120. package/dist/typings/classes/logger.d.ts +1 -1
  121. package/dist/typings/classes/paddings.d.ts +2 -2
  122. package/dist/typings/classes/state/cycle.d.ts +1 -1
  123. package/dist/typings/classes/state/render.d.ts +1 -1
  124. package/dist/typings/classes/state/scroll.d.ts +4 -4
  125. package/dist/typings/classes/state.d.ts +6 -3
  126. package/dist/typings/classes/viewport.d.ts +2 -4
  127. package/dist/typings/index.d.ts +2 -2
  128. package/dist/typings/interfaces/index.d.ts +3 -2
  129. package/dist/typings/interfaces/routines.d.ts +157 -0
  130. package/dist/typings/interfaces/state.d.ts +2 -15
  131. package/dist/typings/interfaces/workflow.d.ts +3 -0
  132. package/dist/typings/processes/adjust.d.ts +1 -0
  133. package/dist/typings/processes/end.d.ts +1 -2
  134. package/dist/typings/scroller.d.ts +1 -1
  135. package/dist/typings/workflow.d.ts +2 -2
  136. package/package.json +18 -17
@@ -1 +1 @@
1
- {"version":3,"file":"scroller.js","sourceRoot":"","sources":["../../src/scroller.ts"],"names":[],"mappings":"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","sourcesContent":["import { DatasourceGeneric, makeDatasource } from './classes/datasource';\nimport { Settings } from './classes/settings';\nimport { Logger } from './classes/logger';\nimport { Routines } from './classes/domRoutines';\nimport { Viewport } from './classes/viewport';\nimport { Buffer } from './classes/buffer';\nimport { State } from './classes/state';\nimport { Adapter } from './classes/adapter';\nimport { Reactive } from './classes/reactive';\nimport { validate, DATASOURCE } from './inputs/index';\nimport core from './version';\nimport {\n ScrollerWorkflow, IDatasource, IDatasourceConstructed, ScrollerParams, IPackages, ProcessSubject\n} from './interfaces/index';\n\nexport const INVALID_DATASOURCE_PREFIX = 'Invalid datasource:';\n\nlet instanceCount = 0;\n\nexport class Scroller<Data = unknown> {\n public datasource: IDatasourceConstructed<Data>;\n public workflow: ScrollerWorkflow<Data>;\n\n public settings: Settings<Data>;\n public logger: Logger;\n public routines: Routines;\n public viewport: Viewport;\n public buffer: Buffer<Data>;\n public state: State;\n public adapter: Adapter<Data>;\n\n constructor({ datasource, consumer, element, workflow, scroller }: ScrollerParams<Data>) {\n const { params: { get } } = validate(datasource, DATASOURCE);\n if (!get.isValid) {\n throw new Error(`${INVALID_DATASOURCE_PREFIX} ${get.errors[0]}`);\n }\n\n const packageInfo = scroller ? scroller.state.packageInfo : ({ consumer, core } as IPackages);\n element = scroller ? scroller.viewport.element : (element as HTMLElement);\n workflow = scroller ? scroller.workflow : (workflow as ScrollerWorkflow<Data>);\n\n this.workflow = workflow;\n this.settings = new Settings<Data>(datasource.settings, datasource.devSettings, ++instanceCount);\n this.logger = new Logger(this as Scroller, packageInfo, datasource.adapter);\n this.routines = new Routines(this.settings);\n this.state = new State(packageInfo, this.settings, scroller ? scroller.state : void 0);\n this.buffer = new Buffer<Data>(this.settings, workflow.onDataChanged, this.logger);\n this.viewport = new Viewport(element, this.settings, this.routines, this.state, this.logger);\n this.logger.object('vscroll settings object', this.settings, true);\n\n this.initDatasource(datasource, scroller);\n }\n\n initDatasource(datasource: IDatasource<Data>, scroller?: Scroller<Data>): void {\n if (scroller) { // scroller re-instantiating case\n this.datasource = datasource as IDatasourceConstructed<Data>;\n this.adapter = scroller.adapter;\n // todo: what about (this.settings.adapter !== scroller.setting.adapter) case?\n return;\n }\n // scroller is being instantiated for the first time\n const constructed = datasource instanceof DatasourceGeneric;\n const mockAdapter = !constructed && !this.settings.adapter;\n if (constructed) { // datasource is already instantiated\n this.datasource = datasource as IDatasourceConstructed<Data>;\n } else { // datasource as POJO\n const DS = makeDatasource(() => ({ mock: mockAdapter }));\n this.datasource = new DS<Data>(datasource);\n if (this.settings.adapter) {\n datasource.adapter = this.datasource.adapter;\n }\n }\n const publicContext = !mockAdapter ? this.datasource.adapter : null;\n this.adapter = new Adapter<Data>(publicContext, () => this.workflow, this.logger);\n }\n\n init(adapterRun$?: Reactive<ProcessSubject>): void {\n this.viewport.reset(this.buffer.startIndex);\n this.logger.stat('initialization');\n this.adapter.initialize(this.buffer, this.state, this.logger, adapterRun$);\n }\n\n dispose(forever?: boolean): void {\n if (forever) { // Adapter is not re-instantiated on reset\n this.adapter.dispose();\n }\n this.buffer.dispose();\n this.state.dispose();\n }\n\n finalize(): void {\n }\n\n}\n"]}
1
+ {"version":3,"file":"scroller.js","sourceRoot":"","sources":["../../src/scroller.ts"],"names":[],"mappings":"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","sourcesContent":["import { DatasourceGeneric, makeDatasource } from './classes/datasource';\nimport { Settings } from './classes/settings';\nimport { Logger } from './classes/logger';\nimport { Routines } from './classes/domRoutines';\nimport { Viewport } from './classes/viewport';\nimport { Buffer } from './classes/buffer';\nimport { State } from './classes/state';\nimport { Adapter } from './classes/adapter';\nimport { Reactive } from './classes/reactive';\nimport { validate, DATASOURCE } from './inputs/index';\nimport core from './version';\nimport {\n ScrollerWorkflow, IDatasource, IDatasourceConstructed, ScrollerParams, IPackages, ProcessSubject\n} from './interfaces/index';\n\nexport const INVALID_DATASOURCE_PREFIX = 'Invalid datasource:';\n\nlet instanceCount = 0;\n\nexport class Scroller<Data = unknown> {\n public datasource: IDatasourceConstructed<Data>;\n public workflow: ScrollerWorkflow<Data>;\n\n public settings: Settings<Data>;\n public logger: Logger;\n public routines: Routines;\n public viewport: Viewport;\n public buffer: Buffer<Data>;\n public state: State;\n public adapter: Adapter<Data>;\n\n constructor({\n datasource, consumer, element, workflow, Routines: CustomRoutines, scroller\n }: ScrollerParams<Data>) {\n const { params: { get } } = validate(datasource, DATASOURCE);\n if (!get.isValid) {\n throw new Error(`${INVALID_DATASOURCE_PREFIX} ${get.errors[0]}`);\n }\n\n const packageInfo = scroller ? scroller.state.packageInfo : ({ consumer, core } as IPackages);\n element = scroller ? scroller.routines.element : (element as HTMLElement);\n workflow = scroller ? scroller.workflow : (workflow as ScrollerWorkflow<Data>);\n\n this.workflow = workflow;\n this.settings = new Settings<Data>(datasource.settings, datasource.devSettings, ++instanceCount);\n this.logger = new Logger(this as Scroller, packageInfo, datasource.adapter);\n this.routines = new Routines(element, this.settings, CustomRoutines);\n this.state = new State(packageInfo, this.settings, scroller ? scroller.state : void 0);\n this.buffer = new Buffer<Data>(this.settings, workflow.onDataChanged, this.logger);\n this.viewport = new Viewport(this.settings, this.routines, this.state, this.logger);\n this.logger.object('vscroll settings object', this.settings, true);\n\n this.initDatasource(datasource, scroller);\n }\n\n initDatasource(datasource: IDatasource<Data>, scroller?: Scroller<Data>): void {\n if (scroller) { // scroller re-instantiating case\n this.datasource = datasource as IDatasourceConstructed<Data>;\n this.adapter = scroller.adapter;\n // todo: what about (this.settings.adapter !== scroller.setting.adapter) case?\n return;\n }\n // scroller is being instantiated for the first time\n const constructed = datasource instanceof DatasourceGeneric;\n const mockAdapter = !constructed && !this.settings.adapter;\n if (constructed) { // datasource is already instantiated\n this.datasource = datasource as IDatasourceConstructed<Data>;\n } else { // datasource as POJO\n const DS = makeDatasource(() => ({ mock: mockAdapter }));\n this.datasource = new DS<Data>(datasource);\n if (this.settings.adapter) {\n datasource.adapter = this.datasource.adapter;\n }\n }\n const publicContext = !mockAdapter ? this.datasource.adapter : null;\n this.adapter = new Adapter<Data>(publicContext, () => this.workflow, this.logger);\n }\n\n init(adapterRun$?: Reactive<ProcessSubject>): void {\n this.viewport.reset(this.buffer.startIndex);\n this.logger.stat('initialization');\n this.adapter.initialize(this.buffer, this.state, this.logger, adapterRun$);\n }\n\n dispose(forever?: boolean): void {\n if (forever) { // Adapter is not re-instantiated on reset\n this.adapter.dispose();\n }\n this.buffer.dispose();\n this.state.dispose();\n }\n\n finalize(): void {\n }\n\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  export default {
2
2
  name: 'vscroll',
3
- version: '1.4.1'
3
+ version: '1.5.0'
4
4
  };
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAe;IACb,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,OAAO;CACjB,CAAC","sourcesContent":["export default {\n name: 'vscroll',\n version: '1.4.1'\n};\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAe;IACb,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,OAAO;CACjB,CAAC","sourcesContent":["export default {\n name: 'vscroll',\n version: '1.5.0'\n};\n"]}
@@ -6,14 +6,14 @@ import { CommonProcess, ProcessStatus as Status, } from './processes/index';
6
6
  var Workflow = /** @class */ (function () {
7
7
  function Workflow(_a) {
8
8
  var _this = this;
9
- var element = _a.element, datasource = _a.datasource, consumer = _a.consumer, run = _a.run;
9
+ var element = _a.element, datasource = _a.datasource, consumer = _a.consumer, run = _a.run, Routines = _a.Routines;
10
10
  this.isInitialized = false;
11
11
  this.initTimer = null;
12
12
  this.adapterRun$ = new Reactive();
13
13
  this.cyclesDone = 0;
14
14
  this.interruptionCount = 0;
15
15
  this.errors = [];
16
- this.disposeScrollEventHandler = function () { return null; };
16
+ this.offScroll = function () { return null; };
17
17
  this.propagateChanges = run;
18
18
  this.stateMachineMethods = {
19
19
  run: this.runProcess(),
@@ -21,7 +21,13 @@ var Workflow = /** @class */ (function () {
21
21
  done: this.done.bind(this),
22
22
  onError: this.onError.bind(this)
23
23
  };
24
- this.scroller = new Scroller({ element: element, datasource: datasource, consumer: consumer, workflow: this.getUpdater() });
24
+ this.scroller = new Scroller({
25
+ element: element,
26
+ datasource: datasource,
27
+ consumer: consumer,
28
+ workflow: this.getUpdater(),
29
+ Routines: Routines
30
+ });
25
31
  if (this.scroller.settings.initializeDelay) {
26
32
  this.initTimer = setTimeout(function () {
27
33
  _this.initTimer = null;
@@ -42,16 +48,13 @@ var Workflow = /** @class */ (function () {
42
48
  status: Status.start
43
49
  });
44
50
  // set up scroll event listener
45
- var scrollEventReceiver = this.scroller.viewport.scrollEventReceiver;
51
+ var routines = this.scroller.routines;
46
52
  var onScrollHandler = function (event) { return _this.callWorkflow({
47
53
  process: CommonProcess.scroll,
48
54
  status: Status.start,
49
55
  payload: { event: event }
50
56
  }); };
51
- scrollEventReceiver.addEventListener('scroll', onScrollHandler);
52
- this.disposeScrollEventHandler = function () {
53
- return scrollEventReceiver.removeEventListener('scroll', onScrollHandler);
54
- };
57
+ this.offScroll = routines.onScroll(onScrollHandler);
55
58
  };
56
59
  Workflow.prototype.changeItems = function (items) {
57
60
  this.propagateChanges(items);
@@ -79,7 +82,7 @@ var Workflow = /** @class */ (function () {
79
82
  '%cfire%c'
80
83
  ], ['color: #cc7777;', 'color: #000000;'], false), [
81
84
  process,
82
- "\"" + status + "\""
85
+ "\"".concat(status, "\"")
83
86
  ], false), __read((payload !== void 0 ? [payload] : [])), false); });
84
87
  }
85
88
  this.scroller.logger.logProcess(data);
@@ -135,7 +138,7 @@ var Workflow = /** @class */ (function () {
135
138
  workflow.call.interrupted = true;
136
139
  this.scroller.workflow = this.getUpdater();
137
140
  this.interruptionCount++;
138
- logger_1.log(function () { return "workflow had been interrupted by the " + process + " process (" + _this.interruptionCount + ")"; });
141
+ logger_1.log(function () { return "workflow had been interrupted by the ".concat(process, " process (").concat(_this.interruptionCount, ")"); });
139
142
  }
140
143
  if (datasource) { // Scroller re-initialization case
141
144
  this.scroller.adapter.relax(function () {
@@ -151,7 +154,7 @@ var Workflow = /** @class */ (function () {
151
154
  var _a = this.scroller, state = _a.state, logger = _a.logger;
152
155
  this.cyclesDone++;
153
156
  logger.logCycle(false);
154
- state.cycle.done(this.cyclesDone + 1);
157
+ state.endWorkflowCycle(this.cyclesDone + 1);
155
158
  this.finalize();
156
159
  };
157
160
  Workflow.prototype.dispose = function () {
@@ -159,7 +162,7 @@ var Workflow = /** @class */ (function () {
159
162
  if (this.initTimer) {
160
163
  clearTimeout(this.initTimer);
161
164
  }
162
- this.disposeScrollEventHandler();
165
+ this.offScroll();
163
166
  this.adapterRun$.dispose();
164
167
  this.scroller.dispose(true);
165
168
  Object.getOwnPropertyNames(this).forEach(function (prop) {
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/workflow.ts"],"names":[],"mappings":"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","sourcesContent":["import { Scroller } from './scroller';\nimport { runStateMachine } from './workflow-transducer';\nimport { Reactive } from './classes/reactive';\nimport { Item } from './classes/item';\nimport { CommonProcess, ProcessStatus as Status, } from './processes/index';\nimport {\n WorkflowParams,\n ProcessName,\n ProcessPayload,\n ProcessClass,\n ProcessSubject,\n WorkflowError,\n InterruptParams,\n StateMachineMethods,\n ScrollerWorkflow,\n} from './interfaces/index';\n\nexport class Workflow<ItemData = unknown> {\n\n isInitialized: boolean;\n initTimer: ReturnType<typeof setTimeout> | null;\n adapterRun$: Reactive<ProcessSubject>;\n cyclesDone: number;\n interruptionCount: number;\n errors: WorkflowError[];\n\n private disposeScrollEventHandler: () => void;\n readonly propagateChanges: WorkflowParams<ItemData>['run'];\n readonly stateMachineMethods: StateMachineMethods<ItemData>;\n\n scroller: Scroller<ItemData>;\n\n constructor({ element, datasource, consumer, run }: WorkflowParams<ItemData>) {\n this.isInitialized = false;\n this.initTimer = null;\n this.adapterRun$ = new Reactive();\n this.cyclesDone = 0;\n this.interruptionCount = 0;\n this.errors = [];\n this.disposeScrollEventHandler = () => null;\n this.propagateChanges = run;\n this.stateMachineMethods = {\n run: this.runProcess(),\n interrupt: this.interrupt.bind(this),\n done: this.done.bind(this),\n onError: this.onError.bind(this)\n };\n\n this.scroller = new Scroller<ItemData>({ element, datasource, consumer, workflow: this.getUpdater() });\n\n if (this.scroller.settings.initializeDelay) {\n this.initTimer = setTimeout(() => {\n this.initTimer = null;\n this.init();\n }, this.scroller.settings.initializeDelay);\n } else {\n this.init();\n }\n }\n\n init(): void {\n this.scroller.init(this.adapterRun$);\n this.isInitialized = true;\n\n // run the Workflow\n this.callWorkflow({\n process: CommonProcess.init,\n status: Status.start\n });\n\n // set up scroll event listener\n const { scrollEventReceiver } = this.scroller.viewport;\n const onScrollHandler: EventListener =\n event => this.callWorkflow({\n process: CommonProcess.scroll,\n status: Status.start,\n payload: { event }\n });\n scrollEventReceiver.addEventListener('scroll', onScrollHandler);\n this.disposeScrollEventHandler = () =>\n scrollEventReceiver.removeEventListener('scroll', onScrollHandler);\n }\n\n changeItems(items: Item<ItemData>[]): void {\n this.propagateChanges(items);\n }\n\n callWorkflow(processSubject: ProcessSubject): void {\n if (!this.isInitialized) {\n return;\n }\n const { process, status } = processSubject;\n if (process && process.startsWith('adapter') && status !== Status.next) {\n this.adapterRun$.set(processSubject);\n }\n this.process(processSubject);\n }\n\n getUpdater(): ScrollerWorkflow<ItemData> {\n return {\n call: this.callWorkflow.bind(this),\n onDataChanged: this.changeItems.bind(this),\n };\n }\n\n process(data: ProcessSubject): void {\n const { status, process, payload } = data;\n if (this.scroller.settings.logProcessRun) {\n this.scroller.logger.log(() => [\n '%cfire%c', ...['color: #cc7777;', 'color: #000000;'],\n process, `\"${status}\"`, ...(payload !== void 0 ? [payload] : [])\n ]);\n }\n this.scroller.logger.logProcess(data);\n\n if (process === CommonProcess.end) {\n this.scroller.finalize();\n }\n runStateMachine({\n input: data,\n methods: this.stateMachineMethods as StateMachineMethods<unknown>\n });\n }\n\n runProcess() {\n return ({ run, process, name }: ProcessClass) =>\n (...args: any[]): void => {\n if (this.scroller.settings.logProcessRun) {\n this.scroller.logger.log(() => [\n '%crun%c', ...['color: #333399;', 'color: #000000;'],\n process || name, ...args\n ]);\n }\n run(this.scroller as Scroller, ...args);\n };\n }\n\n onError(process: ProcessName, payload?: ProcessPayload): void {\n const message: string = payload && String(payload.error) || '';\n const { time, cycle } = this.scroller.state;\n this.errors.push({\n process,\n message,\n time,\n loop: cycle.loopIdNext\n });\n this.scroller.logger.logError(message);\n }\n\n interrupt({ process, finalize, datasource }: InterruptParams<ItemData>): void {\n if (finalize) {\n const { workflow, logger } = this.scroller;\n // we are going to create a new reference for the scroller.workflow object\n // calling the old version of the scroller.workflow by any outstanding async processes will be skipped\n workflow.call = (p: ProcessSubject) => // eslint-disable-line @typescript-eslint/no-unused-vars\n logger.log('[skip wf call]');\n workflow.call.interrupted = true;\n this.scroller.workflow = this.getUpdater();\n this.interruptionCount++;\n logger.log(() => `workflow had been interrupted by the ${process} process (${this.interruptionCount})`);\n }\n if (datasource) { // Scroller re-initialization case\n this.scroller.adapter.relax(() => {\n this.scroller.logger.log('new Scroller instantiation');\n const scroller = new Scroller<ItemData>({ datasource, scroller: this.scroller });\n this.scroller.dispose();\n this.scroller = scroller;\n this.scroller.init();\n });\n }\n }\n\n done(): void {\n const { state, logger } = this.scroller;\n this.cyclesDone++;\n logger.logCycle(false);\n state.cycle.done(this.cyclesDone + 1);\n this.finalize();\n }\n\n dispose(): void {\n if (this.initTimer) {\n clearTimeout(this.initTimer);\n }\n this.disposeScrollEventHandler();\n this.adapterRun$.dispose();\n this.scroller.dispose(true);\n Object.getOwnPropertyNames(this).forEach(prop => {\n delete (this as Record<string, unknown>)[prop];\n });\n }\n\n finalize(): void {\n }\n\n}\n"]}
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/workflow.ts"],"names":[],"mappings":"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","sourcesContent":["import { Scroller } from './scroller';\nimport { runStateMachine } from './workflow-transducer';\nimport { Reactive } from './classes/reactive';\nimport { Item } from './classes/item';\nimport { CommonProcess, ProcessStatus as Status, } from './processes/index';\nimport {\n WorkflowParams,\n ProcessName,\n ProcessPayload,\n ProcessClass,\n ProcessSubject,\n WorkflowError,\n InterruptParams,\n StateMachineMethods,\n ScrollerWorkflow,\n} from './interfaces/index';\n\nexport class Workflow<ItemData = unknown> {\n\n isInitialized: boolean;\n initTimer: ReturnType<typeof setTimeout> | null;\n adapterRun$: Reactive<ProcessSubject>;\n cyclesDone: number;\n interruptionCount: number;\n errors: WorkflowError[];\n\n private offScroll: () => void;\n readonly propagateChanges: WorkflowParams<ItemData>['run'];\n readonly stateMachineMethods: StateMachineMethods<ItemData>;\n\n scroller: Scroller<ItemData>;\n\n constructor({ element, datasource, consumer, run, Routines }: WorkflowParams<ItemData>) {\n this.isInitialized = false;\n this.initTimer = null;\n this.adapterRun$ = new Reactive();\n this.cyclesDone = 0;\n this.interruptionCount = 0;\n this.errors = [];\n this.offScroll = () => null;\n this.propagateChanges = run;\n this.stateMachineMethods = {\n run: this.runProcess(),\n interrupt: this.interrupt.bind(this),\n done: this.done.bind(this),\n onError: this.onError.bind(this)\n };\n\n this.scroller = new Scroller<ItemData>({\n element, datasource, consumer, workflow: this.getUpdater(), Routines\n });\n\n if (this.scroller.settings.initializeDelay) {\n this.initTimer = setTimeout(() => {\n this.initTimer = null;\n this.init();\n }, this.scroller.settings.initializeDelay);\n } else {\n this.init();\n }\n }\n\n init(): void {\n this.scroller.init(this.adapterRun$);\n this.isInitialized = true;\n\n // run the Workflow\n this.callWorkflow({\n process: CommonProcess.init,\n status: Status.start\n });\n\n // set up scroll event listener\n const { routines } = this.scroller;\n const onScrollHandler: EventListener =\n event => this.callWorkflow({\n process: CommonProcess.scroll,\n status: Status.start,\n payload: { event }\n });\n this.offScroll = routines.onScroll(onScrollHandler);\n }\n\n changeItems(items: Item<ItemData>[]): void {\n this.propagateChanges(items);\n }\n\n callWorkflow(processSubject: ProcessSubject): void {\n if (!this.isInitialized) {\n return;\n }\n const { process, status } = processSubject;\n if (process && process.startsWith('adapter') && status !== Status.next) {\n this.adapterRun$.set(processSubject);\n }\n this.process(processSubject);\n }\n\n getUpdater(): ScrollerWorkflow<ItemData> {\n return {\n call: this.callWorkflow.bind(this),\n onDataChanged: this.changeItems.bind(this),\n };\n }\n\n process(data: ProcessSubject): void {\n const { status, process, payload } = data;\n if (this.scroller.settings.logProcessRun) {\n this.scroller.logger.log(() => [\n '%cfire%c', ...['color: #cc7777;', 'color: #000000;'],\n process, `\"${status}\"`, ...(payload !== void 0 ? [payload] : [])\n ]);\n }\n this.scroller.logger.logProcess(data);\n\n if (process === CommonProcess.end) {\n this.scroller.finalize();\n }\n runStateMachine({\n input: data,\n methods: this.stateMachineMethods as StateMachineMethods<unknown>\n });\n }\n\n runProcess() {\n return ({ run, process, name }: ProcessClass) =>\n (...args: any[]): void => {\n if (this.scroller.settings.logProcessRun) {\n this.scroller.logger.log(() => [\n '%crun%c', ...['color: #333399;', 'color: #000000;'],\n process || name, ...args\n ]);\n }\n run(this.scroller as Scroller, ...args);\n };\n }\n\n onError(process: ProcessName, payload?: ProcessPayload): void {\n const message: string = payload && String(payload.error) || '';\n const { time, cycle } = this.scroller.state;\n this.errors.push({\n process,\n message,\n time,\n loop: cycle.loopIdNext\n });\n this.scroller.logger.logError(message);\n }\n\n interrupt({ process, finalize, datasource }: InterruptParams<ItemData>): void {\n if (finalize) {\n const { workflow, logger } = this.scroller;\n // we are going to create a new reference for the scroller.workflow object\n // calling the old version of the scroller.workflow by any outstanding async processes will be skipped\n workflow.call = (p: ProcessSubject) => // eslint-disable-line @typescript-eslint/no-unused-vars\n logger.log('[skip wf call]');\n workflow.call.interrupted = true;\n this.scroller.workflow = this.getUpdater();\n this.interruptionCount++;\n logger.log(() => `workflow had been interrupted by the ${process} process (${this.interruptionCount})`);\n }\n if (datasource) { // Scroller re-initialization case\n this.scroller.adapter.relax(() => {\n this.scroller.logger.log('new Scroller instantiation');\n const scroller = new Scroller<ItemData>({ datasource, scroller: this.scroller });\n this.scroller.dispose();\n this.scroller = scroller;\n this.scroller.init();\n });\n }\n }\n\n done(): void {\n const { state, logger } = this.scroller;\n this.cyclesDone++;\n logger.logCycle(false);\n state.endWorkflowCycle(this.cyclesDone + 1);\n this.finalize();\n }\n\n dispose(): void {\n if (this.initTimer) {\n clearTimeout(this.initTimer);\n }\n this.offScroll();\n this.adapterRun$.dispose();\n this.scroller.dispose(true);\n Object.getOwnPropertyNames(this).forEach(prop => {\n delete (this as Record<string, unknown>)[prop];\n });\n }\n\n finalize(): void {\n }\n\n}\n"]}
@@ -1,28 +1,33 @@
1
1
  import { Settings } from './settings';
2
2
  import { Direction } from '../inputs/index';
3
- export declare class Routines {
4
- readonly horizontal: boolean;
5
- readonly window: boolean;
6
- readonly viewport: HTMLElement | null;
7
- constructor(settings: Settings);
3
+ import { IRoutines, CustomRoutinesClass } from '../interfaces/index';
4
+ export declare class Routines implements IRoutines {
5
+ readonly settings: IRoutines['settings'];
6
+ readonly element: HTMLElement;
7
+ readonly viewport: HTMLElement;
8
+ constructor(element: HTMLElement, settings: Settings, CustomRoutines?: CustomRoutinesClass);
8
9
  checkElement(element: HTMLElement): void;
9
- getHostElement(element: HTMLElement): HTMLElement;
10
- getScrollEventReceiver(element: HTMLElement): HTMLElement | Window;
11
- setupScrollRestoration(): void;
12
- dismissOverflowAnchor(element: HTMLElement): void;
10
+ getViewportElement(): HTMLElement;
11
+ onInit(settings: Settings): void;
13
12
  findElementBySelector(element: HTMLElement, selector: string): HTMLElement | null;
14
- findPaddingElement(element: HTMLElement, direction: Direction): HTMLElement | null;
15
- findItemElement(element: HTMLElement, id: string): HTMLElement | null;
16
- getScrollPosition(element: HTMLElement): number;
17
- setScrollPosition(element: HTMLElement, value: number): void;
18
- getParams(element: HTMLElement, doNotBind?: boolean): DOMRect;
19
- getSize(element: HTMLElement, doNotBind?: boolean): number;
13
+ findPaddingElement(direction: Direction): HTMLElement | null;
14
+ findItemElement(id: string): HTMLElement | null;
15
+ getScrollPosition(): number;
16
+ setScrollPosition(value: number): void;
17
+ getElementParams(element: HTMLElement): DOMRect;
18
+ getWindowParams(): DOMRect;
19
+ getSize(element: HTMLElement): number;
20
+ getScrollerSize(): number;
21
+ getViewportSize(): number;
20
22
  getSizeStyle(element: HTMLElement): number;
21
23
  setSizeStyle(element: HTMLElement, value: number): void;
22
- getEdge(element: HTMLElement, direction: Direction, doNotBind?: boolean): number;
23
- getEdge2(element: HTMLElement, direction: Direction, relativeElement: HTMLElement, opposite: boolean): number;
24
+ getEdge(element: HTMLElement, direction: Direction): number;
25
+ getViewportEdge(direction: Direction): number;
24
26
  makeElementVisible(element: HTMLElement): void;
25
27
  hideElement(element: HTMLElement): void;
26
- getOffset(element: HTMLElement): number;
28
+ getOffset(): number;
27
29
  scrollTo(element: HTMLElement, argument?: boolean | ScrollIntoViewOptions): void;
30
+ render(cb: () => void): () => void;
31
+ animate(cb: () => void): () => void;
32
+ onScroll(handler: EventListener): () => void;
28
33
  }
@@ -10,7 +10,7 @@ export declare class Logger {
10
10
  readonly getWorkflowCycleData: () => string;
11
11
  readonly getLoopId: () => string;
12
12
  readonly getLoopIdNext: () => string;
13
- readonly getScrollPosition: (element: HTMLElement) => number;
13
+ readonly getScrollPosition: () => number;
14
14
  private logs;
15
15
  constructor(scroller: Scroller, packageInfo: IPackages, adapter?: {
16
16
  id: number;
@@ -5,7 +5,7 @@ export declare class Padding {
5
5
  element: HTMLElement;
6
6
  direction: Direction;
7
7
  routines: Routines;
8
- constructor(element: HTMLElement, direction: Direction, routines: Routines);
8
+ constructor(direction: Direction, routines: Routines);
9
9
  reset(size?: number): void;
10
10
  get size(): number;
11
11
  set size(value: number);
@@ -14,7 +14,7 @@ export declare class Paddings {
14
14
  settings: Settings;
15
15
  forward: Padding;
16
16
  backward: Padding;
17
- constructor(element: HTMLElement, routines: Routines, settings: Settings);
17
+ constructor(routines: Routines, settings: Settings);
18
18
  byDirection(direction: Direction, opposite?: boolean): Padding;
19
19
  reset(viewportSize: number, startIndex: number, offset: number): void;
20
20
  getPositiveSize(startIndex: number, viewportSize: number, offset: number): number;
@@ -22,8 +22,8 @@ export declare class WorkflowCycleModel {
22
22
  get loopId(): string;
23
23
  get loopIdNext(): string;
24
24
  constructor(instanceIndex: number, cycle?: WorkflowCycleModel);
25
- done(count: number): void;
26
25
  start(isInitial: boolean, initiator: ProcessName): void;
26
+ end(count: number): void;
27
27
  dispose(forever?: boolean): void;
28
28
  }
29
29
  export {};
@@ -2,7 +2,7 @@ export declare class RenderModel {
2
2
  sizeBefore: number;
3
3
  sizeAfter: number;
4
4
  positionBefore: number;
5
- renderTimer: ReturnType<typeof setTimeout> | null;
5
+ cancel: (() => void) | null;
6
6
  get noSize(): boolean;
7
7
  constructor();
8
8
  reset(): void;
@@ -1,16 +1,16 @@
1
- import { ScrollEventData as IScrollEventData, ScrollState as IScrollState } from '../../interfaces/index';
2
- export declare class ScrollState implements IScrollState {
1
+ import { ScrollEventData as IScrollEventData } from '../../interfaces/index';
2
+ export declare class ScrollModel {
3
3
  previous: IScrollEventData | null;
4
4
  current: IScrollEventData | null;
5
5
  scrollTimer: ReturnType<typeof setTimeout> | null;
6
6
  syntheticPosition: number | null;
7
7
  syntheticFulfill: boolean;
8
- animationFrameId: number;
8
+ cancelAnimation: (() => void) | null;
9
9
  positionBeforeAsync: number | null;
10
10
  positionBeforeAdjust: number | null;
11
11
  positionAfterAdjust: number | null;
12
12
  constructor();
13
13
  reset(): void;
14
- cleanupTimers(): void;
14
+ stop(): void;
15
15
  hasPositionChanged(position: number): boolean;
16
16
  }
@@ -3,7 +3,8 @@ import { WorkflowCycleModel } from './state/cycle';
3
3
  import { FetchModel } from './state/fetch';
4
4
  import { ClipModel } from './state/clip';
5
5
  import { RenderModel } from './state/render';
6
- import { State as IState, IPackages, ScrollState as IScrollState, ProcessName } from '../interfaces/index';
6
+ import { ScrollModel } from './state/scroll';
7
+ import { State as IState, IPackages, ProcessName } from '../interfaces/index';
7
8
  export declare class State implements IState {
8
9
  readonly packageInfo: IPackages;
9
10
  private settings;
@@ -12,13 +13,15 @@ export declare class State implements IState {
12
13
  fetch: FetchModel;
13
14
  clip: ClipModel;
14
15
  render: RenderModel;
15
- scrollState: IScrollState;
16
+ scroll: ScrollModel;
16
17
  get time(): number;
17
18
  constructor(packageInfo: IPackages, settings: Settings, state?: IState);
18
- endInnerLoop(): void;
19
+ startWorkflowCycle(isInitial: boolean, initiator: ProcessName): void;
20
+ endWorkflowCycle(count: number): void;
19
21
  startInnerLoop(): {
20
22
  process?: ProcessName;
21
23
  doRender?: boolean;
22
24
  };
25
+ endInnerLoop(): void;
23
26
  dispose(): void;
24
27
  }
@@ -8,20 +8,18 @@ import { Direction } from '../inputs/index';
8
8
  export declare class Viewport {
9
9
  offset: number;
10
10
  paddings: Paddings;
11
- readonly element: HTMLElement;
12
11
  readonly settings: Settings;
13
12
  readonly routines: Routines;
14
13
  readonly state: State;
15
14
  readonly logger: Logger;
16
- readonly hostElement: HTMLElement;
17
- readonly scrollEventReceiver: HTMLElement | Window;
18
- constructor(element: HTMLElement, settings: Settings, routines: Routines, state: State, logger: Logger);
15
+ constructor(settings: Settings, routines: Routines, state: State, logger: Logger);
19
16
  reset(startIndex: number): void;
20
17
  setPosition(value: number): number;
21
18
  get scrollPosition(): number;
22
19
  set scrollPosition(value: number);
23
20
  getSize(): number;
24
21
  getScrollableSize(): number;
22
+ getMaxScrollPosition(): number;
25
23
  getBufferPadding(): number;
26
24
  getEdge(direction: Direction): number;
27
25
  setOffset(): void;
@@ -4,6 +4,6 @@ import packageInfo from './version';
4
4
  import { INVALID_DATASOURCE_PREFIX } from './scroller';
5
5
  import { AdapterPropName, EMPTY_ITEM, getDefaultAdapterProps } from './classes/adapter/props';
6
6
  import { Direction, SizeStrategy } from './inputs/index';
7
- import { IDatasource, IDatasourceConstructed, IReactivePropConfig, IAdapterConfig, ItemAdapter, IAdapter, Item } from './interfaces/index';
7
+ import { IDatasource, IDatasourceConstructed, IRoutines, IReactivePropConfig, IAdapterConfig, ItemAdapter, IAdapter, Item } from './interfaces/index';
8
8
  export { Workflow, makeDatasource, packageInfo, INVALID_DATASOURCE_PREFIX, AdapterPropName, EMPTY_ITEM, getDefaultAdapterProps, Direction, SizeStrategy, };
9
- export { IDatasource, IDatasourceConstructed, IReactivePropConfig, IAdapterConfig, ItemAdapter as IAdapterItem, IAdapter, Item, };
9
+ export { IDatasource, IDatasourceConstructed, IRoutines, IReactivePropConfig, IAdapterConfig, ItemAdapter as IAdapterItem, IAdapter, Item, };
@@ -3,7 +3,8 @@ import { OnDataChanged, WorkflowParams, ScrollerWorkflow, ScrollerParams, Workfl
3
3
  import { Item } from './item';
4
4
  import { IReactivePropConfig, IReactivePropsConfig, IReactivePropsStore, IAdapterConfig, IAdapterProp, ItemAdapter, ItemsPredicate, ItemsUpdater, ItemsProcessor, BufferUpdater, IPackage, IPackages, IBufferInfo, IAdapterInput, AdapterAppendOptions, AdapterPrependOptions, AdapterRemoveOptions, AdapterClipOptions, AdapterInsertOptions, AdapterReplaceOptions, AdapterUpdateOptions, AdapterFixOptions, AdapterMethodResult, IAdapter } from './adapter';
5
5
  import { Settings, DevSettings } from './settings';
6
- import { ScrollEventData, ScrollState, State } from './state';
6
+ import { IRoutines, CustomRoutinesClass } from './routines';
7
+ import { ScrollEventData, State } from './state';
7
8
  import { ProcessName, ProcessClass, ProcessPayload, ProcessSubject, AdapterProcessMap, IBaseProcess, IBaseAdapterProcess } from './process';
8
9
  import { ValidatedValue, IValidator, ICommonProp, ICommonProps, IValidatedCommonProps, IValidatedData } from './validation';
9
- export { ObservableLike, DatasourceGet, IDatasourceOptional, IDatasource, IDatasourceConstructed, OnDataChanged, WorkflowParams, ScrollerWorkflow, ScrollerParams, WorkflowGetter, WorkflowError, InterruptParams, StateMachineMethods, StateMachineParams, Item, IReactivePropConfig, IReactivePropsConfig, IReactivePropsStore, IAdapterConfig, IAdapterProp, ItemAdapter, AdapterMethodResult, IAdapter, ItemsPredicate, ItemsUpdater, ItemsProcessor, BufferUpdater, IPackage, IPackages, IBufferInfo, IAdapterInput, AdapterAppendOptions, AdapterPrependOptions, AdapterRemoveOptions, AdapterClipOptions, AdapterInsertOptions, AdapterReplaceOptions, AdapterUpdateOptions, AdapterFixOptions, Settings, DevSettings, ScrollEventData, ScrollState, State, ProcessName, ProcessClass, ProcessPayload, ProcessSubject, AdapterProcessMap, IBaseProcess, IBaseAdapterProcess, ValidatedValue, IValidator, ICommonProp, ICommonProps, IValidatedCommonProps, IValidatedData, };
10
+ export { ObservableLike, DatasourceGet, IDatasourceOptional, IDatasource, IDatasourceConstructed, OnDataChanged, WorkflowParams, ScrollerWorkflow, ScrollerParams, WorkflowGetter, WorkflowError, InterruptParams, StateMachineMethods, StateMachineParams, Item, IReactivePropConfig, IReactivePropsConfig, IReactivePropsStore, IAdapterConfig, IAdapterProp, ItemAdapter, AdapterMethodResult, IAdapter, ItemsPredicate, ItemsUpdater, ItemsProcessor, BufferUpdater, IPackage, IPackages, IBufferInfo, IAdapterInput, AdapterAppendOptions, AdapterPrependOptions, AdapterRemoveOptions, AdapterClipOptions, AdapterInsertOptions, AdapterReplaceOptions, AdapterUpdateOptions, AdapterFixOptions, Settings, DevSettings, IRoutines, CustomRoutinesClass, ScrollEventData, State, ProcessName, ProcessClass, ProcessPayload, ProcessSubject, AdapterProcessMap, IBaseProcess, IBaseAdapterProcess, ValidatedValue, IValidator, ICommonProp, ICommonProps, IValidatedCommonProps, IValidatedData, };
@@ -0,0 +1,157 @@
1
+ import { Settings } from '../classes/settings';
2
+ import { Direction } from '../inputs/index';
3
+ interface IRoutinesSettings {
4
+ /** The scroller's viewport element defined by the app settings.
5
+ * The value is equal to settings.viewport and thus can be null.
6
+ */
7
+ viewport: HTMLElement | null;
8
+ /** Determines wether the scroller is horizontal-oriented or not.
9
+ * The value is equal to settings.horizontal.
10
+ */
11
+ horizontal: boolean;
12
+ /** Determines wether the entire window is the scroller's viewport or not.
13
+ * The value is equal to settings.window.
14
+ */
15
+ window: boolean;
16
+ }
17
+ export interface IRoutines {
18
+ /** Internal prop that is available after instantiation.
19
+ * Reduced version of the App settings object.
20
+ */
21
+ readonly settings: IRoutinesSettings;
22
+ /** Internal prop that is available after instantiation.
23
+ * The scroller's element that comes from the end App.
24
+ */
25
+ readonly element: HTMLElement;
26
+ /** Internal prop that is available after instantiation.
27
+ * The scroller's viewport element.
28
+ * The "getViewportElement" method is responsible for the value.
29
+ */
30
+ readonly viewport: HTMLElement;
31
+ /** Checks HTML element. Should throw error if it's not valid.
32
+ * @param {HTMLElement} element HTML element to check.
33
+ */
34
+ checkElement: (element: HTMLElement) => void;
35
+ /** Gets the viewport element based on the internal props:
36
+ * "settings.viewport", "settings.window" and "element".
37
+ * This method is being called during Routines instantiation
38
+ * to determine the "viewport" prop:
39
+ *
40
+ * this.viewport = this.getViewportElement();
41
+ * @returns {HTMLElement} HTML element.
42
+ */
43
+ getViewportElement: () => HTMLElement;
44
+ /** This method is being called in the end of Routines instantiation.
45
+ * @param {Settings} settings Unreduced Scroller's settings object.
46
+ */
47
+ onInit: (settings: Settings) => void;
48
+ /** Finds element by CSS selector.
49
+ * @param {HTMLElement} element Top of the elements hierarchy to search.
50
+ * @param {string} selector CSS selector.
51
+ * @returns {HTMLElement | null} The first HTML element that matches the specified selector, or null.
52
+ */
53
+ findElementBySelector: (element: HTMLElement, selector: string) => HTMLElement | null;
54
+ /** Finds padding element.
55
+ * @param {'backward' | 'forward'} direction Search direction: backward or forward.
56
+ * @returns {HTMLElement | null} HTML padding element, or null.
57
+ */
58
+ findPaddingElement: (direction: Direction) => HTMLElement | null;
59
+ /** Finds single item element by its id.
60
+ * @param {string} id Id of the element to search.
61
+ * @returns {HTMLElement | null} HTML item element, or null.
62
+ */
63
+ findItemElement: (id: string) => HTMLElement | null;
64
+ /** Gets scroll position of the viewport. Internal settings should be taken into account.
65
+ * @returns {number} Scroll position value.
66
+ */
67
+ getScrollPosition: () => number;
68
+ /** Sets scroll position of the viewport. Internal settings should be taken into account.
69
+ * @param {number} value Scroll position value.
70
+ */
71
+ setScrollPosition: (value: number) => void;
72
+ /** Gets the size of the element and its position relative to the viewport.
73
+ * @param {HTMLElement} element
74
+ * @returns {DOMRect} DOMRect object.
75
+ */
76
+ getElementParams: (element: HTMLElement) => DOMRect;
77
+ /** Gets params of the host element in case the "window" setting is set to true.
78
+ * @returns {DOMRect} DOMRect object.
79
+ */
80
+ getWindowParams: () => DOMRect;
81
+ /** Gets size of the element. Internal props should be taken into account.
82
+ * For example, if horizontal = false, then the element's height is needed.
83
+ * If horizontal = true, then the element's width is needed.
84
+ * @param {HTMLElement} element
85
+ * @returns {DOMRect} DOMRect object.
86
+ */
87
+ getSize: (element: HTMLElement) => number;
88
+ /** Gets size of the scroller element.
89
+ * @returns {DOMRect} DOMRect object.
90
+ */
91
+ getScrollerSize: () => number;
92
+ /** Gets size of the viewport.
93
+ * @returns {DOMRect} DOMRect object.
94
+ */
95
+ getViewportSize: () => number;
96
+ /** Gets size of the element. Internal settings ("horizontal") should be taken into account.
97
+ * This method should work in the same way as "setSizeStyle" does.
98
+ * @param {HTMLElement} element
99
+ * @returns {number} Numeric value.
100
+ */
101
+ getSizeStyle: (element: HTMLElement) => number;
102
+ /** Sets size of the element. Internal settings ("horizontal") should be taken into account.
103
+ * This method should work in the same way as "getSizeStyle" does.
104
+ * @param {HTMLElement} element
105
+ * @param {number} value Numeric value to be new element's size.
106
+ */
107
+ setSizeStyle: (element: HTMLElement, value: number) => void;
108
+ /** Gets the edge coordinate of the element. Internal settings ("horizontal") should be taken into account.
109
+ * For example, if horizontal = false and direction = "backward" then the element's top coordinate is needed.
110
+ * If horizontal = true and direction = "forward" then the element's right coordinate is needed.
111
+ * @param {HTMLElement} element
112
+ * @param {'backward' | 'forward'} direction
113
+ * @returns {number} Numeric value.
114
+ */
115
+ getEdge: (element: HTMLElement, direction: Direction) => number;
116
+ /** Gets the edge coordinate of the viewport. Internal settings should be taken into account.
117
+ * @param {'backward' | 'forward'} direction
118
+ * @returns {number} Numeric value.
119
+ */
120
+ getViewportEdge: (direction: Direction) => number;
121
+ /** Makes the element visible in the same way as the external Workflow.run method makes it invisible.
122
+ * @param {HTMLElement} element
123
+ */
124
+ makeElementVisible: (element: HTMLElement) => void;
125
+ /** Hides the element. This method is being called before remove and has no connection with makeElementVisible.
126
+ * @param {HTMLElement} element
127
+ */
128
+ hideElement: (element: HTMLElement) => void;
129
+ /** Gets scroller's offset.
130
+ * @returns {number} Numeric value.
131
+ */
132
+ getOffset: () => number;
133
+ /** Scrolls into the element's view.
134
+ * @param {HTMLElement} element
135
+ * @param {boolean | ScrollIntoViewOptions} argument
136
+ */
137
+ scrollTo: (element: HTMLElement, argument?: boolean | ScrollIntoViewOptions) => void;
138
+ /** Wraps rendering. Runs render process and calls the argument function when it is done.
139
+ * @param {function} cb
140
+ * @returns {function} Callback to dismiss render and prevent the argument function to be invoked.
141
+ */
142
+ render: (cb: () => void) => () => void;
143
+ /** Wraps animation. Runs animations process and calls the argument function when it is done.
144
+ * @param {function} cb
145
+ * @returns {function} Callback to dismiss animation and prevent the argument function to be invoked.
146
+ */
147
+ animate: (cb: () => void) => () => void;
148
+ /** Provides scroll event listening. Invokes the function argument each time the scroll event fires.
149
+ * @param {EventListener} handler
150
+ * @returns {function} Callback to dismiss scroll event listener.
151
+ */
152
+ onScroll: (handler: EventListener) => () => void;
153
+ }
154
+ export declare type CustomRoutinesClass = {
155
+ new (element: HTMLElement, settings: IRoutinesSettings): Partial<IRoutines>;
156
+ };
157
+ export {};
@@ -3,26 +3,13 @@ import { WorkflowCycleModel } from '../classes/state/cycle';
3
3
  import { FetchModel } from '../classes/state/fetch';
4
4
  import { ClipModel } from '../classes/state/clip';
5
5
  import { RenderModel } from '../classes/state/render';
6
+ import { ScrollModel } from '../classes/state/scroll';
6
7
  import { IPackages } from './adapter';
7
8
  export interface ScrollEventData {
8
9
  time: number;
9
10
  position: number;
10
11
  direction: Direction | null;
11
12
  }
12
- export interface ScrollState {
13
- previous: ScrollEventData | null;
14
- current: ScrollEventData | null;
15
- scrollTimer: ReturnType<typeof setTimeout> | null;
16
- syntheticPosition: number | null;
17
- syntheticFulfill: boolean;
18
- animationFrameId: number;
19
- positionBeforeAsync: number | null;
20
- positionBeforeAdjust: number | null;
21
- positionAfterAdjust: number | null;
22
- reset: () => void;
23
- cleanupTimers: () => void;
24
- hasPositionChanged: (position: number) => boolean;
25
- }
26
13
  export interface State {
27
14
  packageInfo: IPackages;
28
15
  initTime: number;
@@ -30,6 +17,6 @@ export interface State {
30
17
  fetch: FetchModel;
31
18
  clip: ClipModel;
32
19
  render: RenderModel;
33
- scrollState: ScrollState;
20
+ scroll: ScrollModel;
34
21
  time: number;
35
22
  }
@@ -2,6 +2,7 @@ import { ProcessClass, ProcessName, ProcessPayload, ProcessSubject } from './pro
2
2
  import { IDatasource } from './datasource';
3
3
  import { IPackage } from './adapter';
4
4
  import { Item } from '../classes/item';
5
+ import { CustomRoutinesClass } from './routines';
5
6
  import { Scroller } from '../scroller';
6
7
  export declare type OnDataChanged<Data> = (items: Item<Data>[]) => void;
7
8
  export interface WorkflowParams<ItemData> {
@@ -9,6 +10,7 @@ export interface WorkflowParams<ItemData> {
9
10
  consumer: IPackage;
10
11
  element: HTMLElement;
11
12
  run: OnDataChanged<ItemData>;
13
+ Routines?: CustomRoutinesClass;
12
14
  }
13
15
  interface CallWorkflow {
14
16
  (process: ProcessSubject): void;
@@ -23,6 +25,7 @@ export interface ScrollerParams<ItemData> {
23
25
  consumer?: IPackage;
24
26
  element?: HTMLElement;
25
27
  workflow?: ScrollerWorkflow<ItemData>;
28
+ Routines?: CustomRoutinesClass;
26
29
  scroller?: Scroller<ItemData>;
27
30
  }
28
31
  export declare type WorkflowGetter<ItemData> = () => ScrollerWorkflow<ItemData>;
@@ -4,6 +4,7 @@ export default class Adjust extends Adjust_base {
4
4
  static run(scroller: Scroller): void;
5
5
  static setPaddings(scroller: Scroller): void;
6
6
  static calculatePosition(scroller: Scroller): number;
7
+ static setAdditionalForwardPadding(scroller: Scroller, position: number): void;
7
8
  static setPosition(scroller: Scroller, position: number, done: () => void): void;
8
9
  }
9
10
  export {};
@@ -6,7 +6,6 @@ export default class End extends End_base {
6
6
  error?: unknown;
7
7
  }): void;
8
8
  static calculateParams(scroller: Scroller, workflow: ScrollerWorkflow): void;
9
- static finalizeInnerLoop(scroller: Scroller, error: unknown): boolean;
10
- static getNext(scroller: Scroller): boolean;
9
+ static shouldContinueRun(scroller: Scroller, error: unknown): boolean;
11
10
  }
12
11
  export {};