@steroidsjs/core 3.0.12 → 3.0.14

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.
@@ -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
@@ -15395,13 +15403,13 @@
15395
15403
  "'items'>",
15396
15404
  "IUiComponent",
15397
15405
  "Pick<ITreeProps",
15398
- "'levelPadding' | 'alwaysOpened' | 'hasIconExpandOnly' | 'customIcon' | 'saveInClientStorage'>"
15406
+ "'levelPadding' | 'alwaysOpened' | 'hasIconExpandOnly' | 'customIcon' | 'saveInClientStorage' | 'collapseChildItems'>"
15399
15407
  ],
15400
15408
  "properties": [
15401
15409
  {
15402
15410
  "name": "alwaysOpened",
15403
15411
  "decorators": [],
15404
- "description": " Используется для управления раскрытием всех элементов в дереве",
15412
+ "description": "Используется для управления раскрытием всех элементов в дереве",
15405
15413
  "required": false,
15406
15414
  "type": "boolean",
15407
15415
  "example": null,
@@ -15443,6 +15451,15 @@
15443
15451
  "example": null,
15444
15452
  "defaultValue": null
15445
15453
  },
15454
+ {
15455
+ "name": "collapseChildItems",
15456
+ "decorators": [],
15457
+ "description": "Скрывать открытые вложенные узлы, если скрыли родительский узел",
15458
+ "required": false,
15459
+ "type": "boolean",
15460
+ "example": "true",
15461
+ "defaultValue": null
15462
+ },
15446
15463
  {
15447
15464
  "name": "customIcon",
15448
15465
  "decorators": [],
@@ -36915,6 +36932,7 @@
36915
36932
  "tags": {},
36916
36933
  "defaultProps": {
36917
36934
  "alwaysOpened": "false",
36935
+ "collapseChildItems": "false",
36918
36936
  "levelPadding": "32",
36919
36937
  "saveInClientStorage": "false"
36920
36938
  },
@@ -36922,18 +36940,27 @@
36922
36940
  "Omit<IGridProps",
36923
36941
  "'items'>",
36924
36942
  "Pick<ITreeProps",
36925
- "'alwaysOpened' | 'levelPadding' | 'customIcon' | 'saveInClientStorage'>"
36943
+ "'alwaysOpened' | 'levelPadding' | 'customIcon' | 'saveInClientStorage' | 'collapseChildItems'>"
36926
36944
  ],
36927
36945
  "properties": [
36928
36946
  {
36929
36947
  "name": "alwaysOpened",
36930
36948
  "decorators": [],
36931
- "description": " Используется для управления раскрытием всех элементов в дереве",
36949
+ "description": "Используется для управления раскрытием всех элементов в дереве",
36932
36950
  "required": false,
36933
36951
  "type": "boolean",
36934
36952
  "example": null,
36935
36953
  "defaultValue": "false"
36936
36954
  },
36955
+ {
36956
+ "name": "collapseChildItems",
36957
+ "decorators": [],
36958
+ "description": "Скрывать открытые вложенные узлы, если скрыли родительский узел",
36959
+ "required": false,
36960
+ "type": "boolean",
36961
+ "example": "true",
36962
+ "defaultValue": "false"
36963
+ },
36937
36964
  {
36938
36965
  "name": "customIcon",
36939
36966
  "decorators": [],
@@ -38989,7 +39016,7 @@
38989
39016
  {
38990
39017
  "name": "alwaysOpened",
38991
39018
  "decorators": [],
38992
- "description": " Используется для управления раскрытием всех элементов в дереве",
39019
+ "description": "Используется для управления раскрытием всех элементов в дереве",
38993
39020
  "required": false,
38994
39021
  "type": "boolean",
38995
39022
  "example": null
@@ -39034,6 +39061,14 @@
39034
39061
  "type": "string",
39035
39062
  "example": "'exampleTree'"
39036
39063
  },
39064
+ {
39065
+ "name": "collapseChildItems",
39066
+ "decorators": [],
39067
+ "description": "Скрывать открытые вложенные узлы, если скрыли родительский узел",
39068
+ "required": false,
39069
+ "type": "boolean",
39070
+ "example": "true"
39071
+ },
39037
39072
  {
39038
39073
  "name": "customIcon",
39039
39074
  "decorators": [],
@@ -39109,7 +39144,7 @@
39109
39144
  {
39110
39145
  "name": "routerParams",
39111
39146
  "decorators": [],
39112
- "description": " Параметры роутинга",
39147
+ "description": "Параметры роутинга",
39113
39148
  "required": false,
39114
39149
  "type": "any",
39115
39150
  "example": null
@@ -39211,6 +39246,7 @@
39211
39246
  "defaultProps": {
39212
39247
  "autoOpenLevels": "1",
39213
39248
  "autoSave": "false",
39249
+ "collapseChildItems": "false",
39214
39250
  "hasIconExpandOnly": "false",
39215
39251
  "hideIcon": "false",
39216
39252
  "itemsKey": "'items'",
@@ -39227,7 +39263,7 @@
39227
39263
  {
39228
39264
  "name": "alwaysOpened",
39229
39265
  "decorators": [],
39230
- "description": " Используется для управления раскрытием всех элементов в дереве",
39266
+ "description": "Используется для управления раскрытием всех элементов в дереве",
39231
39267
  "required": false,
39232
39268
  "type": "boolean",
39233
39269
  "example": null,
@@ -39269,6 +39305,15 @@
39269
39305
  "example": "'exampleTree'",
39270
39306
  "defaultValue": null
39271
39307
  },
39308
+ {
39309
+ "name": "collapseChildItems",
39310
+ "decorators": [],
39311
+ "description": "Скрывать открытые вложенные узлы, если скрыли родительский узел",
39312
+ "required": false,
39313
+ "type": "boolean",
39314
+ "example": "true",
39315
+ "defaultValue": "false"
39316
+ },
39272
39317
  {
39273
39318
  "name": "customIcon",
39274
39319
  "decorators": [],
@@ -39344,7 +39389,7 @@
39344
39389
  {
39345
39390
  "name": "routerParams",
39346
39391
  "decorators": [],
39347
- "description": " Параметры роутинга",
39392
+ "description": "Параметры роутинга",
39348
39393
  "required": false,
39349
39394
  "type": "any",
39350
39395
  "example": null,
@@ -39448,7 +39493,7 @@
39448
39493
  {
39449
39494
  "name": "alwaysOpened",
39450
39495
  "decorators": [],
39451
- "description": " Используется для управления раскрытием всех элементов в дереве",
39496
+ "description": "Используется для управления раскрытием всех элементов в дереве",
39452
39497
  "required": false,
39453
39498
  "type": "boolean",
39454
39499
  "example": null
@@ -39485,6 +39530,14 @@
39485
39530
  "type": "string",
39486
39531
  "example": "'exampleTree'"
39487
39532
  },
39533
+ {
39534
+ "name": "collapseChildItems",
39535
+ "decorators": [],
39536
+ "description": "Скрывать открытые вложенные узлы, если скрыли родительский узел",
39537
+ "required": false,
39538
+ "type": "boolean",
39539
+ "example": "true"
39540
+ },
39488
39541
  {
39489
39542
  "name": "customIcon",
39490
39543
  "decorators": [],
@@ -39552,7 +39605,7 @@
39552
39605
  {
39553
39606
  "name": "routerParams",
39554
39607
  "decorators": [],
39555
- "description": " Параметры роутинга",
39608
+ "description": "Параметры роутинга",
39556
39609
  "required": false,
39557
39610
  "type": "any",
39558
39611
  "example": null
package/en.json CHANGED
@@ -980,7 +980,12 @@
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
  "Дополнительный свойства для view части компонента": "",
983
+ "Используется для управления раскрытием всех элементов в дереве": "",
983
984
  "Идентификатор (ключ) для сохранения в LocalStorage коллекции.": "",
985
+ "Скрывать открытые вложенные узлы, если скрыли родительский узел": "",
986
+ "Текущая страница, используется для корректного отображения пагинации": "",
987
+ "Количество элементов на странице, используется для корректного отображения пагинации": "",
988
+ "Параметры роутинга": "",
984
989
  "Сохранение в localStorage уровней вложенности.": "",
985
990
  "Компоненты для подключения wysiwyg редактора": "",
986
991
  "Отображать чекбоксы только на узлах, не имеющих вложенных элементов": "",
@@ -76,22 +76,22 @@ export interface ITreeConfig {
76
76
  */
77
77
  onExpand?: (...args: any[]) => any;
78
78
  /**
79
- * Используется для управления раскрытием всех элементов в дереве
79
+ * Используется для управления раскрытием всех элементов в дереве
80
80
  * @example: true
81
81
  */
82
82
  alwaysOpened?: boolean;
83
83
  /**
84
- * Текущая страница, используется для корректного отображения пагинации
84
+ * Текущая страница, используется для корректного отображения пагинации
85
85
  * @example: 1
86
86
  */
87
87
  currentPage?: number;
88
88
  /**
89
- * Количество элементов на странице, используется для корректного отображения пагинации
89
+ * Количество элементов на странице, используется для корректного отображения пагинации
90
90
  * @example: 4
91
91
  */
92
92
  itemsOnPage?: number;
93
93
  /**
94
- * Параметры роутинга
94
+ * Параметры роутинга
95
95
  * @example: true
96
96
  */
97
97
  routerParams?: any;
@@ -100,6 +100,11 @@ export interface ITreeConfig {
100
100
  * @example true
101
101
  */
102
102
  useSameSelectedItemId?: boolean;
103
+ /**
104
+ * Скрывать открытые вложенные узлы, если скрыли родительский узел
105
+ * @example true
106
+ */
107
+ collapseChildItems?: boolean;
103
108
  /**
104
109
  * Сохранение в localStorage уровней вложенности.
105
110
  * @example true
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; }
@@ -145,12 +147,15 @@ function useTree(config) {
145
147
  (0, react_use_1.useUnmount)(function () {
146
148
  saveInClientStorage();
147
149
  });
148
- (0, react_use_1.useBeforeUnload)(function () {
149
- saveInClientStorage();
150
- return true;
151
- });
150
+ (0, react_1.useEffect)(function () {
151
+ if (config.saveInClientStorage) {
152
+ window.addEventListener('beforeunload', saveInClientStorage);
153
+ }
154
+ return function () {
155
+ window.removeEventListener('beforeunload', saveInClientStorage);
156
+ };
157
+ }, [config.saveInClientStorage, saveInClientStorage]);
152
158
  var onExpand = (0, react_1.useCallback)(function (e, uniqueId, item) {
153
- var _a;
154
159
  e.preventDefault();
155
160
  if (config.onExpand) {
156
161
  config.onExpand.call(null, e, item);
@@ -158,9 +163,17 @@ function useTree(config) {
158
163
  var sameUniqueIdAccordingToSettings = config.useSameSelectedItemId ? uniqueId : null;
159
164
  setSelectedUniqueId(selectedUniqueId === uniqueId ? sameUniqueIdAccordingToSettings : uniqueId);
160
165
  if (!(0, isEmpty_1["default"])(item[primaryKey])) {
161
- setExpandedItems(__assign(__assign({}, expandedItems), (_a = {}, _a[uniqueId] = !expandedItems[uniqueId], _a)));
166
+ setExpandedItems(function (prevState) {
167
+ var _a;
168
+ // Hide child elements when closing the parent
169
+ if (config.collapseChildItems && prevState[uniqueId]) {
170
+ return __assign({}, removeClosedChildItems(prevState, uniqueId));
171
+ }
172
+ // Hide/expand only the element that was clicked
173
+ return __assign(__assign({}, prevState), (_a = {}, _a[uniqueId] = !prevState[uniqueId], _a));
174
+ });
162
175
  }
163
- }, [config.onExpand, config.useSameSelectedItemId, expandedItems, primaryKey, selectedUniqueId]);
176
+ }, [config.collapseChildItems, config.onExpand, config.useSameSelectedItemId, primaryKey, selectedUniqueId]);
164
177
  var resultTreeItems = (0, react_1.useMemo)(function () {
165
178
  var getItems = function (sourceItems, parentId, currentLevel) {
166
179
  if (parentId === void 0) { parentId = EMPTY_PARENT_ID; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steroidsjs/core",
3
- "version": "3.0.12",
3
+ "version": "3.0.14",
4
4
  "description": "",
5
5
  "author": "Vladimir Kozhin <hello@kozhindev.com>",
6
6
  "repository": {
@@ -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
  };
@@ -70,6 +70,7 @@ declare namespace Tree {
70
70
  useSameSelectedItemId: boolean;
71
71
  hideIcon: boolean;
72
72
  saveInClientStorage: boolean;
73
+ collapseChildItems: boolean;
73
74
  };
74
75
  }
75
76
  export default Tree;
@@ -14,6 +14,7 @@ function Tree(props) {
14
14
  level: props.level,
15
15
  alwaysOpened: props.alwaysOpened,
16
16
  useSameSelectedItemId: props.useSameSelectedItemId,
17
+ collapseChildItems: props.collapseChildItems,
17
18
  saveInClientStorage: props.autoSave,
18
19
  clientStorageId: props.id
19
20
  }).treeItems;
@@ -37,5 +38,6 @@ Tree.defaultProps = {
37
38
  hasIconExpandOnly: false,
38
39
  useSameSelectedItemId: true,
39
40
  hideIcon: false,
40
- saveInClientStorage: false
41
+ saveInClientStorage: false,
42
+ collapseChildItems: false
41
43
  };