@ndla/ui 26.1.0 → 27.0.1
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/Breadcrumb/ActionBreadcrumb.js +10 -5
- package/es/Breadcrumb/Breadcrumb.js +3 -4
- package/es/MyNdla/Resource/Folder.js +29 -13
- package/es/Resource/BlockResource.js +42 -62
- package/es/Resource/ListResource.js +41 -22
- package/es/Resource/resourceComponents.js +64 -38
- package/es/TreeStructure/ComboboxButton.js +162 -0
- package/es/TreeStructure/FolderItem.js +98 -78
- package/es/TreeStructure/FolderItems.js +25 -14
- package/es/TreeStructure/FolderNameInput.js +40 -33
- package/es/TreeStructure/NavigationLink.js +18 -10
- package/es/TreeStructure/TreeStructure.js +92 -165
- package/es/TreeStructure/arrowNavigation.js +3 -3
- package/es/TreeStructure/helperFunctions.js +3 -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/Breadcrumb/ActionBreadcrumb.js +8 -4
- package/lib/Breadcrumb/Breadcrumb.js +3 -5
- package/lib/MyNdla/Resource/Folder.js +34 -13
- package/lib/Resource/BlockResource.js +47 -62
- package/lib/Resource/ListResource.js +46 -22
- package/lib/Resource/resourceComponents.d.ts +6 -1
- package/lib/Resource/resourceComponents.js +64 -37
- package/lib/TreeStructure/ComboboxButton.d.ts +28 -0
- package/lib/TreeStructure/ComboboxButton.js +176 -0
- package/lib/TreeStructure/FolderItem.d.ts +1 -1
- package/lib/TreeStructure/FolderItem.js +99 -77
- package/lib/TreeStructure/FolderItems.d.ts +4 -2
- package/lib/TreeStructure/FolderItems.js +26 -14
- package/lib/TreeStructure/FolderNameInput.d.ts +3 -1
- package/lib/TreeStructure/FolderNameInput.js +41 -32
- package/lib/TreeStructure/NavigationLink.d.ts +1 -1
- package/lib/TreeStructure/NavigationLink.js +18 -10
- package/lib/TreeStructure/TreeStructure.d.ts +2 -2
- package/lib/TreeStructure/TreeStructure.js +92 -165
- package/lib/TreeStructure/arrowNavigation.d.ts +2 -1
- package/lib/TreeStructure/arrowNavigation.js +3 -3
- package/lib/TreeStructure/helperFunctions.d.ts +2 -1
- package/lib/TreeStructure/helperFunctions.js +8 -2
- package/lib/TreeStructure/types.d.ts +6 -7
- package/lib/locale/messages-en.d.ts +5 -0
- package/lib/locale/messages-en.js +6 -1
- package/lib/locale/messages-nb.d.ts +5 -0
- package/lib/locale/messages-nb.js +6 -1
- package/lib/locale/messages-nn.d.ts +5 -0
- package/lib/locale/messages-nn.js +6 -1
- package/lib/locale/messages-se.d.ts +5 -0
- package/lib/locale/messages-se.js +6 -1
- package/lib/locale/messages-sma.d.ts +5 -0
- package/lib/locale/messages-sma.js +6 -1
- package/package.json +11 -11
- package/src/Breadcrumb/ActionBreadcrumb.tsx +9 -3
- package/src/Breadcrumb/Breadcrumb.tsx +1 -2
- package/src/MyNdla/Resource/Folder.tsx +19 -4
- package/src/Resource/BlockResource.tsx +41 -33
- package/src/Resource/ListResource.tsx +35 -29
- package/src/Resource/resourceComponents.tsx +60 -26
- package/src/TreeStructure/ComboboxButton.tsx +189 -0
- package/src/TreeStructure/FolderItem.tsx +89 -70
- package/src/TreeStructure/FolderItems.tsx +36 -16
- package/src/TreeStructure/FolderNameInput.tsx +43 -18
- package/src/TreeStructure/NavigationLink.tsx +17 -10
- package/src/TreeStructure/TreeStructure.tsx +63 -139
- package/src/TreeStructure/arrowNavigation.ts +7 -6
- package/src/TreeStructure/helperFunctions.ts +5 -1
- package/src/TreeStructure/types.ts +6 -7
- package/src/locale/messages-en.ts +6 -0
- package/src/locale/messages-nb.ts +5 -0
- package/src/locale/messages-nn.ts +5 -0
- package/src/locale/messages-se.ts +6 -0
- package/src/locale/messages-sma.ts +6 -0
- package/src/.DS_Store +0 -0
|
@@ -6,4 +6,5 @@
|
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
8
|
import { KeyboardEvent } from 'react';
|
|
9
|
-
|
|
9
|
+
import { FolderType } from './types';
|
|
10
|
+
export declare const arrowNavigation: (e: KeyboardEvent<HTMLElement>, id: string, visibleFolders: FolderType[], setFocusedFolderId: (id: FolderType) => void, onOpen: (id: string) => void, onClose: (id: string) => void) => void;
|
|
@@ -13,8 +13,8 @@ exports.arrowNavigation = void 0;
|
|
|
13
13
|
*
|
|
14
14
|
*/
|
|
15
15
|
var navigateVertical = function navigateVertical(visibleFolders, folderId, setFocusedFolderId, direction) {
|
|
16
|
-
var currentIndex = visibleFolders.findIndex(function (
|
|
17
|
-
return id === folderId;
|
|
16
|
+
var currentIndex = visibleFolders.findIndex(function (folder) {
|
|
17
|
+
return folder.id === folderId;
|
|
18
18
|
});
|
|
19
19
|
var target = visibleFolders[currentIndex + direction];
|
|
20
20
|
|
|
@@ -23,7 +23,7 @@ var navigateVertical = function navigateVertical(visibleFolders, folderId, setFo
|
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
var arrowKeys = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'];
|
|
26
|
+
var arrowKeys = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter'];
|
|
27
27
|
|
|
28
28
|
var arrowNavigation = function arrowNavigation(e, id, visibleFolders, setFocusedFolderId, onOpen, onClose) {
|
|
29
29
|
if (!arrowKeys.includes(e.key)) {
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import { FolderType } from './types';
|
|
1
|
+
import { FolderType, TreeStructureType } from './types';
|
|
2
2
|
export declare const flattenFolders: (folders: FolderType[], openFolders?: string[] | undefined) => FolderType[];
|
|
3
|
+
export declare const treestructureId: (type: TreeStructureType, modifier: string) => string;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.flattenFolders = void 0;
|
|
6
|
+
exports.treestructureId = exports.flattenFolders = void 0;
|
|
7
7
|
|
|
8
8
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
9
9
|
|
|
@@ -35,4 +35,10 @@ var flattenFolders = function flattenFolders(folders, openFolders) {
|
|
|
35
35
|
}, []);
|
|
36
36
|
};
|
|
37
37
|
|
|
38
|
-
exports.flattenFolders = flattenFolders;
|
|
38
|
+
exports.flattenFolders = flattenFolders;
|
|
39
|
+
|
|
40
|
+
var treestructureId = function treestructureId(type, modifier) {
|
|
41
|
+
return "".concat(type, "-treestructure-").concat(modifier);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
exports.treestructureId = treestructureId;
|
|
@@ -12,26 +12,25 @@ export interface FolderType extends IFolder {
|
|
|
12
12
|
icon?: ReactNode;
|
|
13
13
|
isNavigation?: boolean;
|
|
14
14
|
}
|
|
15
|
-
export declare type TreeStructureType = '
|
|
15
|
+
export declare type TreeStructureType = 'navigation' | 'picker';
|
|
16
16
|
export interface TreeStructureMenuProps extends Omit<MenuItemProps, 'onClick'> {
|
|
17
17
|
onClick: (e: MouseEvent<HTMLDivElement> | undefined, folder: FolderType) => void;
|
|
18
18
|
}
|
|
19
19
|
export interface CommonTreeStructureProps {
|
|
20
20
|
loading?: boolean;
|
|
21
21
|
onSelectFolder?: (id: string) => void;
|
|
22
|
-
openOnFolderClick?: boolean;
|
|
23
22
|
targetResource?: IResource;
|
|
24
|
-
framed?: boolean;
|
|
25
23
|
type: TreeStructureType;
|
|
26
24
|
}
|
|
27
25
|
export interface CommonFolderItemsProps extends CommonTreeStructureProps {
|
|
28
|
-
|
|
26
|
+
focusedFolder?: FolderType;
|
|
29
27
|
level: number;
|
|
30
28
|
maxLevel: number;
|
|
31
29
|
selectedFolder?: FolderType;
|
|
32
30
|
onCloseFolder: (id: string) => void;
|
|
33
31
|
onOpenFolder: (id: string) => void;
|
|
34
|
-
|
|
35
|
-
setSelectedFolder: (
|
|
36
|
-
visibleFolders:
|
|
32
|
+
setFocusedFolder: (folder: FolderType, focus?: boolean) => void;
|
|
33
|
+
setSelectedFolder: (folder: FolderType) => void;
|
|
34
|
+
visibleFolders: FolderType[];
|
|
35
|
+
closeTree: () => void;
|
|
37
36
|
}
|
|
@@ -69,8 +69,11 @@ declare const messages: {
|
|
|
69
69
|
folderDeleted: string;
|
|
70
70
|
folderCreated: string;
|
|
71
71
|
};
|
|
72
|
+
tagList: string;
|
|
72
73
|
tags: string;
|
|
73
74
|
tags_plural: string;
|
|
75
|
+
moreTags: string;
|
|
76
|
+
moreTags_plural: string;
|
|
74
77
|
confirmDeleteFolder: string;
|
|
75
78
|
confirmDeleteTag: string;
|
|
76
79
|
myFolders: string;
|
|
@@ -177,6 +180,7 @@ declare const messages: {
|
|
|
177
180
|
newFolder: {
|
|
178
181
|
placeholder: string;
|
|
179
182
|
defaultName: string;
|
|
183
|
+
folderName: string;
|
|
180
184
|
};
|
|
181
185
|
};
|
|
182
186
|
tagSelector: {
|
|
@@ -991,6 +995,7 @@ declare const messages: {
|
|
|
991
995
|
};
|
|
992
996
|
cancel: string;
|
|
993
997
|
close: string;
|
|
998
|
+
loading: string;
|
|
994
999
|
title: string;
|
|
995
1000
|
save: string;
|
|
996
1001
|
image: {
|
|
@@ -39,7 +39,8 @@ var messages = _objectSpread(_objectSpread({
|
|
|
39
39
|
maxFoldersAlreadyAdded: 'Maximum subfolders reached',
|
|
40
40
|
newFolder: {
|
|
41
41
|
placeholder: 'Add foldername',
|
|
42
|
-
defaultName: 'New folder'
|
|
42
|
+
defaultName: 'New folder',
|
|
43
|
+
folderName: 'Folder name'
|
|
43
44
|
}
|
|
44
45
|
},
|
|
45
46
|
tagSelector: {
|
|
@@ -820,6 +821,7 @@ var messages = _objectSpread(_objectSpread({
|
|
|
820
821
|
},
|
|
821
822
|
cancel: 'Cancel',
|
|
822
823
|
close: 'Close',
|
|
824
|
+
loading: 'Loading',
|
|
823
825
|
title: 'Title',
|
|
824
826
|
save: 'Save',
|
|
825
827
|
image: {
|
|
@@ -959,8 +961,11 @@ var messages = _objectSpread(_objectSpread({
|
|
|
959
961
|
folderDeleted: '"{{folderName}}" deleted',
|
|
960
962
|
folderCreated: '"{{folderName}} created'
|
|
961
963
|
},
|
|
964
|
+
tagList: 'Tags',
|
|
962
965
|
tags: '{{count}} tag',
|
|
963
966
|
tags_plural: '{{count}} tags',
|
|
967
|
+
moreTags: 'Show one more tag',
|
|
968
|
+
moreTags_plural: 'Show {{count}} more tags',
|
|
964
969
|
confirmDeleteFolder: 'Are you sure you want to delete this folder? Subfolders of this folder will also be deleted. This action cannot be undone.',
|
|
965
970
|
confirmDeleteTag: 'Are you sure you want to delete this tag? This process cannot be undone.',
|
|
966
971
|
myFolders: 'My folders',
|
|
@@ -69,8 +69,11 @@ declare const messages: {
|
|
|
69
69
|
folderDeleted: string;
|
|
70
70
|
folderCreated: string;
|
|
71
71
|
};
|
|
72
|
+
tagList: string;
|
|
72
73
|
tags: string;
|
|
73
74
|
tags_plural: string;
|
|
75
|
+
moreTags: string;
|
|
76
|
+
moreTags_plural: string;
|
|
74
77
|
confirmDeleteFolder: string;
|
|
75
78
|
confirmDeleteTag: string;
|
|
76
79
|
myFolders: string;
|
|
@@ -177,6 +180,7 @@ declare const messages: {
|
|
|
177
180
|
newFolder: {
|
|
178
181
|
placeholder: string;
|
|
179
182
|
defaultName: string;
|
|
183
|
+
folderName: string;
|
|
180
184
|
};
|
|
181
185
|
};
|
|
182
186
|
tagSelector: {
|
|
@@ -990,6 +994,7 @@ declare const messages: {
|
|
|
990
994
|
close: string;
|
|
991
995
|
};
|
|
992
996
|
close: string;
|
|
997
|
+
loading: string;
|
|
993
998
|
title: string;
|
|
994
999
|
cancel: string;
|
|
995
1000
|
save: string;
|
|
@@ -39,7 +39,8 @@ var messages = _objectSpread(_objectSpread({
|
|
|
39
39
|
maxFoldersAlreadyAdded: 'Maks nivå av undermapper nådd',
|
|
40
40
|
newFolder: {
|
|
41
41
|
placeholder: 'Skriv navn på mappe',
|
|
42
|
-
defaultName: 'Ny mappe'
|
|
42
|
+
defaultName: 'Ny mappe',
|
|
43
|
+
folderName: 'Mappenavn'
|
|
43
44
|
}
|
|
44
45
|
},
|
|
45
46
|
tagSelector: {
|
|
@@ -819,6 +820,7 @@ var messages = _objectSpread(_objectSpread({
|
|
|
819
820
|
close: 'Lukk meny'
|
|
820
821
|
},
|
|
821
822
|
close: 'Lukk',
|
|
823
|
+
loading: 'Laster',
|
|
822
824
|
title: 'Tittel',
|
|
823
825
|
cancel: 'Avbryt',
|
|
824
826
|
save: 'Lagre',
|
|
@@ -959,8 +961,11 @@ var messages = _objectSpread(_objectSpread({
|
|
|
959
961
|
folderDeleted: '"{{folderName}}" er slettet',
|
|
960
962
|
folderCreated: '"{{folderName}}" er opprettet'
|
|
961
963
|
},
|
|
964
|
+
tagList: 'Emneknagger',
|
|
962
965
|
tags: '{{count}} emneknagg',
|
|
963
966
|
tags_plural: '{{count}} emneknagger',
|
|
967
|
+
moreTags: 'Vis en emneknagg til',
|
|
968
|
+
moreTags_plural: 'Vis {{count}} emneknagger til',
|
|
964
969
|
confirmDeleteFolder: 'Er du sikker på at du vil slette mappen? Dersom mappen har undermapper vil disse også slettes. Handlingen kan ikke endres.',
|
|
965
970
|
confirmDeleteTag: 'Er du sikker på at du vil slette emneknagg? Denne handlingen kan ikke endres.',
|
|
966
971
|
myFolders: 'Mine mapper',
|
|
@@ -69,8 +69,11 @@ declare const messages: {
|
|
|
69
69
|
folderDeleted: string;
|
|
70
70
|
folderCreated: string;
|
|
71
71
|
};
|
|
72
|
+
tagList: string;
|
|
72
73
|
tags: string;
|
|
73
74
|
tags_plural: string;
|
|
75
|
+
moreTags: string;
|
|
76
|
+
moreTags_plural: string;
|
|
74
77
|
confirmDeleteFolder: string;
|
|
75
78
|
confirmDeleteTag: string;
|
|
76
79
|
myFolders: string;
|
|
@@ -177,6 +180,7 @@ declare const messages: {
|
|
|
177
180
|
newFolder: {
|
|
178
181
|
placeholder: string;
|
|
179
182
|
defaultName: string;
|
|
183
|
+
folderName: string;
|
|
180
184
|
};
|
|
181
185
|
};
|
|
182
186
|
tagSelector: {
|
|
@@ -991,6 +995,7 @@ declare const messages: {
|
|
|
991
995
|
};
|
|
992
996
|
cancel: string;
|
|
993
997
|
close: string;
|
|
998
|
+
loading: string;
|
|
994
999
|
title: string;
|
|
995
1000
|
save: string;
|
|
996
1001
|
image: {
|
|
@@ -39,7 +39,8 @@ var messages = _objectSpread(_objectSpread({
|
|
|
39
39
|
maxFoldersAlreadyAdded: 'Maks nivå av undermapper nådd',
|
|
40
40
|
newFolder: {
|
|
41
41
|
placeholder: 'Skriv namn på mappe',
|
|
42
|
-
defaultName: 'Ny mappe'
|
|
42
|
+
defaultName: 'Ny mappe',
|
|
43
|
+
folderName: 'Mappenavn'
|
|
43
44
|
}
|
|
44
45
|
},
|
|
45
46
|
tagSelector: {
|
|
@@ -820,6 +821,7 @@ var messages = _objectSpread(_objectSpread({
|
|
|
820
821
|
},
|
|
821
822
|
cancel: 'Avbryt',
|
|
822
823
|
close: 'Lukk',
|
|
824
|
+
loading: 'Laster',
|
|
823
825
|
title: 'Tittel',
|
|
824
826
|
save: 'Lagre',
|
|
825
827
|
image: {
|
|
@@ -959,8 +961,11 @@ var messages = _objectSpread(_objectSpread({
|
|
|
959
961
|
folderDeleted: '"{{folderName}}" er sletta',
|
|
960
962
|
folderCreated: '"{{folderName}}" er oppretta'
|
|
961
963
|
},
|
|
964
|
+
tagList: 'Emneknaggar',
|
|
962
965
|
tags: '{{count}} emneknagg',
|
|
963
966
|
tags_plural: '{{count}} emneknaggar',
|
|
967
|
+
moreTags: 'Vis ein emneknagg til',
|
|
968
|
+
moreTags_plural: 'Vis {{count}} emneknaggar til',
|
|
964
969
|
confirmDeleteFolder: 'Er du sikker på at du vil slette mappa? Dersom mappa har undermapper vil desse også slettast. Denne handlinga kan ikkje endrast.',
|
|
965
970
|
confirmDeleteTag: 'Er du sikker på at du vil slette tag? Denne handlinga kan ikkje endrast.',
|
|
966
971
|
myFolders: 'Mine mapper',
|
|
@@ -69,8 +69,11 @@ declare const messages: {
|
|
|
69
69
|
folderDeleted: string;
|
|
70
70
|
folderCreated: string;
|
|
71
71
|
};
|
|
72
|
+
tagList: string;
|
|
72
73
|
tags: string;
|
|
73
74
|
tags_plural: string;
|
|
75
|
+
moreTags: string;
|
|
76
|
+
moreTags_plural: string;
|
|
74
77
|
confirmDeleteFolder: string;
|
|
75
78
|
confirmDeleteTag: string;
|
|
76
79
|
myFolders: string;
|
|
@@ -177,6 +180,7 @@ declare const messages: {
|
|
|
177
180
|
newFolder: {
|
|
178
181
|
placeholder: string;
|
|
179
182
|
defaultName: string;
|
|
183
|
+
folderName: string;
|
|
180
184
|
};
|
|
181
185
|
};
|
|
182
186
|
tagSelector: {
|
|
@@ -990,6 +994,7 @@ declare const messages: {
|
|
|
990
994
|
close: string;
|
|
991
995
|
};
|
|
992
996
|
close: string;
|
|
997
|
+
loading: string;
|
|
993
998
|
title: string;
|
|
994
999
|
cancel: string;
|
|
995
1000
|
save: string;
|
|
@@ -39,7 +39,8 @@ var messages = _objectSpread(_objectSpread({
|
|
|
39
39
|
maxFoldersAlreadyAdded: 'Vuollemáhpaid badjerádji lea olahuvvon',
|
|
40
40
|
newFolder: {
|
|
41
41
|
placeholder: 'Čále nama máhppii',
|
|
42
|
-
defaultName: 'Ođđa máhppa'
|
|
42
|
+
defaultName: 'Ođđa máhppa',
|
|
43
|
+
folderName: 'Mappenavn'
|
|
43
44
|
}
|
|
44
45
|
},
|
|
45
46
|
tagSelector: {
|
|
@@ -819,6 +820,7 @@ var messages = _objectSpread(_objectSpread({
|
|
|
819
820
|
close: 'Govčča fálu'
|
|
820
821
|
},
|
|
821
822
|
close: 'Govčča',
|
|
823
|
+
loading: 'Laster',
|
|
822
824
|
title: 'Tihttel',
|
|
823
825
|
cancel: 'Botkke',
|
|
824
826
|
save: 'Vurke',
|
|
@@ -959,8 +961,11 @@ var messages = _objectSpread(_objectSpread({
|
|
|
959
961
|
folderDeleted: '"{{folderName}}" lea sihkkojuvvon',
|
|
960
962
|
folderCreated: '"{{folderName}}" er oppretta'
|
|
961
963
|
},
|
|
964
|
+
tagList: 'Emneknagger',
|
|
962
965
|
tags: '{{count}} fáddágilkor',
|
|
963
966
|
tags_plural: '{{count}} fáddágilkorat',
|
|
967
|
+
moreTags: 'Vis ein emneknagg til',
|
|
968
|
+
moreTags_plural: 'Vis {{count}} emneknaggar til',
|
|
964
969
|
confirmDeleteFolder: 'Leat go áibbas sihkar ahte dáhtut sihkkut máhpa? Dan ii sáhte gáhtat.',
|
|
965
970
|
confirmDeleteTag: 'Leat go áibbas sihkar ahte dáhtut sihkkut fáddágilkora? Dan ii sáhte gáhtat.',
|
|
966
971
|
myFolders: 'Mu máhpat',
|
|
@@ -69,8 +69,11 @@ declare const messages: {
|
|
|
69
69
|
folderDeleted: string;
|
|
70
70
|
folderCreated: string;
|
|
71
71
|
};
|
|
72
|
+
tagList: string;
|
|
72
73
|
tags: string;
|
|
73
74
|
tags_plural: string;
|
|
75
|
+
moreTags: string;
|
|
76
|
+
moreTags_plural: string;
|
|
74
77
|
confirmDeleteFolder: string;
|
|
75
78
|
confirmDeleteTag: string;
|
|
76
79
|
myFolders: string;
|
|
@@ -177,6 +180,7 @@ declare const messages: {
|
|
|
177
180
|
newFolder: {
|
|
178
181
|
placeholder: string;
|
|
179
182
|
defaultName: string;
|
|
183
|
+
folderName: string;
|
|
180
184
|
};
|
|
181
185
|
};
|
|
182
186
|
tagSelector: {
|
|
@@ -990,6 +994,7 @@ declare const messages: {
|
|
|
990
994
|
close: string;
|
|
991
995
|
};
|
|
992
996
|
close: string;
|
|
997
|
+
loading: string;
|
|
993
998
|
title: string;
|
|
994
999
|
cancel: string;
|
|
995
1000
|
save: string;
|
|
@@ -39,7 +39,8 @@ var messages = _objectSpread(_objectSpread({
|
|
|
39
39
|
maxFoldersAlreadyAdded: 'Maks nivå av undermapper nådd',
|
|
40
40
|
newFolder: {
|
|
41
41
|
placeholder: 'Skriv navn på mappe',
|
|
42
|
-
defaultName: 'Ny mappe'
|
|
42
|
+
defaultName: 'Ny mappe',
|
|
43
|
+
folderName: 'Mappenavn'
|
|
43
44
|
}
|
|
44
45
|
},
|
|
45
46
|
tagSelector: {
|
|
@@ -819,6 +820,7 @@ var messages = _objectSpread(_objectSpread({
|
|
|
819
820
|
close: 'Lukk meny'
|
|
820
821
|
},
|
|
821
822
|
close: 'Lukk',
|
|
823
|
+
loading: 'Laster',
|
|
822
824
|
title: 'Tittel',
|
|
823
825
|
cancel: 'Avbryt',
|
|
824
826
|
save: 'Lagre',
|
|
@@ -959,8 +961,11 @@ var messages = _objectSpread(_objectSpread({
|
|
|
959
961
|
folderDeleted: '"{{folderName}}" er slettet',
|
|
960
962
|
folderCreated: '"{{folderName}}" er oppretta'
|
|
961
963
|
},
|
|
964
|
+
tagList: 'Emneknagg',
|
|
962
965
|
tags: '{{count}} emneknagg',
|
|
963
966
|
tags_plural: '{{count}} emneknagger',
|
|
967
|
+
moreTags: 'Vis ein emneknagg til',
|
|
968
|
+
moreTags_plural: 'Vis {{count}} emneknaggar til',
|
|
964
969
|
confirmDeleteFolder: 'Er du sikker på at du vil slette mappa? Dersom mappa har undermappar vil disse også slettes. Denne handlinga kan ikkje endrast.',
|
|
965
970
|
confirmDeleteTag: 'Er du sikker på at du vil slette emneknagg? Denne handlingen kan ikke endres.',
|
|
966
971
|
myFolders: 'Mine mapper',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ndla/ui",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "27.0.1",
|
|
4
4
|
"description": "UI component library for NDLA.",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -32,18 +32,18 @@
|
|
|
32
32
|
],
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@ndla/article-scripts": "^3.0.2",
|
|
35
|
-
"@ndla/button": "^3.5.
|
|
36
|
-
"@ndla/carousel": "^1.2.
|
|
35
|
+
"@ndla/button": "^3.5.2",
|
|
36
|
+
"@ndla/carousel": "^1.2.23",
|
|
37
37
|
"@ndla/core": "^2.3.5",
|
|
38
|
-
"@ndla/forms": "^3.3.
|
|
38
|
+
"@ndla/forms": "^3.3.2",
|
|
39
39
|
"@ndla/hooks": "^1.1.6",
|
|
40
|
-
"@ndla/icons": "^1.
|
|
41
|
-
"@ndla/licenses": "^5.0.
|
|
42
|
-
"@ndla/modal": "^1.3.
|
|
43
|
-
"@ndla/notion": "^3.1.
|
|
44
|
-
"@ndla/safelink": "^2.2.
|
|
40
|
+
"@ndla/icons": "^1.13.0",
|
|
41
|
+
"@ndla/licenses": "^5.0.17",
|
|
42
|
+
"@ndla/modal": "^1.3.7",
|
|
43
|
+
"@ndla/notion": "^3.1.42",
|
|
44
|
+
"@ndla/safelink": "^2.2.16",
|
|
45
45
|
"@ndla/switch": "^0.1.13",
|
|
46
|
-
"@ndla/tabs": "^1.1.
|
|
46
|
+
"@ndla/tabs": "^1.1.22",
|
|
47
47
|
"@ndla/tooltip": "^2.2.1",
|
|
48
48
|
"@ndla/types-learningpath-api": "^0.0.13",
|
|
49
49
|
"@ndla/util": "^3.1.0",
|
|
@@ -85,5 +85,5 @@
|
|
|
85
85
|
"publishConfig": {
|
|
86
86
|
"access": "public"
|
|
87
87
|
},
|
|
88
|
-
"gitHead": "
|
|
88
|
+
"gitHead": "7a987443015049a36da7aa5af3288378488696ff"
|
|
89
89
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import styled from '@emotion/styled';
|
|
10
|
-
import { colors, fonts, spacing } from '@ndla/core';
|
|
10
|
+
import { colors, fonts, misc, spacing } from '@ndla/core';
|
|
11
11
|
import { ChevronRight } from '@ndla/icons/common';
|
|
12
12
|
import SafeLink from '@ndla/safelink';
|
|
13
13
|
import React from 'react';
|
|
@@ -30,12 +30,18 @@ const StyledSpan = styled.span`
|
|
|
30
30
|
const StyledSafeLink = styled(SafeLink)`
|
|
31
31
|
color: ${colors.text.primary};
|
|
32
32
|
box-shadow: none;
|
|
33
|
+
margin: 0 2px;
|
|
33
34
|
font-weight: ${fonts.weight.bold};
|
|
34
35
|
:hover {
|
|
35
36
|
color: ${colors.brand.primary};
|
|
36
37
|
}
|
|
37
38
|
`;
|
|
38
39
|
|
|
40
|
+
const StyledMenuButton = styled(MenuButton)`
|
|
41
|
+
border-radius: ${misc.borderRadius};
|
|
42
|
+
margin: 0 2px;
|
|
43
|
+
`;
|
|
44
|
+
|
|
39
45
|
interface Props {
|
|
40
46
|
items: SimpleBreadcrumbItem[];
|
|
41
47
|
actionItems: MenuItemProps[];
|
|
@@ -48,9 +54,9 @@ const ActionBreadcrumb = ({ items, actionItems }: Props) => {
|
|
|
48
54
|
}
|
|
49
55
|
if (item.index === totalCount - 1 && actionItems.length > 0) {
|
|
50
56
|
return (
|
|
51
|
-
<
|
|
57
|
+
<StyledMenuButton menuItems={actionItems} size="small">
|
|
52
58
|
<StyledSpan title={item.name}>{item.name}</StyledSpan>
|
|
53
|
-
</
|
|
59
|
+
</StyledMenuButton>
|
|
54
60
|
);
|
|
55
61
|
}
|
|
56
62
|
return (
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
|
|
9
9
|
import React, { ReactNode, useRef } from 'react';
|
|
10
10
|
import { useComponentSize, useIsomorphicLayoutEffect } from '@ndla/hooks';
|
|
11
|
-
import { uuid } from '@ndla/util';
|
|
12
11
|
import styled from '@emotion/styled';
|
|
13
12
|
import { useTranslation } from 'react-i18next';
|
|
14
13
|
import BreadcrumbItem, { IndexedBreadcrumbItem, SimpleBreadcrumbItem } from './BreadcrumbItem';
|
|
@@ -83,7 +82,7 @@ const Breadcrumb = ({
|
|
|
83
82
|
? breadcrumbItemRefs.delete(item.to)
|
|
84
83
|
: breadcrumbItemRefs.set(item.to, element)
|
|
85
84
|
}
|
|
86
|
-
key={
|
|
85
|
+
key={typeof item.to === 'string' ? item.to : item.to.pathname}
|
|
87
86
|
totalCount={items.length}
|
|
88
87
|
item={{ ...item, index }}
|
|
89
88
|
/>
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import styled from '@emotion/styled';
|
|
10
|
-
import React from 'react';
|
|
10
|
+
import React, { useRef } from 'react';
|
|
11
11
|
import { FolderOutlined } from '@ndla/icons/contentType';
|
|
12
12
|
import { FileDocumentOutline } from '@ndla/icons/common';
|
|
13
13
|
import { fonts, spacing, colors, mq, breakpoints } from '@ndla/core';
|
|
@@ -40,6 +40,12 @@ const FolderIconWrapper = styled.div<FolderIconWrapperProps>`
|
|
|
40
40
|
`};
|
|
41
41
|
`;
|
|
42
42
|
|
|
43
|
+
const FolderTitleLink = styled(SafeLink)`
|
|
44
|
+
box-shadow: none;
|
|
45
|
+
color: ${colors.text.primary};
|
|
46
|
+
flex: 1;
|
|
47
|
+
`;
|
|
48
|
+
|
|
43
49
|
const FolderTitle = styled.h2`
|
|
44
50
|
${fonts.sizes(18)};
|
|
45
51
|
font-weight: ${fonts.weight.normal};
|
|
@@ -55,11 +61,12 @@ const FolderTitle = styled.h2`
|
|
|
55
61
|
-webkit-box-orient: vertical;
|
|
56
62
|
`;
|
|
57
63
|
|
|
58
|
-
const FolderWrapper = styled
|
|
64
|
+
const FolderWrapper = styled.div`
|
|
59
65
|
display: flex;
|
|
60
66
|
align-items: center;
|
|
61
67
|
padding: ${spacing.small};
|
|
62
68
|
border: 1px solid ${colors.brand.neutral7};
|
|
69
|
+
cursor: pointer;
|
|
63
70
|
border-radius: 2px;
|
|
64
71
|
box-shadow: none;
|
|
65
72
|
text-decoration: none;
|
|
@@ -134,12 +141,20 @@ type LayoutType = 'list' | 'block';
|
|
|
134
141
|
|
|
135
142
|
const Folder = ({ id, link, title, subFolders, subResources, type = 'list', menuItems }: Props) => {
|
|
136
143
|
const { t } = useTranslation();
|
|
144
|
+
const linkRef = useRef<HTMLAnchorElement | null>(null);
|
|
145
|
+
|
|
146
|
+
const onClick = () => {
|
|
147
|
+
linkRef?.current?.click();
|
|
148
|
+
};
|
|
149
|
+
|
|
137
150
|
return (
|
|
138
|
-
<FolderWrapper
|
|
151
|
+
<FolderWrapper onClick={onClick} id={id}>
|
|
139
152
|
<FolderIconWrapper type={type}>
|
|
140
153
|
<FolderOutlined aria-label={t('myNdla.folder.folder')} />
|
|
141
154
|
</FolderIconWrapper>
|
|
142
|
-
<
|
|
155
|
+
<FolderTitleLink to={link} ref={linkRef}>
|
|
156
|
+
<FolderTitle>{title}</FolderTitle>
|
|
157
|
+
</FolderTitleLink>
|
|
143
158
|
<IconCount layoutType={type} type={'folder'} count={subFolders} />
|
|
144
159
|
<IconCount layoutType={type} type={'resource'} count={subResources} />
|
|
145
160
|
{menuItems && menuItems.length > 0 && <MenuButton alignRight size="small" menuItems={menuItems} />}
|
|
@@ -7,12 +7,19 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import styled from '@emotion/styled';
|
|
10
|
-
import React from 'react';
|
|
11
|
-
import SafeLink from '@ndla/safelink';
|
|
10
|
+
import React, { useRef } from 'react';
|
|
12
11
|
import { colors, fonts, spacing } from '@ndla/core';
|
|
13
12
|
import { MenuButton, MenuItemProps } from '@ndla/button';
|
|
14
13
|
import Image from '../Image';
|
|
15
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
CompressedTagList,
|
|
16
|
+
ResourceImageProps,
|
|
17
|
+
ResourceTitle,
|
|
18
|
+
Row,
|
|
19
|
+
TopicList,
|
|
20
|
+
ResourceTitleLink,
|
|
21
|
+
LoaderProps,
|
|
22
|
+
} from './resourceComponents';
|
|
16
23
|
import ContentLoader from '../ContentLoader';
|
|
17
24
|
|
|
18
25
|
interface BlockResourceProps {
|
|
@@ -28,7 +35,7 @@ interface BlockResourceProps {
|
|
|
28
35
|
isLoading?: boolean;
|
|
29
36
|
}
|
|
30
37
|
|
|
31
|
-
const BlockElementWrapper = styled
|
|
38
|
+
const BlockElementWrapper = styled.div`
|
|
32
39
|
display: flex;
|
|
33
40
|
text-decoration: none;
|
|
34
41
|
box-shadow: none;
|
|
@@ -38,6 +45,16 @@ const BlockElementWrapper = styled(SafeLink)`
|
|
|
38
45
|
border: 1px solid ${colors.brand.light};
|
|
39
46
|
border-radius: 2px;
|
|
40
47
|
color: ${colors.brand.greyDark};
|
|
48
|
+
cursor: pointer;
|
|
49
|
+
|
|
50
|
+
&:hover {
|
|
51
|
+
box-shadow: 1px 1px 6px 2px rgba(9, 55, 101, 0.08);
|
|
52
|
+
transition-duration: 0.2s;
|
|
53
|
+
${() => ResourceTitleLink} {
|
|
54
|
+
color: ${colors.brand.primary};
|
|
55
|
+
text-decoration: underline;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
41
58
|
`;
|
|
42
59
|
|
|
43
60
|
const BlockDescription = styled.p`
|
|
@@ -49,7 +66,8 @@ const BlockDescription = styled.p`
|
|
|
49
66
|
overflow: hidden;
|
|
50
67
|
text-overflow: ellipsis;
|
|
51
68
|
transition: height 0.2s ease-out;
|
|
52
|
-
${() => BlockElementWrapper}:hover &, ${() => BlockElementWrapper}:focus & {
|
|
69
|
+
${() => BlockElementWrapper}:hover &, ${() => BlockElementWrapper}:focus & , ${() =>
|
|
70
|
+
BlockElementWrapper}:focus-within & {
|
|
53
71
|
// Unfortunate css needed for multi-line text overflow ellipsis.
|
|
54
72
|
height: 3.1em;
|
|
55
73
|
-webkit-line-clamp: 2;
|
|
@@ -60,6 +78,7 @@ const BlockDescription = styled.p`
|
|
|
60
78
|
|
|
61
79
|
const RightRow = styled(Row)`
|
|
62
80
|
justify-content: flex-end;
|
|
81
|
+
margin-bottom: -${spacing.xxsmall};
|
|
63
82
|
`;
|
|
64
83
|
|
|
65
84
|
const BlockInfoWrapper = styled.div`
|
|
@@ -98,28 +117,7 @@ const BlockImage = ({ image, loading }: BlockImageProps) => {
|
|
|
98
117
|
return <Image alt={image.alt} src={image.src} fallbackWidth={300} />;
|
|
99
118
|
};
|
|
100
119
|
|
|
101
|
-
|
|
102
|
-
title: string;
|
|
103
|
-
loading?: boolean;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const BlockTitle = ({ title, loading }: BlockTitleProps) => {
|
|
107
|
-
if (loading) {
|
|
108
|
-
return (
|
|
109
|
-
<ContentLoader height={'18px'} width={'100%'} viewBox={null} preserveAspectRatio="none">
|
|
110
|
-
<rect x="0" y="0" rx="3" ry="3" width="100%" height="18px" />
|
|
111
|
-
</ContentLoader>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
return <ResourceTitle>{title}</ResourceTitle>;
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
interface BlockTopicListProps {
|
|
118
|
-
topics: string[];
|
|
119
|
-
loading?: boolean;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const BlockTopicList = ({ topics, loading }: BlockTopicListProps) => {
|
|
120
|
+
const TopicAndTitleLoader = ({ children, loading }: LoaderProps) => {
|
|
123
121
|
if (loading) {
|
|
124
122
|
return (
|
|
125
123
|
<ContentLoader height={'18px'} width={'100%'} viewBox={null} preserveAspectRatio="none">
|
|
@@ -129,7 +127,7 @@ const BlockTopicList = ({ topics, loading }: BlockTopicListProps) => {
|
|
|
129
127
|
);
|
|
130
128
|
}
|
|
131
129
|
|
|
132
|
-
return
|
|
130
|
+
return <>{children}</>;
|
|
133
131
|
};
|
|
134
132
|
|
|
135
133
|
const BlockResource = ({
|
|
@@ -144,16 +142,26 @@ const BlockResource = ({
|
|
|
144
142
|
menuItems,
|
|
145
143
|
isLoading,
|
|
146
144
|
}: BlockResourceProps) => {
|
|
145
|
+
const linkRef = useRef<HTMLAnchorElement>(null);
|
|
146
|
+
|
|
147
|
+
const handleClick = () => {
|
|
148
|
+
if (linkRef.current) {
|
|
149
|
+
linkRef.current.click();
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
147
153
|
return (
|
|
148
|
-
<BlockElementWrapper
|
|
154
|
+
<BlockElementWrapper onClick={handleClick} id={id}>
|
|
149
155
|
<ImageWrapper>
|
|
150
156
|
<BlockImage image={resourceImage} loading={isLoading} />
|
|
151
157
|
</ImageWrapper>
|
|
152
158
|
<BlockInfoWrapper>
|
|
153
|
-
<
|
|
154
|
-
<
|
|
155
|
-
|
|
156
|
-
|
|
159
|
+
<TopicAndTitleLoader loading={isLoading}>
|
|
160
|
+
<ResourceTitleLink title={title} to={link} ref={linkRef}>
|
|
161
|
+
<ResourceTitle>{title}</ResourceTitle>
|
|
162
|
+
</ResourceTitleLink>
|
|
163
|
+
</TopicAndTitleLoader>
|
|
164
|
+
<TopicList topics={topics} />
|
|
157
165
|
<BlockDescription>{description}</BlockDescription>
|
|
158
166
|
<RightRow>
|
|
159
167
|
{tags && <CompressedTagList tagLinkPrefix={tagLinkPrefix} tags={tags} />}
|