@steroidsjs/core 3.0.13 → 3.0.15
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/docs-autogen-result.json +97 -16
- package/en.json +6 -0
- package/hooks/useTree.d.ts +12 -6
- package/hooks/useTree.js +32 -4
- package/package.json +1 -1
- package/ui/form/CheckboxTreeField/CheckboxTreeField.d.ts +1 -1
- package/ui/form/CheckboxTreeField/CheckboxTreeField.js +4 -2
- package/ui/list/TreeTable/TreeTable.d.ts +2 -1
- package/ui/list/TreeTable/TreeTable.js +3 -1
- package/ui/nav/Tree/Tree.d.ts +8 -0
- package/ui/nav/Tree/Tree.js +17 -11
package/docs-autogen-result.json
CHANGED
|
@@ -4576,7 +4576,7 @@
|
|
|
4576
4576
|
{
|
|
4577
4577
|
"name": "alwaysOpened",
|
|
4578
4578
|
"decorators": [],
|
|
4579
|
-
"description": "
|
|
4579
|
+
"description": "Используется для управления раскрытием всех элементов в дереве",
|
|
4580
4580
|
"required": false,
|
|
4581
4581
|
"type": "boolean",
|
|
4582
4582
|
"example": null
|
|
@@ -4597,10 +4597,18 @@
|
|
|
4597
4597
|
"type": "string",
|
|
4598
4598
|
"example": "'exampleTree'"
|
|
4599
4599
|
},
|
|
4600
|
+
{
|
|
4601
|
+
"name": "collapseChildItems",
|
|
4602
|
+
"decorators": [],
|
|
4603
|
+
"description": "Скрывать открытые вложенные узлы, если скрыли родительский узел",
|
|
4604
|
+
"required": false,
|
|
4605
|
+
"type": "boolean",
|
|
4606
|
+
"example": "true"
|
|
4607
|
+
},
|
|
4600
4608
|
{
|
|
4601
4609
|
"name": "currentPage",
|
|
4602
4610
|
"decorators": [],
|
|
4603
|
-
"description": "
|
|
4611
|
+
"description": "Текущая страница, используется для корректного отображения пагинации",
|
|
4604
4612
|
"required": false,
|
|
4605
4613
|
"type": "number",
|
|
4606
4614
|
"example": null
|
|
@@ -4624,7 +4632,7 @@
|
|
|
4624
4632
|
{
|
|
4625
4633
|
"name": "itemsOnPage",
|
|
4626
4634
|
"decorators": [],
|
|
4627
|
-
"description": "
|
|
4635
|
+
"description": "Количество элементов на странице, используется для корректного отображения пагинации",
|
|
4628
4636
|
"required": false,
|
|
4629
4637
|
"type": "number",
|
|
4630
4638
|
"example": null
|
|
@@ -4640,7 +4648,7 @@
|
|
|
4640
4648
|
{
|
|
4641
4649
|
"name": "routerParams",
|
|
4642
4650
|
"decorators": [],
|
|
4643
|
-
"description": "
|
|
4651
|
+
"description": "Параметры роутинга",
|
|
4644
4652
|
"required": false,
|
|
4645
4653
|
"type": "any",
|
|
4646
4654
|
"example": null
|
|
@@ -4990,7 +4998,26 @@
|
|
|
4990
4998
|
"example": null
|
|
4991
4999
|
}
|
|
4992
5000
|
],
|
|
4993
|
-
"methods": [
|
|
5001
|
+
"methods": [
|
|
5002
|
+
{
|
|
5003
|
+
"name": "onItemFocus",
|
|
5004
|
+
"decorators": [],
|
|
5005
|
+
"description": "",
|
|
5006
|
+
"required": false,
|
|
5007
|
+
"type": "void",
|
|
5008
|
+
"example": null,
|
|
5009
|
+
"parameters": [
|
|
5010
|
+
{
|
|
5011
|
+
"name": "e",
|
|
5012
|
+
"decorators": [],
|
|
5013
|
+
"description": "",
|
|
5014
|
+
"required": true,
|
|
5015
|
+
"type": "any",
|
|
5016
|
+
"example": null
|
|
5017
|
+
}
|
|
5018
|
+
]
|
|
5019
|
+
}
|
|
5020
|
+
]
|
|
4994
5021
|
},
|
|
4995
5022
|
"IUiComponent": {
|
|
4996
5023
|
"name": "IUiComponent",
|
|
@@ -15395,13 +15422,13 @@
|
|
|
15395
15422
|
"'items'>",
|
|
15396
15423
|
"IUiComponent",
|
|
15397
15424
|
"Pick<ITreeProps",
|
|
15398
|
-
"'levelPadding' | 'alwaysOpened' | 'hasIconExpandOnly' | 'customIcon' | 'saveInClientStorage'>"
|
|
15425
|
+
"'levelPadding' | 'alwaysOpened' | 'hasIconExpandOnly' | 'customIcon' | 'saveInClientStorage' | 'collapseChildItems'>"
|
|
15399
15426
|
],
|
|
15400
15427
|
"properties": [
|
|
15401
15428
|
{
|
|
15402
15429
|
"name": "alwaysOpened",
|
|
15403
15430
|
"decorators": [],
|
|
15404
|
-
"description": "
|
|
15431
|
+
"description": "Используется для управления раскрытием всех элементов в дереве",
|
|
15405
15432
|
"required": false,
|
|
15406
15433
|
"type": "boolean",
|
|
15407
15434
|
"example": null,
|
|
@@ -15443,6 +15470,15 @@
|
|
|
15443
15470
|
"example": null,
|
|
15444
15471
|
"defaultValue": null
|
|
15445
15472
|
},
|
|
15473
|
+
{
|
|
15474
|
+
"name": "collapseChildItems",
|
|
15475
|
+
"decorators": [],
|
|
15476
|
+
"description": "Скрывать открытые вложенные узлы, если скрыли родительский узел",
|
|
15477
|
+
"required": false,
|
|
15478
|
+
"type": "boolean",
|
|
15479
|
+
"example": "true",
|
|
15480
|
+
"defaultValue": null
|
|
15481
|
+
},
|
|
15446
15482
|
{
|
|
15447
15483
|
"name": "customIcon",
|
|
15448
15484
|
"decorators": [],
|
|
@@ -36915,6 +36951,7 @@
|
|
|
36915
36951
|
"tags": {},
|
|
36916
36952
|
"defaultProps": {
|
|
36917
36953
|
"alwaysOpened": "false",
|
|
36954
|
+
"collapseChildItems": "false",
|
|
36918
36955
|
"levelPadding": "32",
|
|
36919
36956
|
"saveInClientStorage": "false"
|
|
36920
36957
|
},
|
|
@@ -36922,18 +36959,27 @@
|
|
|
36922
36959
|
"Omit<IGridProps",
|
|
36923
36960
|
"'items'>",
|
|
36924
36961
|
"Pick<ITreeProps",
|
|
36925
|
-
"'alwaysOpened' | 'levelPadding' | 'customIcon' | 'saveInClientStorage'>"
|
|
36962
|
+
"'alwaysOpened' | 'levelPadding' | 'customIcon' | 'saveInClientStorage' | 'collapseChildItems'>"
|
|
36926
36963
|
],
|
|
36927
36964
|
"properties": [
|
|
36928
36965
|
{
|
|
36929
36966
|
"name": "alwaysOpened",
|
|
36930
36967
|
"decorators": [],
|
|
36931
|
-
"description": "
|
|
36968
|
+
"description": "Используется для управления раскрытием всех элементов в дереве",
|
|
36932
36969
|
"required": false,
|
|
36933
36970
|
"type": "boolean",
|
|
36934
36971
|
"example": null,
|
|
36935
36972
|
"defaultValue": "false"
|
|
36936
36973
|
},
|
|
36974
|
+
{
|
|
36975
|
+
"name": "collapseChildItems",
|
|
36976
|
+
"decorators": [],
|
|
36977
|
+
"description": "Скрывать открытые вложенные узлы, если скрыли родительский узел",
|
|
36978
|
+
"required": false,
|
|
36979
|
+
"type": "boolean",
|
|
36980
|
+
"example": "true",
|
|
36981
|
+
"defaultValue": "false"
|
|
36982
|
+
},
|
|
36937
36983
|
{
|
|
36938
36984
|
"name": "customIcon",
|
|
36939
36985
|
"decorators": [],
|
|
@@ -38989,7 +39035,7 @@
|
|
|
38989
39035
|
{
|
|
38990
39036
|
"name": "alwaysOpened",
|
|
38991
39037
|
"decorators": [],
|
|
38992
|
-
"description": "
|
|
39038
|
+
"description": "Используется для управления раскрытием всех элементов в дереве",
|
|
38993
39039
|
"required": false,
|
|
38994
39040
|
"type": "boolean",
|
|
38995
39041
|
"example": null
|
|
@@ -39034,6 +39080,14 @@
|
|
|
39034
39080
|
"type": "string",
|
|
39035
39081
|
"example": "'exampleTree'"
|
|
39036
39082
|
},
|
|
39083
|
+
{
|
|
39084
|
+
"name": "collapseChildItems",
|
|
39085
|
+
"decorators": [],
|
|
39086
|
+
"description": "Скрывать открытые вложенные узлы, если скрыли родительский узел",
|
|
39087
|
+
"required": false,
|
|
39088
|
+
"type": "boolean",
|
|
39089
|
+
"example": "true"
|
|
39090
|
+
},
|
|
39037
39091
|
{
|
|
39038
39092
|
"name": "customIcon",
|
|
39039
39093
|
"decorators": [],
|
|
@@ -39109,7 +39163,7 @@
|
|
|
39109
39163
|
{
|
|
39110
39164
|
"name": "routerParams",
|
|
39111
39165
|
"decorators": [],
|
|
39112
|
-
"description": "
|
|
39166
|
+
"description": "Параметры роутинга",
|
|
39113
39167
|
"required": false,
|
|
39114
39168
|
"type": "any",
|
|
39115
39169
|
"example": null
|
|
@@ -39206,11 +39260,12 @@
|
|
|
39206
39260
|
"name": "ITreeProps",
|
|
39207
39261
|
"moduleName": "ui/nav/Tree/Tree",
|
|
39208
39262
|
"title": "Tree",
|
|
39209
|
-
"description": "Компонент, который представляет в виде дерева список с иерархической структурой
|
|
39263
|
+
"description": "Компонент, который представляет в виде дерева список с иерархической структурой данных\n\nДополнительный функционал: в кастомном view компонента есть возможность реализовать кнопку, по клику на которую\nбудет вызываться функция props.onItemFocus. Данная функция \"находит\" текущий роут в дереве -\nраскрывает родительские уровни, делает элемент активным.\nДанная функция не включает скролл к активному компоненту внутри дерева, это также необходимо\nреализовать в кастомном view локально в проекте.\n",
|
|
39210
39264
|
"tags": {},
|
|
39211
39265
|
"defaultProps": {
|
|
39212
39266
|
"autoOpenLevels": "1",
|
|
39213
39267
|
"autoSave": "false",
|
|
39268
|
+
"collapseChildItems": "false",
|
|
39214
39269
|
"hasIconExpandOnly": "false",
|
|
39215
39270
|
"hideIcon": "false",
|
|
39216
39271
|
"itemsKey": "'items'",
|
|
@@ -39227,7 +39282,7 @@
|
|
|
39227
39282
|
{
|
|
39228
39283
|
"name": "alwaysOpened",
|
|
39229
39284
|
"decorators": [],
|
|
39230
|
-
"description": "
|
|
39285
|
+
"description": "Используется для управления раскрытием всех элементов в дереве",
|
|
39231
39286
|
"required": false,
|
|
39232
39287
|
"type": "boolean",
|
|
39233
39288
|
"example": null,
|
|
@@ -39269,6 +39324,15 @@
|
|
|
39269
39324
|
"example": "'exampleTree'",
|
|
39270
39325
|
"defaultValue": null
|
|
39271
39326
|
},
|
|
39327
|
+
{
|
|
39328
|
+
"name": "collapseChildItems",
|
|
39329
|
+
"decorators": [],
|
|
39330
|
+
"description": "Скрывать открытые вложенные узлы, если скрыли родительский узел",
|
|
39331
|
+
"required": false,
|
|
39332
|
+
"type": "boolean",
|
|
39333
|
+
"example": "true",
|
|
39334
|
+
"defaultValue": "false"
|
|
39335
|
+
},
|
|
39272
39336
|
{
|
|
39273
39337
|
"name": "customIcon",
|
|
39274
39338
|
"decorators": [],
|
|
@@ -39344,7 +39408,7 @@
|
|
|
39344
39408
|
{
|
|
39345
39409
|
"name": "routerParams",
|
|
39346
39410
|
"decorators": [],
|
|
39347
|
-
"description": "
|
|
39411
|
+
"description": "Параметры роутинга",
|
|
39348
39412
|
"required": false,
|
|
39349
39413
|
"type": "any",
|
|
39350
39414
|
"example": null,
|
|
@@ -39448,7 +39512,7 @@
|
|
|
39448
39512
|
{
|
|
39449
39513
|
"name": "alwaysOpened",
|
|
39450
39514
|
"decorators": [],
|
|
39451
|
-
"description": "
|
|
39515
|
+
"description": "Используется для управления раскрытием всех элементов в дереве",
|
|
39452
39516
|
"required": false,
|
|
39453
39517
|
"type": "boolean",
|
|
39454
39518
|
"example": null
|
|
@@ -39485,6 +39549,14 @@
|
|
|
39485
39549
|
"type": "string",
|
|
39486
39550
|
"example": "'exampleTree'"
|
|
39487
39551
|
},
|
|
39552
|
+
{
|
|
39553
|
+
"name": "collapseChildItems",
|
|
39554
|
+
"decorators": [],
|
|
39555
|
+
"description": "Скрывать открытые вложенные узлы, если скрыли родительский узел",
|
|
39556
|
+
"required": false,
|
|
39557
|
+
"type": "boolean",
|
|
39558
|
+
"example": "true"
|
|
39559
|
+
},
|
|
39488
39560
|
{
|
|
39489
39561
|
"name": "customIcon",
|
|
39490
39562
|
"decorators": [],
|
|
@@ -39552,7 +39624,7 @@
|
|
|
39552
39624
|
{
|
|
39553
39625
|
"name": "routerParams",
|
|
39554
39626
|
"decorators": [],
|
|
39555
|
-
"description": "
|
|
39627
|
+
"description": "Параметры роутинга",
|
|
39556
39628
|
"required": false,
|
|
39557
39629
|
"type": "any",
|
|
39558
39630
|
"example": null
|
|
@@ -39634,6 +39706,15 @@
|
|
|
39634
39706
|
"example": null
|
|
39635
39707
|
}
|
|
39636
39708
|
]
|
|
39709
|
+
},
|
|
39710
|
+
{
|
|
39711
|
+
"name": "onItemFocus",
|
|
39712
|
+
"decorators": [],
|
|
39713
|
+
"description": "",
|
|
39714
|
+
"required": false,
|
|
39715
|
+
"type": "void",
|
|
39716
|
+
"example": null,
|
|
39717
|
+
"parameters": []
|
|
39637
39718
|
}
|
|
39638
39719
|
]
|
|
39639
39720
|
},
|
package/en.json
CHANGED
|
@@ -979,8 +979,14 @@
|
|
|
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
|
+
"Компонент, который представляет в виде дерева список с иерархической структурой данных\n\nДополнительный функционал: в кастомном view компонента есть возможность реализовать кнопку, по клику на которую\nбудет вызываться функция props.onItemFocus. Данная функция \"находит\" текущий роут в дереве -\nраскрывает родительские уровни, делает элемент активным.\nДанная функция не включает скролл к активному компоненту внутри дерева, это также необходимо\nреализовать в кастомном view локально в проекте.\n": "",
|
|
982
983
|
"Дополнительный свойства для view части компонента": "",
|
|
984
|
+
"Используется для управления раскрытием всех элементов в дереве": "",
|
|
983
985
|
"Идентификатор (ключ) для сохранения в LocalStorage коллекции.": "",
|
|
986
|
+
"Скрывать открытые вложенные узлы, если скрыли родительский узел": "",
|
|
987
|
+
"Текущая страница, используется для корректного отображения пагинации": "",
|
|
988
|
+
"Количество элементов на странице, используется для корректного отображения пагинации": "",
|
|
989
|
+
"Параметры роутинга": "",
|
|
984
990
|
"Сохранение в localStorage уровней вложенности.": "",
|
|
985
991
|
"Компоненты для подключения wysiwyg редактора": "",
|
|
986
992
|
"Отображать чекбоксы только на узлах, не имеющих вложенных элементов": "",
|
package/hooks/useTree.d.ts
CHANGED
|
@@ -35,6 +35,7 @@ export interface IPreparedTreeItem extends ITreeItem {
|
|
|
35
35
|
}
|
|
36
36
|
export interface ITreeOutput {
|
|
37
37
|
treeItems: IPreparedTreeItem[];
|
|
38
|
+
onItemFocus: (e: Event | React.MouseEvent | any) => void;
|
|
38
39
|
}
|
|
39
40
|
export interface ITreeConfig {
|
|
40
41
|
/**
|
|
@@ -76,34 +77,39 @@ export interface ITreeConfig {
|
|
|
76
77
|
*/
|
|
77
78
|
onExpand?: (...args: any[]) => any;
|
|
78
79
|
/**
|
|
79
|
-
*
|
|
80
|
+
* Используется для управления раскрытием всех элементов в дереве
|
|
80
81
|
* @example: true
|
|
81
82
|
*/
|
|
82
83
|
alwaysOpened?: boolean;
|
|
83
84
|
/**
|
|
84
|
-
*
|
|
85
|
+
* Текущая страница, используется для корректного отображения пагинации
|
|
85
86
|
* @example: 1
|
|
86
87
|
*/
|
|
87
88
|
currentPage?: number;
|
|
88
89
|
/**
|
|
89
|
-
*
|
|
90
|
+
* Количество элементов на странице, используется для корректного отображения пагинации
|
|
90
91
|
* @example: 4
|
|
91
92
|
*/
|
|
92
93
|
itemsOnPage?: number;
|
|
93
94
|
/**
|
|
94
|
-
*
|
|
95
|
+
* Параметры роутинга
|
|
95
96
|
* @example: true
|
|
96
97
|
*/
|
|
97
98
|
routerParams?: any;
|
|
98
99
|
/**
|
|
99
100
|
* При повторном нажатии на выбранный элемент из дерева, он продолжит отображаться как активный.
|
|
100
101
|
* @example true
|
|
101
|
-
|
|
102
|
+
*/
|
|
102
103
|
useSameSelectedItemId?: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Скрывать открытые вложенные узлы, если скрыли родительский узел
|
|
106
|
+
* @example true
|
|
107
|
+
*/
|
|
108
|
+
collapseChildItems?: boolean;
|
|
103
109
|
/**
|
|
104
110
|
* Сохранение в localStorage уровней вложенности.
|
|
105
111
|
* @example true
|
|
106
|
-
|
|
112
|
+
*/
|
|
107
113
|
saveInClientStorage?: boolean;
|
|
108
114
|
/**
|
|
109
115
|
* Идентификатор (ключ) для сохранения в LocalStorage коллекции.
|
package/hooks/useTree.js
CHANGED
|
@@ -22,6 +22,7 @@ var isEqual_1 = __importDefault(require("lodash-es/isEqual"));
|
|
|
22
22
|
var isEmpty_1 = __importDefault(require("lodash-es/isEmpty"));
|
|
23
23
|
var isNil_1 = __importDefault(require("lodash-es/isNil"));
|
|
24
24
|
var keys_1 = __importDefault(require("lodash-es/keys"));
|
|
25
|
+
var pickBy_1 = __importDefault(require("lodash-es/pickBy"));
|
|
25
26
|
var react_use_1 = require("react-use");
|
|
26
27
|
var useComponents_1 = __importDefault(require("./useComponents"));
|
|
27
28
|
var useSelector_1 = __importDefault(require("./useSelector"));
|
|
@@ -68,6 +69,7 @@ var findChildById = function (sourceItems, itemId, primaryKey, parentId, level)
|
|
|
68
69
|
});
|
|
69
70
|
return foundedItem;
|
|
70
71
|
};
|
|
72
|
+
var removeClosedChildItems = function (expandedItems, collapsedItemUniqueId) { return (0, pickBy_1["default"])(expandedItems, function (_, expandedItemUniqueId) { return !expandedItemUniqueId.startsWith(collapsedItemUniqueId); }); };
|
|
71
73
|
var getAutoExpandedItems = function (sourceItems, selectedItemId, primaryKey, autoOpenLevels, parentId, level) {
|
|
72
74
|
if (autoOpenLevels === void 0) { autoOpenLevels = 1; }
|
|
73
75
|
if (parentId === void 0) { parentId = EMPTY_PARENT_ID; }
|
|
@@ -118,6 +120,24 @@ function useTree(config) {
|
|
|
118
120
|
}
|
|
119
121
|
return [];
|
|
120
122
|
}, [config.items, config.routerParams, routes]);
|
|
123
|
+
// Выполняет поиск текущего роута в дереве: раскрывает дерево до элемента, делает элемент активным
|
|
124
|
+
var onItemFocus = (0, react_1.useCallback)(function () {
|
|
125
|
+
var currentRouteAsTreeItem = findChildById(items, selectedItemId, primaryKey);
|
|
126
|
+
var currentRouteUniqueIdParts = currentRouteAsTreeItem.uniqueId.split(DOT_SEPARATOR); // Get all parent levels of item
|
|
127
|
+
var itemsToExpand = {};
|
|
128
|
+
var itemToExpandKey;
|
|
129
|
+
currentRouteUniqueIdParts.forEach(function (item, index) {
|
|
130
|
+
if (index === 0) {
|
|
131
|
+
itemToExpandKey = item;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
itemToExpandKey = [itemToExpandKey, item].join(DOT_SEPARATOR);
|
|
135
|
+
itemsToExpand[itemToExpandKey] = true;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
setSelectedUniqueId(currentRouteAsTreeItem ? currentRouteAsTreeItem.uniqueId : null);
|
|
139
|
+
setExpandedItems(function (prev) { return (__assign(__assign({}, prev), itemsToExpand)); });
|
|
140
|
+
}, [items, primaryKey, selectedItemId]);
|
|
121
141
|
// Initial expanded items
|
|
122
142
|
(0, react_1.useEffect)(function () {
|
|
123
143
|
setExpandedItems(getAutoExpandedItems(items, selectedItemId, primaryKey, config.autoOpenLevels));
|
|
@@ -154,7 +174,6 @@ function useTree(config) {
|
|
|
154
174
|
};
|
|
155
175
|
}, [config.saveInClientStorage, saveInClientStorage]);
|
|
156
176
|
var onExpand = (0, react_1.useCallback)(function (e, uniqueId, item) {
|
|
157
|
-
var _a;
|
|
158
177
|
e.preventDefault();
|
|
159
178
|
if (config.onExpand) {
|
|
160
179
|
config.onExpand.call(null, e, item);
|
|
@@ -162,9 +181,17 @@ function useTree(config) {
|
|
|
162
181
|
var sameUniqueIdAccordingToSettings = config.useSameSelectedItemId ? uniqueId : null;
|
|
163
182
|
setSelectedUniqueId(selectedUniqueId === uniqueId ? sameUniqueIdAccordingToSettings : uniqueId);
|
|
164
183
|
if (!(0, isEmpty_1["default"])(item[primaryKey])) {
|
|
165
|
-
setExpandedItems(
|
|
184
|
+
setExpandedItems(function (prevState) {
|
|
185
|
+
var _a;
|
|
186
|
+
// Hide child elements when closing the parent
|
|
187
|
+
if (config.collapseChildItems && prevState[uniqueId]) {
|
|
188
|
+
return __assign({}, removeClosedChildItems(prevState, uniqueId));
|
|
189
|
+
}
|
|
190
|
+
// Hide/expand only the element that was clicked
|
|
191
|
+
return __assign(__assign({}, prevState), (_a = {}, _a[uniqueId] = !prevState[uniqueId], _a));
|
|
192
|
+
});
|
|
166
193
|
}
|
|
167
|
-
}, [config.onExpand, config.useSameSelectedItemId,
|
|
194
|
+
}, [config.collapseChildItems, config.onExpand, config.useSameSelectedItemId, primaryKey, selectedUniqueId]);
|
|
168
195
|
var resultTreeItems = (0, react_1.useMemo)(function () {
|
|
169
196
|
var getItems = function (sourceItems, parentId, currentLevel) {
|
|
170
197
|
if (parentId === void 0) { parentId = EMPTY_PARENT_ID; }
|
|
@@ -195,7 +222,8 @@ function useTree(config) {
|
|
|
195
222
|
// eslint-disable-next-line max-len
|
|
196
223
|
}, [activeRouteIds, config.alwaysOpened, config.currentPage, config.itemsOnPage, config.level, expandedItems, items, onExpand, primaryKey, routerParams, selectedUniqueId]);
|
|
197
224
|
return {
|
|
198
|
-
treeItems: resultTreeItems
|
|
225
|
+
treeItems: resultTreeItems,
|
|
226
|
+
onItemFocus: onItemFocus
|
|
199
227
|
};
|
|
200
228
|
}
|
|
201
229
|
exports["default"] = useTree;
|
package/package.json
CHANGED
|
@@ -19,7 +19,7 @@ type CheckboxTreeItems = string | ({
|
|
|
19
19
|
*
|
|
20
20
|
* Список с вложенными чекбоксами. Используется в формах для создания иерархической структуры и выбора нескольких значений.
|
|
21
21
|
*/
|
|
22
|
-
export interface ICheckboxTreeFieldProps extends IFieldWrapperInputProps, Omit<IDataProviderConfig, 'items'>, Omit<IDataSelectConfig, 'items'>, IUiComponent, Pick<ITreeProps, 'levelPadding' | 'alwaysOpened' | 'hasIconExpandOnly' | 'customIcon' | 'saveInClientStorage'> {
|
|
22
|
+
export interface ICheckboxTreeFieldProps extends IFieldWrapperInputProps, Omit<IDataProviderConfig, 'items'>, Omit<IDataSelectConfig, 'items'>, IUiComponent, Pick<ITreeProps, 'levelPadding' | 'alwaysOpened' | 'hasIconExpandOnly' | 'customIcon' | 'saveInClientStorage' | 'collapseChildItems'> {
|
|
23
23
|
/**
|
|
24
24
|
* Свойства для элемента input
|
|
25
25
|
* @example { onKeyDown: ... }
|
|
@@ -78,7 +78,8 @@ function CheckboxTreeField(props) {
|
|
|
78
78
|
var treeItems = (0, hooks_1.useTree)({
|
|
79
79
|
items: items,
|
|
80
80
|
autoOpenLevels: 0,
|
|
81
|
-
alwaysOpened: props.alwaysOpened
|
|
81
|
+
alwaysOpened: props.alwaysOpened,
|
|
82
|
+
collapseChildItems: props.collapseChildItems
|
|
82
83
|
}).treeItems;
|
|
83
84
|
// Data select
|
|
84
85
|
var _a = (0, hooks_1.useDataSelect)({
|
|
@@ -141,6 +142,7 @@ CheckboxTreeField.defaultProps = {
|
|
|
141
142
|
primaryKey: 'items',
|
|
142
143
|
hasOnlyLeafCheckboxes: false,
|
|
143
144
|
hasIconExpandOnly: true,
|
|
144
|
-
saveInClientStorage: false
|
|
145
|
+
saveInClientStorage: false,
|
|
146
|
+
collapseChildItems: false
|
|
145
147
|
};
|
|
146
148
|
exports["default"] = (0, fieldWrapper_1["default"])('CheckboxTreeField', CheckboxTreeField);
|
|
@@ -10,7 +10,7 @@ export interface ITreeColumnViewProps extends IColumnViewProps, Pick<ITreeTableP
|
|
|
10
10
|
*
|
|
11
11
|
* Компонент для представления данных коллекции в виде иерархической структуры.
|
|
12
12
|
*/
|
|
13
|
-
export interface ITreeTableProps extends Omit<IGridProps, 'items'>, Pick<ITreeProps, 'alwaysOpened' | 'levelPadding' | 'customIcon' | 'saveInClientStorage'> {
|
|
13
|
+
export interface ITreeTableProps extends Omit<IGridProps, 'items'>, Pick<ITreeProps, 'alwaysOpened' | 'levelPadding' | 'customIcon' | 'saveInClientStorage' | 'collapseChildItems'> {
|
|
14
14
|
/**
|
|
15
15
|
* Элементы коллекции
|
|
16
16
|
* @example
|
|
@@ -36,6 +36,7 @@ declare namespace TreeTable {
|
|
|
36
36
|
levelPadding: number;
|
|
37
37
|
alwaysOpened: boolean;
|
|
38
38
|
saveInClientStorage: boolean;
|
|
39
|
+
collapseChildItems: boolean;
|
|
39
40
|
};
|
|
40
41
|
}
|
|
41
42
|
export default TreeTable;
|
|
@@ -74,6 +74,7 @@ function TreeTable(props) {
|
|
|
74
74
|
alwaysOpened: props.alwaysOpened,
|
|
75
75
|
currentPage: list === null || list === void 0 ? void 0 : list.page,
|
|
76
76
|
itemsOnPage: list === null || list === void 0 ? void 0 : list.pageSize,
|
|
77
|
+
collapseChildItems: props.collapseChildItems,
|
|
77
78
|
saveInClientStorage: props.saveInClientStorage,
|
|
78
79
|
clientStorageId: props.listId
|
|
79
80
|
}).treeItems;
|
|
@@ -83,5 +84,6 @@ exports["default"] = TreeTable;
|
|
|
83
84
|
TreeTable.defaultProps = {
|
|
84
85
|
levelPadding: 32,
|
|
85
86
|
alwaysOpened: false,
|
|
86
|
-
saveInClientStorage: false
|
|
87
|
+
saveInClientStorage: false,
|
|
88
|
+
collapseChildItems: false
|
|
87
89
|
};
|
package/ui/nav/Tree/Tree.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import { IPreparedTreeItem, ITreeConfig, ITreeItem } from '../../../hooks/useTree';
|
|
3
3
|
export interface ITreeViewProps extends ITreeProps {
|
|
4
4
|
items: IPreparedTreeItem[];
|
|
5
|
+
onItemFocus?: () => void;
|
|
5
6
|
}
|
|
6
7
|
export interface ITreeItemViewProps extends ITreeProps {
|
|
7
8
|
item: IPreparedTreeItem;
|
|
@@ -11,6 +12,12 @@ export interface ITreeItemViewProps extends ITreeProps {
|
|
|
11
12
|
/**
|
|
12
13
|
* Tree
|
|
13
14
|
* Компонент, который представляет в виде дерева список с иерархической структурой данных
|
|
15
|
+
*
|
|
16
|
+
* Дополнительный функционал: в кастомном view компонента есть возможность реализовать кнопку, по клику на которую
|
|
17
|
+
* будет вызываться функция props.onItemFocus. Данная функция "находит" текущий роут в дереве -
|
|
18
|
+
* раскрывает родительские уровни, делает элемент активным.
|
|
19
|
+
* Данная функция не включает скролл к активному компоненту внутри дерева, это также необходимо
|
|
20
|
+
* реализовать в кастомном view локально в проекте.
|
|
14
21
|
*/
|
|
15
22
|
export interface ITreeProps extends Omit<ITreeConfig, 'currentPage' | 'itemsOnPage'> {
|
|
16
23
|
/**
|
|
@@ -70,6 +77,7 @@ declare namespace Tree {
|
|
|
70
77
|
useSameSelectedItemId: boolean;
|
|
71
78
|
hideIcon: boolean;
|
|
72
79
|
saveInClientStorage: boolean;
|
|
80
|
+
collapseChildItems: boolean;
|
|
73
81
|
};
|
|
74
82
|
}
|
|
75
83
|
export default Tree;
|
package/ui/nav/Tree/Tree.js
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
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
|
+
};
|
|
2
13
|
exports.__esModule = true;
|
|
3
14
|
var react_1 = require("react");
|
|
4
15
|
var hooks_1 = require("../../../hooks");
|
|
5
16
|
function Tree(props) {
|
|
6
17
|
var components = (0, hooks_1.useComponents)();
|
|
7
|
-
var
|
|
18
|
+
var _a = (0, hooks_1.useTree)({
|
|
8
19
|
items: props.items,
|
|
9
20
|
selectedItemId: props.selectedItemId,
|
|
10
21
|
routerParams: props.routerParams,
|
|
@@ -14,17 +25,11 @@ function Tree(props) {
|
|
|
14
25
|
level: props.level,
|
|
15
26
|
alwaysOpened: props.alwaysOpened,
|
|
16
27
|
useSameSelectedItemId: props.useSameSelectedItemId,
|
|
28
|
+
collapseChildItems: props.collapseChildItems,
|
|
17
29
|
saveInClientStorage: props.autoSave,
|
|
18
30
|
clientStorageId: props.id
|
|
19
|
-
}).treeItems;
|
|
20
|
-
var viewProps = (0, react_1.useMemo)(function () { return ({
|
|
21
|
-
items: treeItems,
|
|
22
|
-
levelPadding: props.levelPadding,
|
|
23
|
-
className: props.className,
|
|
24
|
-
hideIcon: props.hideIcon,
|
|
25
|
-
customIcon: props.customIcon,
|
|
26
|
-
hasIconExpandOnly: props.hasIconExpandOnly
|
|
27
|
-
}); }, [props.className, props.customIcon, props.hasIconExpandOnly, props.hideIcon, props.levelPadding, treeItems]);
|
|
31
|
+
}), treeItems = _a.treeItems, onItemFocus = _a.onItemFocus;
|
|
32
|
+
var viewProps = (0, react_1.useMemo)(function () { return (__assign(__assign({}, props), { onItemFocus: onItemFocus, items: treeItems, levelPadding: props.levelPadding, className: props.className, hideIcon: props.hideIcon, customIcon: props.customIcon, hasIconExpandOnly: props.hasIconExpandOnly })); }, [props, treeItems, onItemFocus]);
|
|
28
33
|
return components.ui.renderView(props.view || 'nav.TreeView', viewProps);
|
|
29
34
|
}
|
|
30
35
|
exports["default"] = Tree;
|
|
@@ -37,5 +42,6 @@ Tree.defaultProps = {
|
|
|
37
42
|
hasIconExpandOnly: false,
|
|
38
43
|
useSameSelectedItemId: true,
|
|
39
44
|
hideIcon: false,
|
|
40
|
-
saveInClientStorage: false
|
|
45
|
+
saveInClientStorage: false,
|
|
46
|
+
collapseChildItems: false
|
|
41
47
|
};
|