@steroidsjs/core 3.0.38 → 3.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/actions/list.d.ts CHANGED
@@ -41,6 +41,14 @@ export interface IList {
41
41
  * Логическое значение, указывающее, является ли список удаленным или нет.
42
42
  */
43
43
  isRemote?: boolean;
44
+ /**
45
+ * Логическое значение, указывающее, можно ли загрузить еще элементы для списка при скролле.
46
+ */
47
+ hasInfiniteScroll?: boolean;
48
+ /**
49
+ * Значение страницы по умолчанию.
50
+ */
51
+ defaultPageValue?: number;
44
52
  /**
45
53
  * Логическое значение, указывающее, можно ли загрузить еще элементы для списка.
46
54
  */
package/actions/list.js CHANGED
@@ -200,6 +200,7 @@ var listFetch = function (listId, query) {
200
200
  }
201
201
  // Send request
202
202
  toDispatch.push(Promise.resolve(onFetch(list, formValues, components)).then(function (data) {
203
+ var _a;
203
204
  // Skip on empty
204
205
  if (!data) {
205
206
  return [];
@@ -215,16 +216,24 @@ var listFetch = function (listId, query) {
215
216
  meta: null
216
217
  };
217
218
  }
219
+ var items = data.items || [];
220
+ var total = data.total || items.length || null;
221
+ var page = formValues[list.pageAttribute];
222
+ var pageSize = formValues[list.pageSizeAttribute];
223
+ var totalPages = Math.ceil(((list === null || list === void 0 ? void 0 : list.total) || 0) / (pageSize || 1));
224
+ var hasNextPage = (_a = data === null || data === void 0 ? void 0 : data.hasNextPage) !== null && _a !== void 0 ? _a : (page !== totalPages || null);
218
225
  return [
219
226
  // Check has errors
220
227
  (0, form_2.formSetErrors)(list.formId, data.errors || null),
221
228
  {
222
- items: data.items || [],
223
- total: data.total || null,
229
+ items: items,
230
+ total: total,
231
+ hasNextPage: hasNextPage,
224
232
  meta: data.meta || null,
225
- page: formValues[list.pageAttribute],
226
- pageSize: formValues[list.pageSizeAttribute],
233
+ page: page,
234
+ pageSize: pageSize,
227
235
  listId: listId,
236
+ defaultPageValue: list.defaultPageValue,
228
237
  type: exports.LIST_AFTER_FETCH
229
238
  },
230
239
  ];
@@ -25,6 +25,14 @@
25
25
  "type": "string",
26
26
  "example": null
27
27
  },
28
+ {
29
+ "name": "defaultPageValue",
30
+ "decorators": [],
31
+ "description": "Значение страницы по умолчанию.",
32
+ "required": false,
33
+ "type": "number",
34
+ "example": null
35
+ },
28
36
  {
29
37
  "name": "formId",
30
38
  "decorators": [],
@@ -33,6 +41,14 @@
33
41
  "type": "string",
34
42
  "example": null
35
43
  },
44
+ {
45
+ "name": "hasInfiniteScroll",
46
+ "decorators": [],
47
+ "description": "Логическое значение, указывающее, можно ли загрузить еще элементы для списка при скролле.",
48
+ "required": false,
49
+ "type": "boolean",
50
+ "example": null
51
+ },
36
52
  {
37
53
  "name": "isFetched",
38
54
  "decorators": [],
@@ -3845,6 +3861,14 @@
3845
3861
  "type": "string | boolean | IEmptyProps",
3846
3862
  "example": "{\n text: 'Записи не найдены'\n}"
3847
3863
  },
3864
+ {
3865
+ "name": "infiniteScroll",
3866
+ "decorators": [],
3867
+ "description": "Подключение бесконечного скролла",
3868
+ "required": false,
3869
+ "type": "boolean | IInfiniteScrollProps",
3870
+ "example": "{\n enable: true\n}"
3871
+ },
3848
3872
  {
3849
3873
  "name": "initialItems",
3850
3874
  "decorators": [],
@@ -4143,6 +4167,15 @@
4143
4167
  "example": null,
4144
4168
  "parameters": []
4145
4169
  },
4170
+ {
4171
+ "name": "renderInfiniteScroll",
4172
+ "decorators": [],
4173
+ "description": "",
4174
+ "required": false,
4175
+ "type": "any",
4176
+ "example": null,
4177
+ "parameters": []
4178
+ },
4146
4179
  {
4147
4180
  "name": "renderLayoutNames",
4148
4181
  "decorators": [],
@@ -7604,6 +7637,15 @@
7604
7637
  "example": null,
7605
7638
  "defaultValue": null
7606
7639
  },
7640
+ {
7641
+ "name": "calendarDatesFormData",
7642
+ "decorators": [],
7643
+ "description": "Данные для формы с текущими датами календаря",
7644
+ "required": false,
7645
+ "type": "{dateFromAttribute: string, dateToAttribute: string, formId: string}",
7646
+ "example": null,
7647
+ "defaultValue": null
7648
+ },
7607
7649
  {
7608
7650
  "name": "calendarModalProps",
7609
7651
  "decorators": [],
@@ -7645,7 +7687,7 @@
7645
7687
  "decorators": [],
7646
7688
  "description": "Параметры для групп событий",
7647
7689
  "required": true,
7648
- "type": "{eventGroups: IEventGroup[], title: string}",
7690
+ "type": "{canAddedEventGroups: boolean, eventGroups: IEventGroup[], title: string}",
7649
7691
  "example": null,
7650
7692
  "defaultValue": null
7651
7693
  },
@@ -7722,6 +7764,24 @@
7722
7764
  "example": null
7723
7765
  }
7724
7766
  ]
7767
+ },
7768
+ {
7769
+ "name": "onEventClick",
7770
+ "decorators": [],
7771
+ "description": "Функция, которая вызывается по клику на событие",
7772
+ "required": false,
7773
+ "type": "void",
7774
+ "example": null,
7775
+ "parameters": [
7776
+ {
7777
+ "name": "event",
7778
+ "decorators": [],
7779
+ "description": "",
7780
+ "required": true,
7781
+ "type": "Record",
7782
+ "example": null
7783
+ }
7784
+ ]
7725
7785
  }
7726
7786
  ]
7727
7787
  },
@@ -7769,6 +7829,14 @@
7769
7829
  "type": "default",
7770
7830
  "example": null
7771
7831
  },
7832
+ {
7833
+ "name": "canAddedEventGroups",
7834
+ "decorators": [],
7835
+ "description": "",
7836
+ "required": false,
7837
+ "type": "boolean",
7838
+ "example": null
7839
+ },
7772
7840
  {
7773
7841
  "name": "children",
7774
7842
  "decorators": [],
@@ -8181,7 +8249,7 @@
8181
8249
  "decorators": [],
8182
8250
  "description": "Идентификатор",
8183
8251
  "required": true,
8184
- "type": "number",
8252
+ "type": "string | number",
8185
8253
  "example": null
8186
8254
  },
8187
8255
  {
@@ -35134,6 +35202,15 @@
35134
35202
  "example": null,
35135
35203
  "defaultValue": "true"
35136
35204
  },
35205
+ {
35206
+ "name": "infiniteScroll",
35207
+ "decorators": [],
35208
+ "description": "Подключение бесконечного скролла",
35209
+ "required": false,
35210
+ "type": "boolean | IInfiniteScrollProps",
35211
+ "example": "{\n enable: true\n}",
35212
+ "defaultValue": null
35213
+ },
35137
35214
  {
35138
35215
  "name": "initialItems",
35139
35216
  "decorators": [],
@@ -35469,6 +35546,15 @@
35469
35546
  "example": null,
35470
35547
  "parameters": []
35471
35548
  },
35549
+ {
35550
+ "name": "renderInfiniteScroll",
35551
+ "decorators": [],
35552
+ "description": "",
35553
+ "required": false,
35554
+ "type": "any",
35555
+ "example": null,
35556
+ "parameters": []
35557
+ },
35472
35558
  {
35473
35559
  "name": "renderLayoutNames",
35474
35560
  "decorators": [],
@@ -35560,6 +35646,73 @@
35560
35646
  }
35561
35647
  ]
35562
35648
  },
35649
+ "IInfiniteScrollProps": {
35650
+ "name": "IInfiniteScrollProps",
35651
+ "moduleName": "ui/list/InfiniteScroll/InfiniteScroll",
35652
+ "title": "InfiniteScroll",
35653
+ "description": "Компонент с бесконечным скроллом страниц.",
35654
+ "tags": {},
35655
+ "defaultProps": null,
35656
+ "extends": [],
35657
+ "properties": [
35658
+ {
35659
+ "name": "enable",
35660
+ "decorators": [],
35661
+ "description": "Подключить бесконечный скролл",
35662
+ "required": false,
35663
+ "type": "boolean",
35664
+ "example": "true",
35665
+ "defaultValue": null
35666
+ },
35667
+ {
35668
+ "name": "hasNextPageAttribute",
35669
+ "decorators": [],
35670
+ "description": "Аттрибут (название) в форме для поля с флагом, определяющим есть ли следующая страница",
35671
+ "required": false,
35672
+ "type": "string",
35673
+ "example": "hasNextPage",
35674
+ "defaultValue": null
35675
+ },
35676
+ {
35677
+ "name": "list",
35678
+ "decorators": [],
35679
+ "description": "Список, для которого используется пагинация",
35680
+ "required": false,
35681
+ "type": "any",
35682
+ "example": null,
35683
+ "defaultValue": null
35684
+ },
35685
+ {
35686
+ "name": "pageAttribute",
35687
+ "decorators": [],
35688
+ "description": "Аттрибут (название) в форме для поля с номером текущей страницы",
35689
+ "required": false,
35690
+ "type": "string",
35691
+ "example": "page",
35692
+ "defaultValue": null
35693
+ }
35694
+ ],
35695
+ "methods": [
35696
+ {
35697
+ "name": "onChange",
35698
+ "decorators": [],
35699
+ "description": "Обработчик, который вызывается после смены страницы",
35700
+ "required": false,
35701
+ "type": "void",
35702
+ "example": null,
35703
+ "parameters": [
35704
+ {
35705
+ "name": "value",
35706
+ "decorators": [],
35707
+ "description": "",
35708
+ "required": true,
35709
+ "type": "number",
35710
+ "example": null
35711
+ }
35712
+ ]
35713
+ }
35714
+ ]
35715
+ },
35563
35716
  "ILayoutNamesProps": {
35564
35717
  "name": "ILayoutNamesProps",
35565
35718
  "moduleName": "ui/list/LayoutNames/LayoutNames",
@@ -35786,6 +35939,15 @@
35786
35939
  "example": "{\n text: 'Записи не найдены'\n}",
35787
35940
  "defaultValue": null
35788
35941
  },
35942
+ {
35943
+ "name": "infiniteScroll",
35944
+ "decorators": [],
35945
+ "description": "Подключение бесконечного скролла",
35946
+ "required": false,
35947
+ "type": "boolean | IInfiniteScrollProps",
35948
+ "example": "{\n enable: true\n}",
35949
+ "defaultValue": null
35950
+ },
35789
35951
  {
35790
35952
  "name": "initialItems",
35791
35953
  "decorators": [],
@@ -36131,6 +36293,15 @@
36131
36293
  "example": null,
36132
36294
  "parameters": []
36133
36295
  },
36296
+ {
36297
+ "name": "renderInfiniteScroll",
36298
+ "decorators": [],
36299
+ "description": "",
36300
+ "required": false,
36301
+ "type": "any",
36302
+ "example": null,
36303
+ "parameters": []
36304
+ },
36134
36305
  {
36135
36306
  "name": "renderLayoutNames",
36136
36307
  "decorators": [],
@@ -44509,6 +44680,13 @@
44509
44680
  "description": "",
44510
44681
  "tags": {}
44511
44682
  },
44683
+ "ui/list/InfiniteScroll/InfiniteScroll": {
44684
+ "name": "default",
44685
+ "moduleName": "ui/list/InfiniteScroll/InfiniteScroll",
44686
+ "title": "",
44687
+ "description": "",
44688
+ "tags": {}
44689
+ },
44512
44690
  "ui/list/LayoutNames/LayoutNames": {
44513
44691
  "name": "default",
44514
44692
  "moduleName": "ui/list/LayoutNames/LayoutNames",
package/en.json CHANGED
@@ -979,7 +979,11 @@
979
979
  "Скрыть иконку c лева от элемента": "",
980
980
  "\nКомпонент `Kanban` позволяет создать доску для управления задачами.\nКоличество столбцов задается с помощью пропа `columns`.\nЗадачи на доске можно создавать, редактировать и перемещать с визуальным отображением.\n\nДля работы этого компонента необходимо установить в проекте зависимости `react-beautiful-dnd`\nи передать в пропсы `droppableComponent`, `draggableComponent` и `dndContext`\nкомпоненты `Droppable`, `Draggable` и `DragDropContext` соответственно.\n\nДля корректной работы функционала создания задач,\nнеобходимо установить в проекте зависимости `@ckeditor/ckeditor5-react` и `@steroidsjs/ckeditor5`,\nзатем импортировать `CKEditor` из `@ckeditor/ckeditor5-react` и `ClassicEditor` из `@steroidsjs/ckeditor5/packages/ckeditor5-build-classic`.\nИмпортированные компоненты нужно передать в проп `createTaskEditorConfig`,\nв поле `htmlComponent` передать `CKEditor`, а в `editorConstructor` передать `ClassicEditor`.\n": "",
981
981
  "Компонент для создания HTML-разметки, использующий WYSIWYG редактор.\n\nДля использования WYSIWYG редактора, необходимо установить в проекте зависимости `@ckeditor/ckeditor5-react` и `@steroidsjs/ckeditor5`,\nзатем импортировать `CKEditor` из `@ckeditor/ckeditor5-react` и `ClassicEditor` из `@steroidsjs/ckeditor5/packages/ckeditor5-build-classic`.\nКомпонент `CKEditor` нужно передать в проп `htmlComponent`, а конструктор `ClassicEditor` в проп `editorConstructor`.\n\nПри передаче `HtmlField` с бэкенда, необходимо переопределить `view` компонента, указав локальный.\nВ локальном компоненте добавить вместо пропсов `htmlComponent` и `editorConstructor` импорты `CKEditor` и `ClassicEditor` соотвественно.\n": "",
982
+ "Компонент с бесконечным скроллом страниц.": "",
982
983
  "Компонент, который представляет в виде дерева список с иерархической структурой данных\n\nДополнительный функционал: в кастомном view компонента есть возможность реализовать кнопку, по клику на которую\nбудет вызываться функция props.onItemFocus. Данная функция \"находит\" текущий роут в дереве -\nраскрывает родительские уровни, делает элемент активным.\nДанная функция не включает скролл к активному компоненту внутри дерева, это также необходимо\nреализовать в кастомном view локально в проекте.\n": "",
984
+ "Значение страницы по умолчанию.": "",
985
+ "Логическое значение, указывающее, можно ли загрузить еще элементы для списка при скролле.": "",
986
+ "Подключение бесконечного скролла": "",
983
987
  "Дополнительный свойства для view части компонента": "",
984
988
  "Используется для управления раскрытием всех элементов в дереве": "",
985
989
  "Идентификатор (ключ) для сохранения в LocalStorage коллекции.": "",
@@ -990,6 +994,7 @@
990
994
  "Сохранение в localStorage уровней вложенности.": "",
991
995
  "Дополнительные свойства для списка календарей бокового календаря": "",
992
996
  "Дополнительные свойства для бокового календаря": "",
997
+ "Данные для формы с текущими датами календаря": "",
993
998
  "Свойства для сетки дня": "",
994
999
  "Свойства для сетки месяца": "",
995
1000
  "Свойства для сетки недели": "",
@@ -1013,6 +1018,9 @@
1013
1018
  "Компонент редактора 'ckeditor5-react' из библиотеки @ckeditor\nПримечание: для использования встроенного отображения 'HtmlField', данный компонент должен быть передан": "",
1014
1019
  "Допустимое количество символов после разделителя": "",
1015
1020
  "Может ли число быть отрицательным": "",
1021
+ "Подключить бесконечный скролл": "",
1022
+ "Аттрибут (название) в форме для поля с флагом, определяющим есть ли следующая страница": "",
1023
+ "Аттрибут (название) в форме для поля с номером текущей страницы": "",
1016
1024
  "CSS-класс для элемента навигации.": "",
1017
1025
  "Тип данных для параметров маршрута.": "",
1018
1026
  "Обертка над Redux Store со встроенными middleware (thunk, multi, promise..) и react-router.": ""
@@ -1,3 +1,4 @@
1
+ import { IInfiniteScrollProps } from '@steroidsjs/core/ui/list/InfiniteScroll/InfiniteScroll';
1
2
  import { IAddressBarConfig } from '../hooks/useAddressBar';
2
3
  import { IList } from '../actions/list';
3
4
  import { ILayoutNamesProps } from '../ui/list/LayoutNames/LayoutNames';
@@ -63,6 +64,14 @@ export interface IListConfig {
63
64
  * }
64
65
  */
65
66
  paginationSize?: boolean | IPaginationSizeProps;
67
+ /**
68
+ * Подключение бесконечного скролла
69
+ * @example
70
+ * {
71
+ * enable: true
72
+ * }
73
+ */
74
+ infiniteScroll?: boolean | IInfiniteScrollProps;
66
75
  /**
67
76
  * Подключение сортировки
68
77
  * @example
@@ -208,6 +217,7 @@ export interface IListOutput {
208
217
  renderPaginationSize: () => any;
209
218
  renderLayoutNames: () => any;
210
219
  renderSearchForm: () => any;
220
+ renderInfiniteScroll: () => any;
211
221
  onFetch: (params?: Record<string, unknown>) => void;
212
222
  onSort: (value: any) => void;
213
223
  }
package/hooks/useList.js CHANGED
@@ -44,6 +44,7 @@ var get_1 = __importDefault(require("lodash-es/get"));
44
44
  var union_1 = __importDefault(require("lodash-es/union"));
45
45
  var isEqual_1 = __importDefault(require("lodash-es/isEqual"));
46
46
  var react_use_1 = require("react-use");
47
+ var InfiniteScroll_1 = require("@steroidsjs/core/ui/list/InfiniteScroll/InfiniteScroll");
47
48
  var useSelector_1 = __importDefault(require("./useSelector"));
48
49
  var list_1 = require("../reducers/list");
49
50
  var useModel_1 = __importDefault(require("../hooks/useModel"));
@@ -105,6 +106,7 @@ var createInitialValues = function (_a) {
105
106
  return (__assign(__assign((_b = {}, _b[paginationProps.attribute] = paginationProps.defaultValue, _b[paginationSizeProps.attribute] = paginationSizeProps.defaultValue, _b[sort.attribute] = sort.defaultValue, _b[layoutNamesProps.attribute] = layoutNamesProps.defaultValue, _b), initialQuery), configQuery));
106
107
  };
107
108
  exports.createInitialValues = createInitialValues;
109
+ var FIRST_PAGE = 1;
108
110
  /**
109
111
  * useList
110
112
  * Добавляет массу возможностей для взаимодействия с коллекциями. Коллекции можно получать как с бекенда,
@@ -143,6 +145,12 @@ function useList(config) {
143
145
  var renderPagination = function () { return paginationProps.enable && (list === null || list === void 0 ? void 0 : list.isFetched)
144
146
  ? (react_1["default"].createElement(Pagination, __assign({ list: list }, paginationProps, { sizeAttribute: paginationSizeProps.attribute })))
145
147
  : null; };
148
+ // InfiniteScroll
149
+ var InfiniteScroll = require('../ui/list/InfiniteScroll')["default"];
150
+ var infiniteScrollProps = (0, InfiniteScroll_1.normalizeInfiniteScrollProps)(config.infiniteScroll);
151
+ var renderInfiniteScroll = function () { return infiniteScrollProps.enable && (list === null || list === void 0 ? void 0 : list.isFetched) && !(list === null || list === void 0 ? void 0 : list.isLoading)
152
+ ? (react_1["default"].createElement(InfiniteScroll, __assign({ list: list }, infiniteScrollProps, { sizeAttribute: infiniteScrollProps.attribute })))
153
+ : null; };
146
154
  // Layout switcher
147
155
  var LayoutNames = require('../ui/list/LayoutNames')["default"];
148
156
  var layoutNamesProps = (0, LayoutNames_1.normalizeLayoutNamesProps)(config.layout);
@@ -193,6 +201,7 @@ function useList(config) {
193
201
  }, [formId, initialValues]);
194
202
  // Init list in redux store
195
203
  (0, react_use_1.useMount)(function () {
204
+ var _a;
196
205
  if (!list) {
197
206
  var toDispatch = [
198
207
  (0, list_2.listInit)(config.listId, {
@@ -213,7 +222,9 @@ function useList(config) {
213
222
  pageAttribute: paginationProps.attribute || null,
214
223
  pageSizeAttribute: paginationSizeProps.attribute || null,
215
224
  sortAttribute: sort.attribute || null,
216
- layoutAttribute: layoutNamesProps.attribute || null
225
+ layoutAttribute: layoutNamesProps.attribute || null,
226
+ hasInfiniteScroll: (infiniteScrollProps === null || infiniteScrollProps === void 0 ? void 0 : infiniteScrollProps.enable) || null,
227
+ defaultPageValue: (_a = paginationProps.defaultValue) !== null && _a !== void 0 ? _a : FIRST_PAGE
217
228
  }),
218
229
  ];
219
230
  if (config.initialItems || config.items) {
@@ -297,6 +308,7 @@ function useList(config) {
297
308
  renderPaginationSize: renderPaginationSize,
298
309
  renderLayoutNames: renderLayoutNames,
299
310
  renderSearchForm: renderSearchForm,
311
+ renderInfiniteScroll: renderInfiniteScroll,
300
312
  onFetch: onFetch,
301
313
  onSort: onSort
302
314
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steroidsjs/core",
3
- "version": "3.0.38",
3
+ "version": "3.0.40",
4
4
  "description": "",
5
5
  "author": "Vladimir Kozhin <hello@kozhindev.com>",
6
6
  "repository": {
package/reducers/list.js CHANGED
@@ -51,7 +51,7 @@ var reducerMap = (_a = {},
51
51
  var _a;
52
52
  var items;
53
53
  var list = state.lists[action.listId];
54
- if (list.items === action.items) {
54
+ if (list.items === action.items && !list.hasInfiniteScroll) {
55
55
  // No changes
56
56
  items = list.items;
57
57
  }
@@ -62,6 +62,14 @@ var reducerMap = (_a = {},
62
62
  items[index] = entry;
63
63
  });
64
64
  }
65
+ else if (list && list.items && list.hasInfiniteScroll) {
66
+ if (action.page === list.defaultPageValue) {
67
+ items = [].concat(action.items);
68
+ }
69
+ else {
70
+ items = [].concat(list.items, action.items);
71
+ }
72
+ }
65
73
  else {
66
74
  items = [].concat(action.items);
67
75
  }
@@ -59,7 +59,7 @@ export interface IEventGroup {
59
59
  /**
60
60
  * Идентификатор
61
61
  */
62
- id: number;
62
+ id: number | string;
63
63
  /**
64
64
  * Название группы
65
65
  */
@@ -120,6 +120,10 @@ export interface ICalendarSystemProps extends IUiComponent {
120
120
  * Группы событий
121
121
  */
122
122
  eventGroups: IEventGroup[];
123
+ /**
124
+ * Можно ли добавлять группы событий в календарь
125
+ */
126
+ canAddedEventGroups?: boolean;
123
127
  };
124
128
  /**
125
129
  * Свойства для сетки дня
@@ -150,12 +154,25 @@ export interface ICalendarSystemProps extends IUiComponent {
150
154
  * Дочерние элементы
151
155
  */
152
156
  children?: React.ReactNode;
157
+ /**
158
+ * Функция, которая вызывается по клику на событие
159
+ */
160
+ onEventClick?: (event: Record<string, any>) => void;
161
+ /**
162
+ * Данные для формы с текущими датами календаря
163
+ */
164
+ calendarDatesFormData?: {
165
+ formId: string;
166
+ dateFromAttribute?: string;
167
+ dateToAttribute?: string;
168
+ };
153
169
  [key: string]: any;
154
170
  }
155
171
  export interface ICalendarSystemViewProps extends Pick<ICalendarSystemProps, 'className' | 'style' | 'additionalViewProps' | 'users' | 'asideCalendarProps' | 'asideCalendarCheckboxListProps'> {
156
172
  onCalendarChangedMonth: (newDate: Date) => void;
157
173
  eventGroups: IEventGroup[];
158
174
  eventGroupsTitle: string;
175
+ canAddedEventGroups?: boolean;
159
176
  onChangeEventGroupsIds: (selectedIds: number[]) => void;
160
177
  openCreateEventGroupModal: VoidFunction;
161
178
  dateToDisplay: string;
@@ -36,6 +36,7 @@ function CalendarSystem(props) {
36
36
  additionalViewProps: props.additionalViewProps,
37
37
  users: calendarSystem.users,
38
38
  eventGroupsTitle: props.eventBlock.title,
39
+ canAddedEventGroups: props.eventBlock.canAddedEventGroups,
39
40
  asideCalendarProps: props.asideCalendarProps,
40
41
  asideCalendarCheckboxListProps: props.asideCalendarCheckboxListProps,
41
42
  children: props.children,
@@ -49,11 +50,11 @@ function CalendarSystem(props) {
49
50
  handleCalendarTypeChange: calendarSystem.handleCalendarTypeChange,
50
51
  onClickControl: calendarSystem.onClickControl,
51
52
  getEventsFromDate: calendarSystem.getEventsFromDate,
52
- openEditModal: calendarSystem.openEditModal,
53
+ openEditModal: props.onEventClick || calendarSystem.openEditModal,
53
54
  monthGridProps: __assign({ monthGridWeekDays: calendarSystem.monthGridWeekDays, monthGridCalendarDays: calendarSystem.monthGridCalendarDays }, monthGridViews),
54
55
  weekGridProps: __assign({ weekGridTwentyFourHoursArray: calendarSystem.weekGridTwentyFourHoursArray, weekGridCurrentWeekDays: calendarSystem.weekGridCurrentWeekDays }, weekGridViews),
55
56
  dayGridProps: __assign({ dayGridTwentyFourHoursArray: calendarSystem.dayGridTwentyFourHoursArray, dayGridCurrentDay: calendarSystem.dayGridCurrentDay }, dayGridViews)
56
- }); }, [props.className, props.style, props.additionalViewProps, props.eventBlock.title, props.asideCalendarProps, props.asideCalendarCheckboxListProps, props.children, calendarSystem, monthGridViews, weekGridViews, dayGridViews]);
57
+ }); }, [props.className, props.style, props.additionalViewProps, props.eventBlock.title, props.eventBlock.canAddedEventGroups, props.asideCalendarProps, props.asideCalendarCheckboxListProps, props.children, props.onEventClick, calendarSystem, monthGridViews, weekGridViews, dayGridViews]);
57
58
  return components.ui.renderView(props.view || 'content.CalendarSystemView', viewProps);
58
59
  }
59
60
  exports["default"] = CalendarSystem;
@@ -1,3 +1,3 @@
1
1
  import dayjs from 'dayjs';
2
2
  import { IEventGroup, IEvent } from '../CalendarSystem';
3
- export declare const addEventIfMatchDate: (eventDateDayJs: dayjs.Dayjs, sourceDateInDayJs: dayjs.Dayjs, calendarGroup: IEventGroup, originalEvent: IEvent, unit: 'hours' | 'day', selectedEventGroupsIds: number[], resultEventsOnDate: IEvent[]) => void;
3
+ export declare const addEventIfMatchDate: (eventDateDayJs: dayjs.Dayjs, sourceDateInDayJs: dayjs.Dayjs, calendarGroup: IEventGroup, originalEvent: IEvent, unit: 'hours' | 'day', selectedEventGroupsIds: Array<number | string>, resultEventsOnDate: IEvent[]) => void;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { ICalendarSystemProps, ICalendarUser, IEventGroup } from '../CalendarSystem';
3
- import CalendarEnum from '../enums/CalendarType';
3
+ import CalendarType from '../enums/CalendarType';
4
4
  export declare const useCalendarSystem: (props: ICalendarSystemProps) => {
5
5
  monthGridWeekDays: any;
6
6
  monthGridCalendarDays: import("../CalendarSystem").IDay[];
@@ -16,11 +16,11 @@ export declare const useCalendarSystem: (props: ICalendarSystemProps) => {
16
16
  dayGridCurrentDay: import("../CalendarSystem").IDay;
17
17
  dateToDisplay: any;
18
18
  innerEventGroups: IEventGroup[];
19
- calendarType: CalendarEnum;
19
+ calendarType: CalendarType;
20
20
  users: ICalendarUser[];
21
21
  setSelectedEventGroupsIds: React.Dispatch<React.SetStateAction<number[]>>;
22
22
  handleCalendarTypeChange: (newType: string) => void;
23
- getEventsFromDate: (dateFromDay: Date, currentCalendarType: CalendarEnum) => import("../CalendarSystem").IEvent[];
23
+ getEventsFromDate: (dateFromDay: Date, currentCalendarType: CalendarType) => import("../CalendarSystem").IEvent[];
24
24
  onCalendarChangedMonth: (newDate: Date) => void;
25
25
  openCreateEventGroupModal: () => void;
26
26
  openEditModal: (event: import("../CalendarSystem").IEvent) => void;
@@ -27,11 +27,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
27
27
  };
28
28
  exports.__esModule = true;
29
29
  exports.useCalendarSystem = void 0;
30
+ /* eslint-disable default-case */
30
31
  var react_1 = __importStar(require("react"));
32
+ var react_use_1 = require("react-use");
33
+ var react_redux_1 = require("react-redux");
34
+ var last_1 = __importDefault(require("lodash-es/last"));
35
+ var head_1 = __importDefault(require("lodash-es/head"));
31
36
  var useDisplayDate_1 = __importDefault(require("./useDisplayDate"));
32
37
  var useDayGrid_1 = require("./useDayGrid");
33
38
  var useCalendarType_1 = require("./useCalendarType");
34
- var CalendarType_1 = __importDefault(require("../enums/CalendarType"));
35
39
  var useMonthGrid_1 = __importDefault(require("./useMonthGrid"));
36
40
  var useWeekGrid_1 = __importDefault(require("./useWeekGrid"));
37
41
  var useCalendarControls_1 = __importDefault(require("./useCalendarControls"));
@@ -40,12 +44,24 @@ var useCalendarSystemEventGroupModals_1 = require("./useCalendarSystemEventGroup
40
44
  var useEventsFromDate_1 = require("./useEventsFromDate");
41
45
  var DisplayDateFormatType_1 = __importDefault(require("../enums/DisplayDateFormatType"));
42
46
  var utils_1 = require("../utils/utils");
47
+ var form_1 = require("../../../../actions/form");
48
+ var CalendarType_1 = __importDefault(require("../enums/CalendarType"));
49
+ var DEFAULT_DATE_FROM_ATTRIBUTE = 'dateFrom';
50
+ var DEFAULT_DATE_TO_ATTRIBUTE = 'dateTo';
43
51
  var useCalendarSystem = function (props) {
44
- var _a = react_1["default"].useState(props.eventBlock.eventGroups || []), innerEventGroups = _a[0], setInnerEventGroups = _a[1];
45
- var _b = react_1["default"].useState([]), selectedEventGroupsIds = _b[0], setSelectedEventGroupsIds = _b[1];
46
- var _c = (0, react_1.useState)(props.users), users = _c[0], setUsers = _c[1];
52
+ var _a, _b;
53
+ var dispatch = (0, react_redux_1.useDispatch)();
54
+ var _c = react_1["default"].useState(props.eventBlock.eventGroups || []), innerEventGroups = _c[0], setInnerEventGroups = _c[1];
55
+ var _d = react_1["default"].useState([]), selectedEventGroupsIds = _d[0], setSelectedEventGroupsIds = _d[1];
56
+ var _e = (0, react_1.useState)(props.users), users = _e[0], setUsers = _e[1];
57
+ react_1["default"].useEffect(function () {
58
+ setInnerEventGroups(props.eventBlock.eventGroups);
59
+ }, [props.eventBlock.eventGroups]);
60
+ react_1["default"].useEffect(function () {
61
+ setUsers(props.users);
62
+ }, [props.users]);
47
63
  //Главная дата, от которой происходят все вычисления
48
- var _d = react_1["default"].useState((0, utils_1.getFormattedDay)()), generalCurrentDay = _d[0], setGeneralCurrentDay = _d[1];
64
+ var _f = react_1["default"].useState((0, utils_1.getFormattedDay)()), generalCurrentDay = _f[0], setGeneralCurrentDay = _f[1];
49
65
  var isGeneralCurrentDayNeedsUpdate = (0, react_1.useRef)(true);
50
66
  var updateGeneralCurrentDay = (0, react_1.useCallback)(function (newDate) {
51
67
  if (!isGeneralCurrentDayNeedsUpdate.current) {
@@ -57,21 +73,59 @@ var useCalendarSystem = function (props) {
57
73
  var onCalendarChangedMonth = react_1["default"].useCallback(function (newDate) {
58
74
  updateGeneralCurrentDay(newDate);
59
75
  }, [updateGeneralCurrentDay]);
60
- var _e = (0, useDisplayDate_1["default"])(generalCurrentDay), dateToDisplay = _e.dateToDisplay, changeDisplayFormat = _e.changeDisplayFormat;
61
- var _f = (0, useMonthGrid_1["default"])(generalCurrentDay), monthGridWeekDays = _f.monthGridWeekDays, monthGridCalendarDays = _f.monthGridCalendarDays;
62
- var _g = (0, useWeekGrid_1["default"])(generalCurrentDay), weekGridTwentyFourHoursArray = _g.weekGridTwentyFourHoursArray, weekGridCurrentWeekDays = _g.weekGridCurrentWeekDays;
63
- var _h = (0, useDayGrid_1.useDayGrid)(generalCurrentDay), dayGridTwentyFourHoursArray = _h.dayGridTwentyFourHoursArray, dayGridCurrentDay = _h.dayGridCurrentDay;
64
- var _j = (0, useCalendarType_1.useCalendarType)(function (newType) {
76
+ var _g = (0, useDisplayDate_1["default"])(generalCurrentDay), dateToDisplay = _g.dateToDisplay, changeDisplayFormat = _g.changeDisplayFormat;
77
+ var _h = (0, useMonthGrid_1["default"])(generalCurrentDay), monthGridWeekDays = _h.monthGridWeekDays, monthGridCalendarDays = _h.monthGridCalendarDays;
78
+ var _j = (0, useWeekGrid_1["default"])(generalCurrentDay), weekGridTwentyFourHoursArray = _j.weekGridTwentyFourHoursArray, weekGridCurrentWeekDays = _j.weekGridCurrentWeekDays;
79
+ var _k = (0, useDayGrid_1.useDayGrid)(generalCurrentDay), dayGridTwentyFourHoursArray = _k.dayGridTwentyFourHoursArray, dayGridCurrentDay = _k.dayGridCurrentDay;
80
+ var _l = (0, useCalendarType_1.useCalendarType)(function (newType) {
65
81
  if (newType === CalendarType_1["default"].DAY) {
66
82
  changeDisplayFormat(DisplayDateFormatType_1["default"].DAY);
67
83
  return;
68
84
  }
69
85
  changeDisplayFormat(DisplayDateFormatType_1["default"].DEFAULT);
70
- }), calendarType = _j.calendarType, handleCalendarTypeChange = _j.handleCalendarTypeChange;
86
+ }), calendarType = _l.calendarType, handleCalendarTypeChange = _l.handleCalendarTypeChange;
71
87
  var onClickControl = (0, useCalendarControls_1["default"])(calendarType, generalCurrentDay, setGeneralCurrentDay, isGeneralCurrentDayNeedsUpdate).onClickControl;
72
- var _k = (0, useCalendarSystemModals_1["default"])(props.calendarModalProps, innerEventGroups, setInnerEventGroups, users, setUsers), openCreateModal = _k.openCreateModal, openEditModal = _k.openEditModal;
88
+ var _m = (0, useCalendarSystemModals_1["default"])(props.calendarModalProps, innerEventGroups, setInnerEventGroups, users, setUsers), openCreateModal = _m.openCreateModal, openEditModal = _m.openEditModal;
73
89
  var openCreateEventGroupModal = (0, useCalendarSystemEventGroupModals_1.useCalendarSystemEventGroupModals)(innerEventGroups, setInnerEventGroups, props.eventGroupModalProps).openCreateEventGroupModal;
74
90
  var getEventsFromDate = (0, useEventsFromDate_1.useEventsFromDate)(innerEventGroups, selectedEventGroupsIds).getEventsFromDate;
91
+ // save dateTo and dateFrom in redux
92
+ var dateFromAttribute = ((_a = props.calendarDatesFormData) === null || _a === void 0 ? void 0 : _a.dateFromAttribute) || DEFAULT_DATE_FROM_ATTRIBUTE;
93
+ var dateToAttribute = ((_b = props.calendarDatesFormData) === null || _b === void 0 ? void 0 : _b.dateToAttribute) || DEFAULT_DATE_TO_ATTRIBUTE;
94
+ (0, react_use_1.useMount)(function () {
95
+ var _a;
96
+ if (props.calendarDatesFormData) {
97
+ dispatch((0, form_1.formInitialize)(props.calendarDatesFormData.formId, (_a = {},
98
+ _a[dateFromAttribute] = null,
99
+ _a[dateToAttribute] = null,
100
+ _a)));
101
+ }
102
+ });
103
+ react_1["default"].useEffect(function () {
104
+ var _a;
105
+ if (props.calendarDatesFormData) {
106
+ var currentDateArray = calendarType === CalendarType_1["default"].MONTH
107
+ ? monthGridCalendarDays
108
+ : weekGridCurrentWeekDays;
109
+ var newFormValues = (_a = {},
110
+ _a[dateFromAttribute] = (0, head_1["default"])(currentDateArray).date,
111
+ _a[dateToAttribute] = (0, last_1["default"])(currentDateArray).date,
112
+ _a);
113
+ if (calendarType === CalendarType_1["default"].DAY) {
114
+ newFormValues[dateFromAttribute] = dayGridCurrentDay.date;
115
+ newFormValues[dateToAttribute] = dayGridCurrentDay.date;
116
+ }
117
+ dispatch((0, form_1.formChange)(props.calendarDatesFormData.formId, newFormValues));
118
+ }
119
+ }, [
120
+ calendarType,
121
+ dateFromAttribute,
122
+ dateToAttribute,
123
+ dayGridCurrentDay,
124
+ dispatch,
125
+ monthGridCalendarDays,
126
+ props.calendarDatesFormData,
127
+ weekGridCurrentWeekDays,
128
+ ]);
75
129
  return {
76
130
  monthGridWeekDays: monthGridWeekDays,
77
131
  monthGridCalendarDays: monthGridCalendarDays,
@@ -6,7 +6,7 @@ declare const useCalendarSystemModals: (calendarModalProps: IModalProps, innerEv
6
6
  openEditModal: (event: IEvent) => void;
7
7
  getEventFromGroup: (event: IEvent) => IEventGroup;
8
8
  getModalProps: (isCreate: boolean, eventInitialValues?: Partial<IEvent & {
9
- eventGroupId: number;
9
+ eventGroupId: number | string;
10
10
  }>) => ICalendarSystemModalViewProps;
11
11
  };
12
12
  export default useCalendarSystemModals;
@@ -198,6 +198,7 @@ export interface IGridViewProps extends Omit<IGridProps, 'onFetch'> {
198
198
  renderPaginationSize: () => any;
199
199
  renderLayoutNames: () => any;
200
200
  renderSearchForm: () => any;
201
+ renderInfiniteScroll: () => any;
201
202
  renderValue: (item: Record<string, unknown>, column: IGridColumn) => any;
202
203
  onFetch: (params?: Record<string, unknown>) => void;
203
204
  onSort: (value: any) => void;
@@ -53,6 +53,7 @@ function Grid(props) {
53
53
  actionMethod: props.actionMethod,
54
54
  pagination: props.pagination,
55
55
  paginationSize: props.paginationSize,
56
+ infiniteScroll: props.infiniteScroll,
56
57
  sort: props.sort,
57
58
  layout: props.layout,
58
59
  empty: props.empty,
@@ -69,7 +70,7 @@ function Grid(props) {
69
70
  initialItems: props.initialItems,
70
71
  initialTotal: props.initialTotal,
71
72
  autoFetchOnFormChanges: props.autoFetchOnFormChanges
72
- }), list = _a.list, model = _a.model, searchModel = _a.searchModel, paginationPosition = _a.paginationPosition, paginationSizePosition = _a.paginationSizePosition, layoutNamesPosition = _a.layoutNamesPosition, renderList = _a.renderList, renderLoading = _a.renderLoading, renderEmpty = _a.renderEmpty, renderPagination = _a.renderPagination, renderPaginationSize = _a.renderPaginationSize, renderLayoutNames = _a.renderLayoutNames, renderSearchForm = _a.renderSearchForm, onFetch = _a.onFetch, onSort = _a.onSort;
73
+ }), list = _a.list, model = _a.model, searchModel = _a.searchModel, paginationPosition = _a.paginationPosition, paginationSizePosition = _a.paginationSizePosition, layoutNamesPosition = _a.layoutNamesPosition, renderList = _a.renderList, renderLoading = _a.renderLoading, renderEmpty = _a.renderEmpty, renderPagination = _a.renderPagination, renderPaginationSize = _a.renderPaginationSize, renderLayoutNames = _a.renderLayoutNames, renderSearchForm = _a.renderSearchForm, renderInfiniteScroll = _a.renderInfiniteScroll, onFetch = _a.onFetch, onSort = _a.onSort;
73
74
  var renderLabel = (0, react_1.useCallback)(function (column) {
74
75
  if (column.headerView) {
75
76
  var HeaderView = column.headerView;
@@ -130,6 +131,7 @@ function Grid(props) {
130
131
  renderPaginationSize: renderPaginationSize,
131
132
  renderLayoutNames: renderLayoutNames,
132
133
  renderSearchForm: renderSearchForm,
134
+ renderInfiniteScroll: renderInfiniteScroll,
133
135
  renderValue: renderValue,
134
136
  columns: columns,
135
137
  onFetch: onFetch,
@@ -142,9 +144,9 @@ function Grid(props) {
142
144
  hasAlternatingColors: props.hasAlternatingColors,
143
145
  className: props.className,
144
146
  primaryKey: props.primaryKey
145
- }); }, [columns, layoutNamesPosition, list, onFetch, onSort, paginationPosition, paginationSizePosition, props.className,
146
- props.hasAlternatingColors, props.isLoading, props.listId, props.primaryKey, props.searchForm, props.size, renderEmpty,
147
- renderLayoutNames, renderList, renderPagination, renderPaginationSize, renderSearchForm, renderValue, renderLoading]);
147
+ }); }, [list, paginationPosition, paginationSizePosition, layoutNamesPosition, renderList, renderLoading, renderEmpty,
148
+ renderPagination, renderPaginationSize, renderLayoutNames, renderSearchForm, renderInfiniteScroll, renderValue, columns,
149
+ onFetch, onSort, props.searchForm, props.listId, props.isLoading, props.size, props.hasAlternatingColors, props.className, props.primaryKey]);
148
150
  return components.ui.renderView(props.view || 'list.GridView', viewProps);
149
151
  }
150
152
  exports["default"] = Grid;
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+ /**
3
+ * InfiniteScroll
4
+ * Компонент с бесконечным скроллом страниц.
5
+ */
6
+ export interface IInfiniteScrollProps {
7
+ /**
8
+ * Подключить бесконечный скролл
9
+ * @example true
10
+ */
11
+ enable?: boolean;
12
+ /**
13
+ * Аттрибут (название) в форме для поля с номером текущей страницы
14
+ * @example page
15
+ */
16
+ pageAttribute?: string;
17
+ /**
18
+ * Аттрибут (название) в форме для поля с флагом, определяющим есть ли следующая страница
19
+ * @example hasNextPage
20
+ */
21
+ hasNextPageAttribute?: string;
22
+ /**
23
+ * Обработчик, который вызывается после смены страницы
24
+ * @param {number} value
25
+ * @return {void}
26
+ */
27
+ onChange?: (value: number) => void;
28
+ /**
29
+ * Список, для которого используется пагинация
30
+ */
31
+ list?: any;
32
+ [key: string]: any;
33
+ }
34
+ declare function InfiniteScroll(props: IInfiniteScrollProps): JSX.Element;
35
+ declare namespace InfiniteScroll {
36
+ var defaultProps: {
37
+ enable: boolean;
38
+ pageAttribute: string;
39
+ hasNextPageAttribute: string;
40
+ };
41
+ }
42
+ export declare const normalizeInfiniteScrollProps: (props: any) => any;
43
+ declare const _default: React.MemoExoticComponent<typeof InfiniteScroll>;
44
+ export default _default;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ exports.__esModule = true;
40
+ exports.normalizeInfiniteScrollProps = void 0;
41
+ var react_1 = __importStar(require("react"));
42
+ var get_1 = __importDefault(require("lodash-es/get"));
43
+ var hooks_1 = require("./hooks");
44
+ var useForm_1 = __importDefault(require("../../../hooks/useForm"));
45
+ var form_1 = require("../../../actions/form");
46
+ function InfiniteScroll(props) {
47
+ var _a, _b;
48
+ var observerTarget = (0, react_1.useRef)(null);
49
+ var _c = (0, react_1.useState)(false), isScrollRefSet = _c[0], setIsScrollRefSet = _c[1];
50
+ var setScrollContainerRef = (0, react_1.useCallback)(function (scrollContainerNode) {
51
+ if (scrollContainerNode) {
52
+ observerTarget.current = scrollContainerNode;
53
+ setIsScrollRefSet(true);
54
+ }
55
+ }, []);
56
+ var initialValues = {
57
+ page: (_a = props.list) === null || _a === void 0 ? void 0 : _a[props.pageAttribute]
58
+ };
59
+ var _d = (0, useForm_1["default"])(), formId = _d.formId, formDispatch = _d.formDispatch, formSelector = _d.formSelector;
60
+ var page = (formSelector(function (_a) {
61
+ var values = _a.values;
62
+ return ({
63
+ page: (0, get_1["default"])(values, props.pageAttribute)
64
+ });
65
+ }) || initialValues).page;
66
+ var onScrollFetch = (0, react_1.useCallback)(function () {
67
+ var nextPage = page + 1;
68
+ if (formDispatch) {
69
+ formDispatch((0, form_1.formChange)(formId, props.pageAttribute, nextPage));
70
+ }
71
+ if (props.onChange) {
72
+ props.onChange(nextPage);
73
+ }
74
+ }, [formDispatch, formId, page, props]);
75
+ (0, hooks_1.useIntersectionObserver)({
76
+ target: observerTarget,
77
+ onIntersect: function () { return onScrollFetch(); },
78
+ enabled: Boolean(!props.list.isLoading && ((_b = props.list) === null || _b === void 0 ? void 0 : _b[props.hasNextPageAttribute]) && isScrollRefSet)
79
+ });
80
+ return react_1["default"].createElement("div", { ref: setScrollContainerRef });
81
+ }
82
+ InfiniteScroll.defaultProps = {
83
+ enable: false,
84
+ pageAttribute: 'page',
85
+ hasNextPageAttribute: 'hasNextPage'
86
+ };
87
+ var normalizeInfiniteScrollProps = function (props) { return (__assign(__assign({}, InfiniteScroll.defaultProps), (typeof props === 'boolean' ? { enable: props } : props))); };
88
+ exports.normalizeInfiniteScrollProps = normalizeInfiniteScrollProps;
89
+ exports["default"] = (0, react_1.memo)(InfiniteScroll);
@@ -0,0 +1,12 @@
1
+ import { RefObject } from 'react';
2
+ interface IIntersectionObserverConfig {
3
+ target: RefObject<any>;
4
+ onIntersect: (...args: any[]) => void;
5
+ enabled: boolean;
6
+ }
7
+ export declare const defaultConfig: {
8
+ threshold: number;
9
+ rootMargin: string;
10
+ };
11
+ export declare const useIntersectionObserver: (config: IIntersectionObserverConfig) => void;
12
+ export {};
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ exports.__esModule = true;
14
+ exports.useIntersectionObserver = exports.defaultConfig = void 0;
15
+ var react_1 = require("react");
16
+ exports.defaultConfig = {
17
+ threshold: 0,
18
+ rootMargin: '0px'
19
+ };
20
+ var useIntersectionObserver = function (config) {
21
+ (0, react_1.useEffect)(function () {
22
+ if (!config.enabled) {
23
+ return;
24
+ }
25
+ var observer = new IntersectionObserver(function (entries) {
26
+ if (entries[0].isIntersecting) {
27
+ config.onIntersect();
28
+ }
29
+ }, __assign({}, exports.defaultConfig));
30
+ var ref = config.target;
31
+ if (!ref.current) {
32
+ return;
33
+ }
34
+ observer.observe(ref.current);
35
+ // eslint-disable-next-line consistent-return
36
+ return function () {
37
+ observer.unobserve(ref.current);
38
+ };
39
+ }, [config.target.current, config.enabled]);
40
+ };
41
+ exports.useIntersectionObserver = useIntersectionObserver;
@@ -0,0 +1,2 @@
1
+ import InfiniteScroll from './InfiniteScroll';
2
+ export default InfiniteScroll;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ exports.__esModule = true;
6
+ var InfiniteScroll_1 = __importDefault(require("./InfiniteScroll"));
7
+ exports["default"] = InfiniteScroll_1["default"];