@ndla/ui 3.3.13 → 3.3.14

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 (91) hide show
  1. package/es/Figure/Figure.js +3 -1
  2. package/es/NDLAFilm/AboutNdlaFilm.js +6 -17
  3. package/es/NDLAFilm/AllMoviesAlphabetically.js +11 -11
  4. package/es/NDLAFilm/CategorySelect.js +17 -18
  5. package/es/NDLAFilm/FilmContentCard.js +8 -22
  6. package/es/NDLAFilm/FilmContentCardTags.js +4 -8
  7. package/es/NDLAFilm/FilmMovieList.js +6 -21
  8. package/es/NDLAFilm/FilmMovieSearch.js +18 -26
  9. package/es/NDLAFilm/MovieGrid.js +10 -19
  10. package/es/NDLAFilm/VisualElement.js +22 -29
  11. package/es/TopicIntroductionList/TopicIntroduction.js +14 -33
  12. package/es/TopicIntroductionList/TopicIntroductionList.js +6 -23
  13. package/es/TopicIntroductionList/TopicIntroductionShortcuts.js +71 -110
  14. package/es/TopicIntroductionList/TopicShortcutItem.js +0 -9
  15. package/es/all.css +1 -4
  16. package/es/index-javascript.js +1 -5
  17. package/es/index.js +4 -0
  18. package/es/shapes.js +0 -6
  19. package/lib/Figure/Figure.js +3 -1
  20. package/lib/NDLAFilm/AboutNdlaFilm.d.ts +15 -0
  21. package/lib/NDLAFilm/AboutNdlaFilm.js +6 -18
  22. package/lib/NDLAFilm/AllMoviesAlphabetically.d.ts +2 -2
  23. package/lib/NDLAFilm/AllMoviesAlphabetically.js +11 -11
  24. package/lib/NDLAFilm/CategorySelect.d.ts +11 -0
  25. package/lib/NDLAFilm/CategorySelect.js +20 -19
  26. package/lib/NDLAFilm/FilmContentCard.d.ts +11 -0
  27. package/lib/NDLAFilm/FilmContentCard.js +8 -23
  28. package/lib/NDLAFilm/FilmContentCardTags.d.ts +7 -0
  29. package/lib/NDLAFilm/FilmContentCardTags.js +4 -9
  30. package/lib/NDLAFilm/FilmMovieList.d.ts +19 -0
  31. package/lib/NDLAFilm/FilmMovieList.js +5 -21
  32. package/lib/NDLAFilm/FilmMovieSearch.d.ts +21 -0
  33. package/lib/NDLAFilm/FilmMovieSearch.js +25 -30
  34. package/lib/NDLAFilm/FilmSlideshow.d.ts +5 -5
  35. package/lib/NDLAFilm/MovieGrid.d.ts +13 -0
  36. package/lib/NDLAFilm/MovieGrid.js +9 -21
  37. package/lib/NDLAFilm/SlideshowIndicator.d.ts +2 -2
  38. package/lib/NDLAFilm/VisualElement.d.ts +16 -0
  39. package/lib/NDLAFilm/VisualElement.js +22 -30
  40. package/lib/NDLAFilm/index.d.ts +14 -0
  41. package/lib/NDLAFilm/types.d.ts +6 -4
  42. package/lib/TopicIntroductionList/TopicIntroduction.d.ts +21 -0
  43. package/lib/TopicIntroductionList/TopicIntroduction.js +16 -36
  44. package/lib/TopicIntroductionList/TopicIntroductionList.d.ts +35 -0
  45. package/lib/TopicIntroductionList/TopicIntroductionList.js +6 -25
  46. package/lib/TopicIntroductionList/TopicIntroductionShortcuts.d.ts +8 -0
  47. package/lib/TopicIntroductionList/TopicIntroductionShortcuts.js +72 -110
  48. package/lib/TopicIntroductionList/TopicShortcutItem.d.ts +6 -0
  49. package/lib/TopicIntroductionList/TopicShortcutItem.js +0 -11
  50. package/lib/TopicIntroductionList/index.d.ts +9 -0
  51. package/lib/all.css +1 -4
  52. package/lib/index-javascript.js +3 -137
  53. package/lib/index.d.ts +4 -0
  54. package/lib/index.js +155 -0
  55. package/lib/shapes.js +1 -10
  56. package/package.json +10 -10
  57. package/src/Figure/Figure.tsx +2 -1
  58. package/src/Figure/component.figure.scss +37 -3
  59. package/src/NDLAFilm/{AboutNdlaFilm.jsx → AboutNdlaFilm.tsx} +19 -18
  60. package/src/NDLAFilm/AllMoviesAlphabetically.tsx +3 -3
  61. package/src/NDLAFilm/{CategorySelect.jsx → CategorySelect.tsx} +23 -20
  62. package/src/NDLAFilm/{FilmContentCard.jsx → FilmContentCard.tsx} +21 -21
  63. package/src/NDLAFilm/{FilmContentCardTags.jsx → FilmContentCardTags.tsx} +7 -7
  64. package/src/NDLAFilm/{FilmMovieList.jsx → FilmMovieList.tsx} +17 -27
  65. package/src/NDLAFilm/FilmMovieSearch.tsx +71 -0
  66. package/src/NDLAFilm/FilmSlideshow.tsx +6 -6
  67. package/src/NDLAFilm/MovieGrid.tsx +76 -0
  68. package/src/NDLAFilm/SlideshowIndicator.tsx +2 -2
  69. package/src/NDLAFilm/VisualElement.tsx +40 -0
  70. package/src/NDLAFilm/{index.js → index.ts} +0 -0
  71. package/src/NDLAFilm/types.ts +7 -4
  72. package/src/TopicIntroductionList/{TopicIntroduction.jsx → TopicIntroduction.tsx} +22 -35
  73. package/src/TopicIntroductionList/{TopicIntroductionList.jsx → TopicIntroductionList.tsx} +32 -26
  74. package/src/TopicIntroductionList/TopicIntroductionShortcuts.tsx +71 -0
  75. package/src/TopicIntroductionList/{TopicShortcutItem.jsx → TopicShortcutItem.tsx} +5 -13
  76. package/src/TopicIntroductionList/{index.js → index.ts} +0 -0
  77. package/src/index-javascript.js +0 -30
  78. package/src/index.ts +31 -0
  79. package/src/shapes.js +0 -7
  80. package/es/NDLAFilm/interfaces.js +0 -0
  81. package/es/NDLAFilm/shapes.js +0 -15
  82. package/lib/NDLAFilm/interfaces.d.ts +0 -10
  83. package/lib/NDLAFilm/interfaces.js +0 -1
  84. package/lib/NDLAFilm/shapes.d.ts +0 -15
  85. package/lib/NDLAFilm/shapes.js +0 -30
  86. package/src/NDLAFilm/FilmMovieSearch.jsx +0 -66
  87. package/src/NDLAFilm/MovieGrid.jsx +0 -75
  88. package/src/NDLAFilm/VisualElement.jsx +0 -48
  89. package/src/NDLAFilm/interfaces.ts +0 -10
  90. package/src/NDLAFilm/shapes.ts +0 -17
  91. package/src/TopicIntroductionList/TopicIntroductionShortcuts.jsx +0 -92
@@ -0,0 +1,71 @@
1
+ import React, { useState } from 'react';
2
+ import { useTranslation } from 'react-i18next';
3
+ import BEMHelper from 'react-bem-helper';
4
+ import { Forward } from '@ndla/icons/common';
5
+
6
+ import ShortcutItem from './TopicShortcutItem';
7
+
8
+ import { Shortcut } from './TopicIntroductionList';
9
+
10
+ const classes = new BEMHelper({
11
+ name: 'topic-shortcuts',
12
+ prefix: 'c-',
13
+ });
14
+
15
+ interface Props {
16
+ id: string;
17
+ alwaysExpanded?: boolean;
18
+ shortcuts: Shortcut[];
19
+ }
20
+
21
+ const TopicIntroductionShortcuts = ({ id, alwaysExpanded = false, shortcuts }: Props) => {
22
+ const { t } = useTranslation();
23
+ const [open, setOpen] = useState(alwaysExpanded);
24
+ const [returned, setReturned] = useState(false);
25
+ const [showButtonText, setShowButtonText] = useState(true);
26
+
27
+ const handleOnToggle = (newOpen: boolean) => {
28
+ setOpen(newOpen);
29
+ setShowButtonText(!newOpen);
30
+ setReturned(!newOpen);
31
+ };
32
+
33
+ let onMouseEnter = undefined;
34
+ let onMouseLeave = undefined;
35
+
36
+ let buttonView = null;
37
+
38
+ if (!alwaysExpanded) {
39
+ onMouseEnter = () => handleOnToggle(true);
40
+ onMouseLeave = () => handleOnToggle(false);
41
+
42
+ buttonView = (
43
+ <button
44
+ type="button"
45
+ aria-expanded={open}
46
+ aria-label={t('resource.label')}
47
+ aria-controls={id}
48
+ {...classes('button', returned ? 're-enter' : '')}
49
+ onClick={() => handleOnToggle(!open)}>
50
+ <Forward />
51
+ {showButtonText && <span {...classes('label')}>{t('resource.label')}</span>}
52
+ </button>
53
+ );
54
+ }
55
+ return (
56
+ <div onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave} {...classes()}>
57
+ {buttonView}
58
+ {open && (
59
+ <ul className={classes('list', open ? 'visible' : '').className}>
60
+ {shortcuts.map((shortcut) => (
61
+ <li {...classes('item')} key={shortcut.id}>
62
+ <ShortcutItem shortcut={shortcut} />
63
+ </li>
64
+ ))}
65
+ </ul>
66
+ )}
67
+ </div>
68
+ );
69
+ };
70
+
71
+ export default TopicIntroductionShortcuts;
@@ -1,19 +1,20 @@
1
1
  import React from 'react';
2
- import PropTypes from 'prop-types';
3
2
  import BEMHelper from 'react-bem-helper';
4
3
  import Tooltip from '@ndla/tooltip';
5
4
  import SafeLink from '@ndla/safelink';
6
5
  import { useTranslation } from 'react-i18next';
7
6
  import ContentTypeBadge from '../ContentTypeBadge';
8
-
9
- import { ShortcutShape } from '../shapes';
7
+ import { Shortcut } from './TopicIntroductionList';
10
8
 
11
9
  const classes = new BEMHelper({
12
10
  name: 'topic-shortcuts',
13
11
  prefix: 'c-',
14
12
  });
15
13
 
16
- const ShortcutItem = ({ shortcut: { id, tooltip, contentType, url, count } }) => {
14
+ interface Props {
15
+ shortcut: Shortcut;
16
+ }
17
+ const ShortcutItem = ({ shortcut: { id, tooltip, contentType, url, count } }: Props) => {
17
18
  const { t } = useTranslation();
18
19
  return (
19
20
  <Tooltip
@@ -29,13 +30,4 @@ const ShortcutItem = ({ shortcut: { id, tooltip, contentType, url, count } }) =>
29
30
  );
30
31
  };
31
32
 
32
- ShortcutItem.propTypes = {
33
- shortcut: ShortcutShape.isRequired,
34
- disableToolTip: PropTypes.bool,
35
- };
36
-
37
- ShortcutItem.defaultProps = {
38
- disableToolTip: false,
39
- };
40
-
41
33
  export default ShortcutItem;
File without changes
@@ -23,16 +23,6 @@ export {
23
23
  ToggleSearchButton,
24
24
  } from './Search';
25
25
 
26
- export {
27
- default as ContentTypeBadge,
28
- SubjectMaterialBadge,
29
- TasksAndActivitiesBadge,
30
- AssessmentResourcesBadge,
31
- LearningPathBadge,
32
- SubjectBadge,
33
- ExternalLearningResourcesBadge,
34
- SourceMaterialBadge,
35
- } from './ContentTypeBadge';
36
26
  export { default as TopicIntroductionList } from './TopicIntroductionList';
37
27
  export { default as TopicMenu, TopicMenuButton } from './TopicMenu';
38
28
  export {
@@ -43,24 +33,4 @@ export {
43
33
  CompetenceGoalsDialog,
44
34
  } from './CompetenceGoals';
45
35
 
46
- export {
47
- MediaList,
48
- MediaListItem,
49
- MediaListItemBody,
50
- MediaListItemActions,
51
- MediaListItemImage,
52
- MediaListItemMeta,
53
- } from './MediaList';
54
-
55
36
  export { EmbeddedTwitter, EmbeddedFacebook, EmbeddedFacebookPage } from './Embedded';
56
-
57
- export { DisplayOnPageYOffset } from './Animation';
58
-
59
- export {
60
- FilmSlideshow,
61
- MovieGrid,
62
- AboutNdlaFilm,
63
- FilmMovieSearch,
64
- FilmMovieList,
65
- AllMoviesAlphabetically,
66
- } from './NDLAFilm';
package/src/index.ts CHANGED
@@ -158,6 +158,37 @@ export { default as ResourceGroup } from './ResourceGroup';
158
158
 
159
159
  export { default as LayoutItem, OneColumn, PageContainer, Content } from './Layout';
160
160
 
161
+ export {
162
+ FilmSlideshow,
163
+ MovieGrid,
164
+ AboutNdlaFilm,
165
+ FilmMovieSearch,
166
+ FilmMovieList,
167
+ AllMoviesAlphabetically,
168
+ } from './NDLAFilm';
169
+
170
+ export { DisplayOnPageYOffset } from './Animation';
171
+
172
+ export {
173
+ MediaList,
174
+ MediaListItem,
175
+ MediaListItemBody,
176
+ MediaListItemActions,
177
+ MediaListItemImage,
178
+ MediaListItemMeta,
179
+ } from './MediaList';
180
+
181
+ export {
182
+ default as ContentTypeBadge,
183
+ SubjectMaterialBadge,
184
+ TasksAndActivitiesBadge,
185
+ AssessmentResourcesBadge,
186
+ LearningPathBadge,
187
+ SubjectBadge,
188
+ ExternalLearningResourcesBadge,
189
+ SourceMaterialBadge,
190
+ } from './ContentTypeBadge';
191
+
161
192
  export {
162
193
  SubjectAbout,
163
194
  SubjectArchive,
package/src/shapes.js CHANGED
@@ -69,13 +69,6 @@ export const ResourceShape = PropTypes.shape({
69
69
  type: PropTypes.string,
70
70
  });
71
71
 
72
- export const ShortcutShape = PropTypes.shape({
73
- tooltip: PropTypes.string.isRequired,
74
- contentType: PropTypes.string.isRequired,
75
- url: PropTypes.string.isRequired,
76
- count: PropTypes.number.isRequired,
77
- });
78
-
79
72
  export const ContentTypeShape = PropTypes.oneOf([
80
73
  contentTypes.SUBJECT_MATERIAL,
81
74
  contentTypes.TASKS_AND_ACTIVITIES,
File without changes
@@ -1,15 +0,0 @@
1
- import PropTypes from 'prop-types';
2
- export var movieShape = PropTypes.shape({
3
- id: PropTypes.string.isRequired,
4
- metaDescription: PropTypes.string.isRequired,
5
- title: PropTypes.string.isRequired,
6
- metaImage: PropTypes.shape({
7
- url: PropTypes.string.isRequired,
8
- alt: PropTypes.string.isRequired
9
- }),
10
- path: PropTypes.string.isRequired
11
- });
12
- export var topicShape = PropTypes.shape({
13
- id: PropTypes.string,
14
- name: PropTypes.string
15
- });
@@ -1,10 +0,0 @@
1
- export interface NDLAMovie {
2
- id: string;
3
- metaDescription: string;
4
- title: string;
5
- metaImage: {
6
- url: string;
7
- alt: string;
8
- };
9
- path: string;
10
- }
@@ -1 +0,0 @@
1
- "use strict";
@@ -1,15 +0,0 @@
1
- import PropTypes from 'prop-types';
2
- export declare const movieShape: PropTypes.Requireable<PropTypes.InferProps<{
3
- id: PropTypes.Validator<string>;
4
- metaDescription: PropTypes.Validator<string>;
5
- title: PropTypes.Validator<string>;
6
- metaImage: PropTypes.Requireable<PropTypes.InferProps<{
7
- url: PropTypes.Validator<string>;
8
- alt: PropTypes.Validator<string>;
9
- }>>;
10
- path: PropTypes.Validator<string>;
11
- }>>;
12
- export declare const topicShape: PropTypes.Requireable<PropTypes.InferProps<{
13
- id: PropTypes.Requireable<string>;
14
- name: PropTypes.Requireable<string>;
15
- }>>;
@@ -1,30 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.topicShape = exports.movieShape = void 0;
7
-
8
- var _propTypes = _interopRequireDefault(require("prop-types"));
9
-
10
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
11
-
12
- var movieShape = _propTypes["default"].shape({
13
- id: _propTypes["default"].string.isRequired,
14
- metaDescription: _propTypes["default"].string.isRequired,
15
- title: _propTypes["default"].string.isRequired,
16
- metaImage: _propTypes["default"].shape({
17
- url: _propTypes["default"].string.isRequired,
18
- alt: _propTypes["default"].string.isRequired
19
- }),
20
- path: _propTypes["default"].string.isRequired
21
- });
22
-
23
- exports.movieShape = movieShape;
24
-
25
- var topicShape = _propTypes["default"].shape({
26
- id: _propTypes["default"].string,
27
- name: _propTypes["default"].string
28
- });
29
-
30
- exports.topicShape = topicShape;
@@ -1,66 +0,0 @@
1
- /**
2
- * Copyright (c) 2016-present, NDLA.
3
- *
4
- * This source code is licensed under the GPLv3 license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- */
8
-
9
- import React from 'react';
10
- import PropTypes from 'prop-types';
11
- import BEMHelper from 'react-bem-helper';
12
- import { OneColumn } from '@ndla/ui';
13
- import SafeLink from '@ndla/safelink';
14
- import { withTranslation } from 'react-i18next';
15
- import CategorySelect from './CategorySelect';
16
-
17
- import { topicShape } from './shapes';
18
-
19
- const classes = new BEMHelper({
20
- name: 'film-moviesearch',
21
- prefix: 'c-',
22
- });
23
-
24
- const classesMovieList = new BEMHelper({
25
- name: 'film-movielist',
26
- prefix: 'c-',
27
- });
28
-
29
- const FilmMovieSearch = ({ topics, t, ...props }) => (
30
- <div {...classes('')}>
31
- <OneColumn>
32
- <div {...classes('topic-navigation')}>
33
- <h2 {...classesMovieList('heading', '', 'u-12/12 u-4/12@tablet')}>{t('ndlaFilm.subjectsInMovies')}:</h2>
34
- <nav className="u-12/12 u-8/12@tablet">
35
- <ul>
36
- {topics.map((topic) => (
37
- <li key={topic.id}>
38
- <SafeLink to={topic.path} key={topic.id}>
39
- <span>{topic.name}</span>
40
- </SafeLink>
41
- </li>
42
- ))}
43
- </ul>
44
- </nav>
45
- </div>
46
- <CategorySelect {...props} />
47
- </OneColumn>
48
- </div>
49
- );
50
-
51
- FilmMovieSearch.propTypes = {
52
- topics: PropTypes.arrayOf(topicShape),
53
- onChangeResourceType: PropTypes.func.isRequired,
54
- resourceTypeSelected: PropTypes.shape({
55
- name: PropTypes.string,
56
- id: PropTypes.string,
57
- }),
58
- ariaControlId: PropTypes.string.isRequired,
59
- t: PropTypes.func.isRequired,
60
- };
61
-
62
- FilmMovieSearch.defaultProps = {
63
- topics: [],
64
- };
65
-
66
- export default withTranslation()(FilmMovieSearch);
@@ -1,75 +0,0 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import BEMHelper from 'react-bem-helper';
4
- import { css } from '@emotion/core';
5
- import { withTranslation } from 'react-i18next';
6
- import FilmContentCard from './FilmContentCard';
7
-
8
- const movieListClasses = new BEMHelper({
9
- name: 'film-movielist',
10
- prefix: 'c-',
11
- });
12
-
13
- const MovieGrid = ({
14
- resourceTypeName,
15
- fetchingMoviesByType,
16
- moviesByType,
17
- resourceTypes,
18
- loadingPlaceholderHeight,
19
- autoSizedProps,
20
- resizeThumbnailImages,
21
- t,
22
- }) => (
23
- <section>
24
- <h1
25
- {...movieListClasses('heading')}
26
- css={css`
27
- margin-left: ${autoSizedProps.margin}px;
28
- `}>
29
- {resourceTypeName && resourceTypeName.name}
30
- <small>
31
- {fetchingMoviesByType
32
- ? t('ndlaFilm.loadingMovies')
33
- : `${moviesByType.length} ${t('ndlaFilm.movieMatchInCategory')}`}
34
- </small>
35
- </h1>
36
- <div
37
- {...movieListClasses('movie-listing')}
38
- css={css`
39
- margin-left: ${autoSizedProps.margin}px;
40
- `}>
41
- {fetchingMoviesByType && (
42
- <div
43
- css={css`
44
- height: ${loadingPlaceholderHeight};
45
- `}
46
- />
47
- )}
48
- {!fetchingMoviesByType &&
49
- moviesByType.map((movie) => (
50
- <FilmContentCard
51
- hideTags
52
- movie={movie}
53
- columnWidth={autoSizedProps.columnWidth}
54
- distanceBetweenItems={autoSizedProps.distanceBetweenItems}
55
- resourceTypes={resourceTypes}
56
- resizeThumbnailImages={resizeThumbnailImages}
57
- />
58
- ))}
59
- </div>
60
- </section>
61
- );
62
-
63
- MovieGrid.propTypes = {
64
- autoSizedProps: PropTypes.shape({}),
65
- resourceTypeName: PropTypes.shape({
66
- name: PropTypes.string,
67
- }),
68
- fetchingMoviesByType: PropTypes.bool,
69
- moviesByType: PropTypes.array,
70
- classes: PropTypes.func,
71
- resourceTypes: PropTypes.array,
72
- loadingPlaceholderHeight: PropTypes.string,
73
- };
74
-
75
- export default withTranslation()(MovieGrid);
@@ -1,48 +0,0 @@
1
- /**
2
- * Copyright (c) 2019-present, NDLA.
3
- *
4
- * This source code is licensed under the GPLv3 license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- */
8
-
9
- import React from 'react';
10
- import PropTypes from 'prop-types';
11
- import { Image } from '@ndla/ui';
12
- import styled from '@emotion/styled';
13
-
14
- const StylediFrame = styled.iframe`
15
- height: 100%;
16
- width: 100%;
17
- border: 0;
18
- margin: 0;
19
- padding: 0;
20
- `;
21
-
22
- const VisualElement = ({ visualElement }) => {
23
- switch (visualElement.type) {
24
- case 'image':
25
- return <Image src={visualElement.url} alt={visualElement.alt} />;
26
- case 'brightcove':
27
- return (
28
- <StylediFrame
29
- allowfullscreen="true"
30
- webkitallowfullscreen="true"
31
- mozallowfullscreen="true"
32
- src={visualElement.url}
33
- />
34
- );
35
- default:
36
- return null;
37
- }
38
- };
39
-
40
- VisualElement.propTypes = {
41
- visualElement: PropTypes.shape({
42
- url: PropTypes.string,
43
- alt: PropTypes.string,
44
- type: PropTypes.string,
45
- }).isRequired,
46
- };
47
-
48
- export default VisualElement;
@@ -1,10 +0,0 @@
1
- export interface NDLAMovie {
2
- id: string;
3
- metaDescription: string;
4
- title: string;
5
- metaImage: {
6
- url: string;
7
- alt: string;
8
- };
9
- path: string;
10
- }
@@ -1,17 +0,0 @@
1
- import PropTypes from 'prop-types';
2
-
3
- export const movieShape = PropTypes.shape({
4
- id: PropTypes.string.isRequired,
5
- metaDescription: PropTypes.string.isRequired,
6
- title: PropTypes.string.isRequired,
7
- metaImage: PropTypes.shape({
8
- url: PropTypes.string.isRequired,
9
- alt: PropTypes.string.isRequired,
10
- }),
11
- path: PropTypes.string.isRequired,
12
- });
13
-
14
- export const topicShape = PropTypes.shape({
15
- id: PropTypes.string,
16
- name: PropTypes.string,
17
- });
@@ -1,92 +0,0 @@
1
- import React, { Component } from 'react';
2
- import PropTypes from 'prop-types';
3
- import BEMHelper from 'react-bem-helper';
4
- import { Forward } from '@ndla/icons/common';
5
-
6
- import ShortcutItem from './TopicShortcutItem';
7
-
8
- import { ShortcutShape } from '../shapes';
9
-
10
- const classes = new BEMHelper({
11
- name: 'topic-shortcuts',
12
- prefix: 'c-',
13
- });
14
-
15
- class TopicIntroductionShortcuts extends Component {
16
- constructor(props) {
17
- super(props);
18
- this.state = {
19
- open: props.alwaysExpanded,
20
- returned: false,
21
- showButtonText: true,
22
- };
23
- this.handleOnToggle = this.handleOnToggle.bind(this);
24
- }
25
-
26
- handleOnToggle(open) {
27
- this.setState({
28
- open,
29
- showButtonText: !open,
30
- returned: !open,
31
- });
32
- }
33
-
34
- render() {
35
- const { shortcuts, messages, id, alwaysExpanded } = this.props;
36
- const { open, returned, showButtonText } = this.state;
37
-
38
- let onMouseEnter = null;
39
- let onMouseLeave = null;
40
-
41
- let buttonView = null;
42
-
43
- if (!alwaysExpanded) {
44
- onMouseEnter = () => this.handleOnToggle(true);
45
- onMouseLeave = () => this.handleOnToggle(false);
46
-
47
- buttonView = (
48
- <button
49
- type="button"
50
- aria-expanded={this.state.open}
51
- aria-label={messages.toggleButtonText}
52
- aria-controls={id}
53
- {...classes('button', returned ? 're-enter' : '')}
54
- onClick={() => {
55
- this.handleOnToggle(!open);
56
- }}>
57
- <Forward />
58
- {showButtonText && <span {...classes('label')}>{messages.toggleButtonText}</span>}
59
- </button>
60
- );
61
- }
62
- return (
63
- <div onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave} {...classes()}>
64
- {buttonView}
65
- {open && (
66
- <ul className={classes('list', open ? 'visible' : '').className}>
67
- {shortcuts.map((shortcut) => (
68
- <li {...classes('item')} key={shortcut.id}>
69
- <ShortcutItem shortcut={shortcut} />
70
- </li>
71
- ))}
72
- </ul>
73
- )}
74
- </div>
75
- );
76
- }
77
- }
78
-
79
- TopicIntroductionShortcuts.propTypes = {
80
- id: PropTypes.string.isRequired,
81
- alwaysExpanded: PropTypes.bool,
82
- messages: PropTypes.shape({
83
- toggleButtonText: PropTypes.string.isRequired,
84
- }),
85
- shortcuts: PropTypes.arrayOf(ShortcutShape).isRequired,
86
- };
87
-
88
- TopicIntroductionShortcuts.defaultProps = {
89
- alwaysExpanded: false,
90
- };
91
-
92
- export default TopicIntroductionShortcuts;