@ndla/ui 24.0.0 → 24.2.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 (60) hide show
  1. package/es/Article/ArticleFavoritesButton.js +2 -2
  2. package/es/InfoBox/InfoBox.js +2 -2
  3. package/es/MyNdla/Resource/FolderInput.js +19 -6
  4. package/es/NoContentBox/NoContentBox.js +1 -6
  5. package/es/Resource/BlockResource.js +7 -6
  6. package/es/Resource/ListResource.js +8 -7
  7. package/es/TagSelector/SuggestionInput.js +9 -19
  8. package/es/TreeStructure/FolderItems.js +3 -3
  9. package/es/TreeStructure/FolderNameInput.js +33 -14
  10. package/es/TreeStructure/TreeStructure.js +3 -2
  11. package/es/all.css +1 -1
  12. package/es/locale/messages-en.js +13 -6
  13. package/es/locale/messages-nb.js +11 -4
  14. package/es/locale/messages-nn.js +13 -6
  15. package/es/locale/messages-se.js +31 -24
  16. package/es/locale/messages-sma.js +45 -38
  17. package/lib/Article/ArticleFavoritesButton.js +2 -2
  18. package/lib/InfoBox/InfoBox.js +6 -6
  19. package/lib/MediaList/MediaList.d.ts +1 -1
  20. package/lib/MyNdla/Resource/FolderInput.js +18 -5
  21. package/lib/NoContentBox/NoContentBox.js +1 -8
  22. package/lib/Resource/BlockResource.js +7 -6
  23. package/lib/Resource/ListResource.js +8 -7
  24. package/lib/TagSelector/SuggestionInput.js +9 -19
  25. package/lib/TreeStructure/FolderItems.js +3 -3
  26. package/lib/TreeStructure/FolderNameInput.js +35 -14
  27. package/lib/TreeStructure/TreeStructure.js +3 -2
  28. package/lib/TreeStructure/types.d.ts +1 -1
  29. package/lib/all.css +1 -1
  30. package/lib/locale/messages-en.d.ts +8 -1
  31. package/lib/locale/messages-en.js +13 -6
  32. package/lib/locale/messages-nb.d.ts +7 -0
  33. package/lib/locale/messages-nb.js +11 -4
  34. package/lib/locale/messages-nn.d.ts +8 -1
  35. package/lib/locale/messages-nn.js +13 -6
  36. package/lib/locale/messages-se.d.ts +8 -1
  37. package/lib/locale/messages-se.js +31 -24
  38. package/lib/locale/messages-sma.d.ts +13 -6
  39. package/lib/locale/messages-sma.js +45 -38
  40. package/package.json +9 -9
  41. package/src/Article/ArticleFavoritesButton.tsx +2 -2
  42. package/src/InfoBox/InfoBox.tsx +1 -1
  43. package/src/MediaList/MediaList.tsx +1 -1
  44. package/src/MyNdla/Resource/FolderInput.tsx +18 -3
  45. package/src/NoContentBox/NoContentBox.tsx +2 -7
  46. package/src/Resource/BlockResource.tsx +1 -1
  47. package/src/Resource/ListResource.tsx +3 -1
  48. package/src/SectionHeading/SectionHeading.tsx +1 -0
  49. package/src/TagSelector/SuggestionInput.tsx +0 -9
  50. package/src/TreeStructure/FolderItems.tsx +1 -1
  51. package/src/TreeStructure/FolderNameInput.tsx +34 -9
  52. package/src/TreeStructure/TreeStructure.tsx +1 -0
  53. package/src/TreeStructure/types.ts +1 -1
  54. package/src/locale/messages-en.ts +11 -4
  55. package/src/locale/messages-nb.ts +10 -3
  56. package/src/locale/messages-nn.ts +11 -4
  57. package/src/locale/messages-se.ts +30 -23
  58. package/src/locale/messages-sma.ts +42 -35
  59. package/src/main.scss +0 -1
  60. package/src/NoContentBox/component.no-content-box.scss +0 -17
@@ -424,11 +424,12 @@ var messages = _objectSpread(_objectSpread({
424
424
  files: 'Filer',
425
425
  embedlink: 'Innbyggingslenke',
426
426
  concept: 'Forklaringer',
427
+ podcast: 'Podkast',
427
428
  other: 'Annet innhold'
428
429
  },
429
430
  embedlink: {
430
431
  heading: 'Slik viser du artikkelen i annet innhold',
431
- description: 'Denne lenken viser artikkelen uten kontekst(meny og bunntekst)',
432
+ description: 'Denne lenken viser artikkelen uten kontekst (meny og bunntekst)',
432
433
  copyTitle: 'Kopier lenke',
433
434
  hasCopiedTitle: 'Lenke kopiert'
434
435
  },
@@ -460,6 +461,11 @@ var messages = _objectSpread(_objectSpread({
460
461
  description: 'Husk å kopiere teksten som skal legges ved lydfilen der du bruker den.',
461
462
  rules: 'Regler for bruk av lydfilen:'
462
463
  },
464
+ podcast: {
465
+ heading: 'Slik gjenbruker du podkaster',
466
+ description: 'Husk å kopiere teksten som skal legges ved podkasten der du bruker den.',
467
+ rules: 'Regler for bruk av podkasten:'
468
+ },
463
469
  video: {
464
470
  heading: 'Slik gjenbruker du videoer',
465
471
  description: 'Husk å kopiere teksten som skal legges ved videoen der du bruker den.',
@@ -481,16 +487,16 @@ var messages = _objectSpread(_objectSpread({
481
487
  rules: 'Regler for bruk av H5P:'
482
488
  },
483
489
  concept: {
484
- embedlink: {
485
- heading: 'Slik viser du forklaringa i anna innhald',
486
- description: 'Denne lenka viser forklaringa utan kontekst (meny og botntekst)',
487
- copyTitle: 'Kopier innbyggingslenke',
488
- hasCopiedTitle: 'Innbyggingslenke kopiert'
489
- },
490
490
  heading: 'Slik gjenbruker du forklaringer',
491
491
  description: 'Du finner retningslinjene for bruk av innholdet i forklaring-elementet',
492
492
  rules: 'Regler for bruk av forklaring:',
493
- title: 'Tittel'
493
+ title: 'Tittel',
494
+ embedlink: {
495
+ heading: 'Slik viser du forklaringen i annet innhold',
496
+ description: 'Denne lenken viser forklaringen uten kontekst (meny og bunntekst)',
497
+ copyTitle: 'Kopier innbyggingslenke',
498
+ hasCopiedTitle: 'Innbyggingslenke kopiert'
499
+ }
494
500
  },
495
501
  files: {
496
502
  heading: 'Slik gjenbruker du filer',
@@ -501,10 +507,10 @@ var messages = _objectSpread(_objectSpread({
501
507
  }
502
508
  },
503
509
  title: 'Tittel',
504
- originator: 'Opphavar',
505
- rightsholder: 'Rettshavar',
506
- source: 'Kjelde',
507
- published: 'Publiseringsdato'
510
+ originator: 'Opphaver',
511
+ published: 'Publiseringsdato',
512
+ rightsholder: 'Rettighetshaver',
513
+ source: 'Kilde'
508
514
  },
509
515
  errorMessage: {
510
516
  title: 'Ops, noe gikk galt',
@@ -773,12 +779,12 @@ var messages = _objectSpread(_objectSpread({
773
779
  content: 'Ressursen',
774
780
  text: 'er hentet fra',
775
781
  concept: {
776
- content: 'Forklaringa',
777
- text: 'er utarbeida av'
782
+ content: 'Forklaringen',
783
+ text: 'er utarbeidet av'
778
784
  },
779
785
  listing: {
780
- content: 'Lista',
781
- text: 'er utarbeida av'
786
+ content: 'Listen',
787
+ text: 'er utarbeidet av'
782
788
  }
783
789
  },
784
790
  fagfornyelse: {
@@ -829,24 +835,24 @@ var messages = _objectSpread(_objectSpread({
829
835
  open: 'Åpne meny',
830
836
  close: 'Lukk meny'
831
837
  },
832
- cancel: 'Avbryt',
833
838
  close: 'Lukk',
834
839
  title: 'Tittel',
840
+ cancel: 'Avbryt',
835
841
  save: 'Lagre',
836
842
  image: {
837
843
  altText: 'Alt-tekst',
838
- caption: 'Bilettekst',
844
+ caption: 'Bildetekst',
839
845
  type: 'Filtype',
840
- width: 'Breidde',
841
- height: 'Høgde',
846
+ width: 'Bredde',
847
+ height: 'Høyde',
842
848
  size: 'Størrelse (bytes)',
843
849
  modelReleased: {
844
850
  label: 'Modellklarert',
845
851
  yes: 'Ja',
846
852
  no: 'Nei',
847
- 'not-applicable': 'Ikkje relevant',
848
- 'not-set': 'Ikkje valgt',
849
- description: 'Om bildet er modellklarert eller ikkje:'
853
+ 'not-applicable': 'Ikke relevant',
854
+ 'not-set': 'Ikke valgt',
855
+ description: 'Om bildet er modellklarert eller ikke:'
850
856
  },
851
857
  download: 'Last ned bildet',
852
858
  reuse: 'Bruk bildet',
@@ -936,10 +942,10 @@ var messages = _objectSpread(_objectSpread({
936
942
  resource: {
937
943
  accessDenied: 'Vi beklager, men denne ressursen er bare for lærere innlogget med Feide.'
938
944
  },
939
- primarySchool: 'Hovudskule',
940
- name: 'Namn',
945
+ primarySchool: 'Hovedskole',
946
+ name: 'Navn',
941
947
  mail: 'E-post',
942
- username: 'Brukarnamn',
948
+ username: 'Brukernavn',
943
949
  groupTypes: {
944
950
  basic: 'Basisgruppe',
945
951
  teaching: 'Undervisningsgruppe',
@@ -966,7 +972,7 @@ var messages = _objectSpread(_objectSpread({
966
972
  "delete": 'Slett',
967
973
  edit: 'Rediger',
968
974
  missingName: 'Mappenavn er påkrevd',
969
- folderDeleted: '"{{folderName}}" er sletta'
975
+ folderDeleted: '"{{folderName}}" er slettet'
970
976
  },
971
977
  tags: '{{count}} tag',
972
978
  tags_plural: '{{count}} tags',
@@ -985,15 +991,15 @@ var messages = _objectSpread(_objectSpread({
985
991
  more: 'Flere valg',
986
992
  listView: 'Listevisning',
987
993
  detailView: 'Detaljrik listevisning',
988
- shortView: 'Kort visning',
994
+ shortView: 'Kortvisning',
989
995
  myPage: {
990
996
  confirmDeleteAccount: 'Er du sikker på at du vil slette kontoen?',
991
997
  confirmDeleteAccountButton: 'Slett konto',
992
998
  myPage: 'Min side',
993
999
  deleteAccount: 'Slett Min NDLA',
994
1000
  logout: 'Logg ut av Min NDLA',
995
- loginTerms: 'Logg på med Feide for å få tilgang. Ved å logge på godkjennar du våre vilkår for bruk',
996
- loginResourcePitch: 'Ønsker du å favorittmerke denne sida?',
1001
+ loginTerms: 'Logg på med Feide for å få tilgang. Ved å logge på godkjenner du våre vilkår for bruk',
1002
+ loginResourcePitch: 'Ønsker du å favorittmerke denne siden?',
997
1003
  loginWelcome: 'Velkommen til NDLA! Her kan du organisere fagstoffet på <i>din</i> måte!',
998
1004
  welcome: 'Velkommen til Min NDLA! Nå kan du lagre dine favorittressurser fra NDLA og organisere dem slik du ønsker i mapper og med tags.',
999
1005
  read: {
@@ -1016,7 +1022,7 @@ var messages = _objectSpread(_objectSpread({
1016
1022
  feide: 'Dette henter vi om deg fra Feide',
1017
1023
  storageInfo: {
1018
1024
  title: 'Slik lagrer du dine favorittressurser fra NDLA',
1019
- text: 'Når du ønsker å lagre en ressurs, kan du gjøre dette ved å klikke på hjertet øverst til høyre på siden. Du vil da få mulighet til å lagre ressursen i en mappe.'
1025
+ text: 'Når du ønsker å lagre en ressurs, kan du gjøre dette ved å klikke på hjerteknappen der den er tilgjengelig. Du vil da få mulighet til å lagre ressursen i en mappe.'
1020
1026
  },
1021
1027
  folderInfo: {
1022
1028
  title: 'Slik organiserer du dine favorittressurser i mapper',
@@ -1031,16 +1037,17 @@ var messages = _objectSpread(_objectSpread({
1031
1037
  add: 'Legg til mappe/tag',
1032
1038
  remove: 'Fjern',
1033
1039
  removeTitle: 'Fjern ressurs',
1034
- confirmRemove: 'Er du sikker på at du ønsker å fjerne ressursen frå denne mappen?',
1040
+ confirmRemove: 'Er du sikker på at du ønsker å fjerne ressursen fra denne mappen?',
1035
1041
  copyLink: 'Kopier lenke til siden',
1036
- linkCopied: 'Kopiert til utklippstavla',
1042
+ linkCopied: 'Kopiert til utklippstavle',
1037
1043
  addToMyNdla: 'Legg i Min NDLA',
1038
1044
  addedToMyNdla: 'Lagt i Min NDLA',
1039
- addedToFolder: 'Ressurs er lagt i "{{folderName}}"',
1045
+ addedToFolder: 'Ressurs er lagt i ',
1040
1046
  removedFromFolder: 'Fjernet fra "{{folderName}}"',
1041
1047
  titleUpdated: 'Tittel oppdatert',
1042
1048
  tagsUpdated: 'Tags oppdatert',
1043
- show: 'Vis'
1049
+ show: 'Vis',
1050
+ save: 'Lagre ressurs'
1044
1051
  }
1045
1052
  },
1046
1053
  snackbar: {
@@ -1049,12 +1056,12 @@ var messages = _objectSpread(_objectSpread({
1049
1056
  labels: {
1050
1057
  category: 'Kategori',
1051
1058
  subject: 'Fag',
1052
- other: 'Anna'
1059
+ other: 'Annet'
1053
1060
  },
1054
1061
  listingPage: {
1055
1062
  or: 'eller',
1056
- noFilters: 'Har ikkje noko å filtrera',
1057
- loadMore: 'Last meir'
1063
+ noFilters: 'Har ingenting å filtrere',
1064
+ loadMore: 'Last mer'
1058
1065
  },
1059
1066
  siteNav: {
1060
1067
  search: 'Søk',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ndla/ui",
3
- "version": "24.0.0",
3
+ "version": "24.2.0",
4
4
  "description": "UI component library for NDLA.",
5
5
  "license": "GPL-3.0",
6
6
  "main": "lib/index.js",
@@ -32,20 +32,20 @@
32
32
  ],
33
33
  "dependencies": {
34
34
  "@ndla/article-scripts": "^3.0.1",
35
- "@ndla/button": "^3.3.1",
35
+ "@ndla/button": "^3.3.2",
36
36
  "@ndla/carousel": "^1.2.16",
37
37
  "@ndla/core": "^2.3.4",
38
- "@ndla/forms": "^3.1.4",
38
+ "@ndla/forms": "^3.1.5",
39
39
  "@ndla/hooks": "^1.1.5",
40
40
  "@ndla/icons": "^1.11.4",
41
- "@ndla/licenses": "^5.0.8",
42
- "@ndla/modal": "^1.2.18",
43
- "@ndla/notion": "^3.1.31",
44
- "@ndla/safelink": "^2.2.7",
41
+ "@ndla/licenses": "^5.0.9",
42
+ "@ndla/modal": "^1.3.0",
43
+ "@ndla/notion": "^3.1.33",
44
+ "@ndla/safelink": "^2.2.8",
45
45
  "@ndla/switch": "^0.1.11",
46
46
  "@ndla/tabs": "^1.1.15",
47
47
  "@ndla/tooltip": "^2.2.0",
48
- "@ndla/types-learningpath-api": "^0.0.12",
48
+ "@ndla/types-learningpath-api": "^0.0.13",
49
49
  "@ndla/util": "^3.0.1",
50
50
  "@reach/menu-button": "^0.16.2",
51
51
  "@reach/slider": "^0.16.0",
@@ -85,5 +85,5 @@
85
85
  "publishConfig": {
86
86
  "access": "public"
87
87
  },
88
- "gitHead": "5ae8101f78ef46929de137ecbdd3275a5ef72649"
88
+ "gitHead": "190f0f17e8012e9fd1563837091b5376e9026476"
89
89
  }
@@ -25,8 +25,8 @@ export const ArticleFavoritesButton = ({ isFavorite, onToggleAddToFavorites, art
25
25
  return (
26
26
  <Tooltip tooltip={isFavorite ? addToFavoritesLabel : removeFromFavoritesLabel}>
27
27
  <IconButtonDualStates
28
- ariaLabelActive={t('myNdla.addToFavourites')}
29
- ariaLabelInActive={t('myNdla.alreadyFavourited')}
28
+ ariaLabelActive={t('myNdla.alreadyFavourited')}
29
+ ariaLabelInActive={t('myNdla.addToFavourites')}
30
30
  activeIcon={<Heart />}
31
31
  inactiveIcon={<HeartOutline />}
32
32
  active={isFavorite}
@@ -1,5 +1,5 @@
1
1
  import styled from '@emotion/styled';
2
- import { breakpoints, colors, fonts, mq, spacing } from '@ndla/core/src';
2
+ import { breakpoints, colors, fonts, mq, spacing } from '@ndla/core';
3
3
  import React, { ReactNode } from 'react';
4
4
 
5
5
  interface Props {
@@ -64,7 +64,7 @@ interface MediaListItemBodyProps {
64
64
  license: string;
65
65
  locale: string;
66
66
  resourceUrl?: string;
67
- resourceType?: 'video' | 'image' | 'audio' | 'text' | 'h5p';
67
+ resourceType?: 'video' | 'image' | 'audio' | 'text' | 'h5p' | 'podcast';
68
68
  messages?: {
69
69
  modelPremission?: string;
70
70
  };
@@ -15,6 +15,7 @@ import { useTranslation } from 'react-i18next';
15
15
  import { colors, spacing } from '@ndla/core';
16
16
  import { Input } from '@ndla/forms';
17
17
  import { css } from '@emotion/core';
18
+ import { Done } from '@ndla/icons/editor';
18
19
 
19
20
  // Source: https://kovart.github.io/dashed-border-generator/
20
21
  const borderStyle = `url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' stroke='${encodeURIComponent(
@@ -40,6 +41,9 @@ const inputWrapperStyle = css`
40
41
 
41
42
  const StyledInput = styled(Input)`
42
43
  && {
44
+ flex-grow: 1;
45
+ flex-basis: 0;
46
+ min-width: 0;
43
47
  line-height: 1.75em;
44
48
  color: ${colors.brand.primary};
45
49
  ::selection {
@@ -48,6 +52,12 @@ const StyledInput = styled(Input)`
48
52
  }
49
53
  `;
50
54
 
55
+ const Row = styled.div`
56
+ display: flex;
57
+ gap: ${spacing.xsmall};
58
+ padding-right: ${spacing.small};
59
+ `;
60
+
51
61
  interface Props {
52
62
  onAddFolder: (name: string) => void;
53
63
  onClose: () => void;
@@ -90,9 +100,14 @@ const FolderInput = ({ onAddFolder, onClose, autoSelect }: Props) => {
90
100
  </StyledFolderIcon>
91
101
  }
92
102
  iconRight={
93
- <IconButton aria-label={t('close')} size="small" ghostPill onClick={onClose}>
94
- <Cross />
95
- </IconButton>
103
+ <Row>
104
+ <IconButton aria-label={t('close')} size="small" ghostPill onClick={onClose}>
105
+ <Cross />
106
+ </IconButton>
107
+ <IconButton aria-label={t('save')} size="small" ghostPill onClick={() => onAddFolder(input)}>
108
+ <Done />
109
+ </IconButton>
110
+ </Row>
96
111
  }
97
112
  />
98
113
  );
@@ -7,21 +7,16 @@
7
7
  */
8
8
 
9
9
  import React from 'react';
10
- import BEMHelper from 'react-bem-helper';
11
10
  import Button from '@ndla/button';
12
11
 
13
- const classes = new BEMHelper({
14
- name: 'topic-resource',
15
- prefix: 'c-',
16
- });
17
-
18
12
  interface Props {
19
13
  onClick?: () => void;
20
14
  buttonText?: string;
21
15
  text: string;
22
16
  }
17
+
23
18
  export const NoContentBox = ({ buttonText, text, onClick }: Props) => (
24
- <div {...classes('additional-resources-trigger')}>
19
+ <div>
25
20
  <span>
26
21
  <div>
27
22
  <p>{text}</p>
@@ -94,7 +94,7 @@ const BlockImage = ({ image, loading }: BlockImageProps) => {
94
94
  </ContentLoader>
95
95
  );
96
96
  }
97
- return <Image alt={image.alt} src={image.src} />;
97
+ return <Image alt={image.alt} src={image.src} fallbackWidth={300} />;
98
98
  };
99
99
 
100
100
  interface BlockTitleProps {
@@ -127,7 +127,9 @@ interface ListResourceImageProps {
127
127
 
128
128
  const ListResourceImage = ({ resourceImage, loading, type }: ListResourceImageProps) => {
129
129
  if (!loading) {
130
- return <StyledImage alt={resourceImage.alt} src={resourceImage.src} />;
130
+ return (
131
+ <StyledImage alt={resourceImage.alt} src={resourceImage.src} fallbackWidth={type === 'compact' ? 56 : 136} />
132
+ );
131
133
  }
132
134
  return (
133
135
  <ContentLoader height={'100%'} width={'100%'} viewBox={null} preserveAspectRatio="none">
@@ -9,6 +9,7 @@ interface Props {
9
9
  large?: boolean;
10
10
  className?: string;
11
11
  }
12
+
12
13
  const SectionHeading = ({ children, large = false, className }: Props) => {
13
14
  const Wrapper: ElementType = large ? 'h1' : 'h2';
14
15
  return <Wrapper {...classes('', { large: !!large }, className)}>{children}</Wrapper>;
@@ -128,7 +128,6 @@ const SuggestionInput = ({
128
128
  const { t } = useTranslation();
129
129
  const [currentHighlightedIndex, setCurrentHighlightedIndex] = useState(0);
130
130
  const [hasFocus, setHasFocus] = useState(false);
131
- const initalRender = useRef(true);
132
131
  const inputRef = useRef<HTMLInputElement>(null);
133
132
  const containerRef = useRef<HTMLDivElement>(null);
134
133
  const suggestionIdRef = useRef<string>(uuid());
@@ -138,14 +137,6 @@ const SuggestionInput = ({
138
137
  setCurrentHighlightedIndex(0);
139
138
  }, [suggestions]);
140
139
 
141
- useEffect(() => {
142
- if (!initalRender.current) {
143
- inputRef.current?.focus();
144
- } else {
145
- initalRender.current = false;
146
- }
147
- }, [addedTags]);
148
-
149
140
  useEffect(() => {
150
141
  const selectedSuggestionElement = document
151
142
  .getElementById(suggestionIdRef.current)
@@ -22,7 +22,7 @@ const StyledUL = styled.ul<{ firstLevel?: boolean }>`
22
22
  list-style: none;
23
23
  margin: 0;
24
24
  padding: 0;
25
- margin-left: ${({ firstLevel }) => (firstLevel ? `-${spacing.xsmall}` : spacing.normal)};
25
+ margin-left: ${({ firstLevel }) => (firstLevel ? `-${spacing.xsmall}` : spacing.small)};
26
26
  `;
27
27
 
28
28
  const StyledLI = styled.li`
@@ -14,6 +14,9 @@ import { spacing, colors, misc, animations } from '@ndla/core';
14
14
  import { useTranslation } from 'react-i18next';
15
15
  import { isMobile } from 'react-device-detect';
16
16
  import { Spinner } from '@ndla/icons';
17
+ import { IconButton } from '@ndla/button';
18
+ import { Cross } from '@ndla/icons/action';
19
+ import { Done } from '@ndla/icons/editor';
17
20
 
18
21
  const ArrowRight = styled(ArrowDropDownRaw)`
19
22
  color: ${colors.text.primary};
@@ -29,15 +32,19 @@ const NewFolderWrapper = styled.div`
29
32
  }
30
33
  `;
31
34
 
35
+ const Row = styled.div`
36
+ display: flex;
37
+ gap: ${spacing.xxsmall};
38
+ padding-right: ${spacing.xsmall};
39
+ `;
40
+
32
41
  const InputWrapper = styled.div<{ loading?: boolean }>`
33
- margin: ${spacing.xxsmall} ${spacing.small} ${spacing.xxsmall} 0;
34
42
  display: flex;
43
+ margin: ${spacing.xxsmall} 0;
35
44
  align-items: center;
36
45
  border: 1px solid ${({ loading }) => (loading ? colors.brand.lighter : colors.brand.primary)};
37
46
  border-style: dashed;
38
47
  border-radius: ${misc.borderRadius};
39
- padding-right: ${spacing.normal};
40
- padding-left: ${spacing.xsmall};
41
48
  color: ${colors.brand.primary};
42
49
  `;
43
50
 
@@ -45,8 +52,7 @@ const StyledInput = styled.input`
45
52
  flex-grow: 1;
46
53
  border: 0;
47
54
  outline: none;
48
- padding: ${spacing.small};
49
- padding-left: ${spacing.xsmall};
55
+ min-width: 0;
50
56
  background: transparent;
51
57
  color: ${colors.text.primary};
52
58
  scroll-margin-top: 100px;
@@ -74,17 +80,19 @@ const FolderNameInput = ({ onSaveNewFolder, parentId, onCancelNewFolder, loading
74
80
  return (
75
81
  <NewFolderWrapper>
76
82
  <InputWrapper loading={loading}>
77
- <ArrowRight />
78
- <FolderOutlined />
83
+ <Row>
84
+ <ArrowRight />
85
+ <FolderOutlined />
86
+ </Row>
79
87
  <StyledInput
80
88
  ref={inputRef}
81
89
  autoFocus
82
90
  placeholder={t('treeStructure.newFolder.placeholder')}
83
91
  disabled={loading}
84
92
  value={name}
85
- onBlur={() => onCancelNewFolder()}
86
93
  onKeyDown={(e: KeyboardEvent<HTMLInputElement>) => {
87
94
  if (e.key === 'Escape') {
95
+ e.preventDefault();
88
96
  onCancelNewFolder();
89
97
  } else if (e.key === 'Enter' || e.key === 'Tab') {
90
98
  e.preventDefault();
@@ -93,7 +101,24 @@ const FolderNameInput = ({ onSaveNewFolder, parentId, onCancelNewFolder, loading
93
101
  }}
94
102
  onChange={(e: ChangeEvent<HTMLInputElement>) => setName(e.target.value)}
95
103
  />
96
- {loading && <Spinner size="small" />}
104
+ <Row>
105
+ {!loading ? (
106
+ <>
107
+ <IconButton aria-label={t('close')} size="xsmall" ghostPill onClick={onCancelNewFolder}>
108
+ <Cross />
109
+ </IconButton>
110
+ <IconButton
111
+ aria-label={t('save')}
112
+ size="xsmall"
113
+ ghostPill
114
+ onClick={() => onSaveNewFolder(name, parentId)}>
115
+ <Done />
116
+ </IconButton>
117
+ </>
118
+ ) : (
119
+ <Spinner size="small" margin="0" />
120
+ )}
121
+ </Row>
97
122
  </InputWrapper>
98
123
  </NewFolderWrapper>
99
124
  );
@@ -114,6 +114,7 @@ const TreeStructure = ({
114
114
  };
115
115
 
116
116
  const onSaveNewFolder = (name: string, parentId: string) => {
117
+ setNewFolderParentId(undefined);
117
118
  onNewFolder?.(name, parentId).then((newFolder) => {
118
119
  if (newFolder) {
119
120
  setSelectedFolder(newFolder);
@@ -8,7 +8,7 @@
8
8
 
9
9
  import { MouseEvent, ReactNode } from 'react';
10
10
  import { IFolder, IResource } from '@ndla/types-learningpath-api';
11
- import { MenuItemProps } from '@ndla/button/src';
11
+ import { MenuItemProps } from '@ndla/button';
12
12
 
13
13
  export interface FolderType extends IFolder {
14
14
  icon?: ReactNode;
@@ -441,8 +441,9 @@ const messages = {
441
441
  h5p: 'H5P',
442
442
  files: 'Files',
443
443
  embedlink: 'Embedded link',
444
- other: 'Other content',
445
444
  concept: 'Concepts',
445
+ podcast: 'Podcast',
446
+ other: 'Other content',
446
447
  },
447
448
  embedlink: {
448
449
  heading: 'How to show the article in other content',
@@ -478,6 +479,11 @@ const messages = {
478
479
  description: 'Remember to copy the text to be attached to the audio where you use it.',
479
480
  rules: 'Rules for use of audio file:',
480
481
  },
482
+ podcast: {
483
+ heading: 'How to reuse podcasts',
484
+ description: 'Remember to copy the text to be attached to the podcast where you use it.',
485
+ rules: 'Rules for use of podcast:',
486
+ },
481
487
  video: {
482
488
  heading: 'How to reuse videos',
483
489
  description: 'Remember to copy the text to be attached to the video where you use it.',
@@ -1023,7 +1029,7 @@ const messages = {
1023
1029
  more: 'More options',
1024
1030
  listView: 'List view',
1025
1031
  detailView: 'Detailed listview',
1026
- shortView: 'Short view',
1032
+ shortView: 'Card view',
1027
1033
  myPage: {
1028
1034
  confirmDeleteAccount: 'Are you sure you want to delete your account?',
1029
1035
  confirmDeleteAccountButton: 'Delete account',
@@ -1050,7 +1056,7 @@ const messages = {
1050
1056
 
1051
1057
  storageInfo: {
1052
1058
  title: 'How to save your favourite resources from NDLA',
1053
- text: 'When you wish to save a resource, you can do so by clicking the heart on the top right corner of the page. You will then get an option to store the resource in a folder',
1059
+ text: 'When you wish to save a resource, you can do so by clicking the heart button. You will then get an option to store the resource in a folder',
1054
1060
  },
1055
1061
  folderInfo: {
1056
1062
  title: 'How to organise your favourite resources in folders',
@@ -1070,11 +1076,12 @@ const messages = {
1070
1076
  linkCopied: 'Copied to clipboard',
1071
1077
  addToMyNdla: 'Add to My NDLA',
1072
1078
  addedToMyNdla: 'Added to My NDLA',
1073
- addedToFolder: 'Resource added to "{{folderName}}"',
1079
+ addedToFolder: 'Resource added to ',
1074
1080
  removedFromFolder: 'Removed from "{{folderName}}"',
1075
1081
  titleUpdated: 'Title updated',
1076
1082
  tagsUpdated: 'Tags updated',
1077
1083
  show: 'Show',
1084
+ save: 'Save resource',
1078
1085
  },
1079
1086
  },
1080
1087
  snackbar: {
@@ -455,6 +455,7 @@ const messages = {
455
455
  files: 'Filer',
456
456
  embedlink: 'Innbyggingslenke',
457
457
  concept: 'Forklaringer',
458
+ podcast: 'Podkast',
458
459
  other: 'Annet innhold',
459
460
  },
460
461
  embedlink: {
@@ -491,6 +492,11 @@ const messages = {
491
492
  description: 'Husk å kopiere teksten som skal legges ved lydfilen der du bruker den.',
492
493
  rules: 'Regler for bruk av lydfilen:',
493
494
  },
495
+ podcast: {
496
+ heading: 'Slik gjenbruker du podkaster',
497
+ description: 'Husk å kopiere teksten som skal legges ved podkasten der du bruker den.',
498
+ rules: 'Regler for bruk av podkasten:',
499
+ },
494
500
  video: {
495
501
  heading: 'Slik gjenbruker du videoer',
496
502
  description: 'Husk å kopiere teksten som skal legges ved videoen der du bruker den.',
@@ -1021,7 +1027,7 @@ const messages = {
1021
1027
  more: 'Flere valg',
1022
1028
  listView: 'Listevisning',
1023
1029
  detailView: 'Detaljrik listevisning',
1024
- shortView: 'Kort visning',
1030
+ shortView: 'Kortvisning',
1025
1031
  myPage: {
1026
1032
  confirmDeleteAccount: 'Er du sikker på at du vil slette kontoen?',
1027
1033
  confirmDeleteAccountButton: 'Slett konto',
@@ -1048,7 +1054,7 @@ const messages = {
1048
1054
  feide: 'Dette henter vi om deg fra Feide',
1049
1055
  storageInfo: {
1050
1056
  title: 'Slik lagrer du dine favorittressurser fra NDLA',
1051
- text: 'Når du ønsker å lagre en ressurs, kan du gjøre dette ved å klikke på hjertet øverst til høyre på siden. Du vil da få mulighet til å lagre ressursen i en mappe.',
1057
+ text: 'Når du ønsker å lagre en ressurs, kan du gjøre dette ved å klikke på hjerteknappen der den er tilgjengelig. Du vil da få mulighet til å lagre ressursen i en mappe.',
1052
1058
  },
1053
1059
  folderInfo: {
1054
1060
  title: 'Slik organiserer du dine favorittressurser i mapper',
@@ -1068,11 +1074,12 @@ const messages = {
1068
1074
  linkCopied: 'Kopiert til utklippstavle',
1069
1075
  addToMyNdla: 'Legg i Min NDLA',
1070
1076
  addedToMyNdla: 'Lagt i Min NDLA',
1071
- addedToFolder: 'Ressurs er lagt i "{{folderName}}"',
1077
+ addedToFolder: 'Ressurs er lagt i ',
1072
1078
  removedFromFolder: 'Fjernet fra "{{folderName}}"',
1073
1079
  titleUpdated: 'Tittel oppdatert',
1074
1080
  tagsUpdated: 'Tags oppdatert',
1075
1081
  show: 'Vis',
1082
+ save: 'Lagre ressurs',
1076
1083
  },
1077
1084
  },
1078
1085
  snackbar: {