@ndla/ui 25.2.1 → 26.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/Article/ArticleByline.js +17 -7
- package/es/Article/ArticleSideBar.js +5 -4
- package/es/Breadcrumb/BreadcrumbItem.js +8 -7
- package/es/ErrorMessage/ErrorMessage.js +12 -6
- package/es/Frontpage/FrontpageHeader.js +7 -9
- package/es/LanguageSelector/LanguageSelector.js +12 -7
- package/es/LearningPaths/LearningPathInformation.js +8 -5
- package/es/Subject/SubjectHeader.js +5 -6
- package/es/TreeStructure/FolderItem.js +110 -94
- package/es/TreeStructure/FolderItems.js +26 -30
- package/es/TreeStructure/FolderNameInput.js +35 -27
- package/es/TreeStructure/NavigationLink.js +81 -0
- package/es/TreeStructure/TreeStructure.js +169 -45
- package/es/locale/messages-en.js +7 -22
- package/es/locale/messages-nb.js +8 -23
- package/es/locale/messages-nn.js +7 -22
- package/es/locale/messages-se.js +697 -712
- package/es/locale/messages-sma.js +8 -23
- package/lib/Article/ArticleByline.js +17 -7
- package/lib/Article/ArticleSideBar.js +5 -4
- package/lib/Breadcrumb/BreadcrumbItem.js +8 -7
- package/lib/ErrorMessage/ErrorMessage.d.ts +1 -0
- package/lib/ErrorMessage/ErrorMessage.js +12 -6
- package/lib/Frontpage/FrontpageHeader.d.ts +5 -6
- package/lib/Frontpage/FrontpageHeader.js +7 -11
- package/lib/LanguageSelector/LanguageSelector.js +13 -7
- package/lib/LearningPaths/LearningPathInformation.d.ts +2 -1
- package/lib/LearningPaths/LearningPathInformation.js +8 -5
- package/lib/Subject/SubjectHeader.js +14 -16
- package/lib/TreeStructure/FolderItem.d.ts +2 -3
- package/lib/TreeStructure/FolderItem.js +107 -92
- package/lib/TreeStructure/FolderItems.d.ts +1 -3
- package/lib/TreeStructure/FolderItems.js +26 -29
- package/lib/TreeStructure/FolderNameInput.d.ts +2 -1
- package/lib/TreeStructure/FolderNameInput.js +33 -26
- package/lib/TreeStructure/NavigationLink.d.ts +15 -0
- package/lib/TreeStructure/NavigationLink.js +100 -0
- package/lib/TreeStructure/TreeStructure.d.ts +1 -2
- package/lib/TreeStructure/TreeStructure.js +163 -45
- package/lib/TreeStructure/types.d.ts +4 -1
- package/lib/locale/messages-en.d.ts +4 -19
- package/lib/locale/messages-en.js +7 -22
- package/lib/locale/messages-nb.d.ts +4 -19
- package/lib/locale/messages-nb.js +8 -23
- package/lib/locale/messages-nn.d.ts +4 -19
- package/lib/locale/messages-nn.js +7 -22
- package/lib/locale/messages-se.d.ts +4 -19
- package/lib/locale/messages-se.js +697 -712
- package/lib/locale/messages-sma.d.ts +4 -19
- package/lib/locale/messages-sma.js +8 -23
- package/package.json +14 -14
- package/src/Article/ArticleByline.tsx +10 -3
- package/src/Article/ArticleSideBar.tsx +1 -0
- package/src/Breadcrumb/BreadcrumbItem.tsx +1 -1
- package/src/ErrorMessage/ErrorMessage.tsx +6 -0
- package/src/Frontpage/FrontpageHeader.tsx +5 -6
- package/src/LanguageSelector/LanguageSelector.tsx +4 -1
- package/src/LearningPaths/LearningPathInformation.tsx +3 -2
- package/src/Subject/SubjectHeader.tsx +1 -2
- package/src/TreeStructure/FolderItem.tsx +126 -104
- package/src/TreeStructure/FolderItems.tsx +51 -43
- package/src/TreeStructure/FolderNameInput.tsx +43 -28
- package/src/TreeStructure/NavigationLink.tsx +100 -0
- package/src/TreeStructure/TreeStructure.tsx +187 -61
- package/src/TreeStructure/types.ts +5 -1
- package/src/locale/messages-en.ts +9 -22
- package/src/locale/messages-nb.ts +10 -23
- package/src/locale/messages-nn.ts +9 -22
- package/src/locale/messages-se.ts +724 -738
- package/src/locale/messages-sma.ts +10 -23
- package/es/TreeStructure/TreeStructureWrapper.js +0 -13
- package/lib/TreeStructure/TreeStructureWrapper.d.ts +0 -12
- package/lib/TreeStructure/TreeStructureWrapper.js +0 -24
- package/src/TreeStructure/TreeStructureWrapper.tsx +0 -31
|
@@ -6,18 +6,20 @@
|
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import React, { useEffect, useState, useMemo } from 'react';
|
|
10
|
-
import {
|
|
9
|
+
import React, { useEffect, useState, useMemo, useRef } from 'react';
|
|
10
|
+
import { ButtonV2 as Button, IconButtonDualStates } from '@ndla/button';
|
|
11
|
+
import { Plus } from '@ndla/icons/action';
|
|
12
|
+
import { ChevronDown, ChevronUp } from '@ndla/icons/common';
|
|
11
13
|
import Tooltip from '@ndla/tooltip';
|
|
12
14
|
import { useTranslation } from 'react-i18next';
|
|
13
15
|
import styled from '@emotion/styled';
|
|
14
|
-
import {
|
|
16
|
+
import { colors, fonts, misc, spacing } from '@ndla/core';
|
|
17
|
+
import { css } from '@emotion/core';
|
|
15
18
|
import { uniq } from 'lodash';
|
|
16
19
|
import { IFolder } from '@ndla/types-learningpath-api';
|
|
17
|
-
import TreeStructureStyledWrapper from './TreeStructureWrapper';
|
|
18
20
|
import FolderItems from './FolderItems';
|
|
19
21
|
import { flattenFolders } from './helperFunctions';
|
|
20
|
-
import { CommonTreeStructureProps, FolderType } from './types';
|
|
22
|
+
import { CommonTreeStructureProps, FolderType, TreeStructureType } from './types';
|
|
21
23
|
|
|
22
24
|
export const MAX_LEVEL_FOR_FOLDERS = 4;
|
|
23
25
|
|
|
@@ -25,15 +27,86 @@ const StyledLabel = styled.label`
|
|
|
25
27
|
font-weight: ${fonts.weight.semibold};
|
|
26
28
|
`;
|
|
27
29
|
|
|
28
|
-
|
|
30
|
+
interface StyledRowProps {
|
|
31
|
+
isOpen: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const StyledRow = styled.div<StyledRowProps>`
|
|
35
|
+
display: flex;
|
|
36
|
+
justify-content: space-between;
|
|
37
|
+
padding: ${spacing.xxsmall};
|
|
38
|
+
border-bottom: ${({ isOpen }) => isOpen && `1px solid ${colors.brand.tertiary}`};
|
|
39
|
+
`;
|
|
40
|
+
|
|
41
|
+
const StyledTreeStructure = styled.div`
|
|
42
|
+
flex: 1;
|
|
43
|
+
display: flex;
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
`;
|
|
46
|
+
|
|
47
|
+
const TreeStructureWrapper = styled.div<{ type: TreeStructureType }>`
|
|
29
48
|
display: flex;
|
|
30
|
-
|
|
49
|
+
flex-direction: column;
|
|
50
|
+
${({ type }) =>
|
|
51
|
+
(type === 'normal' || type === 'picker') &&
|
|
52
|
+
css`
|
|
53
|
+
overflow: hidden;
|
|
54
|
+
border: 1px solid ${colors.brand.neutral7};
|
|
55
|
+
border-radius: ${misc.borderRadius};
|
|
56
|
+
scroll-behavior: smooth;
|
|
57
|
+
`}
|
|
58
|
+
transition: ${misc.transition.default};
|
|
59
|
+
&:focus-within {
|
|
60
|
+
border-color: ${colors.brand.tertiary};
|
|
61
|
+
}
|
|
62
|
+
`;
|
|
63
|
+
interface ScrollableDivProps {
|
|
64
|
+
type: TreeStructureType;
|
|
65
|
+
}
|
|
66
|
+
const ScrollableDiv = styled.div<ScrollableDivProps>`
|
|
67
|
+
${({ type }) =>
|
|
68
|
+
(type === 'picker' || type === 'normal') &&
|
|
69
|
+
css`
|
|
70
|
+
overflow: overlay;
|
|
71
|
+
::-webkit-scrollbar {
|
|
72
|
+
width: ${spacing.small};
|
|
73
|
+
}
|
|
74
|
+
::-webkit-scrollbar-thumb {
|
|
75
|
+
border: 4px solid transparent;
|
|
76
|
+
border-radius: 14px;
|
|
77
|
+
background-clip: padding-box;
|
|
78
|
+
padding: 0 4px;
|
|
79
|
+
background-color: ${colors.brand.neutral7};
|
|
80
|
+
}
|
|
81
|
+
`}
|
|
82
|
+
`;
|
|
83
|
+
|
|
84
|
+
const StyledSelectedFolder = styled(Button)`
|
|
85
|
+
flex: 1;
|
|
86
|
+
justify-content: flex-start;
|
|
87
|
+
:hover,
|
|
88
|
+
:focus {
|
|
89
|
+
background: none;
|
|
90
|
+
box-shadow: none;
|
|
91
|
+
border-color: transparent;
|
|
92
|
+
}
|
|
93
|
+
`;
|
|
94
|
+
|
|
95
|
+
const StyledAddFolderButton = styled(Button)`
|
|
96
|
+
&,
|
|
97
|
+
&:disabled {
|
|
98
|
+
border-color: transparent;
|
|
99
|
+
}
|
|
100
|
+
`;
|
|
101
|
+
|
|
102
|
+
const StyledPlus = styled(Plus)`
|
|
103
|
+
height: 24px;
|
|
104
|
+
width: 24px;
|
|
31
105
|
`;
|
|
32
106
|
|
|
33
107
|
export interface TreeStructureProps extends CommonTreeStructureProps {
|
|
34
108
|
defaultOpenFolders?: string[];
|
|
35
109
|
folders: FolderType[];
|
|
36
|
-
editable?: boolean;
|
|
37
110
|
label?: string;
|
|
38
111
|
maximumLevelsOfFoldersAllowed?: number;
|
|
39
112
|
onNewFolder?: (name: string, parentId: string) => Promise<IFolder>;
|
|
@@ -41,10 +114,7 @@ export interface TreeStructureProps extends CommonTreeStructureProps {
|
|
|
41
114
|
|
|
42
115
|
const TreeStructure = ({
|
|
43
116
|
defaultOpenFolders,
|
|
44
|
-
editable,
|
|
45
|
-
menuItems,
|
|
46
117
|
folders,
|
|
47
|
-
framed,
|
|
48
118
|
label,
|
|
49
119
|
loading,
|
|
50
120
|
maximumLevelsOfFoldersAllowed = MAX_LEVEL_FOR_FOLDERS,
|
|
@@ -52,9 +122,12 @@ const TreeStructure = ({
|
|
|
52
122
|
onSelectFolder,
|
|
53
123
|
openOnFolderClick,
|
|
54
124
|
targetResource,
|
|
125
|
+
type = 'normal',
|
|
55
126
|
}: TreeStructureProps) => {
|
|
56
127
|
const { t } = useTranslation();
|
|
57
128
|
|
|
129
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
130
|
+
|
|
58
131
|
const defaultSelectedFolderId = defaultOpenFolders && defaultOpenFolders[defaultOpenFolders.length - 1];
|
|
59
132
|
|
|
60
133
|
const [openFolders, setOpenFolders] = useState<string[]>(defaultOpenFolders || []);
|
|
@@ -62,10 +135,25 @@ const TreeStructure = ({
|
|
|
62
135
|
const [newFolderParentId, setNewFolderParentId] = useState<string | undefined>();
|
|
63
136
|
const [focusedId, setFocusedId] = useState<string | undefined>();
|
|
64
137
|
const [selectedFolder, setSelectedFolder] = useState<FolderType | undefined>();
|
|
138
|
+
const [showTree, setShowTree] = useState(type !== 'picker');
|
|
65
139
|
|
|
66
140
|
const flattenedFolders = useMemo(() => flattenFolders(folders, openFolders), [folders, openFolders]);
|
|
67
141
|
const visibleFolderIds = flattenedFolders.map((folder) => folder.id);
|
|
68
142
|
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
const handleClickOutside = (e: MouseEvent) => {
|
|
145
|
+
if (e.target instanceof Element && ref.current && !ref.current.contains(e.target)) {
|
|
146
|
+
setShowTree(false);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
if (type === 'picker') {
|
|
150
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
151
|
+
return () => {
|
|
152
|
+
document.removeEventListener('mousedown', handleClickOutside);
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}, [ref, type]);
|
|
156
|
+
|
|
69
157
|
useEffect(() => {
|
|
70
158
|
if (defaultOpenFolders) {
|
|
71
159
|
if (!defaultOpenFolders.every((element) => openFolders.includes(element))) {
|
|
@@ -77,6 +165,10 @@ const TreeStructure = ({
|
|
|
77
165
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
78
166
|
}, [defaultOpenFolders]);
|
|
79
167
|
|
|
168
|
+
useEffect(() => {
|
|
169
|
+
setNewFolderParentId(undefined);
|
|
170
|
+
}, [selectedFolder]);
|
|
171
|
+
|
|
80
172
|
useEffect(() => {
|
|
81
173
|
if (defaultSelectedFolderId !== undefined) {
|
|
82
174
|
const selected = flattenFolders(folders).find((folder) => folder.id === defaultSelectedFolderId);
|
|
@@ -114,9 +206,9 @@ const TreeStructure = ({
|
|
|
114
206
|
};
|
|
115
207
|
|
|
116
208
|
const onSaveNewFolder = (name: string, parentId: string) => {
|
|
117
|
-
setNewFolderParentId(undefined);
|
|
118
209
|
onNewFolder?.(name, parentId).then((newFolder) => {
|
|
119
210
|
if (newFolder) {
|
|
211
|
+
setNewFolderParentId?.(undefined);
|
|
120
212
|
setSelectedFolder(newFolder);
|
|
121
213
|
onSelectFolder?.(newFolder.id);
|
|
122
214
|
setFocusedId(newFolder.id);
|
|
@@ -126,60 +218,94 @@ const TreeStructure = ({
|
|
|
126
218
|
};
|
|
127
219
|
|
|
128
220
|
const onCancelNewFolder = () => {
|
|
129
|
-
setNewFolderParentId(undefined);
|
|
221
|
+
setNewFolderParentId?.(undefined);
|
|
130
222
|
};
|
|
131
223
|
|
|
132
|
-
const canAddFolder =
|
|
133
|
-
editable && selectedFolder && selectedFolder?.breadcrumbs.length < (maximumLevelsOfFoldersAllowed || 1);
|
|
224
|
+
const canAddFolder = selectedFolder && selectedFolder?.breadcrumbs.length < (maximumLevelsOfFoldersAllowed || 1);
|
|
134
225
|
|
|
135
226
|
return (
|
|
136
|
-
<
|
|
227
|
+
<StyledTreeStructure ref={ref}>
|
|
137
228
|
{label && <StyledLabel>{label}</StyledLabel>}
|
|
138
|
-
<
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
{t('
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
229
|
+
<TreeStructureWrapper aria-label={label} type={type}>
|
|
230
|
+
{type === 'picker' && (
|
|
231
|
+
<StyledRow isOpen={showTree}>
|
|
232
|
+
<StyledSelectedFolder
|
|
233
|
+
variant="ghost"
|
|
234
|
+
colorTheme="light"
|
|
235
|
+
fontWeight="normal"
|
|
236
|
+
shape="sharp"
|
|
237
|
+
onClick={() => {
|
|
238
|
+
setShowTree(!showTree);
|
|
239
|
+
}}>
|
|
240
|
+
{selectedFolder?.name}
|
|
241
|
+
</StyledSelectedFolder>
|
|
242
|
+
{onNewFolder && showTree && (
|
|
243
|
+
<Tooltip
|
|
244
|
+
tooltip={
|
|
245
|
+
canAddFolder
|
|
246
|
+
? t('myNdla.newFolderUnder', {
|
|
247
|
+
folderName: selectedFolder?.name,
|
|
248
|
+
})
|
|
249
|
+
: t('treeStructure.maxFoldersAlreadyAdded')
|
|
250
|
+
}>
|
|
251
|
+
<StyledAddFolderButton
|
|
252
|
+
variant="outline"
|
|
253
|
+
shape="pill"
|
|
254
|
+
disabled={!canAddFolder}
|
|
255
|
+
aria-label={
|
|
256
|
+
canAddFolder
|
|
257
|
+
? t('myNdla.newFolderUnder', {
|
|
258
|
+
folderName: selectedFolder?.name,
|
|
259
|
+
})
|
|
260
|
+
: t('treeStructure.maxFoldersAlreadyAdded')
|
|
261
|
+
}
|
|
262
|
+
onClick={() => setNewFolderParentId(selectedFolder?.id)}>
|
|
263
|
+
<StyledPlus /> {t('myNdla.newFolder')}
|
|
264
|
+
</StyledAddFolderButton>
|
|
265
|
+
</Tooltip>
|
|
266
|
+
)}
|
|
267
|
+
<IconButtonDualStates
|
|
268
|
+
ariaLabelActive={t('treeStructure.hideFolders')}
|
|
269
|
+
ariaLabelInActive={t('treeStructure.showFolders')}
|
|
270
|
+
active={showTree}
|
|
271
|
+
variant="ghost"
|
|
272
|
+
colorTheme="greyLighter"
|
|
273
|
+
inactiveIcon={<ChevronDown />}
|
|
274
|
+
activeIcon={<ChevronUp />}
|
|
275
|
+
size="small"
|
|
276
|
+
onClick={() => {
|
|
277
|
+
setShowTree(!showTree);
|
|
278
|
+
}}
|
|
279
|
+
/>
|
|
280
|
+
</StyledRow>
|
|
281
|
+
)}
|
|
282
|
+
{showTree && (
|
|
283
|
+
<ScrollableDiv type={type}>
|
|
284
|
+
<FolderItems
|
|
285
|
+
focusedFolderId={focusedId}
|
|
286
|
+
folders={folders}
|
|
287
|
+
level={0}
|
|
288
|
+
loading={loading}
|
|
289
|
+
selectedFolder={selectedFolder}
|
|
290
|
+
maxLevel={maximumLevelsOfFoldersAllowed}
|
|
291
|
+
newFolderParentId={newFolderParentId}
|
|
292
|
+
onCancelNewFolder={onCancelNewFolder}
|
|
293
|
+
onCloseFolder={onCloseFolder}
|
|
294
|
+
onOpenFolder={onOpenFolder}
|
|
295
|
+
onSaveNewFolder={onSaveNewFolder}
|
|
296
|
+
onSelectFolder={onSelectFolder}
|
|
297
|
+
openFolders={openFolders}
|
|
298
|
+
openOnFolderClick={openOnFolderClick}
|
|
299
|
+
setFocusedId={setFocusedId}
|
|
300
|
+
setSelectedFolder={setSelectedFolder}
|
|
301
|
+
targetResource={targetResource}
|
|
302
|
+
visibleFolders={visibleFolderIds}
|
|
303
|
+
type={type}
|
|
304
|
+
/>
|
|
305
|
+
</ScrollableDiv>
|
|
306
|
+
)}
|
|
307
|
+
</TreeStructureWrapper>
|
|
308
|
+
</StyledTreeStructure>
|
|
183
309
|
);
|
|
184
310
|
};
|
|
185
311
|
|
|
@@ -12,8 +12,11 @@ import { MenuItemProps } from '@ndla/button';
|
|
|
12
12
|
|
|
13
13
|
export interface FolderType extends IFolder {
|
|
14
14
|
icon?: ReactNode;
|
|
15
|
+
isNavigation?: boolean;
|
|
15
16
|
}
|
|
16
17
|
|
|
18
|
+
export type TreeStructureType = 'normal' | 'navigation' | 'picker';
|
|
19
|
+
|
|
17
20
|
export interface TreeStructureMenuProps extends Omit<MenuItemProps, 'onClick'> {
|
|
18
21
|
onClick: (e: MouseEvent<HTMLDivElement> | undefined, folder: FolderType) => void;
|
|
19
22
|
}
|
|
@@ -22,14 +25,15 @@ export interface CommonTreeStructureProps {
|
|
|
22
25
|
loading?: boolean;
|
|
23
26
|
onSelectFolder?: (id: string) => void;
|
|
24
27
|
openOnFolderClick?: boolean;
|
|
25
|
-
menuItems?: TreeStructureMenuProps[];
|
|
26
28
|
targetResource?: IResource;
|
|
27
29
|
framed?: boolean;
|
|
30
|
+
type: TreeStructureType;
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
export interface CommonFolderItemsProps extends CommonTreeStructureProps {
|
|
31
34
|
focusedFolderId?: string;
|
|
32
35
|
level: number;
|
|
36
|
+
maxLevel: number;
|
|
33
37
|
selectedFolder?: FolderType;
|
|
34
38
|
onCloseFolder: (id: string) => void;
|
|
35
39
|
onOpenFolder: (id: string) => void;
|
|
@@ -19,6 +19,8 @@ const messages = {
|
|
|
19
19
|
edit: 'Edit foldername',
|
|
20
20
|
delete: 'Delete',
|
|
21
21
|
},
|
|
22
|
+
hideFolders: 'Hide all folders',
|
|
23
|
+
showFolders: 'Show all folders',
|
|
22
24
|
createFolder: 'Create folder',
|
|
23
25
|
maxFoldersAlreadyAdded: 'Maximum subfolders reached',
|
|
24
26
|
newFolder: {
|
|
@@ -248,13 +250,6 @@ const messages = {
|
|
|
248
250
|
name: 'Follow us',
|
|
249
251
|
},
|
|
250
252
|
},
|
|
251
|
-
category: {
|
|
252
|
-
fellesfag: 'Common',
|
|
253
|
-
yrkesfag: 'Vocational',
|
|
254
|
-
studiespesialiserende: 'Specialization',
|
|
255
|
-
imported: 'Imported subjects',
|
|
256
|
-
heading: 'What will you learn?',
|
|
257
|
-
},
|
|
258
253
|
film: {
|
|
259
254
|
header: 'NDLA film',
|
|
260
255
|
text: 'NDLA film is a service in collaboration with Norgesfilm. This service allows you to watch a range of feature films, short films, documentaries and series. You can also watch educational films and movie clips. Welcome to the world of cinema!',
|
|
@@ -824,18 +819,6 @@ const messages = {
|
|
|
824
819
|
text: 'is created by',
|
|
825
820
|
},
|
|
826
821
|
},
|
|
827
|
-
fagfornyelse: {
|
|
828
|
-
frontpage: {
|
|
829
|
-
heading: 'Welcome to a sneak peek at Fagfornyelsen at NDLA',
|
|
830
|
-
text: 'The new curricula will take effect in the fall 2020. At NDLA we have already started this work. Those responsible for our content make new great learning resources every day, resources that are adapted to the new curricula. On this page you can already see them.',
|
|
831
|
-
blogHeading: 'Do you want to know more?',
|
|
832
|
-
},
|
|
833
|
-
badge: {
|
|
834
|
-
heading: 'This page is adapted for Fagfornyelsen 2020',
|
|
835
|
-
text: 'The content is in progress. Not what you were looking for?',
|
|
836
|
-
linkText: "Go to ndla.no for today's content",
|
|
837
|
-
},
|
|
838
|
-
},
|
|
839
822
|
frontPageToolbox: {
|
|
840
823
|
heading: 'Toolbox',
|
|
841
824
|
text: 'Do you want to become good at presenting, or do you want to learn to study smarter using the right study technique? Need advice on how to read most effectively for the exam? In the NDLA Toolbox you will find lots of great tips and advice!',
|
|
@@ -1007,14 +990,15 @@ const messages = {
|
|
|
1007
990
|
folders_plural: '{{count}} Folders',
|
|
1008
991
|
folder: {
|
|
1009
992
|
folder: 'Folder',
|
|
1010
|
-
delete: 'Delete',
|
|
1011
|
-
edit: 'Edit',
|
|
993
|
+
delete: 'Delete folder',
|
|
994
|
+
edit: 'Edit folder',
|
|
1012
995
|
missingName: 'Folder name required',
|
|
1013
996
|
folderDeleted: '"{{folderName}}" deleted',
|
|
1014
997
|
},
|
|
1015
998
|
tags: '{{count}} tag',
|
|
1016
999
|
tags_plural: '{{count}} tags',
|
|
1017
|
-
confirmDeleteFolder:
|
|
1000
|
+
confirmDeleteFolder:
|
|
1001
|
+
'Are you sure you want to delete this folder? Subfolders of this folder will also be deleted. This action cannot be undone.',
|
|
1018
1002
|
confirmDeleteTag: 'Are you sure you want to delete this tag? This process cannot be undone.',
|
|
1019
1003
|
myFolders: 'My folders',
|
|
1020
1004
|
myTags: 'My tags',
|
|
@@ -1035,6 +1019,9 @@ const messages = {
|
|
|
1035
1019
|
confirmDeleteAccountButton: 'Delete account',
|
|
1036
1020
|
myPage: 'My page',
|
|
1037
1021
|
logout: 'Log out of My NDLA',
|
|
1022
|
+
loginText:
|
|
1023
|
+
'Log in with Feide to receive access to My NDLA. We ask you not to write offensive or personally sensitive information in text fields. Read our ',
|
|
1024
|
+
loginTextLink: 'privacy policy here',
|
|
1038
1025
|
loginTerms: 'Log in with Feide to receive access. By logging on your accept your terms of service',
|
|
1039
1026
|
loginResourcePitch: 'Do you want to favorite this page?',
|
|
1040
1027
|
loginWelcome: 'Welcome to My NDLA! This page allows you to organize your articles in your <i>own</i> way!',
|
|
@@ -19,6 +19,8 @@ const messages = {
|
|
|
19
19
|
edit: 'Endre mappenavn',
|
|
20
20
|
delete: 'Slett',
|
|
21
21
|
},
|
|
22
|
+
hideFolders: 'Skjul alle mapper',
|
|
23
|
+
showFolders: 'Vis alle mapper',
|
|
22
24
|
createFolder: 'Lag mappe',
|
|
23
25
|
maxFoldersAlreadyAdded: 'Maks nivå av undermapper nådd',
|
|
24
26
|
newFolder: {
|
|
@@ -247,13 +249,6 @@ const messages = {
|
|
|
247
249
|
name: 'Følg oss',
|
|
248
250
|
},
|
|
249
251
|
},
|
|
250
|
-
category: {
|
|
251
|
-
fellesfag: 'Fellesfag',
|
|
252
|
-
yrkesfag: 'Yrkesfag',
|
|
253
|
-
studiespesialiserende: 'Studieforberedende',
|
|
254
|
-
imported: 'Spolte fag',
|
|
255
|
-
heading: 'Hva lærer du?',
|
|
256
|
-
},
|
|
257
252
|
errorDescription: 'Beklager, en feil oppstod under lasting av fagene.',
|
|
258
253
|
film: {
|
|
259
254
|
header: 'NDLA film',
|
|
@@ -822,18 +817,6 @@ const messages = {
|
|
|
822
817
|
text: 'er utarbeidet av',
|
|
823
818
|
},
|
|
824
819
|
},
|
|
825
|
-
fagfornyelse: {
|
|
826
|
-
frontpage: {
|
|
827
|
-
heading: 'Velkommen til sniktitt på Fagfornyelsen i NDLA',
|
|
828
|
-
text: 'Høsten 2020 og 2021 vil de nye læreplanene tre i kraft. I NDLA har vi startet med dette arbeidet allerede. Våre innholdsansvarlige lager hver dag nye supre læringsressurser som er tilrettelagt for de nye planene. På denne siden kan du se dem allerede nå.',
|
|
829
|
-
blogHeading: 'Vil du vite mer?',
|
|
830
|
-
},
|
|
831
|
-
badge: {
|
|
832
|
-
heading: 'Denne siden er tilrettelagt for fagfornyelsen 2020/2021',
|
|
833
|
-
text: 'Innholdet er under arbeid. Ikke på jakt etter dette?',
|
|
834
|
-
linkText: 'Gå til ndla.no for dagens innhold',
|
|
835
|
-
},
|
|
836
|
-
},
|
|
837
820
|
frontPageToolbox: {
|
|
838
821
|
heading: 'Verktøykassa',
|
|
839
822
|
text: 'Har du lyst til å bli god til å presentere, eller vil du lære å studere smartere ved hjelp av riktig studieteknikk? Trenger du råd om hvordan du leser mest mulig effektivt til eksamen? I verktøykassa til NDLA finner du masse gode tips og råd!',
|
|
@@ -1005,14 +988,15 @@ const messages = {
|
|
|
1005
988
|
folders_plural: '{{count}} mapper',
|
|
1006
989
|
folder: {
|
|
1007
990
|
folder: 'Mappe',
|
|
1008
|
-
delete: 'Slett',
|
|
1009
|
-
edit: 'Rediger',
|
|
991
|
+
delete: 'Slett mappe',
|
|
992
|
+
edit: 'Rediger mappe',
|
|
1010
993
|
missingName: 'Skriv navn på mappe',
|
|
1011
994
|
folderDeleted: '"{{folderName}}" er slettet',
|
|
1012
995
|
},
|
|
1013
996
|
tags: '{{count}} emneknagg',
|
|
1014
997
|
tags_plural: '{{count}} emneknagger',
|
|
1015
|
-
confirmDeleteFolder:
|
|
998
|
+
confirmDeleteFolder:
|
|
999
|
+
'Er du sikker på at du vil slette mappen? Dersom mappen har undermapper vil disse også slettes. Handlingen kan ikke endres.',
|
|
1016
1000
|
confirmDeleteTag: 'Er du sikker på at du vil slette emneknagg? Denne handlingen kan ikke endres.',
|
|
1017
1001
|
myFolders: 'Mine mapper',
|
|
1018
1002
|
myTags: 'Mine emneknagger',
|
|
@@ -1034,6 +1018,9 @@ const messages = {
|
|
|
1034
1018
|
myPage: 'Min side',
|
|
1035
1019
|
deleteAccount: 'Slett Min NDLA',
|
|
1036
1020
|
logout: 'Logg ut av Min NDLA',
|
|
1021
|
+
loginText:
|
|
1022
|
+
'Logg på med Feide for å få tilgang til Min NDLA. Vi ber om at du ikke skriver noe støtende, personsensitiv informasjon eller andre persondata i tekstfelt. Les vår ',
|
|
1023
|
+
loginTextLink: 'personvernerklæring her',
|
|
1037
1024
|
loginTerms: 'Logg på med Feide for å få tilgang. Ved å logge på godkjenner du våre vilkår for bruk',
|
|
1038
1025
|
loginResourcePitch: 'Ønsker du å favorittmerke denne siden?',
|
|
1039
1026
|
loginWelcome: 'Velkommen til NDLA! Her kan du organisere fagstoffet på <i>din</i> måte!',
|
|
@@ -1073,7 +1060,7 @@ const messages = {
|
|
|
1073
1060
|
linkCopied: 'Kopiert til utklippstavle',
|
|
1074
1061
|
addToMyNdla: 'Legg i Min NDLA',
|
|
1075
1062
|
addedToMyNdla: 'Lagt i Min NDLA',
|
|
1076
|
-
addedToFolder: 'Ressurs er lagt i
|
|
1063
|
+
addedToFolder: 'Ressurs er lagt i ',
|
|
1077
1064
|
removedFromFolder: 'Fjernet fra "{{folderName}}"',
|
|
1078
1065
|
titleUpdated: 'Tittel oppdatert',
|
|
1079
1066
|
tagsUpdated: 'Emneknagger oppdatert',
|
|
@@ -19,6 +19,8 @@ const messages = {
|
|
|
19
19
|
edit: 'Endre mappenamn',
|
|
20
20
|
delete: 'Slett',
|
|
21
21
|
},
|
|
22
|
+
hideFolders: 'Skjul alle mapper',
|
|
23
|
+
showFolders: 'Vis alle mapper',
|
|
22
24
|
createFolder: 'Lag mappe',
|
|
23
25
|
maxFoldersAlreadyAdded: 'Maks nivå av undermapper nådd',
|
|
24
26
|
newFolder: {
|
|
@@ -247,13 +249,6 @@ const messages = {
|
|
|
247
249
|
name: 'Følg oss',
|
|
248
250
|
},
|
|
249
251
|
},
|
|
250
|
-
category: {
|
|
251
|
-
fellesfag: 'Fellesfag',
|
|
252
|
-
yrkesfag: 'Yrkesfag',
|
|
253
|
-
studiespesialiserende: 'Studieførebuande',
|
|
254
|
-
imported: 'Spolte fag',
|
|
255
|
-
heading: 'Kva lærer du?',
|
|
256
|
-
},
|
|
257
252
|
film: {
|
|
258
253
|
header: 'NDLA film',
|
|
259
254
|
text: 'NDLA film er ei teneste i samarbeid med Norgesfilm. Denne tenesta lar deg sjå ei rekkje spelefilmar, kortfilmar, dokumentarar og seriar. Du kan òg sjå undervisningsfilm og filmklipp. Velkomen inn i filmen si verd!',
|
|
@@ -823,18 +818,6 @@ const messages = {
|
|
|
823
818
|
text: 'er utarbeida av',
|
|
824
819
|
},
|
|
825
820
|
},
|
|
826
|
-
fagfornyelse: {
|
|
827
|
-
frontpage: {
|
|
828
|
-
heading: 'Velkommen til sniktitt på Fagfornyelsen i NDLA',
|
|
829
|
-
text: 'Hausten 2020 og 2021 vil dei nye læreplanane tre i kraft. I NDLA har vi starta dette arbeidet allereie. Dei innhaldsansvarlege i NDLA lagar kvar dag nye supre læringsressursar som er tilrettelagte for dei nye planane. På denne sida kan du sjå dei allereie nå.',
|
|
830
|
-
blogHeading: 'Vil du vite meir?',
|
|
831
|
-
},
|
|
832
|
-
badge: {
|
|
833
|
-
heading: 'Denne sida er tilrettelagt for fagfornyelsen 2020/2021',
|
|
834
|
-
text: 'Innhaldet er under arbeid. Ikkje på jakt etter dette?',
|
|
835
|
-
linkText: 'Gå til ndla.no for dagens innhald',
|
|
836
|
-
},
|
|
837
|
-
},
|
|
838
821
|
frontPageToolbox: {
|
|
839
822
|
heading: 'Verktøykassa',
|
|
840
823
|
text: 'Har du lyst til å bli god til å presentere, eller vil du lære å studere smartare ved hjelp av riktig studieteknikk? Treng du råd om korleis du les mest mogleg effektivt til eksamen? I verktøykassa til NDLA finn du masse gode tips og råd!',
|
|
@@ -1006,14 +989,15 @@ const messages = {
|
|
|
1006
989
|
folders_plural: '{{count}} mapper',
|
|
1007
990
|
folder: {
|
|
1008
991
|
folder: 'Mappe',
|
|
1009
|
-
delete: 'Slett',
|
|
1010
|
-
edit: 'Rediger',
|
|
992
|
+
delete: 'Slett mappe',
|
|
993
|
+
edit: 'Rediger mappe',
|
|
1011
994
|
missingName: 'Skriv namn på mappe',
|
|
1012
995
|
folderDeleted: '"{{folderName}}" er sletta',
|
|
1013
996
|
},
|
|
1014
997
|
tags: '{{count}} emneknagg',
|
|
1015
998
|
tags_plural: '{{count}} emneknaggar',
|
|
1016
|
-
confirmDeleteFolder:
|
|
999
|
+
confirmDeleteFolder:
|
|
1000
|
+
'Er du sikker på at du vil slette mappa? Dersom mappa har undermapper vil desse også slettast. Denne handlinga kan ikkje endrast.',
|
|
1017
1001
|
confirmDeleteTag: 'Er du sikker på at du vil slette tag? Denne handlinga kan ikkje endrast.',
|
|
1018
1002
|
myFolders: 'Mine mapper',
|
|
1019
1003
|
myTags: 'Emneknaggane mine',
|
|
@@ -1035,6 +1019,9 @@ const messages = {
|
|
|
1035
1019
|
myPage: 'Mi side',
|
|
1036
1020
|
deleteAccount: 'Slett Min NDLA',
|
|
1037
1021
|
logout: 'Logg ut av Min NDLA',
|
|
1022
|
+
loginText:
|
|
1023
|
+
'Logg på med Feide for å få tilgang til Min NDLA. Vi ber om at du ikkje skriv noko støtande, personsensitiv informasjon eller andre persondata i tekstfelt. Les vår ',
|
|
1024
|
+
loginTextLink: 'personvernerklæring her',
|
|
1038
1025
|
loginTerms: 'Logg på med Feide for å få tilgang. Ved å logge på godkjennar du våre vilkår for bruk',
|
|
1039
1026
|
loginResourcePitch: 'Ønsker du å favorittmerke denne sida?',
|
|
1040
1027
|
loginWelcome: 'Velkommen til NDLA! Her kan du organisere fagstoffet på <i>din</i> måte!',
|