Skip to content

Commit 50c11e2

Browse files
Xaohssvenvandescheur
authored andcommitted
✨ - feat: mult-select implemented
1 parent 31be205 commit 50c11e2

File tree

5 files changed

+235
-72
lines changed

5 files changed

+235
-72
lines changed

src/components/form/form/form.stories.tsx

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ const playFormComponent = async ({
6565
const schoolYear = canvas.getByLabelText("Select school year", {
6666
exact: false,
6767
});
68+
const favouriteSport = canvas.getByLabelText("Favourite sport");
6869
const address = canvas.getByLabelText("Address");
6970
const address_addition = canvas.getByLabelText("Address (addition)");
7071
const dateOfBirth = canvas.getByLabelText("Date of birth", { exact: false });
@@ -140,6 +141,18 @@ const playFormComponent = async ({
140141
await expect(math).toBeChecked();
141142
await expectLogToBe(canvasElement, "courses", ["english", "math"]);
142143

144+
await userEvent.click(favouriteSport, { delay: 100 });
145+
const football = await canvas.findByText("Football");
146+
const tennis = await canvas.findByText("Tennis");
147+
await userEvent.click(football, { delay: 10 });
148+
await userEvent.click(tennis, { delay: 10 });
149+
await expect(favouriteSport).toHaveTextContent("FootballTennis");
150+
await expectLogToBe(
151+
canvasElement,
152+
"favourite_sport",
153+
typedResults ? ["football", "tennis"] : ["football", "tennis"],
154+
);
155+
143156
await userEvent.click(yes);
144157
await expect(yes).toBeChecked();
145158
await expectLogToBe(canvasElement, "subscribe_newsletter", "yes");
@@ -204,6 +217,20 @@ export const FormComponent: Story = {
204217
{ label: "Science", value: "science" },
205218
],
206219
},
220+
{
221+
options: [
222+
{ label: "Football", value: "football" },
223+
{ label: "Basketball", value: "basketball" },
224+
{ label: "Tennis", value: "tennis" },
225+
{ label: "Swimming", value: "swimming" },
226+
{ label: "Running", value: "running" },
227+
{ label: "Cycling", value: "cycling" },
228+
],
229+
name: "favourite_sport",
230+
placeholder: "Select favourite sport",
231+
label: "Favourite sport",
232+
multiple: true,
233+
},
207234
{
208235
label: "Receive newsletter",
209236
name: "subscribe_newsletter",
@@ -214,6 +241,7 @@ export const FormComponent: Story = {
214241
{ label: "No", value: "no" },
215242
],
216243
},
244+
217245
{
218246
label: "I have read and accept the terms and conditions",
219247
name: "accept_tos",
@@ -287,6 +315,20 @@ export const UsageWithFormik: Story = {
287315
{ label: "Science", value: "science" },
288316
],
289317
},
318+
{
319+
options: [
320+
{ label: "Football", value: "football" },
321+
{ label: "Basketball", value: "basketball" },
322+
{ label: "Tennis", value: "tennis" },
323+
{ label: "Swimming", value: "swimming" },
324+
{ label: "Running", value: "running" },
325+
{ label: "Cycling", value: "cycling" },
326+
],
327+
name: "favourite_sport",
328+
placeholder: "Select favourite sport",
329+
label: "Favourite sport",
330+
multiple: true,
331+
},
290332
{
291333
label: "Receive newsletter",
292334
name: "subscribe_newsletter",

src/components/form/select/select.scss

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
--mykn-select-font-size: var(--typography-font-size-body-s);
55
--mykn-select-line-height: var(--typography-line-height-body-s);
66
--mykn-select-min-height: 42px;
7+
--mykn-select-spacing-pill: calc(var(--spacing-xs-h) / 4);
78

89
align-items: center;
910
background: var(--typography-color-background);
@@ -34,6 +35,15 @@
3435
--mykn-select-padding-v: var(--mykn-select-padding-xs, var(--spacing-xs-v));
3536
}
3637

38+
&--multiple#{&}--pad-v {
39+
--mykn-select-padding-v: calc(
40+
var(--mykn-select-padding-xs, var(--spacing-xs-v)) - var(
41+
--mykn-select-spacing-pill
42+
) *
43+
2
44+
);
45+
}
46+
3747
&--size-xl {
3848
--mykn-select-font-size: var(--typography-font-size-xl);
3949
--mykn-select-line-height: var(--typography-line-height-xl);
@@ -95,6 +105,26 @@
95105
text-overflow: ellipsis;
96106
}
97107

108+
&--multiple &__label {
109+
white-space: unset;
110+
overflow: visible;
111+
}
112+
113+
&__pill {
114+
display: inline-flex;
115+
align-items: center;
116+
padding: 0 0.5em; // TODO: spacing-h and spacing-v are too big for this. Add more tokens or hardcode?
117+
margin: var(--mykn-select-spacing-pill);
118+
border-radius: var(--border-radius-l);
119+
background-color: var(--page-color-highlight);
120+
font-size: var(--typography-font-size-body-xs);
121+
line-height: var(--typography-font-size-body-xs);
122+
123+
&-remove {
124+
margin-inline-start: 0.05em;
125+
}
126+
}
127+
98128
&__clear {
99129
appearance: none;
100130
background-color: transparent;

src/components/form/select/select.stories.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,3 +202,35 @@ export const Padding: Story = {
202202
);
203203
},
204204
};
205+
206+
export const SelectSingle: Story = {
207+
args: {
208+
options: [
209+
{ label: "Freshman", value: "FR" },
210+
{ label: "Sophomore", value: "SO" },
211+
{ label: "Junior", value: "JR" },
212+
{ label: "Senior", value: "SR" },
213+
{ label: "Graduate", value: "GR" },
214+
],
215+
name: "school_year",
216+
placeholder: "Select school year",
217+
},
218+
decorators: [FORM_TEST_DECORATOR],
219+
};
220+
221+
export const SelectMultiple: Story = {
222+
args: {
223+
options: [
224+
{ label: "Football", value: "football" },
225+
{ label: "Basketball", value: "basketball" },
226+
{ label: "Tennis", value: "tennis" },
227+
{ label: "Swimming", value: "swimming" },
228+
{ label: "Running", value: "running" },
229+
{ label: "Cycling", value: "cycling" },
230+
],
231+
name: "favourite_sport",
232+
placeholder: "Select favourite sport",
233+
multiple: true,
234+
},
235+
decorators: [FORM_TEST_DECORATOR],
236+
};

0 commit comments

Comments
 (0)