Skip to content

Commit dfc5f64

Browse files
committed
Enable SideMenu sub menu to be links
1 parent cbafdb0 commit dfc5f64

File tree

2 files changed

+36
-23
lines changed

2 files changed

+36
-23
lines changed

src/SideMenu.tsx

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export namespace SideMenuProps {
4242
items: Item[];
4343
/** Default: false */
4444
expandedByDefault?: boolean;
45+
linkProps?: RegisteredLinkProps;
4546
};
4647
}
4748
}
@@ -134,23 +135,34 @@ export const SideMenu = memo(
134135
>
135136
{"items" in item ? (
136137
<>
137-
<button
138-
aria-expanded={
139-
item.expandedByDefault ?? false
140-
? "true"
141-
: "false"
142-
}
143-
aria-controls={itemId}
144-
{...(item.isActive && {
145-
["aria-current"]: true
146-
})}
147-
className={cx(
148-
fr.cx("fr-sidemenu__btn"),
149-
classes.button
150-
)}
151-
>
152-
{item.text}
153-
</button>
138+
{(() => {
139+
const ComponentToUse =
140+
item.linkProps !== undefined
141+
? Link
142+
: "button";
143+
144+
// @ts-expect-error
145+
return (
146+
<ComponentToUse
147+
aria-expanded={
148+
item.expandedByDefault ?? false
149+
? "true"
150+
: "false"
151+
}
152+
aria-controls={itemId}
153+
{...(item.isActive && {
154+
["aria-current"]: true
155+
})}
156+
className={cx(
157+
fr.cx("fr-sidemenu__btn"),
158+
classes.button
159+
)}
160+
{...item.linkProps}
161+
>
162+
{item.text}
163+
</ComponentToUse>
164+
);
165+
})()}
154166
<div
155167
className={fr.cx("fr-collapse")}
156168
id={itemId}

test/integration/cra/src/Home.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { fr } from "@codegouvfr/react-dsfr";
33
import { useIsDark } from "@codegouvfr/react-dsfr/useIsDark";
44
import { SideMenu } from "@codegouvfr/react-dsfr/SideMenu";
55
import { Table } from "@codegouvfr/react-dsfr/Table";
6-
import { ButtonsGroup } from '@codegouvfr/react-dsfr/ButtonsGroup';
6+
import { routes } from "./router";
77

88
const sideMenuItems = [
99
{
@@ -55,7 +55,8 @@ const sideMenuItems = [
5555
linkProps: { href: "#" }
5656
},
5757
{
58-
text: "Niveau 1",
58+
text: "Niveau 1 (with link)",
59+
linkProps: routes.home().link,
5960
items: [
6061
{
6162
text: "Accès direct niveau 2",
@@ -114,10 +115,10 @@ export function Home() {
114115
function TableExample() {
115116
return (
116117
<Table
117-
caption = "Titre du tableau"
118-
colorVariant = "green-emeraude"
119-
headers = {["Titre", "Titre", "Titre", "Titre", "Titre"]}
120-
data = {[
118+
caption="Titre du tableau"
119+
colorVariant="green-emeraude"
120+
headers={["Titre", "Titre", "Titre", "Titre", "Titre"]}
121+
data={[
121122
["Donnée", "Donnée", "Donnée", "Donnée", "Donnée"],
122123
["Donnée", "Donnée", "Donnée", "Donnée", "Donnée"],
123124
["Donnée", "Donnée", "Donnée", "Donnée", "Donnée"],

0 commit comments

Comments
 (0)