@ndla/ui 27.1.6 → 28.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 (69) hide show
  1. package/es/Article/ArticleByline.js +38 -7
  2. package/es/Breadcrumb/ActionBreadcrumb.js +5 -4
  3. package/es/Breadcrumb/Breadcrumb.js +12 -4
  4. package/es/Frontpage/FrontpageAllSubjects.js +9 -8
  5. package/es/Resource/BlockResource.js +45 -23
  6. package/es/Resource/ListResource.js +45 -25
  7. package/es/Resource/resourceComponents.js +42 -34
  8. package/es/SearchTypeResult/SearchItem.js +8 -35
  9. package/es/SearchTypeResult/components/ItemResourceHeader.js +5 -5
  10. package/es/locale/messages-en.js +8 -6
  11. package/es/locale/messages-nb.js +20 -18
  12. package/es/locale/messages-nn.js +19 -17
  13. package/es/locale/messages-se.js +97 -95
  14. package/es/locale/messages-sma.js +19 -17
  15. package/es/model/ContentType.js +24 -1
  16. package/es/model/SubjectCategories.js +1 -5
  17. package/es/model/index.js +3 -2
  18. package/es/utils/resourceTypeColor.js +44 -0
  19. package/lib/Article/ArticleByline.d.ts +3 -1
  20. package/lib/Article/ArticleByline.js +38 -7
  21. package/lib/Breadcrumb/ActionBreadcrumb.js +5 -4
  22. package/lib/Breadcrumb/Breadcrumb.js +12 -4
  23. package/lib/Frontpage/FrontpageAllSubjects.js +10 -8
  24. package/lib/Resource/BlockResource.d.ts +6 -2
  25. package/lib/Resource/BlockResource.js +47 -22
  26. package/lib/Resource/ListResource.d.ts +6 -2
  27. package/lib/Resource/ListResource.js +47 -24
  28. package/lib/Resource/resourceComponents.d.ts +11 -4
  29. package/lib/Resource/resourceComponents.js +47 -37
  30. package/lib/SearchTypeResult/SearchItem.d.ts +0 -1
  31. package/lib/SearchTypeResult/SearchItem.js +9 -39
  32. package/lib/SearchTypeResult/components/ItemResourceHeader.js +8 -8
  33. package/lib/locale/messages-en.d.ts +18 -23
  34. package/lib/locale/messages-en.js +8 -6
  35. package/lib/locale/messages-nb.d.ts +18 -23
  36. package/lib/locale/messages-nb.js +20 -18
  37. package/lib/locale/messages-nn.d.ts +18 -23
  38. package/lib/locale/messages-nn.js +19 -17
  39. package/lib/locale/messages-se.d.ts +18 -23
  40. package/lib/locale/messages-se.js +97 -95
  41. package/lib/locale/messages-sma.d.ts +18 -23
  42. package/lib/locale/messages-sma.js +19 -17
  43. package/lib/model/ContentType.d.ts +19 -0
  44. package/lib/model/ContentType.js +34 -2
  45. package/lib/model/SubjectCategories.d.ts +0 -3
  46. package/lib/model/SubjectCategories.js +3 -10
  47. package/lib/model/index.d.ts +12 -2
  48. package/lib/model/index.js +4 -3
  49. package/lib/utils/resourceTypeColor.d.ts +9 -0
  50. package/lib/utils/resourceTypeColor.js +59 -0
  51. package/package.json +7 -7
  52. package/src/Article/ArticleByline.tsx +40 -1
  53. package/src/Breadcrumb/ActionBreadcrumb.tsx +1 -2
  54. package/src/Breadcrumb/Breadcrumb.tsx +15 -6
  55. package/src/Frontpage/FrontpageAllSubjects.tsx +5 -2
  56. package/src/Resource/BlockResource.tsx +33 -15
  57. package/src/Resource/ListResource.tsx +41 -16
  58. package/src/Resource/resourceComponents.tsx +27 -16
  59. package/src/SearchTypeResult/SearchItem.tsx +0 -22
  60. package/src/SearchTypeResult/components/ItemResourceHeader.tsx +3 -1
  61. package/src/locale/messages-en.ts +7 -7
  62. package/src/locale/messages-nb.ts +19 -19
  63. package/src/locale/messages-nn.ts +18 -18
  64. package/src/locale/messages-se.ts +97 -96
  65. package/src/locale/messages-sma.ts +18 -18
  66. package/src/model/ContentType.ts +41 -0
  67. package/src/model/SubjectCategories.ts +0 -5
  68. package/src/model/index.ts +2 -1
  69. package/src/utils/resourceTypeColor.tsx +38 -0
@@ -80,7 +80,7 @@ var messages = _objectSpread(_objectSpread({
80
80
  embed: 'Sett inn',
81
81
  notSupported: 'Det fungerte ikke å sette inn innholdet automatisk. Kopier kildekoden under for å sette inn på din side.'
82
82
  },
83
- subjectCategories: (_subjectCategories = {}, _defineProperty(_subjectCategories, subjectCategories.ACTIVE_SUBJECTS, 'Aktive'), _defineProperty(_subjectCategories, subjectCategories.ARCHIVE_SUBJECTS, 'Utgåtte'), _defineProperty(_subjectCategories, subjectCategories.BETA_SUBJECTS, 'Kommende'), _defineProperty(_subjectCategories, subjectCategories.COMMON_SUBJECTS, 'Fellesfag'), _defineProperty(_subjectCategories, subjectCategories.PROGRAMME_SUBJECTS, 'Programfag SF'), _defineProperty(_subjectCategories, subjectCategories.SPECIALIZED_SUBJECTS, 'Yrkesfag'), _subjectCategories),
83
+ subjectCategories: (_subjectCategories = {}, _defineProperty(_subjectCategories, subjectCategories.ACTIVE_SUBJECTS, 'Aktive'), _defineProperty(_subjectCategories, subjectCategories.ARCHIVE_SUBJECTS, 'Utgåtte'), _defineProperty(_subjectCategories, subjectCategories.BETA_SUBJECTS, 'Kommende'), _defineProperty(_subjectCategories, subjectTypes.RESOURCE_COLLECTION, 'Andre ressurser'), _subjectCategories),
84
84
  subjectTypes: (_subjectTypes = {}, _defineProperty(_subjectTypes, subjectTypes.SUBJECT, 'Fag'), _defineProperty(_subjectTypes, subjectTypes.RESOURCE_COLLECTION, 'Ressurssamling'), _subjectTypes),
85
85
  searchPage: {
86
86
  noHits: 'Ingen artikler samsvarte med søket ditt på: {{query}}',
@@ -401,6 +401,7 @@ var messages = _objectSpread(_objectSpread({
401
401
  heading: 'Slik gjenbruker du innhold',
402
402
  learnMore: 'Lær mer om åpne lisenser',
403
403
  copyTitle: 'Kildehenvisning',
404
+ copy: 'Kopier',
404
405
  hasCopiedTitle: 'Kopiert!',
405
406
  embed: 'Bygg inn',
406
407
  embedCopied: 'Kopierte innbyggingskode!',
@@ -918,9 +919,9 @@ var messages = _objectSpread(_objectSpread({
918
919
  loggedInAs: 'Du er pålogget som {{role}}.',
919
920
  loggedInAsButton: 'Du er pålogget som {{role}}',
920
921
  role: {
921
- employee: 'Lærer',
922
- staff: 'Ansatt',
923
- student: 'Elev'
922
+ employee: 'lærer',
923
+ staff: 'ansatt',
924
+ student: 'elev'
924
925
  },
925
926
  buttonLogIn: 'Logg inn med Feide',
926
927
  buttonLogOut: 'Logg ut',
@@ -935,7 +936,7 @@ var messages = _objectSpread(_objectSpread({
935
936
  resource: {
936
937
  accessDenied: 'Vi beklager, men denne ressursen er bare for lærere innlogget med Feide.'
937
938
  },
938
- primarySchool: 'Hovedskole',
939
+ primarySchool: 'hovedskole',
939
940
  name: 'Navn',
940
941
  mail: 'E-post',
941
942
  username: 'Brukernavn',
@@ -944,7 +945,7 @@ var messages = _objectSpread(_objectSpread({
944
945
  teaching: 'Undervisningsgruppe',
945
946
  other: 'Andre grupper'
946
947
  },
947
- wrongUserInfoDisclaimer: 'Dersom informasjon er feil, dette oppdaterast av vertsorganisasjon/skuleeigar som brukaren tilhøyrar. Oversikt over brukarstøtte finst her: '
948
+ wrongUserInfoDisclaimer: 'Dersom informasjonen er feil, må den oppdateres av vertsorganisasjon/skoleeier som brukeren tilhører. Oversikt over brukerstøtte finnes her: '
948
949
  },
949
950
  checkOutNewFeature: 'Sjekk ut ny funksjonalitet',
950
951
  slateBlockMenu: {
@@ -1002,15 +1003,16 @@ var messages = _objectSpread(_objectSpread({
1002
1003
  loginTerms: 'Logg på med Feide for å få tilgang. Ved å logge på godkjenner du våre vilkår for bruk',
1003
1004
  loginResourcePitch: 'Ønsker du å favorittmerke denne siden?',
1004
1005
  loginWelcome: 'Velkommen til NDLA! Her kan du organisere fagstoffet på <i>din</i> måte!',
1005
- welcome: 'Velkommen til Min NDLA! Nå kan du lagre dine favorittressurser fra NDLA og organisere dem slik du ønsker i mapper og med emneknagger.',
1006
+ welcome: 'Velkommen til Min NDLA! Nå kan du lagre favorittressursene dine fra NDLA og organisere dem i mapper og med emneknagger.',
1006
1007
  read: {
1007
- our: 'Les vår',
1008
- ours: 'Les våre'
1008
+ read: 'Les',
1009
+ our: ' vår.'
1009
1010
  },
1010
- privacy: 'personvernerklæring her',
1011
+ privacy: 'personvernerklæringa',
1012
+ privacyLink: 'https://om.ndla.no/gdpr',
1011
1013
  questions: {
1012
1014
  question: 'Lurer du på noe?',
1013
- ask: 'Spør oss i chatten'
1015
+ ask: 'Spør NDLA'
1014
1016
  },
1015
1017
  wishToDelete: 'Vil du ikke ha brukerprofil hos oss lenger?',
1016
1018
  terms: {
@@ -1023,16 +1025,16 @@ var messages = _objectSpread(_objectSpread({
1023
1025
  feide: 'Dette henter vi om deg gjennom Feide',
1024
1026
  feideWrongInfo: 'Dersom informasjon er feil, så må dette oppdateres av vertsorganisasjon/skoleeier som brukeren tilhører. Oversikt over brukerstøtte finnes her: feide.no/brukerstøtte',
1025
1027
  storageInfo: {
1026
- title: 'Slik lagrer du dine favorittressurser fra NDLA',
1027
- text: 'Klikk på hjerteknappen for å lagre en ressurs. Du vil da få mulighet til å lagre ressursen i en mappe.'
1028
+ title: 'Slik lagrer du favorittressursene dine fra NDLA',
1029
+ text: 'Klikk på hjerteknappen for å lagre en ressurs. Du vil da få mulighet til å lagre ressursen i ei mappe.'
1028
1030
  },
1029
1031
  folderInfo: {
1030
- title: 'Slik organiserer du dine favorittressurser i mapper',
1031
- text: 'Klikk på mine mapper i menyen til venstre for å komme til mappeoversikten. Her kan du opprette nye mapper og undermapper. Du kan også opprette en ny mappe i dialogvinduet som kommer når du klikker på et hjerte i en ressurs.'
1032
+ title: 'Slik organiserer du favorittressursene dine i mapper',
1033
+ text: 'Klikk på <strong>Mine mapper</strong> i menyen til venstre for å komme til mappeoversikten. Her kan du opprette nye mapper og undermapper. Du kan også opprette ei ny mappe i dialogvinduet som kommer når du klikker på et hjerte i en ressurs.'
1032
1034
  },
1033
1035
  tagInfo: {
1034
- title: 'Slik tagger du dine favorittressurser',
1035
- text: 'Når du lagrer en ressurs får du mulighet til å markere ressursen med en emneknagg. Emneknaggen er et nøkkelord du kan bruke til å finne tilbake til ressurser på tvers av mapper. Du finner alle emneknaggene du har brukt ved å velge mine emneknagger i venstremenyen. Her kan du også se hvilke ressurser du har markert med hver enkel emneknagg.'
1036
+ title: 'Slik tagger du favorittressursene dine',
1037
+ text: 'Når du lagrer en ressurs, får du mulighet til å markere ressursen med en emneknagg. Emneknaggen er et nøkkelord du kan bruke til å finne tilbake til ressurser på tvers av mapper. Du finner alle emneknaggene du har brukt, ved å velge <strong>Mine emneknagger</strong> i venstremenyen. Her kan du også se hvilke ressurser du har markert med hvilken emneknagg.'
1036
1038
  }
1037
1039
  },
1038
1040
  resource: {
@@ -14,3 +14,22 @@ export declare const SOURCE_MATERIAL = "source-material";
14
14
  export declare const LEARNING_PATH = "learning-path";
15
15
  export declare const TOPIC = "topic";
16
16
  export declare const MULTIDISCIPLINARY_TOPIC = "multidisciplinary-topic";
17
+ export declare const contentTypes: {
18
+ SUBJECT_MATERIAL: string;
19
+ TASKS_AND_ACTIVITIES: string;
20
+ ASSESSMENT_RESOURCES: string;
21
+ SUBJECT: string;
22
+ EXTERNAL_LEARNING_RESOURCES: string;
23
+ SOURCE_MATERIAL: string;
24
+ LEARNING_PATH: string;
25
+ TOPIC: string;
26
+ MULTIDISCIPLINARY_TOPIC: string;
27
+ };
28
+ export declare const RESOURCE_TYPE_LEARNING_PATH = "urn:resourcetype:learningPath";
29
+ export declare const RESOURCE_TYPE_SUBJECT_MATERIAL = "urn:resourcetype:subjectMaterial";
30
+ export declare const RESOURCE_TYPE_TASKS_AND_ACTIVITIES = "urn:resourcetype:tasksAndActivities";
31
+ export declare const RESOURCE_TYPE_ASSESSMENT_RESOURCES = "urn:resourcetype:reviewResource";
32
+ export declare const RESOURCE_TYPE_EXTERNAL_LEARNING_RESOURCES = "urn:resourcetype:externalResource";
33
+ export declare const RESOURCE_TYPE_SOURCE_MATERIAL = "urn:resourcetype:SourceMaterial";
34
+ export declare const ListOfContentTypes: string[];
35
+ export declare const contentTypeMapping: Record<string, string>;
@@ -3,7 +3,11 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.MULTIDISCIPLINARY_TOPIC = exports.TOPIC = exports.LEARNING_PATH = exports.SOURCE_MATERIAL = exports.EXTERNAL_LEARNING_RESOURCES = exports.SUBJECT = exports.ASSESSMENT_RESOURCES = exports.TASKS_AND_ACTIVITIES = exports.SUBJECT_MATERIAL = void 0;
6
+ exports.contentTypeMapping = exports.ListOfContentTypes = exports.RESOURCE_TYPE_SOURCE_MATERIAL = exports.RESOURCE_TYPE_EXTERNAL_LEARNING_RESOURCES = exports.RESOURCE_TYPE_ASSESSMENT_RESOURCES = exports.RESOURCE_TYPE_TASKS_AND_ACTIVITIES = exports.RESOURCE_TYPE_SUBJECT_MATERIAL = exports.RESOURCE_TYPE_LEARNING_PATH = exports.contentTypes = exports.MULTIDISCIPLINARY_TOPIC = exports.TOPIC = exports.LEARNING_PATH = exports.SOURCE_MATERIAL = exports.EXTERNAL_LEARNING_RESOURCES = exports.SUBJECT = exports.ASSESSMENT_RESOURCES = exports.TASKS_AND_ACTIVITIES = exports.SUBJECT_MATERIAL = void 0;
7
+
8
+ var _contentTypeMapping;
9
+
10
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
7
11
 
8
12
  /**
9
13
  * Copyright (c) 2017-present, NDLA.
@@ -29,4 +33,32 @@ exports.LEARNING_PATH = LEARNING_PATH;
29
33
  var TOPIC = 'topic';
30
34
  exports.TOPIC = TOPIC;
31
35
  var MULTIDISCIPLINARY_TOPIC = 'multidisciplinary-topic';
32
- exports.MULTIDISCIPLINARY_TOPIC = MULTIDISCIPLINARY_TOPIC;
36
+ exports.MULTIDISCIPLINARY_TOPIC = MULTIDISCIPLINARY_TOPIC;
37
+ var contentTypes = {
38
+ SUBJECT_MATERIAL: SUBJECT_MATERIAL,
39
+ TASKS_AND_ACTIVITIES: TASKS_AND_ACTIVITIES,
40
+ ASSESSMENT_RESOURCES: ASSESSMENT_RESOURCES,
41
+ SUBJECT: SUBJECT,
42
+ EXTERNAL_LEARNING_RESOURCES: EXTERNAL_LEARNING_RESOURCES,
43
+ SOURCE_MATERIAL: SOURCE_MATERIAL,
44
+ LEARNING_PATH: LEARNING_PATH,
45
+ TOPIC: TOPIC,
46
+ MULTIDISCIPLINARY_TOPIC: MULTIDISCIPLINARY_TOPIC
47
+ };
48
+ exports.contentTypes = contentTypes;
49
+ var RESOURCE_TYPE_LEARNING_PATH = 'urn:resourcetype:learningPath';
50
+ exports.RESOURCE_TYPE_LEARNING_PATH = RESOURCE_TYPE_LEARNING_PATH;
51
+ var RESOURCE_TYPE_SUBJECT_MATERIAL = 'urn:resourcetype:subjectMaterial';
52
+ exports.RESOURCE_TYPE_SUBJECT_MATERIAL = RESOURCE_TYPE_SUBJECT_MATERIAL;
53
+ var RESOURCE_TYPE_TASKS_AND_ACTIVITIES = 'urn:resourcetype:tasksAndActivities';
54
+ exports.RESOURCE_TYPE_TASKS_AND_ACTIVITIES = RESOURCE_TYPE_TASKS_AND_ACTIVITIES;
55
+ var RESOURCE_TYPE_ASSESSMENT_RESOURCES = 'urn:resourcetype:reviewResource';
56
+ exports.RESOURCE_TYPE_ASSESSMENT_RESOURCES = RESOURCE_TYPE_ASSESSMENT_RESOURCES;
57
+ var RESOURCE_TYPE_EXTERNAL_LEARNING_RESOURCES = 'urn:resourcetype:externalResource';
58
+ exports.RESOURCE_TYPE_EXTERNAL_LEARNING_RESOURCES = RESOURCE_TYPE_EXTERNAL_LEARNING_RESOURCES;
59
+ var RESOURCE_TYPE_SOURCE_MATERIAL = 'urn:resourcetype:SourceMaterial';
60
+ exports.RESOURCE_TYPE_SOURCE_MATERIAL = RESOURCE_TYPE_SOURCE_MATERIAL;
61
+ var ListOfContentTypes = ['SUBJECT_MATERIAL', 'TASKS_AND_ACTIVITIES', 'ASSESSMENT_RESOURCES', 'SUBJECT', 'EXTERNAL_LEARNING_RESOURCES', 'SOURCE_MATERIAL', 'LEARNING_PATH', 'TOPIC', 'MULTIDISIPLINARY_TOPIC'];
62
+ exports.ListOfContentTypes = ListOfContentTypes;
63
+ var contentTypeMapping = (_contentTypeMapping = {}, _defineProperty(_contentTypeMapping, RESOURCE_TYPE_LEARNING_PATH, LEARNING_PATH), _defineProperty(_contentTypeMapping, RESOURCE_TYPE_SUBJECT_MATERIAL, SUBJECT_MATERIAL), _defineProperty(_contentTypeMapping, RESOURCE_TYPE_TASKS_AND_ACTIVITIES, TASKS_AND_ACTIVITIES), _defineProperty(_contentTypeMapping, RESOURCE_TYPE_ASSESSMENT_RESOURCES, ASSESSMENT_RESOURCES), _defineProperty(_contentTypeMapping, RESOURCE_TYPE_EXTERNAL_LEARNING_RESOURCES, EXTERNAL_LEARNING_RESOURCES), _defineProperty(_contentTypeMapping, RESOURCE_TYPE_SOURCE_MATERIAL, SOURCE_MATERIAL), _defineProperty(_contentTypeMapping, "default", SUBJECT_MATERIAL), _contentTypeMapping);
64
+ exports.contentTypeMapping = contentTypeMapping;
@@ -8,6 +8,3 @@
8
8
  export declare const ACTIVE_SUBJECTS = "active";
9
9
  export declare const BETA_SUBJECTS = "beta";
10
10
  export declare const ARCHIVE_SUBJECTS = "archive";
11
- export declare const COMMON_SUBJECTS = "common";
12
- export declare const PROGRAMME_SUBJECTS = "programme";
13
- export declare const SPECIALIZED_SUBJECTS = "specialized";
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.SPECIALIZED_SUBJECTS = exports.PROGRAMME_SUBJECTS = exports.COMMON_SUBJECTS = exports.ARCHIVE_SUBJECTS = exports.BETA_SUBJECTS = exports.ACTIVE_SUBJECTS = void 0;
6
+ exports.ARCHIVE_SUBJECTS = exports.BETA_SUBJECTS = exports.ACTIVE_SUBJECTS = void 0;
7
7
 
8
8
  /**
9
9
  * Copyright (c) 2021-present, NDLA.
@@ -16,12 +16,5 @@ var ACTIVE_SUBJECTS = 'active';
16
16
  exports.ACTIVE_SUBJECTS = ACTIVE_SUBJECTS;
17
17
  var BETA_SUBJECTS = 'beta';
18
18
  exports.BETA_SUBJECTS = BETA_SUBJECTS;
19
- var ARCHIVE_SUBJECTS = 'archive'; // deprecated
20
-
21
- exports.ARCHIVE_SUBJECTS = ARCHIVE_SUBJECTS;
22
- var COMMON_SUBJECTS = 'common';
23
- exports.COMMON_SUBJECTS = COMMON_SUBJECTS;
24
- var PROGRAMME_SUBJECTS = 'programme';
25
- exports.PROGRAMME_SUBJECTS = PROGRAMME_SUBJECTS;
26
- var SPECIALIZED_SUBJECTS = 'specialized';
27
- exports.SPECIALIZED_SUBJECTS = SPECIALIZED_SUBJECTS;
19
+ var ARCHIVE_SUBJECTS = 'archive';
20
+ exports.ARCHIVE_SUBJECTS = ARCHIVE_SUBJECTS;
@@ -5,12 +5,22 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  */
8
- import * as contentTypes from './ContentType';
9
8
  import * as subjectCategories from './SubjectCategories';
10
9
  import * as subjectTypes from './SubjectTypes';
11
10
  declare const model: {
12
- contentTypes: typeof contentTypes;
11
+ contentTypes: {
12
+ SUBJECT_MATERIAL: string;
13
+ TASKS_AND_ACTIVITIES: string;
14
+ ASSESSMENT_RESOURCES: string;
15
+ SUBJECT: string;
16
+ EXTERNAL_LEARNING_RESOURCES: string;
17
+ SOURCE_MATERIAL: string;
18
+ LEARNING_PATH: string;
19
+ TOPIC: string;
20
+ MULTIDISCIPLINARY_TOPIC: string;
21
+ };
13
22
  subjectCategories: typeof subjectCategories;
14
23
  subjectTypes: typeof subjectTypes;
24
+ contentTypeMapping: Record<string, string>;
15
25
  };
16
26
  export default model;
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports["default"] = void 0;
9
9
 
10
- var contentTypes = _interopRequireWildcard(require("./ContentType"));
10
+ var _ContentType = require("./ContentType");
11
11
 
12
12
  var subjectCategories = _interopRequireWildcard(require("./SubjectCategories"));
13
13
 
@@ -25,9 +25,10 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj;
25
25
  *
26
26
  */
27
27
  var model = {
28
- contentTypes: contentTypes,
28
+ contentTypes: _ContentType.contentTypes,
29
29
  subjectCategories: subjectCategories,
30
- subjectTypes: subjectTypes
30
+ subjectTypes: subjectTypes,
31
+ contentTypeMapping: _ContentType.contentTypeMapping
31
32
  };
32
33
  var _default = model;
33
34
  exports["default"] = _default;
@@ -0,0 +1,9 @@
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
+ export declare const resourceTypeColor: (type: string) => string;
9
+ export default resourceTypeColor;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = exports.resourceTypeColor = void 0;
7
+
8
+ var _core = require("@ndla/core");
9
+
10
+ var _model = _interopRequireDefault(require("../model"));
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
13
+
14
+ /**
15
+ * Copyright (c) 2022-present, NDLA.
16
+ *
17
+ * This source code is licensed under the GPLv3 license found in the
18
+ * LICENSE file in the root directory of this source tree.
19
+ *
20
+ */
21
+ var contentTypes = _model["default"].contentTypes;
22
+
23
+ var resourceTypeColor = function resourceTypeColor(type) {
24
+ switch (type) {
25
+ case contentTypes.SUBJECT_MATERIAL:
26
+ return _core.colors.subjectMaterial.light;
27
+
28
+ case contentTypes.SUBJECT:
29
+ return _core.colors.subject.light;
30
+
31
+ case contentTypes.TOPIC:
32
+ return _core.colors.subject.light;
33
+
34
+ case contentTypes.TASKS_AND_ACTIVITIES:
35
+ return _core.colors.tasksAndActivities.light;
36
+
37
+ case contentTypes.ASSESSMENT_RESOURCES:
38
+ return _core.colors.assessmentResource.light;
39
+
40
+ case contentTypes.EXTERNAL_LEARNING_RESOURCES:
41
+ return _core.colors.externalLearningResource.light;
42
+
43
+ case contentTypes.SOURCE_MATERIAL:
44
+ return _core.colors.sourceMaterial.light;
45
+
46
+ case contentTypes.LEARNING_PATH:
47
+ return _core.colors.learningPath.light;
48
+
49
+ case contentTypes.MULTIDISCIPLINARY_TOPIC:
50
+ return _core.colors.learningPath.background;
51
+
52
+ default:
53
+ return '';
54
+ }
55
+ };
56
+
57
+ exports.resourceTypeColor = resourceTypeColor;
58
+ var _default = resourceTypeColor;
59
+ exports["default"] = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ndla/ui",
3
- "version": "27.1.6",
3
+ "version": "28.0.0",
4
4
  "description": "UI component library for NDLA.",
5
5
  "license": "GPL-3.0",
6
6
  "main": "lib/index.js",
@@ -32,16 +32,16 @@
32
32
  ],
33
33
  "dependencies": {
34
34
  "@ndla/article-scripts": "^3.0.2",
35
- "@ndla/button": "^3.6.0",
35
+ "@ndla/button": "^3.6.1",
36
36
  "@ndla/carousel": "^1.2.23",
37
37
  "@ndla/core": "^2.3.5",
38
- "@ndla/forms": "^3.3.4",
38
+ "@ndla/forms": "^3.3.5",
39
39
  "@ndla/hooks": "^1.1.6",
40
40
  "@ndla/icons": "^1.13.0",
41
41
  "@ndla/licenses": "^5.0.17",
42
- "@ndla/modal": "^1.5.0",
43
- "@ndla/notion": "^3.1.45",
44
- "@ndla/safelink": "^2.2.18",
42
+ "@ndla/modal": "^1.6.0",
43
+ "@ndla/notion": "^3.1.47",
44
+ "@ndla/safelink": "^2.2.19",
45
45
  "@ndla/switch": "^0.1.13",
46
46
  "@ndla/tabs": "^1.1.22",
47
47
  "@ndla/tooltip": "^2.2.1",
@@ -85,5 +85,5 @@
85
85
  "publishConfig": {
86
86
  "access": "public"
87
87
  },
88
- "gitHead": "f28cf161105aaf76aa1893a70cd8f3ff8cca6b05"
88
+ "gitHead": "f7cac264e9855369dc3061fc240ece485de041bb"
89
89
  }
@@ -59,6 +59,8 @@ type Props = {
59
59
  copyPageUrlLink?: string;
60
60
  printUrl?: string;
61
61
  locale?: string;
62
+ copyEmbedLink?: string;
63
+ copySourceReference?: string;
62
64
  };
63
65
 
64
66
  const renderContributors = (contributors: SupplierProps[] | AuthorProps[], t: TFunction) => {
@@ -91,16 +93,29 @@ const ArticleByline = ({
91
93
  copyPageUrlLink,
92
94
  printUrl,
93
95
  locale,
96
+ copyEmbedLink,
97
+ copySourceReference,
94
98
  }: Props) => {
95
99
  const { t } = useTranslation();
100
+
96
101
  const copyLinkHandler = () => {
97
102
  if (copyPageUrlLink) {
98
103
  copyTextToClipboard(copyPageUrlLink);
99
104
  }
100
105
  };
101
-
102
106
  const licenseRights = getLicenseByAbbreviation(license, locale).rights;
103
107
 
108
+ const copyLicense = () => {
109
+ if (copySourceReference) {
110
+ copyTextToClipboard(copySourceReference);
111
+ }
112
+ };
113
+ const copyEmbededLink = () => {
114
+ if (copyEmbedLink) {
115
+ copyTextToClipboard(copyEmbedLink);
116
+ }
117
+ };
118
+
104
119
  const showPrimaryContributors = suppliers.length > 0 || authors.length > 0;
105
120
  const showSecondaryContributors = suppliers.length > 0 && authors.length > 0;
106
121
 
@@ -129,6 +144,18 @@ const ArticleByline = ({
129
144
  )}
130
145
  {showSecondaryContributors && <TextWrapper>{getSuppliersText(suppliers, t)}</TextWrapper>}
131
146
  <ButtonWrapper>
147
+ {copySourceReference && (
148
+ <CopyButton
149
+ size="small"
150
+ borderShape="rounded"
151
+ outline
152
+ aria-live="assertive"
153
+ copyNode={t('license.hasCopiedTitle')}
154
+ data-copy-string={copySourceReference}
155
+ onClick={copyLicense}>
156
+ {`${t('license.copy')} ${t('license.copyTitle').toLowerCase()}`}
157
+ </CopyButton>
158
+ )}
132
159
  {licenseBox && (
133
160
  <Modal
134
161
  labelledBy={buttonId}
@@ -162,6 +189,18 @@ const ArticleByline = ({
162
189
  {t('article.copyPageLink')}
163
190
  </CopyButton>
164
191
  )}
192
+ {copyEmbedLink && (
193
+ <CopyButton
194
+ size="small"
195
+ borderShape="rounded"
196
+ outline
197
+ aria-live="assertive"
198
+ copyNode={t('license.hasCopiedTitle')}
199
+ data-copy-string={copyEmbedLink}
200
+ onClick={copyEmbededLink}>
201
+ {`${t('license.copy')} ${t('license.tabs.embedlink').toLowerCase()}`}
202
+ </CopyButton>
203
+ )}
165
204
  {printUrl && (
166
205
  <Button size="small" borderShape="rounded" outline onClick={() => printPage(printUrl)}>
167
206
  {t('article.printPage')}
@@ -23,7 +23,6 @@ const StyledRightChevron = styled(ChevronRight)`
23
23
  `;
24
24
 
25
25
  const StyledSpan = styled.span`
26
- color: ${colors.text.primary};
27
26
  font-weight: ${fonts.weight.bold};
28
27
  `;
29
28
 
@@ -54,7 +53,7 @@ const ActionBreadcrumb = ({ items, actionItems }: Props) => {
54
53
  }
55
54
  if (item.index === totalCount - 1 && actionItems.length > 0) {
56
55
  return (
57
- <StyledMenuButton menuItems={actionItems} size="small">
56
+ <StyledMenuButton menuItems={actionItems} alignRight size="small">
58
57
  <StyledSpan title={item.name}>{item.name}</StyledSpan>
59
58
  </StyledMenuButton>
60
59
  );
@@ -67,7 +67,7 @@ const Breadcrumb = ({
67
67
  el.setMaxWidth('40px');
68
68
  }
69
69
  });
70
- }, [size]);
70
+ }, [size, items]);
71
71
 
72
72
  return (
73
73
  <BreadcrumbNav ref={containerRef} aria-label={t('breadcrumb.breadcrumb')}>
@@ -77,11 +77,20 @@ const Breadcrumb = ({
77
77
  autoCollapse={autoCollapse}
78
78
  renderItem={renderItem}
79
79
  renderSeparator={renderSeparator}
80
- ref={(element) =>
81
- element === null || (!collapseFirst && index === 0) || (!collapseLast && index === items.length - 1)
82
- ? breadcrumbItemRefs.delete(item.to)
83
- : breadcrumbItemRefs.set(item.to, element)
84
- }
80
+ ref={(element) => {
81
+ if (
82
+ element === null ||
83
+ (!collapseFirst && index === 0) ||
84
+ (!collapseLast && index === items.length - 1)
85
+ ) {
86
+ if (element) {
87
+ element.setMaxWidth('none');
88
+ }
89
+ breadcrumbItemRefs.delete(item.to);
90
+ } else {
91
+ breadcrumbItemRefs.set(item.to, element);
92
+ }
93
+ }}
85
94
  key={typeof item.to === 'string' ? item.to : item.to.pathname}
86
95
  totalCount={items.length}
87
96
  item={{ ...item, index }}
@@ -6,6 +6,7 @@ import SafeLink from '@ndla/safelink';
6
6
  import { colors, fonts, mq, breakpoints } from '@ndla/core';
7
7
  import { MessageBox } from '../Messages';
8
8
  import { ToggleItem } from '../Filter';
9
+ import constants from '../model';
9
10
 
10
11
  const StyledWrapper = styled.nav`
11
12
  margin: 32px 0 0;
@@ -198,12 +199,14 @@ const FrontpageAllSubjects = ({
198
199
  content: (
199
200
  <>
200
201
  {/* Should be persistent til fall 2022 */}
201
- {category.name === t('subjectCategories.beta') && (
202
+ {(category.name === t('subjectCategories.beta') ||
203
+ category.type === constants.subjectCategories.BETA_SUBJECTS) && (
202
204
  <MessageBoxWrapper>
203
205
  <MessageBox>{t('messageBoxInfo.frontPageBeta')}</MessageBox>
204
206
  </MessageBoxWrapper>
205
207
  )}
206
- {category.name === t('subjectCategories.archive') && (
208
+ {(category.name === t('subjectCategories.archive') ||
209
+ category.type === constants.subjectCategories.ARCHIVE_SUBJECTS) && (
207
210
  <MessageBoxWrapper>
208
211
  <MessageBox>{t('messageBoxInfo.frontPageExpired')}</MessageBox>
209
212
  </MessageBoxWrapper>
@@ -10,17 +10,20 @@ import styled from '@emotion/styled';
10
10
  import React, { useRef } from 'react';
11
11
  import { colors, fonts, spacing } from '@ndla/core';
12
12
  import { MenuButton, MenuItemProps } from '@ndla/button';
13
+ import ContentTypeBadge from '../ContentTypeBadge';
13
14
  import Image from '../Image';
14
15
  import {
15
16
  CompressedTagList,
16
17
  ResourceImageProps,
17
18
  ResourceTitle,
18
19
  Row,
19
- TopicList,
20
+ ResourceTypeList,
20
21
  ResourceTitleLink,
21
22
  LoaderProps,
23
+ StyledContentIconWrapper,
22
24
  } from './resourceComponents';
23
25
  import ContentLoader from '../ContentLoader';
26
+ import { contentTypeMapping } from '../model/ContentType';
24
27
 
25
28
  interface BlockResourceProps {
26
29
  id: string;
@@ -28,12 +31,13 @@ interface BlockResourceProps {
28
31
  tagLinkPrefix?: string;
29
32
  title: string;
30
33
  resourceImage: ResourceImageProps;
31
- topics: string[];
32
34
  tags?: string[];
33
35
  description?: string;
36
+ headingLevel?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
34
37
  menuItems?: MenuItemProps[];
35
38
  isLoading?: boolean;
36
39
  targetBlank?: boolean;
40
+ resourceTypes?: { id: string; name: string }[];
37
41
  }
38
42
 
39
43
  const BlockElementWrapper = styled.div`
@@ -92,22 +96,21 @@ const BlockInfoWrapper = styled.div`
92
96
  const ImageWrapper = styled.div`
93
97
  display: flex;
94
98
  width: 100%;
99
+ justify-content: center;
95
100
  overflow: hidden;
96
101
  align-items: center;
97
- div {
98
- min-width: 100%;
99
- }
102
+ aspect-ratio: 3/4;
100
103
  img {
101
104
  min-width: 100%;
102
105
  }
103
106
  `;
104
-
105
107
  interface BlockImageProps {
106
108
  image: ResourceImageProps;
107
109
  loading?: boolean;
110
+ contentType: string;
108
111
  }
109
112
 
110
- const BlockImage = ({ image, loading }: BlockImageProps) => {
113
+ const BlockImage = ({ image, loading, contentType }: BlockImageProps) => {
111
114
  if (loading) {
112
115
  return (
113
116
  <ContentLoader height={'100%'} width={'100%'} viewBox={null} preserveAspectRatio="none">
@@ -115,10 +118,18 @@ const BlockImage = ({ image, loading }: BlockImageProps) => {
115
118
  </ContentLoader>
116
119
  );
117
120
  }
118
- return <Image alt={image.alt} src={image.src} fallbackWidth={300} />;
121
+ if (image.src === '') {
122
+ return (
123
+ <StyledContentIconWrapper contentType={contentType}>
124
+ <ContentTypeBadge type={contentType} size="large" />
125
+ </StyledContentIconWrapper>
126
+ );
127
+ } else {
128
+ return <Image alt={image.alt} src={image.src} fallbackWidth={300} />;
129
+ }
119
130
  };
120
131
 
121
- const TopicAndTitleLoader = ({ children, loading }: LoaderProps) => {
132
+ const ResourceTypeAndTitleLoader = ({ children, loading }: LoaderProps) => {
122
133
  if (loading) {
123
134
  return (
124
135
  <ContentLoader height={'18px'} width={'100%'} viewBox={null} preserveAspectRatio="none">
@@ -138,13 +149,16 @@ const BlockResource = ({
138
149
  title,
139
150
  tags,
140
151
  resourceImage,
141
- topics,
142
152
  description,
143
153
  menuItems,
144
154
  isLoading,
155
+ headingLevel = 'h2',
145
156
  targetBlank,
157
+ resourceTypes,
146
158
  }: BlockResourceProps) => {
147
159
  const linkRef = useRef<HTMLAnchorElement>(null);
160
+ const firstResourceType = resourceTypes?.[0].id ?? '';
161
+ const Title = ResourceTitle.withComponent(headingLevel);
148
162
 
149
163
  const handleClick = () => {
150
164
  if (linkRef.current) {
@@ -155,15 +169,19 @@ const BlockResource = ({
155
169
  return (
156
170
  <BlockElementWrapper onClick={handleClick} id={id}>
157
171
  <ImageWrapper>
158
- <BlockImage image={resourceImage} loading={isLoading} />
172
+ <BlockImage
173
+ image={resourceImage}
174
+ loading={isLoading}
175
+ contentType={contentTypeMapping[firstResourceType] ?? contentTypeMapping['default']}
176
+ />
159
177
  </ImageWrapper>
160
178
  <BlockInfoWrapper>
161
- <TopicAndTitleLoader loading={isLoading}>
179
+ <ResourceTypeAndTitleLoader loading={isLoading}>
162
180
  <ResourceTitleLink title={title} target={targetBlank ? '_blank' : undefined} to={link} ref={linkRef}>
163
- <ResourceTitle>{title}</ResourceTitle>
181
+ <Title>{title}</Title>
164
182
  </ResourceTitleLink>
165
- </TopicAndTitleLoader>
166
- <TopicList topics={topics} />
183
+ </ResourceTypeAndTitleLoader>
184
+ <ResourceTypeList resourceTypes={resourceTypes} />
167
185
  <BlockDescription>{description}</BlockDescription>
168
186
  <RightRow>
169
187
  {tags && <CompressedTagList tagLinkPrefix={tagLinkPrefix} tags={tags} />}