Skip to content

Commit 02ee359

Browse files
committed
feat(components): add Input & Select label props (closes #129)
1 parent 4c3547f commit 02ee359

File tree

8 files changed

+68
-4
lines changed

8 files changed

+68
-4
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ $ yarn add sveltejs-forms
126126
let:isSubmitting
127127
let:isValid
128128
>
129-
<Input name="user.email" placeholder="Email" /> <!-- nested field -->
129+
<Input name="user.email" label="Email" placeholder="e.g. user@example.com" /> <!-- nested field -->
130130
<Input name="password" type="password" placeholder="Password" />
131131
<Select name="language" options={langOptions} />
132132
<Choice name="os" options={osOptions} multiple />

src/App.svelte

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,16 @@
7979
on:reset={handleReset}
8080
let:isSubmitting
8181
let:isValid>
82-
<Input name="user.email" placeholder="Email" />
82+
<Input
83+
name="user.email"
84+
label="Email Address"
85+
placeholder="e.g. user@example.com" />
8386
<Input
8487
name="user.password"
8588
type="password"
8689
placeholder="Password"
8790
multiline />
88-
<Select name="user.language" options={langOptions} />
91+
<Select name="user.language" label="Language" options={langOptions} />
8992
<Choice name="user.os" options={osOptions} multiple />
9093

9194
<button type="reset">Reset</button>

src/components/Input.svelte

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import { FORM } from './Form.svelte';
55
66
export let name;
7+
export let label = '';
78
export let type = 'text';
89
export let placeholder = '';
910
export let multiline = false;
@@ -20,10 +21,14 @@
2021
</script>
2122

2223
<div class="field" class:error={get($touched, name) && get($errors, name)}>
24+
{#if label}
25+
<label for={name}>{label}</label>
26+
{/if}
2327
{#if multiline}
2428
<textarea
2529
{name}
2630
{placeholder}
31+
id={name}
2732
value={get($values, name)}
2833
on:blur={onBlur}
2934
on:change={onChange} />
@@ -32,6 +37,7 @@
3237
{name}
3338
{type}
3439
{placeholder}
40+
id={name}
3541
value={get($values, name)}
3642
on:blur={onBlur}
3743
on:change={onChange} />

src/components/Select.svelte

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import { FORM } from './Form.svelte';
55
66
export let name;
7+
export let label = '';
78
export let options;
89
910
const { touchField, setValue, values, errors, touched } = getContext(FORM);
@@ -18,8 +19,12 @@
1819
</script>
1920

2021
<div class="field" class:error={get($touched, name) && get($errors, name)}>
22+
{#if label}
23+
<label for={name}>{label}</label>
24+
{/if}
2125
<select
2226
{name}
27+
id={name}
2328
value={get($values, name)}
2429
on:change={onChange}
2530
on:blur={onBlur}>

tests/Form/__snapshots__/Form.spec.js.snap

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ exports[`Form matches snapshot 1`] = `
88
<div
99
class="field"
1010
>
11+
1112
<input
13+
id="user.email"
1214
name="user.email"
1315
placeholder="Email"
1416
type="text"
@@ -19,7 +21,9 @@ exports[`Form matches snapshot 1`] = `
1921
<div
2022
class="field"
2123
>
24+
2225
<select
26+
id="language"
2327
name="language"
2428
>
2529
<option
@@ -166,7 +170,9 @@ exports[`Form shows error message when schema is defined 1`] = `
166170
<div
167171
class="field error"
168172
>
173+
169174
<input
175+
id="user.email"
170176
name="user.email"
171177
placeholder="Email"
172178
type="text"
@@ -182,7 +188,9 @@ exports[`Form shows error message when schema is defined 1`] = `
182188
<div
183189
class="field"
184190
>
191+
185192
<select
193+
id="language"
186194
name="language"
187195
>
188196
<option

tests/Input/Input.spec.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ describe('Input', () => {
99
expect(container.firstChild).toMatchSnapshot();
1010
});
1111

12+
it('renders label', async () => {
13+
const { container } = await render(App, { props: { label: 'Email' } });
14+
expect(container.firstChild).toMatchSnapshot();
15+
});
16+
1217
it('updates form value on change', async () => {
1318
const { component, getByPlaceholderText } = await render(App);
1419

tests/Input/TestApp.svelte

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
export let validateOnChange = true;
99
export let form = null;
1010
export let multiline = false;
11+
export let label = '';
1112
</script>
1213

1314
<Form
@@ -18,7 +19,7 @@
1819
on:submit={onSubmit}
1920
let:isSubmitting
2021
bind:this={form}>
21-
<Input name="email" placeholder="Email" {multiline} />
22+
<Input name="email" {label} placeholder="Email" {multiline} />
2223

2324
<button type="submit" disabled={isSubmitting}>Sign in</button>
2425
</Form>

tests/Input/__snapshots__/Input.spec.js.snap

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,41 @@ exports[`Input matches snapshot 1`] = `
88
<div
99
class="field"
1010
>
11+
1112
<input
13+
id="email"
14+
name="email"
15+
placeholder="Email"
16+
type="text"
17+
/>
18+
19+
</div>
20+
21+
<button
22+
type="submit"
23+
>
24+
Sign in
25+
</button>
26+
</form>
27+
</div>
28+
`;
29+
30+
exports[`Input renders label 1`] = `
31+
<div>
32+
<form
33+
class="sveltejs-forms"
34+
>
35+
<div
36+
class="field"
37+
>
38+
<label
39+
for="email"
40+
>
41+
Email
42+
</label>
43+
44+
<input
45+
id="email"
1246
name="email"
1347
placeholder="Email"
1448
type="text"
@@ -33,7 +67,9 @@ exports[`Input renders textarea when multiline parameter is set 1`] = `
3367
<div
3468
class="field"
3569
>
70+
3671
<textarea
72+
id="email"
3773
name="email"
3874
placeholder="Email"
3975
/>

0 commit comments

Comments
 (0)