@steroidsjs/core 3.0.5 → 3.0.6
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 +108 -14
- package/en.json +2 -0
- package/hooks/useTree.d.ts +10 -0
- package/hooks/useTree.js +26 -1
- package/package.json +1 -1
- package/ui/form/CheckboxTreeField/CheckboxTreeField.d.ts +3 -3
- package/ui/form/CheckboxTreeField/CheckboxTreeField.js +11 -7
- package/ui/form/NumberField/NumberField.js +2 -1
- package/ui/form/NumberField/hooks/useInputTypeNumber.d.ts +1 -0
- package/ui/form/NumberField/hooks/useInputTypeNumber.js +7 -6
- package/ui/list/TreeTable/TreeTable.d.ts +2 -1
- package/ui/list/TreeTable/TreeTable.js +5 -2
- package/ui/nav/Tree/Tree.d.ts +1 -1
- package/ui/nav/Tree/Tree.js +5 -2
package/docs-autogen-result.json
CHANGED
|
@@ -4581,6 +4581,14 @@
|
|
|
4581
4581
|
"type": "number",
|
|
4582
4582
|
"example": "1"
|
|
4583
4583
|
},
|
|
4584
|
+
{
|
|
4585
|
+
"name": "clientStorageId",
|
|
4586
|
+
"decorators": [],
|
|
4587
|
+
"description": "Идентификатор (ключ) для сохранения в LocalStorage коллекции.",
|
|
4588
|
+
"required": false,
|
|
4589
|
+
"type": "string",
|
|
4590
|
+
"example": "'exampleTree'"
|
|
4591
|
+
},
|
|
4584
4592
|
{
|
|
4585
4593
|
"name": "currentPage",
|
|
4586
4594
|
"decorators": [],
|
|
@@ -4629,6 +4637,14 @@
|
|
|
4629
4637
|
"type": "any",
|
|
4630
4638
|
"example": null
|
|
4631
4639
|
},
|
|
4640
|
+
{
|
|
4641
|
+
"name": "saveInClientStorage",
|
|
4642
|
+
"decorators": [],
|
|
4643
|
+
"description": "Сохранение в localStorage уровней вложенности.",
|
|
4644
|
+
"required": false,
|
|
4645
|
+
"type": "boolean",
|
|
4646
|
+
"example": "true"
|
|
4647
|
+
},
|
|
4632
4648
|
{
|
|
4633
4649
|
"name": "selectedItemId",
|
|
4634
4650
|
"decorators": [],
|
|
@@ -15312,7 +15328,7 @@
|
|
|
15312
15328
|
"'items'>",
|
|
15313
15329
|
"IUiComponent",
|
|
15314
15330
|
"Pick<ITreeProps",
|
|
15315
|
-
"'levelPadding' | 'alwaysOpened' | 'customIcon'>"
|
|
15331
|
+
"'levelPadding' | 'alwaysOpened' | 'hasIconExpandOnly' | 'customIcon' | 'saveInClientStorage'>"
|
|
15316
15332
|
],
|
|
15317
15333
|
"properties": [
|
|
15318
15334
|
{
|
|
@@ -15423,6 +15439,15 @@
|
|
|
15423
15439
|
"example": "items",
|
|
15424
15440
|
"defaultValue": null
|
|
15425
15441
|
},
|
|
15442
|
+
{
|
|
15443
|
+
"name": "hasIconExpandOnly",
|
|
15444
|
+
"decorators": [],
|
|
15445
|
+
"description": "Флаг, определяющий раскрывать вложенные элементы по клику на весь элемент или только на иконку",
|
|
15446
|
+
"required": false,
|
|
15447
|
+
"type": "boolean",
|
|
15448
|
+
"example": "false",
|
|
15449
|
+
"defaultValue": null
|
|
15450
|
+
},
|
|
15426
15451
|
{
|
|
15427
15452
|
"name": "hasOnlyLeafCheckboxes",
|
|
15428
15453
|
"decorators": [],
|
|
@@ -15576,6 +15601,15 @@
|
|
|
15576
15601
|
"example": "true",
|
|
15577
15602
|
"defaultValue": null
|
|
15578
15603
|
},
|
|
15604
|
+
{
|
|
15605
|
+
"name": "saveInClientStorage",
|
|
15606
|
+
"decorators": [],
|
|
15607
|
+
"description": "Сохранение в localStorage уровней вложенности.",
|
|
15608
|
+
"required": false,
|
|
15609
|
+
"type": "boolean",
|
|
15610
|
+
"example": "true",
|
|
15611
|
+
"defaultValue": null
|
|
15612
|
+
},
|
|
15579
15613
|
{
|
|
15580
15614
|
"name": "selectFirst",
|
|
15581
15615
|
"decorators": [],
|
|
@@ -15671,7 +15705,7 @@
|
|
|
15671
15705
|
"extends": [
|
|
15672
15706
|
"IFieldWrapperOutputProps",
|
|
15673
15707
|
"Pick<ITreeProps",
|
|
15674
|
-
"'levelPadding' | 'customIcon'>"
|
|
15708
|
+
"'levelPadding' | 'hasIconExpandOnly' | 'customIcon'>"
|
|
15675
15709
|
],
|
|
15676
15710
|
"properties": [
|
|
15677
15711
|
{
|
|
@@ -15706,6 +15740,14 @@
|
|
|
15706
15740
|
"type": "string",
|
|
15707
15741
|
"example": null
|
|
15708
15742
|
},
|
|
15743
|
+
{
|
|
15744
|
+
"name": "hasIconExpandOnly",
|
|
15745
|
+
"decorators": [],
|
|
15746
|
+
"description": "Флаг, определяющий раскрывать вложенные элементы по клику на весь элемент или только на иконку",
|
|
15747
|
+
"required": false,
|
|
15748
|
+
"type": "boolean",
|
|
15749
|
+
"example": "false"
|
|
15750
|
+
},
|
|
15709
15751
|
{
|
|
15710
15752
|
"name": "hasOnlyLeafCheckboxes",
|
|
15711
15753
|
"decorators": [],
|
|
@@ -36567,7 +36609,7 @@
|
|
|
36567
36609
|
"extends": [
|
|
36568
36610
|
"IColumnViewProps",
|
|
36569
36611
|
"Pick<ITreeTableProps",
|
|
36570
|
-
"'levelPadding' | 'customIcon'>"
|
|
36612
|
+
"'levelPadding' | 'customIcon' >"
|
|
36571
36613
|
],
|
|
36572
36614
|
"properties": [
|
|
36573
36615
|
{
|
|
@@ -36773,13 +36815,14 @@
|
|
|
36773
36815
|
"tags": {},
|
|
36774
36816
|
"defaultProps": {
|
|
36775
36817
|
"alwaysOpened": "false",
|
|
36776
|
-
"levelPadding": "32"
|
|
36818
|
+
"levelPadding": "32",
|
|
36819
|
+
"saveInClientStorage": "false"
|
|
36777
36820
|
},
|
|
36778
36821
|
"extends": [
|
|
36779
36822
|
"Omit<IGridProps",
|
|
36780
36823
|
"'items'>",
|
|
36781
36824
|
"Pick<ITreeProps",
|
|
36782
|
-
"'alwaysOpened' | 'levelPadding' | 'customIcon'>"
|
|
36825
|
+
"'alwaysOpened' | 'levelPadding' | 'customIcon' | 'saveInClientStorage'>"
|
|
36783
36826
|
],
|
|
36784
36827
|
"properties": [
|
|
36785
36828
|
{
|
|
@@ -36817,6 +36860,15 @@
|
|
|
36817
36860
|
"type": "number",
|
|
36818
36861
|
"example": "32",
|
|
36819
36862
|
"defaultValue": "32"
|
|
36863
|
+
},
|
|
36864
|
+
{
|
|
36865
|
+
"name": "saveInClientStorage",
|
|
36866
|
+
"decorators": [],
|
|
36867
|
+
"description": "Сохранение в localStorage уровней вложенности.",
|
|
36868
|
+
"required": false,
|
|
36869
|
+
"type": "boolean",
|
|
36870
|
+
"example": "true",
|
|
36871
|
+
"defaultValue": "false"
|
|
36820
36872
|
}
|
|
36821
36873
|
],
|
|
36822
36874
|
"methods": []
|
|
@@ -38832,6 +38884,14 @@
|
|
|
38832
38884
|
"type": "string",
|
|
38833
38885
|
"example": null
|
|
38834
38886
|
},
|
|
38887
|
+
{
|
|
38888
|
+
"name": "clientStorageId",
|
|
38889
|
+
"decorators": [],
|
|
38890
|
+
"description": "Идентификатор (ключ) для сохранения в LocalStorage коллекции.",
|
|
38891
|
+
"required": false,
|
|
38892
|
+
"type": "string",
|
|
38893
|
+
"example": "'exampleTree'"
|
|
38894
|
+
},
|
|
38835
38895
|
{
|
|
38836
38896
|
"name": "customIcon",
|
|
38837
38897
|
"decorators": [],
|
|
@@ -38912,6 +38972,14 @@
|
|
|
38912
38972
|
"type": "any",
|
|
38913
38973
|
"example": null
|
|
38914
38974
|
},
|
|
38975
|
+
{
|
|
38976
|
+
"name": "saveInClientStorage",
|
|
38977
|
+
"decorators": [],
|
|
38978
|
+
"description": "Сохранение в localStorage уровней вложенности.",
|
|
38979
|
+
"required": false,
|
|
38980
|
+
"type": "boolean",
|
|
38981
|
+
"example": "true"
|
|
38982
|
+
},
|
|
38915
38983
|
{
|
|
38916
38984
|
"name": "selectedItemId",
|
|
38917
38985
|
"decorators": [],
|
|
@@ -38989,15 +39057,6 @@
|
|
|
38989
39057
|
"example": null
|
|
38990
39058
|
}
|
|
38991
39059
|
]
|
|
38992
|
-
},
|
|
38993
|
-
{
|
|
38994
|
-
"name": "onNestedItemClick",
|
|
38995
|
-
"decorators": [],
|
|
38996
|
-
"description": "",
|
|
38997
|
-
"required": false,
|
|
38998
|
-
"type": "void",
|
|
38999
|
-
"example": null,
|
|
39000
|
-
"parameters": []
|
|
39001
39060
|
}
|
|
39002
39061
|
]
|
|
39003
39062
|
},
|
|
@@ -39015,6 +39074,7 @@
|
|
|
39015
39074
|
"itemsKey": "'items'",
|
|
39016
39075
|
"level": "0",
|
|
39017
39076
|
"levelPadding": "32",
|
|
39077
|
+
"saveInClientStorage": "false",
|
|
39018
39078
|
"useSameSelectedItemId": "true"
|
|
39019
39079
|
},
|
|
39020
39080
|
"extends": [
|
|
@@ -39058,6 +39118,15 @@
|
|
|
39058
39118
|
"example": null,
|
|
39059
39119
|
"defaultValue": null
|
|
39060
39120
|
},
|
|
39121
|
+
{
|
|
39122
|
+
"name": "clientStorageId",
|
|
39123
|
+
"decorators": [],
|
|
39124
|
+
"description": "Идентификатор (ключ) для сохранения в LocalStorage коллекции.",
|
|
39125
|
+
"required": false,
|
|
39126
|
+
"type": "string",
|
|
39127
|
+
"example": "'exampleTree'",
|
|
39128
|
+
"defaultValue": null
|
|
39129
|
+
},
|
|
39061
39130
|
{
|
|
39062
39131
|
"name": "customIcon",
|
|
39063
39132
|
"decorators": [],
|
|
@@ -39139,6 +39208,15 @@
|
|
|
39139
39208
|
"example": null,
|
|
39140
39209
|
"defaultValue": null
|
|
39141
39210
|
},
|
|
39211
|
+
{
|
|
39212
|
+
"name": "saveInClientStorage",
|
|
39213
|
+
"decorators": [],
|
|
39214
|
+
"description": "Сохранение в localStorage уровней вложенности.",
|
|
39215
|
+
"required": false,
|
|
39216
|
+
"type": "boolean",
|
|
39217
|
+
"example": "true",
|
|
39218
|
+
"defaultValue": "false"
|
|
39219
|
+
},
|
|
39142
39220
|
{
|
|
39143
39221
|
"name": "selectedItemId",
|
|
39144
39222
|
"decorators": [],
|
|
@@ -39257,6 +39335,14 @@
|
|
|
39257
39335
|
"type": "string",
|
|
39258
39336
|
"example": null
|
|
39259
39337
|
},
|
|
39338
|
+
{
|
|
39339
|
+
"name": "clientStorageId",
|
|
39340
|
+
"decorators": [],
|
|
39341
|
+
"description": "Идентификатор (ключ) для сохранения в LocalStorage коллекции.",
|
|
39342
|
+
"required": false,
|
|
39343
|
+
"type": "string",
|
|
39344
|
+
"example": "'exampleTree'"
|
|
39345
|
+
},
|
|
39260
39346
|
{
|
|
39261
39347
|
"name": "customIcon",
|
|
39262
39348
|
"decorators": [],
|
|
@@ -39329,6 +39415,14 @@
|
|
|
39329
39415
|
"type": "any",
|
|
39330
39416
|
"example": null
|
|
39331
39417
|
},
|
|
39418
|
+
{
|
|
39419
|
+
"name": "saveInClientStorage",
|
|
39420
|
+
"decorators": [],
|
|
39421
|
+
"description": "Сохранение в localStorage уровней вложенности.",
|
|
39422
|
+
"required": false,
|
|
39423
|
+
"type": "boolean",
|
|
39424
|
+
"example": "true"
|
|
39425
|
+
},
|
|
39332
39426
|
{
|
|
39333
39427
|
"name": "selectedItemId",
|
|
39334
39428
|
"decorators": [],
|
package/en.json
CHANGED
|
@@ -979,6 +979,8 @@
|
|
|
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
|
+
"Идентификатор (ключ) для сохранения в LocalStorage коллекции.": "",
|
|
983
|
+
"Сохранение в localStorage уровней вложенности.": "",
|
|
982
984
|
"Компоненты для подключения wysiwyg редактора": "",
|
|
983
985
|
"Отображать чекбоксы только на узлах, не имеющих вложенных элементов": "",
|
|
984
986
|
"Размер компонента и вложенных полей": "",
|
package/hooks/useTree.d.ts
CHANGED
|
@@ -100,5 +100,15 @@ export interface ITreeConfig {
|
|
|
100
100
|
* @example true
|
|
101
101
|
*/
|
|
102
102
|
useSameSelectedItemId?: boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Сохранение в localStorage уровней вложенности.
|
|
105
|
+
* @example true
|
|
106
|
+
*/
|
|
107
|
+
saveInClientStorage?: boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Идентификатор (ключ) для сохранения в LocalStorage коллекции.
|
|
110
|
+
* @example 'exampleTree'
|
|
111
|
+
*/
|
|
112
|
+
clientStorageId?: string;
|
|
103
113
|
}
|
|
104
114
|
export default function useTree(config: ITreeConfig): ITreeOutput;
|
package/hooks/useTree.js
CHANGED
|
@@ -22,12 +22,15 @@ 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 react_use_1 = require("react-use");
|
|
26
|
+
var useComponents_1 = __importDefault(require("./useComponents"));
|
|
25
27
|
var useSelector_1 = __importDefault(require("./useSelector"));
|
|
26
28
|
var router_1 = require("../reducers/router");
|
|
27
29
|
var INITIAL_CURRENT_LEVEL = 0;
|
|
28
30
|
var DOT_SEPARATOR = '.';
|
|
29
31
|
var EMPTY_PARENT_ID = '';
|
|
30
32
|
var FIRST_LEVEL_PARENT_ID = '0';
|
|
33
|
+
var CLIENT_STORAGE_KEY = '_tree';
|
|
31
34
|
var defaultProps = {
|
|
32
35
|
itemsKey: 'items',
|
|
33
36
|
autoOpenLevels: 0
|
|
@@ -96,6 +99,7 @@ function useTree(config) {
|
|
|
96
99
|
var primaryKey = config.itemsKey || defaultProps.itemsKey;
|
|
97
100
|
var _a = (0, react_1.useState)(null), selectedUniqueId = _a[0], setSelectedUniqueId = _a[1];
|
|
98
101
|
var _b = (0, react_1.useState)({}), expandedItems = _b[0], setExpandedItems = _b[1];
|
|
102
|
+
var clientStorage = (0, useComponents_1["default"])().clientStorage;
|
|
99
103
|
//Redux connection
|
|
100
104
|
var _c = (0, useSelector_1["default"])(function (state) { return ({
|
|
101
105
|
routes: (0, isString_1["default"])(config.items) ? (0, router_1.getNavItems)(state, config.items) : null,
|
|
@@ -116,11 +120,32 @@ function useTree(config) {
|
|
|
116
120
|
}, [config.items, config.routerParams, routes]);
|
|
117
121
|
// Initial expanded items
|
|
118
122
|
(0, react_1.useEffect)(function () {
|
|
119
|
-
// TODO add clientStorage
|
|
120
123
|
setExpandedItems(getAutoExpandedItems(items, selectedItemId, primaryKey, config.autoOpenLevels));
|
|
121
124
|
var selectedItem = findChildById(items, selectedItemId, primaryKey);
|
|
122
125
|
setSelectedUniqueId(selectedItem ? selectedItem.uniqueId : null);
|
|
123
126
|
}, [items]);
|
|
127
|
+
var localTree = JSON.parse(clientStorage.get(CLIENT_STORAGE_KEY)) || {};
|
|
128
|
+
var saveInClientStorage = function () {
|
|
129
|
+
if (config.saveInClientStorage) {
|
|
130
|
+
localTree[config.clientStorageId] = expandedItems;
|
|
131
|
+
clientStorage.set(CLIENT_STORAGE_KEY, JSON.stringify(localTree));
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
(0, react_use_1.useMount)(function () {
|
|
135
|
+
if (config.saveInClientStorage) {
|
|
136
|
+
var treeData = localTree[config.clientStorageId];
|
|
137
|
+
if (treeData) {
|
|
138
|
+
setExpandedItems(treeData);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
(0, react_use_1.useUnmount)(function () {
|
|
143
|
+
saveInClientStorage();
|
|
144
|
+
});
|
|
145
|
+
(0, react_use_1.useBeforeUnload)(function () {
|
|
146
|
+
saveInClientStorage();
|
|
147
|
+
return true;
|
|
148
|
+
});
|
|
124
149
|
var onExpand = (0, react_1.useCallback)(function (e, uniqueId, item) {
|
|
125
150
|
var _a;
|
|
126
151
|
e.preventDefault();
|
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' | 'customIcon'> {
|
|
22
|
+
export interface ICheckboxTreeFieldProps extends IFieldWrapperInputProps, Omit<IDataProviderConfig, 'items'>, Omit<IDataSelectConfig, 'items'>, IUiComponent, Pick<ITreeProps, 'levelPadding' | 'alwaysOpened' | 'hasIconExpandOnly' | 'customIcon' | 'saveInClientStorage'> {
|
|
23
23
|
/**
|
|
24
24
|
* Свойства для элемента input
|
|
25
25
|
* @example { onKeyDown: ... }
|
|
@@ -52,7 +52,7 @@ export interface ICheckboxTreeFieldProps extends IFieldWrapperInputProps, Omit<I
|
|
|
52
52
|
hasOnlyLeafCheckboxes?: boolean;
|
|
53
53
|
[key: string]: any;
|
|
54
54
|
}
|
|
55
|
-
export interface ICheckboxTreeFieldViewProps extends IFieldWrapperOutputProps, Pick<ITreeProps, 'levelPadding' | 'customIcon'> {
|
|
55
|
+
export interface ICheckboxTreeFieldViewProps extends IFieldWrapperOutputProps, Pick<ITreeProps, 'levelPadding' | 'hasIconExpandOnly' | 'customIcon'> {
|
|
56
56
|
items: {
|
|
57
57
|
id: number | string | boolean;
|
|
58
58
|
label?: string;
|
|
@@ -67,6 +67,6 @@ export interface ICheckboxTreeFieldViewProps extends IFieldWrapperOutputProps, P
|
|
|
67
67
|
size?: Size;
|
|
68
68
|
hasOnlyLeafCheckboxes?: boolean;
|
|
69
69
|
}
|
|
70
|
-
export declare const getNestedItemsIds: (item: any, groupAttribute: any) => any[];
|
|
70
|
+
export declare const getNestedItemsIds: (item: any, groupAttribute: any, hasOnlyLeafCheckboxes?: boolean) => any[];
|
|
71
71
|
declare const _default: import("../../../ui/form/Field/fieldWrapper").FieldWrapperComponent<ICheckboxTreeFieldProps>;
|
|
72
72
|
export default _default;
|
|
@@ -44,12 +44,13 @@ var isArray_1 = __importDefault(require("lodash-es/isArray"));
|
|
|
44
44
|
var isEqual_1 = __importDefault(require("lodash-es/isEqual"));
|
|
45
45
|
var hooks_1 = require("../../../hooks");
|
|
46
46
|
var fieldWrapper_1 = __importDefault(require("../../../ui/form/Field/fieldWrapper"));
|
|
47
|
-
var getNestedItemsIds = function (item, groupAttribute) {
|
|
47
|
+
var getNestedItemsIds = function (item, groupAttribute, hasOnlyLeafCheckboxes) {
|
|
48
|
+
if (hasOnlyLeafCheckboxes === void 0) { hasOnlyLeafCheckboxes = false; }
|
|
48
49
|
if (item.disabled) {
|
|
49
50
|
return [];
|
|
50
51
|
}
|
|
51
52
|
var _a = item, _b = groupAttribute, _c = _a[_b], nestedItems = _c === void 0 ? [] : _c;
|
|
52
|
-
var result = [item.id];
|
|
53
|
+
var result = hasOnlyLeafCheckboxes ? [] : [item.id];
|
|
53
54
|
if (groupAttribute && (0, isArray_1["default"])(nestedItems)) {
|
|
54
55
|
nestedItems.reduce(function (acc, nestedItem) {
|
|
55
56
|
if ((0, isArray_1["default"])(nestedItem[groupAttribute])) {
|
|
@@ -88,8 +89,8 @@ function CheckboxTreeField(props) {
|
|
|
88
89
|
inputValue: props.input.value
|
|
89
90
|
}), selectedIds = _a.selectedIds, setSelectedIds = _a.setSelectedIds;
|
|
90
91
|
var onItemSelect = (0, react_1.useCallback)(function (checkbox) {
|
|
91
|
-
if (checkbox.hasItems
|
|
92
|
-
var selectedItemIds = (0, exports.getNestedItemsIds)(checkbox, props.primaryKey);
|
|
92
|
+
if (checkbox.hasItems) {
|
|
93
|
+
var selectedItemIds = (0, exports.getNestedItemsIds)(checkbox, props.primaryKey, props.hasOnlyLeafCheckboxes);
|
|
93
94
|
setSelectedIds(selectedItemIds);
|
|
94
95
|
}
|
|
95
96
|
else if (checkbox.id && !checkbox.hasItems) {
|
|
@@ -126,8 +127,9 @@ function CheckboxTreeField(props) {
|
|
|
126
127
|
renderCheckbox: renderCheckbox,
|
|
127
128
|
size: props.size,
|
|
128
129
|
levelPadding: props.levelPadding,
|
|
129
|
-
hasOnlyLeafCheckboxes: props.hasOnlyLeafCheckboxes
|
|
130
|
-
|
|
130
|
+
hasOnlyLeafCheckboxes: props.hasOnlyLeafCheckboxes,
|
|
131
|
+
hasIconExpandOnly: props.hasIconExpandOnly
|
|
132
|
+
}); }, [treeItems, onItemSelect, selectedIds, renderCheckbox, props.size, props.levelPadding, props.hasOnlyLeafCheckboxes, props.hasIconExpandOnly]);
|
|
131
133
|
return components.ui.renderView(props.view || 'form.CheckboxTreeFieldView', viewProps);
|
|
132
134
|
}
|
|
133
135
|
CheckboxTreeField.defaultProps = {
|
|
@@ -137,6 +139,8 @@ CheckboxTreeField.defaultProps = {
|
|
|
137
139
|
levelPadding: 32,
|
|
138
140
|
alwaysOpened: false,
|
|
139
141
|
primaryKey: 'items',
|
|
140
|
-
hasOnlyLeafCheckboxes: false
|
|
142
|
+
hasOnlyLeafCheckboxes: false,
|
|
143
|
+
hasIconExpandOnly: true,
|
|
144
|
+
saveInClientStorage: false
|
|
141
145
|
};
|
|
142
146
|
exports["default"] = (0, fieldWrapper_1["default"])('CheckboxTreeField', CheckboxTreeField);
|
|
@@ -50,7 +50,8 @@ function NumberField(props) {
|
|
|
50
50
|
var onInputChange = (0, useInputTypeNumber_1["default"])(currentInputRef, {
|
|
51
51
|
max: props.max,
|
|
52
52
|
min: props.min,
|
|
53
|
-
value: props.input.value
|
|
53
|
+
value: props.input.value,
|
|
54
|
+
required: props.required
|
|
54
55
|
}, onChange).onInputChange;
|
|
55
56
|
var onStep = (0, react_1.useCallback)(function (isIncrement) {
|
|
56
57
|
var _a;
|
|
@@ -3,6 +3,7 @@ interface IInputTypeNumberProps {
|
|
|
3
3
|
max: any;
|
|
4
4
|
min: any;
|
|
5
5
|
value: string | undefined | null;
|
|
6
|
+
required?: boolean;
|
|
6
7
|
}
|
|
7
8
|
declare const useInputTypeNumber: (currentInputRef: React.MutableRefObject<HTMLInputElement>, inputTypeNumberProps: IInputTypeNumberProps, onChange: (event: React.ChangeEvent<HTMLInputElement>, value?: any) => void) => {
|
|
8
9
|
onInputChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
@@ -7,14 +7,15 @@ var react_1 = __importDefault(require("react"));
|
|
|
7
7
|
var useInputTypeNumber = function (currentInputRef, inputTypeNumberProps, onChange) {
|
|
8
8
|
react_1["default"].useEffect(function () {
|
|
9
9
|
var _a;
|
|
10
|
-
var defaultValidity = 'The number is not valid.';
|
|
11
|
-
var errorMessage = inputTypeNumberProps.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
var defaultValidity = __('The number is not valid.');
|
|
11
|
+
var errorMessage = inputTypeNumberProps.required
|
|
12
|
+
&& (inputTypeNumberProps.value > inputTypeNumberProps.max
|
|
13
|
+
|| inputTypeNumberProps.value < inputTypeNumberProps.min
|
|
14
|
+
|| !inputTypeNumberProps.value)
|
|
15
|
+
? defaultValidity
|
|
15
16
|
: '';
|
|
16
17
|
(_a = currentInputRef.current) === null || _a === void 0 ? void 0 : _a.setCustomValidity(errorMessage);
|
|
17
|
-
}, [currentInputRef, inputTypeNumberProps.value, inputTypeNumberProps.max, inputTypeNumberProps.min]);
|
|
18
|
+
}, [currentInputRef, inputTypeNumberProps.value, inputTypeNumberProps.max, inputTypeNumberProps.min, inputTypeNumberProps.required]);
|
|
18
19
|
var isValueNumeric = function (value) {
|
|
19
20
|
if (!value) {
|
|
20
21
|
return true;
|
|
@@ -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'> {
|
|
13
|
+
export interface ITreeTableProps extends Omit<IGridProps, 'items'>, Pick<ITreeProps, 'alwaysOpened' | 'levelPadding' | 'customIcon' | 'saveInClientStorage'> {
|
|
14
14
|
/**
|
|
15
15
|
* Элементы коллекции
|
|
16
16
|
* @example
|
|
@@ -35,6 +35,7 @@ declare namespace TreeTable {
|
|
|
35
35
|
var defaultProps: {
|
|
36
36
|
levelPadding: number;
|
|
37
37
|
alwaysOpened: boolean;
|
|
38
|
+
saveInClientStorage: boolean;
|
|
38
39
|
};
|
|
39
40
|
}
|
|
40
41
|
export default TreeTable;
|
|
@@ -73,12 +73,15 @@ function TreeTable(props) {
|
|
|
73
73
|
autoOpenLevels: 0,
|
|
74
74
|
alwaysOpened: props.alwaysOpened,
|
|
75
75
|
currentPage: list === null || list === void 0 ? void 0 : list.page,
|
|
76
|
-
itemsOnPage: list === null || list === void 0 ? void 0 : list.pageSize
|
|
76
|
+
itemsOnPage: list === null || list === void 0 ? void 0 : list.pageSize,
|
|
77
|
+
saveInClientStorage: props.saveInClientStorage,
|
|
78
|
+
clientStorageId: props.listId
|
|
77
79
|
}).treeItems;
|
|
78
80
|
return (React.createElement(Grid_1["default"], __assign({}, props, { columns: columns, items: treeItems, itemsIndexing: false })));
|
|
79
81
|
}
|
|
80
82
|
exports["default"] = TreeTable;
|
|
81
83
|
TreeTable.defaultProps = {
|
|
82
84
|
levelPadding: 32,
|
|
83
|
-
alwaysOpened: false
|
|
85
|
+
alwaysOpened: false,
|
|
86
|
+
saveInClientStorage: false
|
|
84
87
|
};
|
package/ui/nav/Tree/Tree.d.ts
CHANGED
|
@@ -6,7 +6,6 @@ export interface ITreeViewProps extends ITreeProps {
|
|
|
6
6
|
export interface ITreeItemViewProps extends ITreeProps {
|
|
7
7
|
item: IPreparedTreeItem;
|
|
8
8
|
children?: JSX.Element;
|
|
9
|
-
onNestedItemClick?: () => void;
|
|
10
9
|
withoutPointerOnLabel?: boolean;
|
|
11
10
|
}
|
|
12
11
|
/**
|
|
@@ -70,6 +69,7 @@ declare namespace Tree {
|
|
|
70
69
|
hasIconExpandOnly: boolean;
|
|
71
70
|
useSameSelectedItemId: boolean;
|
|
72
71
|
hideIcon: boolean;
|
|
72
|
+
saveInClientStorage: boolean;
|
|
73
73
|
};
|
|
74
74
|
}
|
|
75
75
|
export default Tree;
|
package/ui/nav/Tree/Tree.js
CHANGED
|
@@ -13,7 +13,9 @@ function Tree(props) {
|
|
|
13
13
|
onExpand: props.onItemClick,
|
|
14
14
|
level: props.level,
|
|
15
15
|
alwaysOpened: props.alwaysOpened,
|
|
16
|
-
useSameSelectedItemId: props.useSameSelectedItemId
|
|
16
|
+
useSameSelectedItemId: props.useSameSelectedItemId,
|
|
17
|
+
saveInClientStorage: props.autoSave,
|
|
18
|
+
clientStorageId: props.id
|
|
17
19
|
}).treeItems;
|
|
18
20
|
var viewProps = (0, react_1.useMemo)(function () { return ({
|
|
19
21
|
items: treeItems,
|
|
@@ -34,5 +36,6 @@ Tree.defaultProps = {
|
|
|
34
36
|
levelPadding: 32,
|
|
35
37
|
hasIconExpandOnly: false,
|
|
36
38
|
useSameSelectedItemId: true,
|
|
37
|
-
hideIcon: false
|
|
39
|
+
hideIcon: false,
|
|
40
|
+
saveInClientStorage: false
|
|
38
41
|
};
|