@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.
Files changed (88) hide show
  1. package/es/LearningPaths/LearningPathInformation.js +21 -3
  2. package/es/LearningPaths/LearningPathMenu.js +8 -5
  3. package/es/LearningPaths/LearningPathMenuAsideCopyright.js +17 -4
  4. package/es/LearningPaths/LearningPathMenuIntro.js +19 -8
  5. package/es/MyNdla/Resource/Folder.js +7 -6
  6. package/es/Resource/BlockResource.js +6 -5
  7. package/es/Resource/ListResource.js +7 -6
  8. package/es/ResourceGroup/ResourceGroup.js +3 -3
  9. package/es/ResourceGroup/ResourceItem.js +12 -12
  10. package/es/ResourceGroup/ResourceList.js +2 -2
  11. package/es/TopicMenu/TopicMenuButton.js +4 -2
  12. package/es/TreeStructure/FolderItem.js +72 -51
  13. package/es/TreeStructure/FolderItems.js +33 -61
  14. package/es/TreeStructure/FolderNameInput.js +14 -13
  15. package/es/TreeStructure/TreeStructure.js +80 -96
  16. package/es/TreeStructure/helperFunctions.js +4 -73
  17. package/es/TreeStructure/{TreeStructure.types.js → types.js} +0 -0
  18. package/es/locale/messages-en.js +6 -1
  19. package/es/locale/messages-nb.js +6 -1
  20. package/es/locale/messages-nn.js +6 -1
  21. package/es/locale/messages-se.js +6 -1
  22. package/es/locale/messages-sma.js +6 -1
  23. package/lib/LearningPaths/LearningPathInformation.js +19 -2
  24. package/lib/LearningPaths/LearningPathMenu.d.ts +2 -1
  25. package/lib/LearningPaths/LearningPathMenu.js +8 -5
  26. package/lib/LearningPaths/LearningPathMenuAsideCopyright.js +16 -3
  27. package/lib/LearningPaths/LearningPathMenuIntro.d.ts +3 -1
  28. package/lib/LearningPaths/LearningPathMenuIntro.js +19 -8
  29. package/lib/MyNdla/Resource/Folder.js +7 -6
  30. package/lib/Resource/BlockResource.js +6 -5
  31. package/lib/Resource/ListResource.js +7 -6
  32. package/lib/ResourceGroup/ResourceGroup.d.ts +1 -1
  33. package/lib/ResourceGroup/ResourceGroup.js +3 -3
  34. package/lib/ResourceGroup/ResourceItem.d.ts +1 -1
  35. package/lib/ResourceGroup/ResourceItem.js +12 -12
  36. package/lib/ResourceGroup/ResourceList.d.ts +1 -1
  37. package/lib/ResourceGroup/ResourceList.js +2 -2
  38. package/lib/TopicMenu/TopicMenuButton.js +3 -1
  39. package/lib/TreeStructure/FolderItem.d.ts +6 -20
  40. package/lib/TreeStructure/FolderItem.js +74 -51
  41. package/lib/TreeStructure/FolderItems.d.ts +11 -2
  42. package/lib/TreeStructure/FolderItems.js +33 -61
  43. package/lib/TreeStructure/FolderNameInput.js +14 -13
  44. package/lib/TreeStructure/TreeStructure.d.ts +12 -2
  45. package/lib/TreeStructure/TreeStructure.js +78 -94
  46. package/lib/TreeStructure/helperFunctions.d.ts +2 -4
  47. package/lib/TreeStructure/helperFunctions.js +5 -80
  48. package/lib/TreeStructure/index.d.ts +2 -1
  49. package/lib/TreeStructure/types.d.ts +32 -0
  50. package/lib/TreeStructure/{TreeStructure.types.js → types.js} +0 -0
  51. package/lib/index.d.ts +1 -1
  52. package/lib/locale/messages-en.d.ts +6 -1
  53. package/lib/locale/messages-en.js +6 -1
  54. package/lib/locale/messages-nb.d.ts +6 -1
  55. package/lib/locale/messages-nb.js +6 -1
  56. package/lib/locale/messages-nn.d.ts +6 -1
  57. package/lib/locale/messages-nn.js +6 -1
  58. package/lib/locale/messages-se.d.ts +6 -1
  59. package/lib/locale/messages-se.js +6 -1
  60. package/lib/locale/messages-sma.d.ts +6 -1
  61. package/lib/locale/messages-sma.js +6 -1
  62. package/package.json +15 -14
  63. package/src/LearningPaths/LearningPathInformation.tsx +27 -12
  64. package/src/LearningPaths/LearningPathMenu.tsx +9 -1
  65. package/src/LearningPaths/LearningPathMenuAsideCopyright.tsx +22 -20
  66. package/src/LearningPaths/LearningPathMenuIntro.tsx +15 -2
  67. package/src/MyNdla/Resource/Folder.tsx +1 -1
  68. package/src/Resource/BlockResource.tsx +1 -1
  69. package/src/Resource/ListResource.tsx +1 -1
  70. package/src/ResourceGroup/ResourceGroup.tsx +1 -1
  71. package/src/ResourceGroup/ResourceItem.tsx +2 -2
  72. package/src/ResourceGroup/ResourceList.tsx +1 -1
  73. package/src/TopicMenu/TopicMenuButton.jsx +5 -1
  74. package/src/TreeStructure/FolderItem.tsx +59 -67
  75. package/src/TreeStructure/FolderItems.tsx +30 -50
  76. package/src/TreeStructure/FolderNameInput.tsx +6 -11
  77. package/src/TreeStructure/TreeStructure.tsx +73 -71
  78. package/src/TreeStructure/helperFunctions.ts +3 -37
  79. package/src/TreeStructure/index.ts +2 -1
  80. package/src/TreeStructure/types.ts +37 -0
  81. package/src/index.ts +1 -1
  82. package/src/locale/messages-en.ts +6 -1
  83. package/src/locale/messages-nb.ts +7 -1
  84. package/src/locale/messages-nn.ts +6 -1
  85. package/src/locale/messages-se.ts +7 -1
  86. package/src/locale/messages-sma.ts +7 -1
  87. package/lib/TreeStructure/TreeStructure.types.d.ts +0 -61
  88. 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
- if (inputRef.current) {
69
- inputRef.current.select();
70
- if (isMobile) {
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: React.KeyboardEvent<HTMLInputElement>) => {
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: React.ChangeEvent<HTMLInputElement>) => {
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, useRef, useMemo } from 'react';
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 { getPathOfFolder, getFolderName, flattenFolders } from './helperFunctions';
19
- import { TreeStructureProps } from './TreeStructure.types';
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
- const [newFolderParentId, setNewFolderParentId] = useState<string | undefined>();
57
+
58
+ const defaultSelectedFolderId = defaultOpenFolders && defaultOpenFolders[defaultOpenFolders.length - 1];
59
+
48
60
  const [openFolders, setOpenFolders] = useState<string[]>(defaultOpenFolders || []);
49
- const [focusedFolderId, setFocusedFolderId] = useState<string | undefined>();
50
- const [markedFolderId, setMarkedFolderId] = useState<string | undefined>(folderIdMarkedByDefault || folders[0]?.id);
51
- const treestructureRef = useRef<HTMLDivElement>(null);
52
- const wrapperRef = useRef<HTMLDivElement>(null);
53
- const rootLevelId = 'treestructure-root';
54
-
55
- const visibleFolders = useMemo(
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([...defaultOpenFolders, ...prev]);
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
- // Did we just closed a folder with a marked folder inside it?
76
- // If so, we need to mark the folder we just closed.
77
- if (markedFolderId) {
78
- const closingFolderPath = getPathOfFolder(folders, id);
79
- const markedFolderPath = getPathOfFolder(folders, markedFolderId);
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
- setMarkedFolderId(closingFolderPath[closingFolderPath.length - 1]);
86
- onSelectFolder(closingFolderPath[closingFolderPath.length - 1]);
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((folder) => folder !== id));
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((newFolderId) => {
105
- if (newFolderId) {
106
- setMarkedFolderId(newFolderId);
107
- setFocusedFolderId(newFolderId);
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 onMarkFolder = (id: string) => {
118
- setMarkedFolderId(id);
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 ref={treestructureRef}>
127
- {label && <StyledLabel htmlFor={rootLevelId}>{label}</StyledLabel>}
128
- <TreeStructureStyledWrapper ref={wrapperRef} id={rootLevelId} aria-label="Menu tree" role="tree" framed={framed}>
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
- onOpenFolder={onOpenFolder}
135
- onCloseFolder={onCloseFolder}
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
- visibleFolders={visibleFolders}
148
+ onSelectFolder={onSelectFolder}
141
149
  openFolders={openFolders}
142
- markedFolderId={markedFolderId}
143
- onMarkFolder={onMarkFolder}
144
150
  openOnFolderClick={openOnFolderClick}
145
- loading={loading}
146
- focusedFolderId={focusedFolderId}
147
- setFocusedFolderId={setFocusedFolderId}
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: getFolderName(folders, markedFolderId),
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 { FolderStructureProps } from './TreeStructure.types';
1
+ import { FolderType } from './types';
2
2
 
3
- export const getPathOfFolder = (data: FolderStructureProps[], findId: string): string[] => {
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 FolderStructureProps[]);
9
+ }, [] as FolderType[]);
44
10
  };
@@ -7,5 +7,6 @@
7
7
  */
8
8
 
9
9
  import TreeStructure from './TreeStructure';
10
- export type { FolderStructureProps, TreeStructureProps } from './TreeStructure.types';
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 { FolderStructureProps, TreeStructureProps } from './TreeStructure';
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: 'terms of use',
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: 'vilkår for bruk',
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: 'vilkår for bruk',
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: 'vilkår for bruk',
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: 'vilkår for bruk',
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
- }