@ndla/ui 20.0.2 → 22.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/LearningPathMenu.js +8 -5
- package/es/LearningPaths/LearningPathMenuAsideCopyright.js +17 -4
- package/es/LearningPaths/LearningPathMenuIntro.js +19 -8
- package/es/MyNdla/Resource/Folder.js +7 -6
- package/es/Resource/BlockResource.js +6 -5
- package/es/Resource/ListResource.js +7 -6
- package/es/ResourceGroup/ResourceGroup.js +3 -3
- package/es/ResourceGroup/ResourceItem.js +12 -12
- package/es/ResourceGroup/ResourceList.js +2 -2
- package/es/TopicMenu/TopicMenuButton.js +4 -2
- 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/es/locale/messages-en.js +6 -1
- package/es/locale/messages-nb.js +6 -1
- package/es/locale/messages-nn.js +6 -1
- package/es/locale/messages-se.js +6 -1
- package/es/locale/messages-sma.js +6 -1
- package/lib/LearningPaths/LearningPathInformation.js +19 -2
- package/lib/LearningPaths/LearningPathMenu.d.ts +2 -1
- package/lib/LearningPaths/LearningPathMenu.js +8 -5
- package/lib/LearningPaths/LearningPathMenuAsideCopyright.js +16 -3
- package/lib/LearningPaths/LearningPathMenuIntro.d.ts +3 -1
- package/lib/LearningPaths/LearningPathMenuIntro.js +19 -8
- package/lib/MyNdla/Resource/Folder.js +7 -6
- package/lib/Resource/BlockResource.js +6 -5
- package/lib/Resource/ListResource.js +7 -6
- package/lib/ResourceGroup/ResourceGroup.d.ts +1 -1
- package/lib/ResourceGroup/ResourceGroup.js +3 -3
- package/lib/ResourceGroup/ResourceItem.d.ts +1 -1
- package/lib/ResourceGroup/ResourceItem.js +12 -12
- package/lib/ResourceGroup/ResourceList.d.ts +1 -1
- package/lib/ResourceGroup/ResourceList.js +2 -2
- package/lib/TopicMenu/TopicMenuButton.js +3 -1
- 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/lib/locale/messages-en.d.ts +6 -1
- package/lib/locale/messages-en.js +6 -1
- package/lib/locale/messages-nb.d.ts +6 -1
- package/lib/locale/messages-nb.js +6 -1
- package/lib/locale/messages-nn.d.ts +6 -1
- package/lib/locale/messages-nn.js +6 -1
- package/lib/locale/messages-se.d.ts +6 -1
- package/lib/locale/messages-se.js +6 -1
- package/lib/locale/messages-sma.d.ts +6 -1
- package/lib/locale/messages-sma.js +6 -1
- package/package.json +15 -14
- package/src/LearningPaths/LearningPathInformation.tsx +27 -12
- package/src/LearningPaths/LearningPathMenu.tsx +9 -1
- package/src/LearningPaths/LearningPathMenuAsideCopyright.tsx +22 -20
- package/src/LearningPaths/LearningPathMenuIntro.tsx +15 -2
- package/src/MyNdla/Resource/Folder.tsx +1 -1
- package/src/Resource/BlockResource.tsx +1 -1
- package/src/Resource/ListResource.tsx +1 -1
- package/src/ResourceGroup/ResourceGroup.tsx +1 -1
- package/src/ResourceGroup/ResourceItem.tsx +2 -2
- package/src/ResourceGroup/ResourceList.tsx +1 -1
- package/src/TopicMenu/TopicMenuButton.jsx +5 -1
- 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/src/locale/messages-en.ts +6 -1
- package/src/locale/messages-nb.ts +7 -1
- package/src/locale/messages-nn.ts +6 -1
- package/src/locale/messages-se.ts +7 -1
- package/src/locale/messages-sma.ts +7 -1
- package/lib/TreeStructure/TreeStructure.types.d.ts +0 -61
- package/src/TreeStructure/TreeStructure.types.ts +0 -71
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import React, { useEffect, useState, useRef } from 'react';
|
|
9
|
+
import React, { useEffect, useState, useRef, ChangeEvent, KeyboardEvent } from 'react';
|
|
10
10
|
import styled from '@emotion/styled';
|
|
11
11
|
import { FolderOutlined } from '@ndla/icons/contentType';
|
|
12
12
|
import { ArrowDropDown as ArrowDropDownRaw } from '@ndla/icons/common';
|
|
@@ -65,11 +65,9 @@ const FolderNameInput = ({ onSaveNewFolder, parentId, onCancelNewFolder, loading
|
|
|
65
65
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
66
66
|
|
|
67
67
|
useEffect(() => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
inputRef.current.scrollIntoView({ behavior: 'smooth' });
|
|
72
|
-
}
|
|
68
|
+
inputRef.current?.select();
|
|
69
|
+
if (isMobile) {
|
|
70
|
+
inputRef.current?.scrollIntoView({ behavior: 'smooth' });
|
|
73
71
|
}
|
|
74
72
|
}, []);
|
|
75
73
|
|
|
@@ -85,7 +83,7 @@ const FolderNameInput = ({ onSaveNewFolder, parentId, onCancelNewFolder, loading
|
|
|
85
83
|
disabled={loading}
|
|
86
84
|
value={name}
|
|
87
85
|
onBlur={() => onCancelNewFolder()}
|
|
88
|
-
onKeyDown={(e:
|
|
86
|
+
onKeyDown={(e: KeyboardEvent<HTMLInputElement>) => {
|
|
89
87
|
if (e.key === 'Escape') {
|
|
90
88
|
onCancelNewFolder();
|
|
91
89
|
} else if (e.key === 'Enter' || e.key === 'Tab') {
|
|
@@ -93,10 +91,7 @@ const FolderNameInput = ({ onSaveNewFolder, parentId, onCancelNewFolder, loading
|
|
|
93
91
|
onSaveNewFolder(name, parentId);
|
|
94
92
|
}
|
|
95
93
|
}}
|
|
96
|
-
onChange={(e:
|
|
97
|
-
const target = e.target;
|
|
98
|
-
setName(target.value);
|
|
99
|
-
}}
|
|
94
|
+
onChange={(e: ChangeEvent<HTMLInputElement>) => setName(e.target.value)}
|
|
100
95
|
/>
|
|
101
96
|
{loading && <Spinner size="small" />}
|
|
102
97
|
</InputWrapper>
|
|
@@ -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';
|
|
@@ -1022,7 +1022,12 @@ const messages = {
|
|
|
1022
1022
|
privacy: 'privacy statement',
|
|
1023
1023
|
questions: { question: 'Any questions?', ask: 'Ask us in the chat' },
|
|
1024
1024
|
wishToDelete: 'Do you wish to delete your account?',
|
|
1025
|
-
terms:
|
|
1025
|
+
terms: {
|
|
1026
|
+
terms: 'Terms of use',
|
|
1027
|
+
term1: 'Do not write personal or sensitive information in text fields.',
|
|
1028
|
+
term2: 'Do not write offensive statements in text fields.',
|
|
1029
|
+
term3: 'NDLA reserves the right to update or remove resources if they are not up to date.',
|
|
1030
|
+
},
|
|
1026
1031
|
feide: 'We have retrieved this information from Feide',
|
|
1027
1032
|
newFavourite: 'Recently favourited',
|
|
1028
1033
|
|
|
@@ -1020,7 +1020,13 @@ const messages = {
|
|
|
1020
1020
|
privacy: 'personvernerklæring her',
|
|
1021
1021
|
questions: { question: 'Lurer du på noe?', ask: 'Spør oss i chatten' },
|
|
1022
1022
|
wishToDelete: 'Ønsker du ikke ha brukerprofil hos oss lengre?',
|
|
1023
|
-
terms:
|
|
1023
|
+
terms: {
|
|
1024
|
+
terms: 'Vilkår for bruk',
|
|
1025
|
+
term1: 'Ikke skriv personsensitiv informasjon eller persondata i tekstfelt.',
|
|
1026
|
+
term2: 'Ikke skriv noe støtende i tekstfelt.',
|
|
1027
|
+
term3:
|
|
1028
|
+
'NDLA forbeholder seg retten til å oppdatere eller eventuelt slette ressurser dersom disse blir utdatert.',
|
|
1029
|
+
},
|
|
1024
1030
|
newFavourite: 'Nylig lagt til',
|
|
1025
1031
|
feide: 'Dette henter vi om deg fra Feide',
|
|
1026
1032
|
storageInfo: {
|
|
@@ -1021,7 +1021,12 @@ const messages = {
|
|
|
1021
1021
|
privacy: 'personvernerklæring her',
|
|
1022
1022
|
questions: { question: 'Lurer du på noe?', ask: 'Spør oss i chatten' },
|
|
1023
1023
|
wishToDelete: 'Ønsker du ikke ha brukerprofil hos oss lengre?',
|
|
1024
|
-
terms:
|
|
1024
|
+
terms: {
|
|
1025
|
+
terms: 'Vilkår for bruk',
|
|
1026
|
+
term1: 'Ikkje skriv personsensitiv informasjon eller persondata i tekstfelt.',
|
|
1027
|
+
term2: 'Ikkje skriv noko støytande i tekstfelt.',
|
|
1028
|
+
term3: 'NDLA atterhald seg retten til å oppdatere eller eventuelt slette ressursar dersom disse blir utdatert.',
|
|
1029
|
+
},
|
|
1025
1030
|
newFavourite: 'Nylig lagt til',
|
|
1026
1031
|
feide: 'Dette henter vi om deg fra Feide',
|
|
1027
1032
|
storageInfo: {
|
|
@@ -1020,7 +1020,13 @@ const messages = {
|
|
|
1020
1020
|
privacy: 'personvernerklæring her',
|
|
1021
1021
|
questions: { question: 'Lurer du på noe?', ask: 'Spør oss i chatten' },
|
|
1022
1022
|
wishToDelete: 'Ønsker du ikke ha brukerprofil hos oss lengre?',
|
|
1023
|
-
terms:
|
|
1023
|
+
terms: {
|
|
1024
|
+
terms: 'Vilkår for bruk',
|
|
1025
|
+
term1: 'Ikke skriv personsensitiv informasjon eller persondata i tekstfelt.',
|
|
1026
|
+
term2: 'Ikke skriv noe støtende i tekstfelt.',
|
|
1027
|
+
term3:
|
|
1028
|
+
'NDLA forbeholder seg retten til å oppdatere eller eventuelt slette ressurser dersom disse blir utdatert.',
|
|
1029
|
+
},
|
|
1024
1030
|
newFavourite: 'Nylig lagt til',
|
|
1025
1031
|
feide: 'Dette henter vi om deg fra Feide',
|
|
1026
1032
|
storageInfo: {
|
|
@@ -1020,7 +1020,13 @@ const messages = {
|
|
|
1020
1020
|
privacy: 'personvernerklæring her',
|
|
1021
1021
|
questions: { question: 'Lurer du på noe?', ask: 'Spør oss i chatten' },
|
|
1022
1022
|
wishToDelete: 'Ønsker du ikke ha brukerprofil hos oss lengre?',
|
|
1023
|
-
terms:
|
|
1023
|
+
terms: {
|
|
1024
|
+
terms: 'Vilkår for bruk',
|
|
1025
|
+
term1: 'Ikke skriv personsensitiv informasjon eller persondata i tekstfelt.',
|
|
1026
|
+
term2: 'Ikke skriv noe støtende i tekstfelt.',
|
|
1027
|
+
term3:
|
|
1028
|
+
'NDLA forbeholder seg retten til å oppdatere eller eventuelt slette ressurser dersom disse blir utdatert.',
|
|
1029
|
+
},
|
|
1024
1030
|
newFavourite: 'Nylig lagt til',
|
|
1025
1031
|
feide: 'Dette henter vi om deg fra Feide',
|
|
1026
1032
|
storageInfo: {
|
|
@@ -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
|
-
}
|