vscroll 1.5.6 → 1.6.0-beta.2

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 (72) hide show
  1. package/README.md +31 -19
  2. package/dist/bundles/vscroll.esm5.js +108 -76
  3. package/dist/bundles/vscroll.esm5.js.map +1 -1
  4. package/dist/bundles/vscroll.esm5.min.js +2 -2
  5. package/dist/bundles/vscroll.esm5.min.js.map +1 -1
  6. package/dist/bundles/vscroll.esm6.js +79 -43
  7. package/dist/bundles/vscroll.esm6.js.map +1 -1
  8. package/dist/bundles/vscroll.esm6.min.js +2 -2
  9. package/dist/bundles/vscroll.esm6.min.js.map +1 -1
  10. package/dist/bundles/vscroll.umd.js +109 -76
  11. package/dist/bundles/vscroll.umd.js.map +1 -1
  12. package/dist/bundles/vscroll.umd.min.js +2 -2
  13. package/dist/bundles/vscroll.umd.min.js.map +1 -1
  14. package/dist/esm2015/classes/datasource.js +2 -6
  15. package/dist/esm2015/classes/datasource.js.map +1 -1
  16. package/dist/esm2015/classes/domRoutines.js +7 -12
  17. package/dist/esm2015/classes/domRoutines.js.map +1 -1
  18. package/dist/esm2015/index.js +2 -1
  19. package/dist/esm2015/index.js.map +1 -1
  20. package/dist/esm2015/inputs/index.js +2 -1
  21. package/dist/esm2015/inputs/index.js.map +1 -1
  22. package/dist/esm2015/inputs/validation.js +2 -2
  23. package/dist/esm2015/inputs/validation.js.map +1 -1
  24. package/dist/esm2015/inputs/workflow.js +31 -0
  25. package/dist/esm2015/inputs/workflow.js.map +1 -0
  26. package/dist/esm2015/interfaces/datasource.js.map +1 -1
  27. package/dist/esm2015/interfaces/index.js.map +1 -1
  28. package/dist/esm2015/interfaces/routines.js.map +1 -1
  29. package/dist/esm2015/interfaces/workflow.js.map +1 -1
  30. package/dist/esm2015/processes/render.js +2 -2
  31. package/dist/esm2015/processes/render.js.map +1 -1
  32. package/dist/esm2015/scroller.js +11 -1
  33. package/dist/esm2015/scroller.js.map +1 -1
  34. package/dist/esm2015/version.js +1 -1
  35. package/dist/esm2015/version.js.map +1 -1
  36. package/dist/esm2015/workflow.js +7 -1
  37. package/dist/esm2015/workflow.js.map +1 -1
  38. package/dist/esm5/classes/datasource.js +2 -6
  39. package/dist/esm5/classes/datasource.js.map +1 -1
  40. package/dist/esm5/classes/domRoutines.js +7 -23
  41. package/dist/esm5/classes/domRoutines.js.map +1 -1
  42. package/dist/esm5/index.js +2 -1
  43. package/dist/esm5/index.js.map +1 -1
  44. package/dist/esm5/inputs/index.js +2 -1
  45. package/dist/esm5/inputs/index.js.map +1 -1
  46. package/dist/esm5/inputs/validation.js +2 -2
  47. package/dist/esm5/inputs/validation.js.map +1 -1
  48. package/dist/esm5/inputs/workflow.js +32 -0
  49. package/dist/esm5/inputs/workflow.js.map +1 -0
  50. package/dist/esm5/interfaces/datasource.js.map +1 -1
  51. package/dist/esm5/interfaces/index.js.map +1 -1
  52. package/dist/esm5/interfaces/routines.js.map +1 -1
  53. package/dist/esm5/interfaces/workflow.js.map +1 -1
  54. package/dist/esm5/processes/render.js +2 -2
  55. package/dist/esm5/processes/render.js.map +1 -1
  56. package/dist/esm5/scroller.js +19 -1
  57. package/dist/esm5/scroller.js.map +1 -1
  58. package/dist/esm5/version.js +1 -1
  59. package/dist/esm5/version.js.map +1 -1
  60. package/dist/esm5/workflow.js +7 -2
  61. package/dist/esm5/workflow.js.map +1 -1
  62. package/dist/typings/classes/datasource.d.ts +4 -20
  63. package/dist/typings/classes/domRoutines.d.ts +6 -3
  64. package/dist/typings/index.d.ts +2 -1
  65. package/dist/typings/inputs/index.d.ts +2 -1
  66. package/dist/typings/inputs/workflow.d.ts +9 -0
  67. package/dist/typings/interfaces/datasource.d.ts +6 -4
  68. package/dist/typings/interfaces/index.d.ts +3 -3
  69. package/dist/typings/interfaces/routines.d.ts +15 -6
  70. package/dist/typings/interfaces/workflow.d.ts +3 -3
  71. package/dist/typings/workflow.d.ts +1 -1
  72. package/package.json +1 -1
package/README.md CHANGED
@@ -69,7 +69,7 @@ interface WorkflowParams<ItemData> {
69
69
  element: HTMLElement;
70
70
  datasource: IDatasource<ItemData>;
71
71
  run: OnDataChanged<ItemData>;
72
- Routines?: CustomRoutinesClass;
72
+ Routines?: RoutinesClassType;
73
73
  }
74
74
  ```
75
75
 
@@ -153,7 +153,7 @@ For more solid understanding the concept of the Datasource with examples, please
153
153
  A callback that is called every time the Workflow decides that the UI needs to be changed. Its argument is a list of items to be present in the UI. This is a consumer responsibility to detect changes and display them in the UI.
154
154
 
155
155
  ```js
156
- run: (newItems) => {
156
+ const run = newItems => {
157
157
  // assume oldItems contains a list of items that are currently present in the UI
158
158
  if (!newItems.length && !oldItems.length) {
159
159
  return;
@@ -186,37 +186,49 @@ There are some requirements on how the items should be processed by `run` call:
186
186
 
187
187
  ### 5. Routines
188
188
 
189
- A special class allowing to override the default behavior related to the DOM. All DOM-specific operations are implemented as the [DOM Routines class](https://github.com/dhilt/vscroll/blob/v1.5.0/src/classes/domRoutines.ts) methods inside core. When the `Routines` class setting is passed among the Workflow arguments, its methods override the base class methods. The Routines methods description can be taken from the [IRoutines interface](https://github.com/dhilt/vscroll/blob/v1.5.0/src/interfaces/routines.ts) sources. For example, there is a method that throws an error if its argument is not an HTML element:
189
+ A special class allowing to override the default behavior related to the DOM. All DOM-specific operations are implemented as the [DOM Routines class](https://github.com/dhilt/vscroll/blob/v1.5.0/src/classes/domRoutines.ts) methods inside core. When the `Routines` class setting is passed among the Workflow arguments, it replaces the core Routines. The custom Routines class must extend the core class, which can be taken from the VScroll imports:
190
+
191
+ ```js
192
+ import { Routines, Workflow } from 'vscroll';
193
+
194
+ class CustomRoutines extends Routines { ... }
195
+
196
+ new Workflow({
197
+ // consumer, element, datasource, run,
198
+ Routines: CustomRoutines
199
+ })
200
+ ```
201
+
202
+ The Routines methods description can be taken from the [IRoutines interface](https://github.com/dhilt/vscroll/blob/v1.5.0/src/interfaces/routines.ts) sources. For example, there is a method that calculates the scroller's offset:
190
203
 
191
204
  ```typescript
192
- checkElement(element: HTMLElement): void {
193
- if (!element) {
194
- throw new Error('HTML element is not defined');
195
- }
205
+ getOffset(): number {
206
+ const get = (element: HTMLElement) =>
207
+ (this.settings.horizontal ? element.offsetLeft : element.offsetTop) || 0;
208
+ return get(this.element) - (!this.settings.window ? get(this.viewport) : 0);
196
209
  }
197
210
  ```
198
211
 
199
- With the `Routines` class setting it can be overridden as follows:
212
+ If we have a table layout case where we need to specify the offset of the table header, the base method can be overridden as follows:
200
213
 
201
214
  ```js
202
- new Workflow({
203
- consumer, element, datasource, run,
204
- Routines: class {
205
- checkElement(element) {
206
- if (!element || typeof element.querySelector !== 'function') {
207
- throw new Error('Fatal: expecting HTML element');
208
- }
215
+ new Workflow({
216
+ // consumer, element, datasource, run,
217
+ Routines: class extends Routines {
218
+ getOffset(element) {
219
+ return document.querySelector('#viewport thead')?.offsetHeight || 0;
209
220
  }
210
221
  }
211
222
  });
212
223
  ```
213
224
 
214
- Another example is the table layout case where we need to specify the offset of the table header:
225
+ It's worth noting that thanks to the extending, we can use parent methods and have access to the correct context after the engine instantiates the Routines:
215
226
 
216
227
  ```js
217
- const Routines = class {
218
- getOffset() {
219
- return document.querySelector('#viewport thead')?.offsetHeight || 0;
228
+ class CustomRoutines extends Routines {
229
+ onInit(...args) {
230
+ console.log('Routines settings:', this.settings);
231
+ super.onInit(...args);
220
232
  }
221
233
  }
222
234
  ```
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * vscroll (https://github.com/dhilt/vscroll) FESM5
3
- * Version: 1.5.6 (2023-11-22T18:31:58.626Z)
3
+ * Version: 1.6.0-beta.2 (2023-12-02T15:09:23.845Z)
4
4
  * Author: Denis Hilt
5
5
  * License: MIT
6
6
  */
@@ -345,7 +345,7 @@ var reactiveConfigStorage = new Map();
345
345
 
346
346
  var core = {
347
347
  name: 'vscroll',
348
- version: '1.5.6'
348
+ version: '1.6.0-beta.2'
349
349
  };
350
350
 
351
351
  var getBox = function (id) {
@@ -426,12 +426,8 @@ var AdapterContext = /** @class */ (function () {
426
426
  var DatasourceGeneric = /** @class */ (function () {
427
427
  function DatasourceGeneric(datasource, config) {
428
428
  this.get = datasource.get;
429
- if (datasource.settings) {
430
- this.settings = datasource.settings;
431
- }
432
- if (datasource.devSettings) {
433
- this.devSettings = datasource.devSettings;
434
- }
429
+ this.settings = datasource.settings;
430
+ this.devSettings = datasource.devSettings;
435
431
  var adapterContext = new AdapterContext(config || { mock: false });
436
432
  this.adapter = adapterContext;
437
433
  }
@@ -558,14 +554,14 @@ var onBoolean = function (value) {
558
554
  };
559
555
  var onObject = function (value) {
560
556
  var errors = [];
561
- if (Object.prototype.toString.call(value) !== '[object Object]') {
557
+ if (!value || Object.prototype.toString.call(value) !== '[object Object]') {
562
558
  errors.push(ValidatorType.object);
563
559
  }
564
560
  return { value: value, isSet: true, isValid: !errors.length, errors: errors };
565
561
  };
566
562
  var onHtmlElement = function (value) {
567
563
  var errors = [];
568
- if (!(value instanceof Element) && !(value instanceof HTMLDocument)) {
564
+ if (!(value instanceof Element) && !(value instanceof Document)) {
569
565
  errors.push(ValidatorType.element);
570
566
  }
571
567
  return { value: value, isSet: true, isValid: !errors.length, errors: errors };
@@ -858,29 +854,29 @@ var validate = function (context, params) {
858
854
  return data;
859
855
  };
860
856
 
861
- var _a$3;
862
- var OBJECT$1 = VALIDATORS.OBJECT, FUNC_WITH_X_AND_MORE_ARGUMENTS$1 = VALIDATORS.FUNC_WITH_X_AND_MORE_ARGUMENTS;
857
+ var _a$4;
858
+ var OBJECT$2 = VALIDATORS.OBJECT, FUNC_WITH_X_AND_MORE_ARGUMENTS$1 = VALIDATORS.FUNC_WITH_X_AND_MORE_ARGUMENTS;
863
859
  var DatasourceProps;
864
860
  (function (DatasourceProps) {
865
861
  DatasourceProps["get"] = "get";
866
862
  DatasourceProps["settings"] = "settings";
867
863
  DatasourceProps["devSettings"] = "devSettings";
868
864
  })(DatasourceProps || (DatasourceProps = {}));
869
- var DATASOURCE = (_a$3 = {},
870
- _a$3[DatasourceProps.get] = {
865
+ var DATASOURCE = (_a$4 = {},
866
+ _a$4[DatasourceProps.get] = {
871
867
  validators: [FUNC_WITH_X_AND_MORE_ARGUMENTS$1(2)],
872
868
  mandatory: true
873
869
  },
874
- _a$3[DatasourceProps.settings] = {
875
- validators: [OBJECT$1]
870
+ _a$4[DatasourceProps.settings] = {
871
+ validators: [OBJECT$2]
876
872
  },
877
- _a$3[DatasourceProps.devSettings] = {
878
- validators: [OBJECT$1]
873
+ _a$4[DatasourceProps.devSettings] = {
874
+ validators: [OBJECT$2]
879
875
  },
880
- _a$3);
876
+ _a$4);
881
877
 
882
- var _a$2, _b$2, _c$1;
883
- var NUMBER = VALIDATORS.NUMBER, INTEGER$1 = VALIDATORS.INTEGER, INTEGER_UNLIMITED$1 = VALIDATORS.INTEGER_UNLIMITED, MORE_OR_EQUAL = VALIDATORS.MORE_OR_EQUAL, BOOLEAN$1 = VALIDATORS.BOOLEAN, ELEMENT = VALIDATORS.ELEMENT, FUNC = VALIDATORS.FUNC, OR$1 = VALIDATORS.OR, ENUM = VALIDATORS.ENUM;
878
+ var _a$3, _b$2, _c$1;
879
+ var NUMBER = VALIDATORS.NUMBER, INTEGER$1 = VALIDATORS.INTEGER, INTEGER_UNLIMITED$1 = VALIDATORS.INTEGER_UNLIMITED, MORE_OR_EQUAL = VALIDATORS.MORE_OR_EQUAL, BOOLEAN$1 = VALIDATORS.BOOLEAN, ELEMENT$1 = VALIDATORS.ELEMENT, FUNC$1 = VALIDATORS.FUNC, OR$1 = VALIDATORS.OR, ENUM = VALIDATORS.ENUM;
884
880
  var Settings$1;
885
881
  (function (Settings) {
886
882
  Settings["adapter"] = "adapter";
@@ -912,14 +908,14 @@ var DevSettings;
912
908
  DevSettings["dismissOverflowAnchor"] = "dismissOverflowAnchor";
913
909
  DevSettings["directionPriority"] = "directionPriority";
914
910
  })(DevSettings || (DevSettings = {}));
915
- var MIN = (_a$2 = {},
916
- _a$2[Settings$1.itemSize] = 1,
917
- _a$2[Settings$1.bufferSize] = 1,
918
- _a$2[Settings$1.padding] = 0.01,
919
- _a$2[DevSettings.throttle] = 0,
920
- _a$2[DevSettings.initDelay] = 0,
921
- _a$2[DevSettings.initWindowDelay] = 0,
922
- _a$2);
911
+ var MIN = (_a$3 = {},
912
+ _a$3[Settings$1.itemSize] = 1,
913
+ _a$3[Settings$1.bufferSize] = 1,
914
+ _a$3[Settings$1.padding] = 0.01,
915
+ _a$3[DevSettings.throttle] = 0,
916
+ _a$3[DevSettings.initDelay] = 0,
917
+ _a$3[DevSettings.initWindowDelay] = 0,
918
+ _a$3);
923
919
  var SETTINGS = (_b$2 = {},
924
920
  _b$2[Settings$1.adapter] = {
925
921
  validators: [BOOLEAN$1],
@@ -962,7 +958,7 @@ var SETTINGS = (_b$2 = {},
962
958
  defaultValue: false
963
959
  },
964
960
  _b$2[Settings$1.viewportElement] = {
965
- validators: [OR$1([ELEMENT, FUNC])],
961
+ validators: [OR$1([ELEMENT$1, FUNC$1])],
966
962
  defaultValue: null
967
963
  },
968
964
  _b$2[Settings$1.inverse] = {
@@ -970,7 +966,7 @@ var SETTINGS = (_b$2 = {},
970
966
  defaultValue: false
971
967
  },
972
968
  _b$2[Settings$1.onBeforeClip] = {
973
- validators: [FUNC],
969
+ validators: [FUNC$1],
974
970
  defaultValue: null
975
971
  },
976
972
  _b$2[Settings$1.sizeStrategy] = {
@@ -1061,23 +1057,23 @@ var ProcessStatus;
1061
1057
  ProcessStatus["error"] = "error";
1062
1058
  })(ProcessStatus || (ProcessStatus = {}));
1063
1059
 
1064
- var _a$1, _b$1, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
1065
- var INTEGER = VALIDATORS.INTEGER, INTEGER_UNLIMITED = VALIDATORS.INTEGER_UNLIMITED, BOOLEAN = VALIDATORS.BOOLEAN, OBJECT = VALIDATORS.OBJECT, ITEM_LIST = VALIDATORS.ITEM_LIST, FUNC_WITH_X_ARGUMENTS = VALIDATORS.FUNC_WITH_X_ARGUMENTS, FUNC_WITH_X_AND_MORE_ARGUMENTS = VALIDATORS.FUNC_WITH_X_AND_MORE_ARGUMENTS, FUNC_WITH_X_TO_Y_ARGUMENTS = VALIDATORS.FUNC_WITH_X_TO_Y_ARGUMENTS, ONE_OF_MUST = VALIDATORS.ONE_OF_MUST, ONE_OF_CAN = VALIDATORS.ONE_OF_CAN, OR = VALIDATORS.OR;
1060
+ var _a$2, _b$1, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
1061
+ var INTEGER = VALIDATORS.INTEGER, INTEGER_UNLIMITED = VALIDATORS.INTEGER_UNLIMITED, BOOLEAN = VALIDATORS.BOOLEAN, OBJECT$1 = VALIDATORS.OBJECT, ITEM_LIST = VALIDATORS.ITEM_LIST, FUNC_WITH_X_ARGUMENTS$1 = VALIDATORS.FUNC_WITH_X_ARGUMENTS, FUNC_WITH_X_AND_MORE_ARGUMENTS = VALIDATORS.FUNC_WITH_X_AND_MORE_ARGUMENTS, FUNC_WITH_X_TO_Y_ARGUMENTS = VALIDATORS.FUNC_WITH_X_TO_Y_ARGUMENTS, ONE_OF_MUST = VALIDATORS.ONE_OF_MUST, ONE_OF_CAN = VALIDATORS.ONE_OF_CAN, OR = VALIDATORS.OR;
1066
1062
  var AdapterNoParams;
1067
1063
  (function (AdapterNoParams) {
1068
1064
  })(AdapterNoParams || (AdapterNoParams = {}));
1069
1065
  var NO_METHOD_PARAMS = {};
1070
- var RESET_METHOD_PARAMS = (_a$1 = {},
1071
- _a$1[DatasourceProps.get] = {
1066
+ var RESET_METHOD_PARAMS = (_a$2 = {},
1067
+ _a$2[DatasourceProps.get] = {
1072
1068
  validators: [FUNC_WITH_X_AND_MORE_ARGUMENTS(2)]
1073
1069
  },
1074
- _a$1[DatasourceProps.settings] = {
1075
- validators: [OBJECT]
1070
+ _a$2[DatasourceProps.settings] = {
1071
+ validators: [OBJECT$1]
1076
1072
  },
1077
- _a$1[DatasourceProps.devSettings] = {
1078
- validators: [OBJECT]
1073
+ _a$2[DatasourceProps.devSettings] = {
1074
+ validators: [OBJECT$1]
1079
1075
  },
1080
- _a$1);
1076
+ _a$2);
1081
1077
  var AdapterReloadParams;
1082
1078
  (function (AdapterReloadParams) {
1083
1079
  AdapterReloadParams["reloadIndex"] = "reloadIndex";
@@ -1135,7 +1131,7 @@ var AdapterRemoveParams;
1135
1131
  })(AdapterRemoveParams || (AdapterRemoveParams = {}));
1136
1132
  var REMOVE_METHOD_PARAMS = (_e = {},
1137
1133
  _e[AdapterRemoveParams.predicate] = {
1138
- validators: [FUNC_WITH_X_ARGUMENTS(1), ONE_OF_MUST([AdapterRemoveParams.indexes])]
1134
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1), ONE_OF_MUST([AdapterRemoveParams.indexes])]
1139
1135
  },
1140
1136
  _e[AdapterRemoveParams.indexes] = {
1141
1137
  validators: [ITEM_LIST, ONE_OF_MUST([AdapterRemoveParams.predicate])]
@@ -1175,12 +1171,12 @@ var INSERT_METHOD_PARAMS = (_g = {},
1175
1171
  mandatory: true
1176
1172
  },
1177
1173
  _g[AdapterInsertParams.before] = {
1178
- validators: [FUNC_WITH_X_ARGUMENTS(1), ONE_OF_MUST([
1174
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1), ONE_OF_MUST([
1179
1175
  AdapterInsertParams.after, AdapterInsertParams.beforeIndex, AdapterInsertParams.afterIndex
1180
1176
  ])]
1181
1177
  },
1182
1178
  _g[AdapterInsertParams.after] = {
1183
- validators: [FUNC_WITH_X_ARGUMENTS(1), ONE_OF_MUST([
1179
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1), ONE_OF_MUST([
1184
1180
  AdapterInsertParams.before, AdapterInsertParams.beforeIndex, AdapterInsertParams.afterIndex
1185
1181
  ])]
1186
1182
  },
@@ -1211,7 +1207,7 @@ var REPLACE_METHOD_PARAMS = (_h = {},
1211
1207
  mandatory: true
1212
1208
  },
1213
1209
  _h[AdapterReplaceParams.predicate] = {
1214
- validators: [FUNC_WITH_X_ARGUMENTS(1)],
1210
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1)],
1215
1211
  mandatory: true
1216
1212
  },
1217
1213
  _h[AdapterReplaceParams.fixRight] = {
@@ -1226,7 +1222,7 @@ var AdapterUpdateParams;
1226
1222
  })(AdapterUpdateParams || (AdapterUpdateParams = {}));
1227
1223
  var UPDATE_METHOD_PARAMS = (_j = {},
1228
1224
  _j[AdapterUpdateParams.predicate] = {
1229
- validators: [FUNC_WITH_X_ARGUMENTS(1)],
1225
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1)],
1230
1226
  mandatory: true
1231
1227
  },
1232
1228
  _j[AdapterUpdateParams.fixRight] = {
@@ -1257,10 +1253,10 @@ var FIX_METHOD_PARAMS = (_k = {},
1257
1253
  validators: [FUNC_WITH_X_TO_Y_ARGUMENTS(1, 2)]
1258
1254
  },
1259
1255
  _k[AdapterFixParams.scrollToItem] = {
1260
- validators: [FUNC_WITH_X_ARGUMENTS(1)]
1256
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1)]
1261
1257
  },
1262
1258
  _k[AdapterFixParams.scrollToItemOpt] = {
1263
- validators: [OR([BOOLEAN, OBJECT])]
1259
+ validators: [OR([BOOLEAN, OBJECT$1])]
1264
1260
  },
1265
1261
  _k);
1266
1262
  var AdapterMethods = (_l = {},
@@ -1290,6 +1286,37 @@ var ADAPTER_METHODS = (_m = {},
1290
1286
  _m[AdapterProcess.fix] = FIX_METHOD_PARAMS,
1291
1287
  _m);
1292
1288
 
1289
+ var _a$1;
1290
+ var ELEMENT = VALIDATORS.ELEMENT, OBJECT = VALIDATORS.OBJECT, FUNC = VALIDATORS.FUNC, FUNC_WITH_X_ARGUMENTS = VALIDATORS.FUNC_WITH_X_ARGUMENTS;
1291
+ var WorkflowProps;
1292
+ (function (WorkflowProps) {
1293
+ WorkflowProps["consumer"] = "consumer";
1294
+ WorkflowProps["element"] = "element";
1295
+ WorkflowProps["datasource"] = "datasource";
1296
+ WorkflowProps["run"] = "run";
1297
+ WorkflowProps["Routines"] = "Routines";
1298
+ })(WorkflowProps || (WorkflowProps = {}));
1299
+ var WORKFLOW = (_a$1 = {},
1300
+ _a$1[WorkflowProps.consumer] = {
1301
+ validators: [OBJECT]
1302
+ },
1303
+ _a$1[WorkflowProps.element] = {
1304
+ validators: [ELEMENT],
1305
+ mandatory: true
1306
+ },
1307
+ _a$1[WorkflowProps.datasource] = {
1308
+ validators: [OBJECT],
1309
+ mandatory: true
1310
+ },
1311
+ _a$1[WorkflowProps.run] = {
1312
+ validators: [FUNC_WITH_X_ARGUMENTS(1)],
1313
+ mandatory: true
1314
+ },
1315
+ _a$1[WorkflowProps.Routines] = {
1316
+ validators: [FUNC]
1317
+ },
1318
+ _a$1);
1319
+
1293
1320
  var Settings = /** @class */ (function () {
1294
1321
  function Settings(settings, devSettings, instanceIndex) {
1295
1322
  this.parseInput(settings, SETTINGS);
@@ -2540,7 +2567,7 @@ var Render = /** @class */ (function (_super) {
2540
2567
  return _super !== null && _super.apply(this, arguments) || this;
2541
2568
  }
2542
2569
  Render.run = function (scroller) {
2543
- var workflow = scroller.workflow, _a = scroller.state, cycle = _a.cycle, render = _a.render, scroll = _a.scroll, viewport = scroller.viewport, routines = scroller.routines;
2570
+ var workflow = scroller.workflow, _a = scroller.state, cycle = _a.cycle, render = _a.render, scroll = _a.scroll, fetch = _a.fetch, viewport = scroller.viewport, routines = scroller.routines;
2544
2571
  scroller.logger.stat('before new items render');
2545
2572
  if (scroll.positionBeforeAsync === null) {
2546
2573
  scroll.positionBeforeAsync = viewport.scrollPosition;
@@ -2561,7 +2588,7 @@ var Render = /** @class */ (function (_super) {
2561
2588
  payload: { error: 'Can\'t associate item with element' }
2562
2589
  });
2563
2590
  }
2564
- });
2591
+ }, { items: fetch.items.map(function (i) { return i.get(); }) });
2565
2592
  };
2566
2593
  Render.doRender = function (scroller) {
2567
2594
  var _a = scroller.state, fetch = _a.fetch, render = _a.render, viewport = scroller.viewport, buffer = scroller.buffer, logger = scroller.logger;
@@ -3162,34 +3189,13 @@ var Logger = /** @class */ (function () {
3162
3189
  }());
3163
3190
 
3164
3191
  var Routines = /** @class */ (function () {
3165
- function Routines(element, settings, CustomRoutines) {
3166
- var _this = this;
3192
+ function Routines(element, settings) {
3167
3193
  this.element = element;
3168
3194
  this.settings = {
3169
3195
  viewport: settings.viewport,
3170
3196
  horizontal: settings.horizontal,
3171
3197
  window: settings.windowViewport
3172
3198
  };
3173
- // provide custom overrides for IRoutines methods
3174
- if (CustomRoutines) {
3175
- var self_1 = this;
3176
- var routines_1 = new CustomRoutines(element, this.settings);
3177
- Object.getOwnPropertyNames(Object.getPrototypeOf(routines_1))
3178
- .filter(function (method) {
3179
- return method !== 'constructor' &&
3180
- typeof routines_1[method] === 'function' &&
3181
- typeof self_1[method] === 'function';
3182
- })
3183
- .forEach(function (method) {
3184
- return self_1[method] = function () {
3185
- var args = [];
3186
- for (var _i = 0; _i < arguments.length; _i++) {
3187
- args[_i] = arguments[_i];
3188
- }
3189
- return routines_1[method].apply(_this, args);
3190
- };
3191
- });
3192
- }
3193
3199
  // initialization
3194
3200
  this.viewport = this.getViewportElement();
3195
3201
  this.onInit(settings);
@@ -3212,6 +3218,7 @@ var Routines = /** @class */ (function () {
3212
3218
  return parent;
3213
3219
  };
3214
3220
  Routines.prototype.onInit = function (settings) {
3221
+ console.log('routines on-init (original)');
3215
3222
  if (settings.windowViewport) {
3216
3223
  if ('scrollRestoration' in history) {
3217
3224
  history.scrollRestoration = 'manual';
@@ -3231,6 +3238,9 @@ var Routines = /** @class */ (function () {
3231
3238
  Routines.prototype.findItemElement = function (id) {
3232
3239
  return this.findElementBySelector(this.element, "[data-sid=\"".concat(id, "\"]"));
3233
3240
  };
3241
+ Routines.prototype.findItemChildBySelector = function (id, selector) {
3242
+ return this.findElementBySelector(this.element, "[data-sid=\"".concat(id, "\"] ").concat(selector));
3243
+ };
3234
3244
  Routines.prototype.getScrollPosition = function () {
3235
3245
  if (this.settings.window) {
3236
3246
  return this.settings.horizontal ? window.pageXOffset : window.pageYOffset;
@@ -3326,7 +3336,8 @@ var Routines = /** @class */ (function () {
3326
3336
  this.checkElement(element);
3327
3337
  element.scrollIntoView(argument);
3328
3338
  };
3329
- Routines.prototype.render = function (cb) {
3339
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
3340
+ Routines.prototype.render = function (cb, params) {
3330
3341
  var timeoutId = setTimeout(function () { return cb(); });
3331
3342
  return function () { return clearTimeout(timeoutId); };
3332
3343
  };
@@ -5219,10 +5230,27 @@ var Scroller = /** @class */ (function () {
5219
5230
  var packageInfo = scroller ? scroller.state.packageInfo : { consumer: consumer, core: core };
5220
5231
  element = scroller ? scroller.routines.element : element;
5221
5232
  workflow = scroller ? scroller.workflow : workflow;
5233
+ // In general, custom Routines must extend the original Routines. If not, we provide implicit extending.
5234
+ // This is undocumented feature. It should be removed in vscroll v2.
5235
+ if (CustomRoutines && !(CustomRoutines.prototype instanceof Routines)) {
5236
+ var __Routines_1 = /** @class */ (function (_super) {
5237
+ __extends(__Routines, _super);
5238
+ function __Routines() {
5239
+ return _super !== null && _super.apply(this, arguments) || this;
5240
+ }
5241
+ return __Routines;
5242
+ }(Routines));
5243
+ Object.getOwnPropertyNames(CustomRoutines.prototype)
5244
+ .filter(function (method) { return method !== 'constructor'; })
5245
+ .forEach(function (method) {
5246
+ return __Routines_1.prototype[method] = CustomRoutines === null || CustomRoutines === void 0 ? void 0 : CustomRoutines.prototype[method];
5247
+ });
5248
+ CustomRoutines = __Routines_1;
5249
+ }
5222
5250
  this.workflow = workflow;
5223
5251
  this.settings = new Settings(datasource.settings, datasource.devSettings, ++instanceCount);
5224
5252
  this.logger = new Logger(this, packageInfo, datasource.adapter);
5225
- this.routines = new Routines(element, this.settings, CustomRoutines);
5253
+ this.routines = new (CustomRoutines || Routines)(element, this.settings);
5226
5254
  this.state = new State(packageInfo, this.settings, scroller ? scroller.state : void 0);
5227
5255
  this.buffer = new Buffer(this.settings, workflow.onDataChanged, this.logger);
5228
5256
  this.viewport = new Viewport(this.settings, this.routines, this.state, this.logger);
@@ -5491,9 +5519,13 @@ var runStateMachine = function (_a) {
5491
5519
  };
5492
5520
 
5493
5521
  var Workflow = /** @class */ (function () {
5494
- function Workflow(_a) {
5495
- var element = _a.element, datasource = _a.datasource, consumer = _a.consumer, run = _a.run, Routines = _a.Routines;
5522
+ function Workflow(params) {
5496
5523
  var _this = this;
5524
+ var element = params.element, datasource = params.datasource, consumer = params.consumer, run = params.run, Routines = params.Routines;
5525
+ var validationResult = validate(params, WORKFLOW);
5526
+ if (!validationResult.isValid) {
5527
+ throw new Error("Invalid Workflow params: ".concat(validationResult.errors.join(', '), "."));
5528
+ }
5497
5529
  this.isInitialized = false;
5498
5530
  this.disposed = false;
5499
5531
  this.initTimer = null;
@@ -5671,5 +5703,5 @@ var Workflow = /** @class */ (function () {
5671
5703
  return Workflow;
5672
5704
  }());
5673
5705
 
5674
- export { AdapterPropName, Direction, EMPTY_ITEM, INVALID_DATASOURCE_PREFIX, SizeStrategy, Workflow, getDefaultAdapterProps, makeDatasource, core as packageInfo };
5706
+ export { AdapterPropName, Direction, EMPTY_ITEM, INVALID_DATASOURCE_PREFIX, Routines, SizeStrategy, Workflow, getDefaultAdapterProps, makeDatasource, core as packageInfo };
5675
5707
  //# sourceMappingURL=vscroll.esm5.js.map