@ndla/ui 20.0.3 → 21.0.0
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/es/LearningPaths/LearningPathInformation.js +21 -3
- package/es/LearningPaths/LearningPathMenuAsideCopyright.js +17 -4
- package/es/TreeStructure/FolderItem.js +72 -51
- package/es/TreeStructure/FolderItems.js +33 -61
- package/es/TreeStructure/FolderNameInput.js +14 -13
- package/es/TreeStructure/TreeStructure.js +80 -96
- package/es/TreeStructure/helperFunctions.js +4 -73
- package/es/TreeStructure/{TreeStructure.types.js → types.js} +0 -0
- package/lib/LearningPaths/LearningPathInformation.js +19 -2
- package/lib/LearningPaths/LearningPathMenuAsideCopyright.js +16 -3
- package/lib/TreeStructure/FolderItem.d.ts +6 -20
- package/lib/TreeStructure/FolderItem.js +74 -51
- package/lib/TreeStructure/FolderItems.d.ts +11 -2
- package/lib/TreeStructure/FolderItems.js +33 -61
- package/lib/TreeStructure/FolderNameInput.js +14 -13
- package/lib/TreeStructure/TreeStructure.d.ts +12 -2
- package/lib/TreeStructure/TreeStructure.js +78 -94
- package/lib/TreeStructure/helperFunctions.d.ts +2 -4
- package/lib/TreeStructure/helperFunctions.js +5 -80
- package/lib/TreeStructure/index.d.ts +2 -1
- package/lib/TreeStructure/types.d.ts +32 -0
- package/lib/TreeStructure/{TreeStructure.types.js → types.js} +0 -0
- package/lib/index.d.ts +1 -1
- package/package.json +3 -2
- package/src/LearningPaths/LearningPathInformation.tsx +27 -12
- package/src/LearningPaths/LearningPathMenuAsideCopyright.tsx +22 -20
- package/src/TreeStructure/FolderItem.tsx +59 -67
- package/src/TreeStructure/FolderItems.tsx +30 -50
- package/src/TreeStructure/FolderNameInput.tsx +6 -11
- package/src/TreeStructure/TreeStructure.tsx +73 -71
- package/src/TreeStructure/helperFunctions.ts +3 -37
- package/src/TreeStructure/index.ts +2 -1
- package/src/TreeStructure/types.ts +37 -0
- package/src/index.ts +1 -1
- package/lib/TreeStructure/TreeStructure.types.d.ts +0 -61
- package/src/TreeStructure/TreeStructure.types.ts +0 -71
|
@@ -6,17 +6,18 @@
|
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import React, { useEffect, useState,
|
|
9
|
+
import React, { useEffect, useState, useMemo } from 'react';
|
|
10
10
|
import { AddButton } from '@ndla/button';
|
|
11
11
|
import Tooltip from '@ndla/tooltip';
|
|
12
12
|
import { useTranslation } from 'react-i18next';
|
|
13
13
|
import styled from '@emotion/styled';
|
|
14
14
|
import { spacing, fonts } from '@ndla/core';
|
|
15
15
|
import { uniq } from 'lodash';
|
|
16
|
+
import { IFolder } from '@ndla/types-learningpath-api';
|
|
16
17
|
import TreeStructureStyledWrapper from './TreeStructureWrapper';
|
|
17
18
|
import FolderItems from './FolderItems';
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
19
|
+
import { flattenFolders } from './helperFunctions';
|
|
20
|
+
import { CommonTreeStructureProps, FolderType } from './types';
|
|
20
21
|
|
|
21
22
|
export const MAX_LEVEL_FOR_FOLDERS = 4;
|
|
22
23
|
|
|
@@ -29,42 +30,60 @@ const AddFolderWrapper = styled.div`
|
|
|
29
30
|
margin-top: ${spacing.xsmall};
|
|
30
31
|
`;
|
|
31
32
|
|
|
33
|
+
export interface TreeStructureProps extends CommonTreeStructureProps {
|
|
34
|
+
defaultOpenFolders?: string[];
|
|
35
|
+
folders: FolderType[];
|
|
36
|
+
editable?: boolean;
|
|
37
|
+
framed?: boolean;
|
|
38
|
+
label?: string;
|
|
39
|
+
maximumLevelsOfFoldersAllowed?: number;
|
|
40
|
+
onNewFolder: (name: string, parentId: string) => Promise<IFolder>;
|
|
41
|
+
}
|
|
42
|
+
|
|
32
43
|
const TreeStructure = ({
|
|
44
|
+
defaultOpenFolders,
|
|
45
|
+
editable,
|
|
46
|
+
menuItems,
|
|
33
47
|
folders,
|
|
48
|
+
framed,
|
|
34
49
|
label,
|
|
35
|
-
editable,
|
|
36
50
|
loading,
|
|
51
|
+
maximumLevelsOfFoldersAllowed = MAX_LEVEL_FOR_FOLDERS,
|
|
37
52
|
onNewFolder,
|
|
38
53
|
onSelectFolder,
|
|
39
54
|
openOnFolderClick,
|
|
40
|
-
framed,
|
|
41
|
-
folderIdMarkedByDefault,
|
|
42
|
-
defaultOpenFolders,
|
|
43
|
-
folderChild,
|
|
44
|
-
maximumLevelsOfFoldersAllowed = MAX_LEVEL_FOR_FOLDERS,
|
|
45
55
|
}: TreeStructureProps) => {
|
|
46
56
|
const { t } = useTranslation();
|
|
47
|
-
|
|
57
|
+
|
|
58
|
+
const defaultSelectedFolderId = defaultOpenFolders && defaultOpenFolders[defaultOpenFolders.length - 1];
|
|
59
|
+
|
|
48
60
|
const [openFolders, setOpenFolders] = useState<string[]>(defaultOpenFolders || []);
|
|
49
|
-
|
|
50
|
-
const [
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
() => flattenFolders(folders, openFolders).map((folder) => folder.id),
|
|
57
|
-
[folders, openFolders],
|
|
58
|
-
);
|
|
61
|
+
|
|
62
|
+
const [newFolderParentId, setNewFolderParentId] = useState<string | undefined>();
|
|
63
|
+
const [focusedId, setFocusedId] = useState<string | undefined>();
|
|
64
|
+
const [selectedFolder, setSelectedFolder] = useState<FolderType | undefined>();
|
|
65
|
+
|
|
66
|
+
const flattenedFolders = useMemo(() => flattenFolders(folders, openFolders), [folders, openFolders]);
|
|
67
|
+
const visibleFolderIds = flattenedFolders.map((folder) => folder.id);
|
|
59
68
|
|
|
60
69
|
useEffect(() => {
|
|
61
70
|
if (defaultOpenFolders) {
|
|
62
71
|
setOpenFolders((prev) => {
|
|
63
|
-
return uniq(
|
|
72
|
+
return uniq(defaultOpenFolders.concat(prev));
|
|
64
73
|
});
|
|
65
74
|
}
|
|
66
75
|
}, [defaultOpenFolders]);
|
|
67
76
|
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
if (defaultSelectedFolderId !== undefined) {
|
|
79
|
+
const selected = flattenFolders(folders).find((folder) => folder.id === defaultSelectedFolderId);
|
|
80
|
+
if (selected) {
|
|
81
|
+
setSelectedFolder(selected);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
85
|
+
}, [defaultSelectedFolderId]);
|
|
86
|
+
|
|
68
87
|
useEffect(() => {
|
|
69
88
|
if (!loading) {
|
|
70
89
|
setNewFolderParentId(undefined);
|
|
@@ -72,39 +91,30 @@ const TreeStructure = ({
|
|
|
72
91
|
}, [loading]);
|
|
73
92
|
|
|
74
93
|
const onCloseFolder = (id: string) => {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if (
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
const markedFolderIsSubPath = closingFolderPath.every(
|
|
81
|
-
(folderId, _index) => markedFolderPath[_index] === folderId,
|
|
82
|
-
);
|
|
83
|
-
if (markedFolderIsSubPath) {
|
|
94
|
+
const closedFolder = flattenedFolders.find((folder) => folder.id === id);
|
|
95
|
+
|
|
96
|
+
if (closedFolder) {
|
|
97
|
+
const subFolders = closedFolder.subfolders && flattenFolders(closedFolder.subfolders);
|
|
98
|
+
if (subFolders.some((folder) => folder.id === selectedFolder?.id)) {
|
|
84
99
|
if (onSelectFolder) {
|
|
85
|
-
|
|
86
|
-
onSelectFolder(
|
|
87
|
-
} else {
|
|
88
|
-
setFocusedFolderId(closingFolderPath[closingFolderPath.length - 1]);
|
|
100
|
+
setSelectedFolder(closedFolder);
|
|
101
|
+
onSelectFolder(closedFolder.id);
|
|
89
102
|
}
|
|
103
|
+
setFocusedId(closedFolder.id);
|
|
90
104
|
}
|
|
91
105
|
}
|
|
92
|
-
setOpenFolders(openFolders.filter((
|
|
106
|
+
setOpenFolders(openFolders.filter((folderId) => folderId !== id));
|
|
93
107
|
};
|
|
94
108
|
|
|
95
109
|
const onOpenFolder = (id: string) => {
|
|
96
110
|
setOpenFolders(uniq(openFolders.concat(id)));
|
|
97
111
|
};
|
|
98
112
|
|
|
99
|
-
const onCreateNewFolder = (parentId: string) => {
|
|
100
|
-
setNewFolderParentId(parentId);
|
|
101
|
-
};
|
|
102
|
-
|
|
103
113
|
const onSaveNewFolder = (name: string, parentId: string) => {
|
|
104
|
-
onNewFolder(name, parentId).then((
|
|
105
|
-
if (
|
|
106
|
-
|
|
107
|
-
|
|
114
|
+
onNewFolder(name, parentId).then((newFolder) => {
|
|
115
|
+
if (newFolder) {
|
|
116
|
+
setSelectedFolder(newFolder);
|
|
117
|
+
setFocusedId(newFolder.id);
|
|
108
118
|
setOpenFolders(uniq(openFolders.concat(parentId)));
|
|
109
119
|
}
|
|
110
120
|
});
|
|
@@ -114,39 +124,33 @@ const TreeStructure = ({
|
|
|
114
124
|
setNewFolderParentId(undefined);
|
|
115
125
|
};
|
|
116
126
|
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
setFocusedFolderId(id);
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
const paths = getPathOfFolder(folders, markedFolderId || '');
|
|
123
|
-
const canAddFolder = editable && paths.length < (maximumLevelsOfFoldersAllowed || 1);
|
|
127
|
+
const canAddFolder =
|
|
128
|
+
editable && selectedFolder && selectedFolder?.breadcrumbs.length < (maximumLevelsOfFoldersAllowed || 1);
|
|
124
129
|
|
|
125
130
|
return (
|
|
126
|
-
<div
|
|
127
|
-
{label && <StyledLabel
|
|
128
|
-
<TreeStructureStyledWrapper
|
|
131
|
+
<div>
|
|
132
|
+
{label && <StyledLabel>{label}</StyledLabel>}
|
|
133
|
+
<TreeStructureStyledWrapper aria-label="Menu tree" role="tree" framed={framed}>
|
|
129
134
|
<FolderItems
|
|
130
|
-
onSelectFolder={onSelectFolder}
|
|
131
|
-
level={1}
|
|
132
|
-
folders={folders}
|
|
133
135
|
editable={editable}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
+
focusedFolderId={focusedId}
|
|
137
|
+
menuItems={menuItems}
|
|
138
|
+
folders={folders}
|
|
139
|
+
level={1}
|
|
140
|
+
loading={loading}
|
|
141
|
+
selectedFolder={selectedFolder}
|
|
142
|
+
maximumLevelsOfFoldersAllowed={maximumLevelsOfFoldersAllowed}
|
|
136
143
|
newFolderParentId={newFolderParentId}
|
|
137
|
-
onCreateNewFolder={onCreateNewFolder}
|
|
138
144
|
onCancelNewFolder={onCancelNewFolder}
|
|
145
|
+
onCloseFolder={onCloseFolder}
|
|
146
|
+
onOpenFolder={onOpenFolder}
|
|
139
147
|
onSaveNewFolder={onSaveNewFolder}
|
|
140
|
-
|
|
148
|
+
onSelectFolder={onSelectFolder}
|
|
141
149
|
openFolders={openFolders}
|
|
142
|
-
markedFolderId={markedFolderId}
|
|
143
|
-
onMarkFolder={onMarkFolder}
|
|
144
150
|
openOnFolderClick={openOnFolderClick}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
folderChild={folderChild}
|
|
149
|
-
maximumLevelsOfFoldersAllowed={maximumLevelsOfFoldersAllowed}
|
|
151
|
+
setFocusedId={setFocusedId}
|
|
152
|
+
setSelectedFolder={setSelectedFolder}
|
|
153
|
+
visibleFolders={visibleFolderIds}
|
|
150
154
|
/>
|
|
151
155
|
</TreeStructureStyledWrapper>
|
|
152
156
|
{editable && (
|
|
@@ -155,16 +159,14 @@ const TreeStructure = ({
|
|
|
155
159
|
tooltip={
|
|
156
160
|
canAddFolder
|
|
157
161
|
? t('myNdla.newFolderUnder', {
|
|
158
|
-
folderName:
|
|
162
|
+
folderName: selectedFolder?.name,
|
|
159
163
|
})
|
|
160
164
|
: t('treeStructure.maxFoldersAlreadyAdded')
|
|
161
165
|
}>
|
|
162
166
|
<AddButton
|
|
163
167
|
disabled={!canAddFolder}
|
|
164
168
|
aria-label={t('myNdla.newFolder')}
|
|
165
|
-
onClick={() =>
|
|
166
|
-
setNewFolderParentId(markedFolderId);
|
|
167
|
-
}}>
|
|
169
|
+
onClick={() => setNewFolderParentId(selectedFolder?.id)}>
|
|
168
170
|
{t('myNdla.newFolder')}
|
|
169
171
|
</AddButton>
|
|
170
172
|
</Tooltip>
|
|
@@ -1,44 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FolderType } from './types';
|
|
2
2
|
|
|
3
|
-
export const
|
|
4
|
-
const paths = (folders: FolderStructureProps[], path: string[]): string[] => {
|
|
5
|
-
for (const { id, subfolders } of folders) {
|
|
6
|
-
if (id === findId) {
|
|
7
|
-
return [...path, id];
|
|
8
|
-
} else if (subfolders?.length) {
|
|
9
|
-
return paths(subfolders, [...path, id]);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
return [];
|
|
13
|
-
};
|
|
14
|
-
return paths(data, []);
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export const getFolderName = (data: FolderStructureProps[], findId: string | undefined): string | undefined => {
|
|
18
|
-
if (!findId) {
|
|
19
|
-
return undefined;
|
|
20
|
-
}
|
|
21
|
-
let folderName: string | undefined;
|
|
22
|
-
const paths = (dataChildren: FolderStructureProps[]) => {
|
|
23
|
-
dataChildren.some(({ id, name, subfolders }, _index) => {
|
|
24
|
-
if (id === findId) {
|
|
25
|
-
folderName = name;
|
|
26
|
-
return true;
|
|
27
|
-
} else if (subfolders?.length) {
|
|
28
|
-
return paths(subfolders);
|
|
29
|
-
}
|
|
30
|
-
return false;
|
|
31
|
-
});
|
|
32
|
-
};
|
|
33
|
-
paths(data);
|
|
34
|
-
return folderName;
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
export const flattenFolders = (folders: FolderStructureProps[], openFolders?: string[]): FolderStructureProps[] => {
|
|
3
|
+
export const flattenFolders = (folders: FolderType[], openFolders?: string[]): FolderType[] => {
|
|
38
4
|
return folders.reduce((acc, { subfolders, id, ...rest }) => {
|
|
39
5
|
if (!subfolders || (openFolders && !openFolders.includes(id))) {
|
|
40
6
|
return acc.concat({ subfolders, id, ...rest });
|
|
41
7
|
}
|
|
42
8
|
return acc.concat({ subfolders, id, ...rest }, flattenFolders(subfolders, openFolders));
|
|
43
|
-
}, [] as
|
|
9
|
+
}, [] as FolderType[]);
|
|
44
10
|
};
|
|
@@ -7,5 +7,6 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import TreeStructure from './TreeStructure';
|
|
10
|
-
export type {
|
|
10
|
+
export type { FolderType, TreeStructureMenuProps } from './types';
|
|
11
|
+
export type { TreeStructureProps } from './TreeStructure';
|
|
11
12
|
export { TreeStructure };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2022-present, NDLA.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the GPLv3 license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { MouseEvent, ReactNode } from 'react';
|
|
10
|
+
import { IFolder } from '@ndla/types-learningpath-api';
|
|
11
|
+
import { MenuItemProps } from '@ndla/button/src';
|
|
12
|
+
|
|
13
|
+
export interface FolderType extends IFolder {
|
|
14
|
+
icon?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface TreeStructureMenuProps extends Omit<MenuItemProps, 'onClick'> {
|
|
18
|
+
onClick: (e: MouseEvent<HTMLDivElement> | undefined, folder: FolderType) => void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface CommonTreeStructureProps {
|
|
22
|
+
loading?: boolean;
|
|
23
|
+
onSelectFolder?: (id: string) => void;
|
|
24
|
+
openOnFolderClick?: boolean;
|
|
25
|
+
menuItems?: TreeStructureMenuProps[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface CommonFolderItemsProps extends CommonTreeStructureProps {
|
|
29
|
+
focusedFolderId?: string;
|
|
30
|
+
level: number;
|
|
31
|
+
selectedFolder?: FolderType;
|
|
32
|
+
onCloseFolder: (id: string) => void;
|
|
33
|
+
onOpenFolder: (id: string) => void;
|
|
34
|
+
setFocusedId: (id: string) => void;
|
|
35
|
+
setSelectedFolder: (id: FolderType) => void;
|
|
36
|
+
visibleFolders: string[];
|
|
37
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -244,4 +244,4 @@ export type { SnackBarItem } from './SnackBar';
|
|
|
244
244
|
export { SnackBar } from './SnackBar';
|
|
245
245
|
export { InfoBlock } from './InfoBlock';
|
|
246
246
|
export { TreeStructure } from './TreeStructure';
|
|
247
|
-
export type {
|
|
247
|
+
export type { FolderType, TreeStructureProps, TreeStructureMenuProps } from './TreeStructure';
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) 2022-present, NDLA.
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the GPLv3 license found in the
|
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
|
6
|
-
*
|
|
7
|
-
*/
|
|
8
|
-
import React, { ReactNode } from 'react';
|
|
9
|
-
export interface FolderStructureProps {
|
|
10
|
-
id: string;
|
|
11
|
-
name: string;
|
|
12
|
-
subfolders: FolderStructureProps[];
|
|
13
|
-
isFavorite?: boolean;
|
|
14
|
-
status?: string;
|
|
15
|
-
openAsDefault?: boolean;
|
|
16
|
-
icon?: ReactNode;
|
|
17
|
-
}
|
|
18
|
-
interface CommonFolderProps {
|
|
19
|
-
editable?: boolean;
|
|
20
|
-
loading?: boolean;
|
|
21
|
-
openOnFolderClick?: boolean;
|
|
22
|
-
onSelectFolder?: (id: string) => void;
|
|
23
|
-
}
|
|
24
|
-
export interface TreeStructureProps extends CommonFolderProps {
|
|
25
|
-
folders: FolderStructureProps[];
|
|
26
|
-
framed?: boolean;
|
|
27
|
-
label?: string;
|
|
28
|
-
folderIdMarkedByDefault?: string;
|
|
29
|
-
onNewFolder: (name: string, parentId: string) => Promise<string>;
|
|
30
|
-
defaultOpenFolders?: string[];
|
|
31
|
-
folderChild?: FolderChildFuncType;
|
|
32
|
-
maximumLevelsOfFoldersAllowed?: number;
|
|
33
|
-
}
|
|
34
|
-
export declare type onCreateNewFolderProp = ({ idPaths, parentId, }: {
|
|
35
|
-
idPaths: number[];
|
|
36
|
-
parentId: string | undefined;
|
|
37
|
-
}) => void;
|
|
38
|
-
export declare type SetOpenFolderProp = React.Dispatch<React.SetStateAction<string[]>>;
|
|
39
|
-
export declare type SetFocusedFolderId = React.Dispatch<React.SetStateAction<string | undefined>>;
|
|
40
|
-
export declare type FolderChildFuncType = (id: string, tabIndex: number) => ReactNode;
|
|
41
|
-
export interface FolderItemsProps extends CommonFolderProps {
|
|
42
|
-
folders: FolderStructureProps[];
|
|
43
|
-
onCloseFolder: (id: string) => void;
|
|
44
|
-
onOpenFolder: (id: string) => void;
|
|
45
|
-
onSaveNewFolder: (name: string, parentId: string) => void;
|
|
46
|
-
onCancelNewFolder: () => void;
|
|
47
|
-
onCreateNewFolder: (parentId: string) => void;
|
|
48
|
-
newFolderParentId: string | undefined;
|
|
49
|
-
visibleFolders: string[];
|
|
50
|
-
openFolders: string[];
|
|
51
|
-
markedFolderId?: string;
|
|
52
|
-
onMarkFolder: (id: string) => void;
|
|
53
|
-
level: number;
|
|
54
|
-
focusedFolderId: string | undefined;
|
|
55
|
-
setFocusedFolderId: SetFocusedFolderId;
|
|
56
|
-
keyNavigationFocusIsCreateFolderButton?: boolean;
|
|
57
|
-
icon?: ReactNode;
|
|
58
|
-
folderChild?: FolderChildFuncType;
|
|
59
|
-
maximumLevelsOfFoldersAllowed: number;
|
|
60
|
-
}
|
|
61
|
-
export {};
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) 2022-present, NDLA.
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the GPLv3 license found in the
|
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
|
6
|
-
*
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import React, { ReactNode } from 'react';
|
|
10
|
-
|
|
11
|
-
export interface FolderStructureProps {
|
|
12
|
-
id: string;
|
|
13
|
-
name: string;
|
|
14
|
-
subfolders: FolderStructureProps[];
|
|
15
|
-
isFavorite?: boolean;
|
|
16
|
-
status?: string;
|
|
17
|
-
openAsDefault?: boolean;
|
|
18
|
-
icon?: ReactNode;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface CommonFolderProps {
|
|
22
|
-
editable?: boolean;
|
|
23
|
-
loading?: boolean;
|
|
24
|
-
openOnFolderClick?: boolean;
|
|
25
|
-
onSelectFolder?: (id: string) => void;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface TreeStructureProps extends CommonFolderProps {
|
|
29
|
-
folders: FolderStructureProps[];
|
|
30
|
-
framed?: boolean;
|
|
31
|
-
label?: string;
|
|
32
|
-
folderIdMarkedByDefault?: string;
|
|
33
|
-
onNewFolder: (name: string, parentId: string) => Promise<string>;
|
|
34
|
-
defaultOpenFolders?: string[];
|
|
35
|
-
folderChild?: FolderChildFuncType;
|
|
36
|
-
maximumLevelsOfFoldersAllowed?: number;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export type onCreateNewFolderProp = ({
|
|
40
|
-
idPaths,
|
|
41
|
-
parentId,
|
|
42
|
-
}: {
|
|
43
|
-
idPaths: number[];
|
|
44
|
-
parentId: string | undefined;
|
|
45
|
-
}) => void;
|
|
46
|
-
|
|
47
|
-
export type SetOpenFolderProp = React.Dispatch<React.SetStateAction<string[]>>;
|
|
48
|
-
export type SetFocusedFolderId = React.Dispatch<React.SetStateAction<string | undefined>>;
|
|
49
|
-
|
|
50
|
-
export type FolderChildFuncType = (id: string, tabIndex: number) => ReactNode;
|
|
51
|
-
|
|
52
|
-
export interface FolderItemsProps extends CommonFolderProps {
|
|
53
|
-
folders: FolderStructureProps[];
|
|
54
|
-
onCloseFolder: (id: string) => void;
|
|
55
|
-
onOpenFolder: (id: string) => void;
|
|
56
|
-
onSaveNewFolder: (name: string, parentId: string) => void;
|
|
57
|
-
onCancelNewFolder: () => void;
|
|
58
|
-
onCreateNewFolder: (parentId: string) => void;
|
|
59
|
-
newFolderParentId: string | undefined;
|
|
60
|
-
visibleFolders: string[];
|
|
61
|
-
openFolders: string[];
|
|
62
|
-
markedFolderId?: string;
|
|
63
|
-
onMarkFolder: (id: string) => void;
|
|
64
|
-
level: number;
|
|
65
|
-
focusedFolderId: string | undefined;
|
|
66
|
-
setFocusedFolderId: SetFocusedFolderId;
|
|
67
|
-
keyNavigationFocusIsCreateFolderButton?: boolean;
|
|
68
|
-
icon?: ReactNode;
|
|
69
|
-
folderChild?: FolderChildFuncType;
|
|
70
|
-
maximumLevelsOfFoldersAllowed: number;
|
|
71
|
-
}
|