Skip to content

Commit c3206f6

Browse files
authored
Set language attribute on resource title and descriptions (#2346)
* Set first run language on drawer and card titles and description * Unfocus test * Get language from last resource run. Provide utility function
1 parent 34be505 commit c3206f6

File tree

12 files changed

+79
-7
lines changed

12 files changed

+79
-7
lines changed

frontends/main/src/page-components/LearningResourceExpanded/LearningResourceExpanded.test.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,25 @@ describe("Learning Resource Expanded", () => {
114114
screen.getByText(resource.title)
115115
})
116116

117+
test("Sets lang attribute on title and description", () => {
118+
const resource = factories.learningResources.resource({
119+
resource_type: ResourceTypeEnum.Course,
120+
runs: [
121+
factories.learningResources.run({
122+
languages: ["en-us"],
123+
}),
124+
],
125+
})
126+
127+
setup({ resource })
128+
129+
const title = screen.getByText(resource.title)
130+
expect(title).toHaveAttribute("lang", "en-us")
131+
132+
const description = screen.getByText(resource.description!)
133+
expect(description).toHaveAttribute("lang", "en-us")
134+
})
135+
117136
test.each([ResourceTypeEnum.Program, ResourceTypeEnum.LearningPath])(
118137
'Renders CTA button for resource type "%s"',
119138
(resourceType) => {

frontends/main/src/page-components/LearningResourceExpanded/ResourceDescription.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import React, { useCallback, useRef, useState } from "react"
22
import styled from "@emotion/styled"
33
import { Skeleton, theme, Link } from "ol-components"
44
import type { LearningResource } from "api"
5+
import { getResourceLanguage } from "ol-utilities"
6+
57
const DescriptionContainer = styled.div({
68
display: "flex",
79
flexDirection: "column",
@@ -83,6 +85,7 @@ const ResourceDescription = ({ resource }: { resource?: LearningResource }) => {
8385
* backend during ETL. This is safe to render.
8486
*/
8587
dangerouslySetInnerHTML={{ __html: resource.description || "" }}
88+
lang={getResourceLanguage(resource)}
8689
/>
8790
{(isClamped || clampedOnFirstRender.current) && (
8891
<Link

frontends/main/src/page-components/LearningResourceExpanded/TitleSection.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ const TitleSection: React.FC<{
8282
>
8383
{type}
8484
</Typography>
85-
{title}
85+
<span lang={resource?.runs?.[0]?.languages?.[0]}>{title}</span>
8686
</Typography>
8787
<CloseButton
8888
variant="text"

frontends/ol-components/src/components/Card/Card.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ type TitleProps = {
230230
href?: string
231231
lines?: number
232232
style?: CSSProperties
233+
lang?: string
233234
}
234235

235236
type SlotProps = { children?: ReactNode; style?: CSSProperties }

frontends/ol-components/src/components/Card/ListCard.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ export const Info = styled.div`
8888
export type TitleProps = {
8989
children?: ReactNode
9090
href?: string
91+
lang?: string
9192
}
9293
export const Title: React.FC<TitleProps> = styled(Linkable)`
9394
flex-grow: 1;
@@ -247,8 +248,10 @@ const ListCard: Card = ({
247248
<Body>
248249
<Info>{info}</Info>
249250
{title && (
250-
<Title data-card-link={!!title.href} {...title} href={title.href}>
251-
<TruncateText lineClamp={2}>{title.children}</TruncateText>
251+
<Title data-card-link={!!title.href} href={title.href}>
252+
<TruncateText lineClamp={2} lang={title.lang}>
253+
{title.children}
254+
</TruncateText>
252255
</Title>
253256
)}
254257
<Bottom>

frontends/ol-components/src/components/Card/ListCardCondensed.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,9 @@ const ListCardCondensed: Card = ({
159159
<Body>
160160
<Info>{info}</Info>
161161
<Title data-card-link={!!title.href} href={title.href}>
162-
<TruncateText lineClamp={4}>{title.children}</TruncateText>
162+
<TruncateText lineClamp={4} lang={title.lang}>
163+
{title.children}
164+
</TruncateText>
163165
</Title>
164166
<Bottom>
165167
<Footer>{footer}</Footer>

frontends/ol-components/src/components/LearningResourceCard/LearningResourceCard.test.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,22 @@ describe("Learning Resource Card", () => {
3838
},
3939
)
4040

41+
test("Sets lang attribute on title and description", () => {
42+
const resource = factories.learningResources.resource({
43+
resource_type: ResourceTypeEnum.Course,
44+
runs: [
45+
factories.learningResources.run({
46+
languages: ["en-us"],
47+
}),
48+
],
49+
})
50+
51+
setup({ resource })
52+
53+
const title = screen.getByText(resource.title)
54+
expect(title).toHaveAttribute("lang", "en-us")
55+
})
56+
4157
test("Displays run start date", () => {
4258
const resource = factories.learningResources.resource({
4359
resource_type: ResourceTypeEnum.Course,

frontends/ol-components/src/components/LearningResourceCard/LearningResourceCard.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
getLearningResourcePrices,
1616
getResourceDate,
1717
showStartAnytime,
18+
getResourceLanguage,
1819
} from "ol-utilities"
1920
import { Card } from "../Card/Card"
2021
import type { Size } from "../Card/Card"
@@ -241,7 +242,9 @@ const LearningResourceCard: React.FC<LearningResourceCardProps> = ({
241242
<Card.Info>
242243
<Info resource={resource} size={size} />
243244
</Card.Info>
244-
<Card.Title href={href}>{resource.title}</Card.Title>
245+
<Card.Title href={href} lang={getResourceLanguage(resource)}>
246+
{resource.title}
247+
</Card.Title>
245248
<Card.Actions>
246249
{onAddToLearningPathClick && (
247250
<CardActionButton

frontends/ol-components/src/components/LearningResourceCard/LearningResourceListCard.test.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,22 @@ describe("Learning Resource List Card", () => {
3737
},
3838
)
3939

40+
test("Sets lang attribute on title and description", () => {
41+
const resource = factories.learningResources.resource({
42+
resource_type: ResourceTypeEnum.Course,
43+
runs: [
44+
factories.learningResources.run({
45+
languages: ["pt-pt"],
46+
}),
47+
],
48+
})
49+
50+
setup({ resource })
51+
52+
const title = screen.getByText(resource.title)
53+
expect(title).toHaveAttribute("lang", "pt-pt")
54+
})
55+
4056
test("Displays run start date", () => {
4157
const resource = factories.learningResources.resource({
4258
resource_type: ResourceTypeEnum.Course,

frontends/ol-components/src/components/LearningResourceCard/LearningResourceListCard.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
getLearningResourcePrices,
1717
getResourceDate,
1818
showStartAnytime,
19+
getResourceLanguage,
1920
} from "ol-utilities"
2021
import { ListCard } from "../Card/ListCard"
2122
import type { ActionButtonProps } from "@mitodl/smoot-design"
@@ -319,7 +320,9 @@ const LearningResourceListCard: React.FC<LearningResourceListCardProps> = ({
319320
<ListCard.Info>
320321
<Info resource={resource} />
321322
</ListCard.Info>
322-
<ListCard.Title href={href}>{resource.title}</ListCard.Title>
323+
<ListCard.Title href={href} lang={getResourceLanguage(resource)}>
324+
{resource.title}
325+
</ListCard.Title>
323326
<ListCard.Actions>
324327
{onAddToLearningPathClick && (
325328
<CardActionButton

0 commit comments

Comments
 (0)