Skip to content

Commit 420b045

Browse files
authored
Merge pull request #1245 from dxc-technology/gomezivann-dropdown-refactor
[Major] Removed Material UI dependencies from Dropdown
2 parents 39dd536 + e60246b commit 420b045

File tree

8 files changed

+807
-501
lines changed

8 files changed

+807
-501
lines changed

docs/src/pages/components/cdk-components/dropdown/examples/darkThemeDropdown.js

Lines changed: 0 additions & 41 deletions
This file was deleted.

lib/src/dropdown/Dropdown.stories.tsx

Lines changed: 126 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,30 @@ import { userEvent, within } from "@storybook/testing-library";
33
import DxcDropdown from "./Dropdown";
44
import Title from "../../.storybook/components/Title";
55
import ExampleContainer from "../../.storybook/components/ExampleContainer";
6+
import DropdownMenu from "./DropdownMenu";
7+
import DxcCheckbox from "../checkbox/Checkbox";
8+
import DxcTextInput from "../text-input/TextInput";
9+
import { Option } from "./types";
10+
611

712
export default {
813
title: "Dropdown",
914
component: DxcDropdown,
1015
};
1116

17+
const hamburguerIcon = (
18+
<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20">
19+
<path d="M3 14.5V13h14v1.5Zm0-3.75v-1.5h14v1.5ZM3 7V5.5h14V7Z" />
20+
</svg>
21+
);
1222
const iconSVG = (
1323
<svg viewBox="0 0 24 24" fill="currentColor">
1424
<path d="M0 0h24v24H0z" fill="none" />
1525
<path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" />
1626
</svg>
1727
);
18-
1928
const iconSVGLarge = (
20-
<svg enableBackground="new 0 0 24 24" height="48px" viewBox="0 0 24 24" width="48px" fill="currentColor">
29+
<svg enableBackground="new 0 0 24 24" height="48" viewBox="0 0 24 24" width="48" fill="currentColor">
2130
<g>
2231
<path d="M0,0h24v24H0V0z" fill="none" />
2332
<path d="M0,0h24v24H0V0z" fill="none" />
@@ -27,11 +36,13 @@ const iconSVGLarge = (
2736
</g>
2837
</svg>
2938
);
39+
const iconUrl = "https://iconape.com/wp-content/files/yd/367773/svg/logo-linkedin-logo-icon-png-svg.png";
40+
const icons = [iconSVG, iconSVGLarge, iconUrl];
3041

31-
const options: any = [
42+
const defaultOptions: Option[] = [
3243
{
3344
value: "1",
34-
label: "Amazon with a very long text",
45+
label: "Amazon",
3546
},
3647
{
3748
value: "2",
@@ -41,19 +52,35 @@ const options: any = [
4152
value: "3",
4253
label: "Apple",
4354
},
55+
{
56+
value: "4",
57+
label: "Wallapop",
58+
},
59+
{
60+
value: "5",
61+
label: "Aliexpress",
62+
},
4463
];
45-
46-
const option: any = [
64+
const options: Option[] = [
4765
{
4866
value: "1",
67+
label: "Amazon with a very long text",
68+
},
69+
{
70+
value: "2",
4971
label: "Ebay",
5072
},
73+
{
74+
value: "3",
75+
label: "Apple",
76+
},
5177
];
52-
53-
const icons = [
54-
iconSVG,
55-
iconSVGLarge,
56-
"https://iconape.com/wp-content/files/yd/367773/svg/logo-linkedin-logo-icon-png-svg.png",
78+
const optionWithIcon: Option[] = [
79+
{
80+
value: "1",
81+
label: "Ebay",
82+
icon: iconUrl,
83+
},
5784
];
5885

5986
const optionsIcon: any = options.map((op, i) => ({ ...op, icon: icons[i] }));
@@ -68,7 +95,7 @@ export const Chromatic = () => (
6895
<Title title="Hovered" theme="light" level={4} />
6996
<DxcDropdown label="Hovered" options={options} onSelectOption={(value) => {}} />
7097
</ExampleContainer>
71-
<ExampleContainer pseudoState="pseudo-focus-visible">
98+
<ExampleContainer pseudoState="pseudo-focus">
7299
<Title title="Focused" theme="light" level={4} />
73100
<DxcDropdown label="Focused" options={options} onSelectOption={(value) => {}} />
74101
</ExampleContainer>
@@ -102,6 +129,10 @@ export const Chromatic = () => (
102129
<Title title="Only icon" theme="light" level={4} />
103130
<DxcDropdown options={options} onSelectOption={(value) => {}} icon={iconSVG} />
104131
</ExampleContainer>
132+
<ExampleContainer>
133+
<Title title="Only icon without caret" theme="light" level={4} />
134+
<DxcDropdown options={options} onSelectOption={(value) => {}} icon={hamburguerIcon} caretHidden />
135+
</ExampleContainer>
105136
<ExampleContainer>
106137
<Title title="Large icon" theme="light" level={4} />
107138
<DxcDropdown label="Large icon" options={options} onSelectOption={(value) => {}} icon={iconSVGLarge} />
@@ -191,59 +222,91 @@ export const Chromatic = () => (
191222
</>
192223
);
193224

194-
const DropdownWithOptions = () => (
195-
<ExampleContainer expanded>
196-
<Title title="Options" theme="light" level={4} />
197-
<DxcDropdown label="Options with icon" options={optionsIcon} onSelectOption={(value) => {}} />
198-
</ExampleContainer>
199-
);
200-
201-
const DropdownHoverOption = () => (
202-
<ExampleContainer pseudoState="pseudo-hover" expanded>
203-
<Title title="Hovered option" theme="light" level={4} />
204-
<DxcDropdown label="Hovered options" options={option} onSelectOption={(value) => {}} />
205-
</ExampleContainer>
206-
);
207-
208-
const DropdownActiveOption = () => (
209-
<ExampleContainer pseudoState="pseudo-active" expanded>
210-
<Title title="Actived option" theme="light" level={4} />
211-
<DxcDropdown label="Actived options" options={option} onSelectOption={(value) => {}} />
212-
</ExampleContainer>
213-
);
214-
215-
const DropdownWithOptionsIconAfter = () => (
216-
<ExampleContainer expanded>
217-
<Title title="Icon after options" theme="light" level={4} />
218-
<DxcDropdown
219-
label="Icon after options"
220-
options={optionsIcon}
221-
onSelectOption={(value) => {}}
222-
optionsIconPosition="after"
223-
/>
224-
</ExampleContainer>
225+
const DropdownListStates = () => (
226+
<>
227+
<Title title="Dropdown Menu" theme="light" level={2} />
228+
<Title title="Default with opened menu" theme="light" level={3} />
229+
<ExampleContainer>
230+
<div style={{ display: "flex", gap: "30px", flexDirection: "column", marginBottom: "80px" }}>
231+
<DxcDropdown label="Select a platform" options={defaultOptions} onSelectOption={(option) => {}} size="medium" />
232+
<DxcTextInput label="Your name" onChange={() => {}} />
233+
<DxcCheckbox
234+
label="You understand the selection and give your consent"
235+
onChange={() => {}}
236+
labelPosition="after"
237+
/>
238+
</div>
239+
</ExampleContainer>
240+
<Title title="Option states" theme="light" level={3} />
241+
<ExampleContainer pseudoState="pseudo-hover">
242+
<Title title="Hovered option" theme="light" level={4} />
243+
<DropdownMenu
244+
id="x"
245+
dropdownId="dX"
246+
iconsPosition="before"
247+
visualFocusIndex={-1}
248+
optionOnClick={(option) => {}}
249+
onKeyDown={(e) => {}}
250+
options={optionWithIcon}
251+
styles={{ width: 240 }}
252+
/>
253+
</ExampleContainer>
254+
<ExampleContainer pseudoState="pseudo-active">
255+
<Title title="Active option" theme="light" level={4} />
256+
<DropdownMenu
257+
id="x"
258+
dropdownId="dX"
259+
iconsPosition="before"
260+
visualFocusIndex={-1}
261+
optionOnClick={(option) => {}}
262+
onKeyDown={(e) => {}}
263+
options={optionWithIcon}
264+
styles={{ width: 240 }}
265+
/>
266+
</ExampleContainer>
267+
<ExampleContainer>
268+
<Title title="Focused option" theme="light" level={4} />
269+
<DropdownMenu
270+
id="x"
271+
dropdownId="dX"
272+
iconsPosition="before"
273+
visualFocusIndex={0}
274+
optionOnClick={(option) => {}}
275+
onKeyDown={(e) => {}}
276+
options={options}
277+
styles={{ width: 240 }}
278+
/>
279+
</ExampleContainer>
280+
<Title title="Icons" theme="light" level={3} />
281+
<ExampleContainer>
282+
<Title title="Before" theme="light" level={4} />
283+
<DropdownMenu
284+
id="x"
285+
dropdownId="dX"
286+
iconsPosition="before"
287+
visualFocusIndex={-1}
288+
optionOnClick={(option) => {}}
289+
onKeyDown={(e) => {}}
290+
options={optionsIcon}
291+
styles={{ width: 240 }}
292+
/>
293+
<Title title="After" theme="light" level={4} />
294+
<DropdownMenu
295+
id="x"
296+
dropdownId="dX"
297+
iconsPosition="after"
298+
visualFocusIndex={-1}
299+
optionOnClick={(option) => {}}
300+
onKeyDown={(e) => {}}
301+
options={optionsIcon}
302+
styles={{ width: 240 }}
303+
/>
304+
</ExampleContainer>
305+
</>
225306
);
226307

227-
export const DropdownOptions = DropdownWithOptions.bind({});
228-
DropdownOptions.play = async ({ canvasElement }) => {
229-
const canvas = within(canvasElement);
230-
await userEvent.click(canvas.getByRole("button"));
231-
};
232-
233-
export const DropdownHoveredOption = DropdownHoverOption.bind({});
234-
DropdownHoveredOption.play = async ({ canvasElement }) => {
235-
const canvas = within(canvasElement);
236-
await userEvent.click(canvas.getByRole("button"));
237-
};
238-
239-
export const DropdownActivedOption = DropdownActiveOption.bind({});
240-
DropdownActivedOption.play = async ({ canvasElement }) => {
241-
const canvas = within(canvasElement);
242-
await userEvent.click(canvas.getByRole("button"));
243-
};
244-
245-
export const DropdownOptionsIconAfter = DropdownWithOptionsIconAfter.bind({});
246-
DropdownOptionsIconAfter.play = async ({ canvasElement }) => {
308+
export const DropdownMenuStates = DropdownListStates.bind({});
309+
DropdownMenuStates.play = async ({ canvasElement }) => {
247310
const canvas = within(canvasElement);
248311
await userEvent.click(canvas.getByRole("button"));
249312
};

0 commit comments

Comments
 (0)