@ndla/ui 55.0.18-alpha.0 → 55.0.19-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/AudioPlayer/SpeechControl.js +1 -0
- package/es/BlogPost/BlogPost.js +1 -0
- package/es/CampaignBlock/CampaignBlock.js +32 -27
- package/es/ContactBlock/ContactBlock.js +1 -0
- package/es/CopyParagraphButton/CopyParagraphButton.js +9 -11
- package/es/Embed/AudioEmbed.js +3 -1
- package/es/Embed/BrightcoveEmbed.js +1 -0
- package/es/Embed/CodeEmbed.js +1 -0
- package/es/Embed/ConceptEmbed.js +8 -9
- package/es/Embed/ConceptListEmbed.js +1 -0
- package/es/Embed/ContentLinkEmbed.js +1 -0
- package/es/Embed/CopyrightEmbed.js +1 -0
- package/es/Embed/EmbedErrorPlaceholder.js +1 -0
- package/es/Embed/ExternalEmbed.js +2 -0
- package/es/Embed/FootnoteEmbed.js +1 -0
- package/es/Embed/GlossEmbed.js +1 -0
- package/es/Embed/H5pEmbed.js +2 -0
- package/es/Embed/IframeEmbed.js +2 -0
- package/es/Embed/ImageEmbed.js +1 -0
- package/es/Embed/UnknownEmbed.js +1 -0
- package/es/Embed/UuDisclaimerEmbed.js +1 -0
- package/es/ErrorMessage/ErrorResourceAccessDenied.js +2 -3
- package/es/FactBox/FactBox.js +1 -0
- package/es/LinkBlock/LinkBlock.js +1 -0
- package/es/RelatedArticleList/RelatedArticleList.js +2 -0
- package/es/TreeStructure/AddFolderButton.js +25 -28
- package/lib/AudioPlayer/SpeechControl.js +1 -0
- package/lib/BlogPost/BlogPost.js +1 -0
- package/lib/CampaignBlock/CampaignBlock.js +32 -27
- package/lib/ContactBlock/ContactBlock.js +1 -0
- package/lib/CopyParagraphButton/CopyParagraphButton.js +9 -11
- package/lib/Embed/AudioEmbed.js +3 -1
- package/lib/Embed/BrightcoveEmbed.js +1 -0
- package/lib/Embed/CodeEmbed.js +1 -0
- package/lib/Embed/ConceptEmbed.js +7 -8
- package/lib/Embed/ConceptListEmbed.js +1 -0
- package/lib/Embed/ContentLinkEmbed.js +1 -0
- package/lib/Embed/CopyrightEmbed.js +1 -0
- package/lib/Embed/EmbedErrorPlaceholder.js +1 -0
- package/lib/Embed/ExternalEmbed.js +2 -0
- package/lib/Embed/FootnoteEmbed.js +1 -0
- package/lib/Embed/GlossEmbed.js +1 -0
- package/lib/Embed/H5pEmbed.js +2 -0
- package/lib/Embed/IframeEmbed.js +2 -0
- package/lib/Embed/ImageEmbed.js +1 -0
- package/lib/Embed/UnknownEmbed.js +1 -0
- package/lib/Embed/UuDisclaimerEmbed.js +1 -0
- package/lib/ErrorMessage/ErrorResourceAccessDenied.js +2 -3
- package/lib/FactBox/FactBox.js +1 -0
- package/lib/LinkBlock/LinkBlock.js +1 -0
- package/lib/RelatedArticleList/RelatedArticleList.js +2 -0
- package/lib/TreeStructure/AddFolderButton.js +25 -28
- package/package.json +4 -7
- package/src/AudioPlayer/SpeechControl.tsx +1 -1
- package/src/BlogPost/BlogPost.tsx +1 -1
- package/src/CampaignBlock/CampaignBlock.tsx +2 -1
- package/src/ContactBlock/ContactBlock.tsx +1 -1
- package/src/CopyParagraphButton/CopyParagraphButton.tsx +4 -7
- package/src/Embed/AudioEmbed.tsx +3 -2
- package/src/Embed/BrightcoveEmbed.tsx +1 -1
- package/src/Embed/CodeEmbed.tsx +1 -1
- package/src/Embed/ConceptEmbed.tsx +4 -6
- package/src/Embed/ConceptListEmbed.tsx +1 -1
- package/src/Embed/ContentLinkEmbed.tsx +1 -1
- package/src/Embed/CopyrightEmbed.tsx +1 -1
- package/src/Embed/EmbedErrorPlaceholder.tsx +1 -1
- package/src/Embed/ExternalEmbed.tsx +8 -2
- package/src/Embed/FootnoteEmbed.tsx +1 -1
- package/src/Embed/GlossEmbed.tsx +1 -1
- package/src/Embed/H5pEmbed.tsx +2 -2
- package/src/Embed/IframeEmbed.tsx +2 -2
- package/src/Embed/ImageEmbed.tsx +5 -1
- package/src/Embed/UnknownEmbed.tsx +1 -1
- package/src/Embed/UuDisclaimerEmbed.tsx +1 -1
- package/src/ErrorMessage/ErrorResourceAccessDenied.tsx +3 -3
- package/src/FactBox/FactBox.tsx +1 -1
- package/src/LinkBlock/LinkBlock.tsx +1 -1
- package/src/RelatedArticleList/RelatedArticleList.tsx +2 -2
- package/src/TreeStructure/AddFolderButton.tsx +25 -27
- package/src/TreeStructure/TreeStructure.stories.tsx +5 -5
|
@@ -34,7 +34,7 @@ const ContentLinkEmbed = ({ embed, isOembed, children }: Props) => {
|
|
|
34
34
|
|
|
35
35
|
if (embedData.openIn === "new-context" || isOembed) {
|
|
36
36
|
return (
|
|
37
|
-
<a href={data.path} target="_blank" rel="noopener noreferrer">
|
|
37
|
+
<a href={data.path} data-embed-type="content-link" target="_blank" rel="noopener noreferrer">
|
|
38
38
|
{children}
|
|
39
39
|
</a>
|
|
40
40
|
);
|
|
@@ -48,7 +48,7 @@ const StyledFigure = styled(Figure, {
|
|
|
48
48
|
|
|
49
49
|
const EmbedErrorPlaceholder = ({ type, children, figureType, float }: Props) => {
|
|
50
50
|
return (
|
|
51
|
-
<StyledFigure size={figureType} float={float}>
|
|
51
|
+
<StyledFigure size={figureType} float={float} data-embed-type={type}>
|
|
52
52
|
{children ?? (
|
|
53
53
|
<ErrorPlaceholder data-embed-type={type}>
|
|
54
54
|
<WarningOutline />
|
|
@@ -53,7 +53,7 @@ const ExternalEmbed = ({ embed }: Props) => {
|
|
|
53
53
|
alt: embedData.alt !== undefined ? embedData.alt : data.iframeImage?.alttext?.alttext ?? "",
|
|
54
54
|
};
|
|
55
55
|
return (
|
|
56
|
-
<Figure>
|
|
56
|
+
<Figure data-embed-type="external">
|
|
57
57
|
<ResourceBox
|
|
58
58
|
image={image}
|
|
59
59
|
title={embedData.title ?? ""}
|
|
@@ -65,7 +65,13 @@ const ExternalEmbed = ({ embed }: Props) => {
|
|
|
65
65
|
);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
return
|
|
68
|
+
return (
|
|
69
|
+
<StyledFigure
|
|
70
|
+
data-embed-type="external"
|
|
71
|
+
ref={figRef}
|
|
72
|
+
dangerouslySetInnerHTML={{ __html: data.oembed.html ?? "" }}
|
|
73
|
+
/>
|
|
74
|
+
);
|
|
69
75
|
};
|
|
70
76
|
|
|
71
77
|
export default ExternalEmbed;
|
|
@@ -30,7 +30,7 @@ const FootnoteEmbed = ({ embed }: Props) => {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
return (
|
|
33
|
-
<span id={`ref${embed.data.entryNum}`}>
|
|
33
|
+
<span id={`ref${embed.data.entryNum}`} data-embed-type="footnote">
|
|
34
34
|
<StyledSup>
|
|
35
35
|
<a href={`#note${embed.data.entryNum}`} target="_self">{`[${embed.data.entryNum}]`}</a>
|
|
36
36
|
</StyledSup>
|
package/src/Embed/GlossEmbed.tsx
CHANGED
package/src/Embed/H5pEmbed.tsx
CHANGED
|
@@ -39,11 +39,11 @@ const H5pEmbed = ({ embed }: Props) => {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
if (embed.data.oembed) {
|
|
42
|
-
return <FigureOembed dangerouslySetInnerHTML={{ __html: embed.data.oembed.html ?? "" }} />;
|
|
42
|
+
return <FigureOembed data-embed-type="h5p" dangerouslySetInnerHTML={{ __html: embed.data.oembed.html ?? "" }} />;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
return (
|
|
46
|
-
<StyledFigure>
|
|
46
|
+
<StyledFigure data-embed-type="h5p">
|
|
47
47
|
<iframe title={embed.embedData.url} aria-label={embed.embedData.url} src={embed.embedData.url} />
|
|
48
48
|
</StyledFigure>
|
|
49
49
|
);
|
|
@@ -49,7 +49,7 @@ const IframeEmbed = ({ embed }: Props) => {
|
|
|
49
49
|
const alt = embedData.alt !== undefined ? embedData.alt : iframeImage?.alttext.alttext;
|
|
50
50
|
const image = { src: iframeImage?.image.imageUrl ?? "", alt: alt ?? "" };
|
|
51
51
|
return (
|
|
52
|
-
<Figure>
|
|
52
|
+
<Figure data-embed-type="iframe">
|
|
53
53
|
<ResourceBox
|
|
54
54
|
image={image}
|
|
55
55
|
title={embedData.title ?? ""}
|
|
@@ -68,7 +68,7 @@ const IframeEmbed = ({ embed }: Props) => {
|
|
|
68
68
|
const urlOrTitle = title || url;
|
|
69
69
|
|
|
70
70
|
return (
|
|
71
|
-
<Figure>
|
|
71
|
+
<Figure data-embed-type="iframe">
|
|
72
72
|
<StyledIframe
|
|
73
73
|
ref={iframeRef}
|
|
74
74
|
title={urlOrTitle}
|
package/src/Embed/ImageEmbed.tsx
CHANGED
|
@@ -250,7 +250,11 @@ const ImageEmbed = ({ embed, previewAlt, lang, renderContext = "article", childr
|
|
|
250
250
|
|
|
251
251
|
// TODO: Check how this works with `children`. Will only be important for ED
|
|
252
252
|
return (
|
|
253
|
-
<StyledFigure
|
|
253
|
+
<StyledFigure
|
|
254
|
+
float={figureProps?.float}
|
|
255
|
+
size={imageSizes ? "full" : figureProps?.size ?? "medium"}
|
|
256
|
+
data-embed-type="image"
|
|
257
|
+
>
|
|
254
258
|
{children}
|
|
255
259
|
<ImageWrapper border={embedData.border === "true"} expandable={!!figureProps?.float}>
|
|
256
260
|
<Image
|
|
@@ -17,7 +17,7 @@ interface Props {
|
|
|
17
17
|
const UnknownEmbed = ({ embed }: Props) => {
|
|
18
18
|
const { t } = useTranslation();
|
|
19
19
|
return (
|
|
20
|
-
<Text color="text.error" asChild consumeCss>
|
|
20
|
+
<Text color="text.error" asChild consumeCss data-embed-type="unknown">
|
|
21
21
|
<span>{t("embed.unsupported", { type: embed.resource })}</span>
|
|
22
22
|
</Text>
|
|
23
23
|
);
|
|
@@ -50,7 +50,7 @@ const UuDisclaimerEmbed = ({ embed, children }: Props) => {
|
|
|
50
50
|
) : null;
|
|
51
51
|
|
|
52
52
|
return (
|
|
53
|
-
<div role="region">
|
|
53
|
+
<div role="region" data-embed-type="uu-disclaimer">
|
|
54
54
|
<StyledMessageBox variant="warning" contentEditable={false}>
|
|
55
55
|
<InformationOutline />
|
|
56
56
|
<Disclaimer>
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { useTranslation } from "react-i18next";
|
|
10
|
-
import { ButtonV2 } from "@ndla/button";
|
|
11
10
|
import { HumanMaleBoard, LogIn } from "@ndla/icons/common";
|
|
11
|
+
import { Button } from "@ndla/primitives";
|
|
12
12
|
import { styled } from "@ndla/styled-system/jsx";
|
|
13
13
|
import ErrorMessage from "./ErrorMessage";
|
|
14
14
|
|
|
@@ -34,12 +34,12 @@ const ErrorResourceAccessDenied = ({ onAuthenticateClick }: Props) => {
|
|
|
34
34
|
}}
|
|
35
35
|
illustrationElement={<HumanMaleBoard size="medium" />}
|
|
36
36
|
customElement={
|
|
37
|
-
<
|
|
37
|
+
<Button onClick={onAuthenticateClick}>
|
|
38
38
|
{t("user.buttonLogIn")}
|
|
39
39
|
<StyledLogInIconWrapper aria-hidden>
|
|
40
40
|
<LogIn size="medium" />
|
|
41
41
|
</StyledLogInIconWrapper>
|
|
42
|
-
</
|
|
42
|
+
</Button>
|
|
43
43
|
}
|
|
44
44
|
/>
|
|
45
45
|
);
|
package/src/FactBox/FactBox.tsx
CHANGED
|
@@ -132,7 +132,7 @@ const FactBox = forwardRef<HTMLElement, Props>(
|
|
|
132
132
|
}, [state, onOpenChange]);
|
|
133
133
|
|
|
134
134
|
return (
|
|
135
|
-
<StyledAside data-state={state} {...rest} ref={ref}>
|
|
135
|
+
<StyledAside data-state={state} data-embed-type="factbox" {...rest} ref={ref}>
|
|
136
136
|
<StyledIconButton
|
|
137
137
|
data-state={state}
|
|
138
138
|
onClick={onClick}
|
|
@@ -82,7 +82,7 @@ const LinkBlock = ({ title, articleLanguage, date, url, path }: Props) => {
|
|
|
82
82
|
return format(new Date(date), "dd. LLLL yyyy", { locale });
|
|
83
83
|
}, [date, articleLanguage]);
|
|
84
84
|
return (
|
|
85
|
-
<StyledSafeLink to={href}>
|
|
85
|
+
<StyledSafeLink to={href} data-embed-type="link-block">
|
|
86
86
|
<InfoWrapper>
|
|
87
87
|
<Heading asChild consumeCss textStyle="title.medium">
|
|
88
88
|
<h3 data-heading>{parse(title)}</h3>
|
|
@@ -34,7 +34,7 @@ export const RelatedArticle = ({
|
|
|
34
34
|
type = contentTypes.SUBJECT_MATERIAL,
|
|
35
35
|
}: RelatedArticleProps) => {
|
|
36
36
|
return (
|
|
37
|
-
<CardRoot>
|
|
37
|
+
<CardRoot data-embed-type="related-article">
|
|
38
38
|
<CardContent>
|
|
39
39
|
<ContentTypeBadge contentType={type} />
|
|
40
40
|
<CardHeading asChild consumeCss>
|
|
@@ -119,7 +119,7 @@ export const RelatedArticleList = ({
|
|
|
119
119
|
);
|
|
120
120
|
|
|
121
121
|
return (
|
|
122
|
-
<StyledSection {...rest}>
|
|
122
|
+
<StyledSection {...rest} data-embed-type="related-content-list">
|
|
123
123
|
<HeadingWrapper>
|
|
124
124
|
<Heading asChild consumeCss textStyle="title.large" fontWeight="bold">
|
|
125
125
|
<HeadingElement>{t("related.title")}</HeadingElement>
|
|
@@ -11,7 +11,6 @@ import { useTranslation } from "react-i18next";
|
|
|
11
11
|
import styled from "@emotion/styled";
|
|
12
12
|
import { ButtonV2 as Button } from "@ndla/button";
|
|
13
13
|
import { Plus } from "@ndla/icons/action";
|
|
14
|
-
import { Tooltip } from "@ndla/tooltip";
|
|
15
14
|
import { IFolder } from "@ndla/types-backend/myndla-api";
|
|
16
15
|
|
|
17
16
|
interface AddFolderButtonProps {
|
|
@@ -49,32 +48,31 @@ const AddFolderButton = ({
|
|
|
49
48
|
? t("myNdla.newFolderUnder", { folderName: focusedFolder?.name })
|
|
50
49
|
: t("treeStructure.maxFoldersAlreadyAdded");
|
|
51
50
|
return (
|
|
52
|
-
<
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
</Tooltip>
|
|
51
|
+
<StyledAddFolderButton
|
|
52
|
+
ref={ref}
|
|
53
|
+
variant="outline"
|
|
54
|
+
shape="pill"
|
|
55
|
+
disabled={loading || !canAddFolder}
|
|
56
|
+
title={tooltip}
|
|
57
|
+
aria-label={tooltip}
|
|
58
|
+
onMouseDown={(e) => {
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
e.stopPropagation();
|
|
61
|
+
ref.current?.focus();
|
|
62
|
+
}}
|
|
63
|
+
onMouseUp={(e) => {
|
|
64
|
+
e.preventDefault();
|
|
65
|
+
e.stopPropagation();
|
|
66
|
+
ref.current?.focus();
|
|
67
|
+
}}
|
|
68
|
+
onClick={(e) => {
|
|
69
|
+
e.currentTarget.focus();
|
|
70
|
+
setNewFolderParentId(focusedFolder?.id);
|
|
71
|
+
setShowTree(true);
|
|
72
|
+
}}
|
|
73
|
+
>
|
|
74
|
+
<StyledPlus /> {t("myNdla.newFolder")}
|
|
75
|
+
</StyledAddFolderButton>
|
|
78
76
|
);
|
|
79
77
|
};
|
|
80
78
|
|
|
@@ -13,10 +13,10 @@ import styled from "@emotion/styled";
|
|
|
13
13
|
import { Meta, StoryFn } from "@storybook/react";
|
|
14
14
|
import { IconButtonV2 } from "@ndla/button";
|
|
15
15
|
import { spacing } from "@ndla/core";
|
|
16
|
-
import { FieldErrorMessage, FieldHelper, FormControl, InputContainer, InputV3, Label } from "@ndla/forms";
|
|
17
16
|
import { Spinner } from "@ndla/icons";
|
|
18
17
|
import { Cross } from "@ndla/icons/action";
|
|
19
18
|
import { Done } from "@ndla/icons/editor";
|
|
19
|
+
import { FieldErrorMessage, FieldLabel, FieldRoot, InputContainer, FieldHelper, FieldInput } from "@ndla/primitives";
|
|
20
20
|
import { IFolder } from "@ndla/types-backend/myndla-api";
|
|
21
21
|
import { uuid } from "@ndla/util";
|
|
22
22
|
import { flattenFolders } from "./helperFunctions";
|
|
@@ -253,11 +253,11 @@ const NewFolder = ({ parentId, onClose, structure, setStructure, onCreate }: New
|
|
|
253
253
|
}, [name]);
|
|
254
254
|
|
|
255
255
|
return (
|
|
256
|
-
<
|
|
257
|
-
<
|
|
256
|
+
<FieldRoot required invalid={!!error}>
|
|
257
|
+
<FieldLabel srOnly>Mine mapper</FieldLabel>
|
|
258
258
|
<FieldErrorMessage>{error}</FieldErrorMessage>
|
|
259
259
|
<InputContainer>
|
|
260
|
-
<
|
|
260
|
+
<FieldInput
|
|
261
261
|
autoComplete="off"
|
|
262
262
|
disabled={loading}
|
|
263
263
|
ref={inputRef}
|
|
@@ -307,6 +307,6 @@ const NewFolder = ({ parentId, onClose, structure, setStructure, onCreate }: New
|
|
|
307
307
|
)}
|
|
308
308
|
</Row>
|
|
309
309
|
</InputContainer>
|
|
310
|
-
</
|
|
310
|
+
</FieldRoot>
|
|
311
311
|
);
|
|
312
312
|
};
|