@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 +8 -0
- package/actions/list.js +13 -4
- package/docs-autogen-result.json +180 -2
- package/en.json +8 -0
- package/hooks/useList.d.ts +10 -0
- package/hooks/useList.js +13 -1
- package/package.json +1 -1
- package/reducers/list.js +9 -1
- package/ui/content/CalendarSystem/CalendarSystem.d.ts +18 -1
- package/ui/content/CalendarSystem/CalendarSystem.js +3 -2
- package/ui/content/CalendarSystem/helpers/addEventIfMatchDate.d.ts +1 -1
- package/ui/content/CalendarSystem/hooks/useCalendarSystem.d.ts +3 -3
- package/ui/content/CalendarSystem/hooks/useCalendarSystem.js +66 -12
- package/ui/content/CalendarSystem/hooks/useCalendarSystemModals.d.ts +1 -1
- package/ui/list/Grid/Grid.d.ts +1 -0
- package/ui/list/Grid/Grid.js +6 -4
- package/ui/list/InfiniteScroll/InfiniteScroll.d.ts +44 -0
- package/ui/list/InfiniteScroll/InfiniteScroll.js +89 -0
- package/ui/list/InfiniteScroll/hooks.d.ts +12 -0
- package/ui/list/InfiniteScroll/hooks.js +41 -0
- package/ui/list/InfiniteScroll/index.d.ts +2 -0
- package/ui/list/InfiniteScroll/index.js +7 -0
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:
|
|
223
|
-
total:
|
|
229
|
+
items: items,
|
|
230
|
+
total: total,
|
|
231
|
+
hasNextPage: hasNextPage,
|
|
224
232
|
meta: data.meta || null,
|
|
225
|
-
page:
|
|
226
|
-
pageSize:
|
|
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
|
];
|
package/docs-autogen-result.json
CHANGED
|
@@ -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.": ""
|
package/hooks/useList.d.ts
CHANGED
|
@@ -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
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
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
45
|
-
var
|
|
46
|
-
var _c =
|
|
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
|
|
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
|
|
61
|
-
var
|
|
62
|
-
var
|
|
63
|
-
var
|
|
64
|
-
var
|
|
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 =
|
|
86
|
+
}), calendarType = _l.calendarType, handleCalendarTypeChange = _l.handleCalendarTypeChange;
|
|
71
87
|
var onClickControl = (0, useCalendarControls_1["default"])(calendarType, generalCurrentDay, setGeneralCurrentDay, isGeneralCurrentDayNeedsUpdate).onClickControl;
|
|
72
|
-
var
|
|
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;
|
package/ui/list/Grid/Grid.d.ts
CHANGED
|
@@ -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;
|
package/ui/list/Grid/Grid.js
CHANGED
|
@@ -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
|
-
}); }, [
|
|
146
|
-
|
|
147
|
-
|
|
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,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"];
|