Skip to content

Commit 3ad1918

Browse files
committed
fix(choice): use empty array as multiple choice initial value
1 parent 20196d1 commit 3ad1918

File tree

9 files changed

+56
-42
lines changed

9 files changed

+56
-42
lines changed

jest.config.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
module.exports = {
22
transform: {
3-
'^.+\\.js$': 'babel-jest',
3+
'^.+\\.m?js$': 'babel-jest',
44
'^.+\\.svelte$': 'jest-transform-svelte',
55
},
6-
transformIgnorePatterns: ['/node_modules/(?!lodash-es).+\\.js$'],
7-
moduleFileExtensions: ['js', 'svelte'],
6+
transformIgnorePatterns: [
7+
'/node_modules/(?!(lodash-es|svelte-writable-derived)).+\\.m?js$',
8+
],
9+
moduleFileExtensions: ['js', 'svelte', 'mjs'],
810
roots: ['<rootDir>/tests'],
911
bail: false,
1012
verbose: false,

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@
5252
"yup": "0.27.0"
5353
},
5454
"dependencies": {
55-
"lodash-es": "^4.17.15"
55+
"lodash-es": "^4.17.15",
56+
"svelte-writable-derived": "^2.0.1"
5657
},
5758
"scripts": {
5859
"prettier": "prettier --check '**/*.{svelte, html, css, scss, stylus, js, ts, json, yml, md}' --plugin-search-dir=.",

src/App.svelte

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,6 @@
1919
user: { email: 'test@user.com' },
2020
});
2121
}, 2000);
22-
23-
/**
24-
* {
25-
* email: 'email@example.com',
26-
* password: '123456',
27-
* language: 'svelte',
28-
* os: ['osx', 'linux']
29-
* }
30-
*/
3122
}
3223
3324
const schema = yup.object().shape({
@@ -38,7 +29,10 @@
3829
.email(),
3930
password: yup.string().min(4),
4031
language: yup.string().required(),
41-
os: yup.string().required(),
32+
os: yup
33+
.array()
34+
.of(yup.string().required())
35+
.min(2),
4236
}),
4337
});
4438
@@ -92,7 +86,7 @@
9286
placeholder="Password"
9387
multiline />
9488
<Select name="user.language" options={langOptions} />
95-
<Choice name="user.os" options={osOptions} />
89+
<Choice name="user.os" options={osOptions} multiple />
9690

9791
<button type="reset">Reset</button>
9892
<button type="submit" disabled={isSubmitting}>Sign in</button>

src/components/Choice.svelte

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
<script>
22
import { getContext } from 'svelte';
33
import get from 'lodash-es/get';
4+
import set from 'lodash-es/set';
5+
import writableDerived from 'svelte-writable-derived';
46
import { FORM } from './Form.svelte';
57
68
export let name;
79
export let options;
810
export let multiple = false;
911
10-
let choiceValue = get($values, name, []);
11-
1212
const {
1313
touchField,
14-
setValue,
1514
validate,
1615
values,
1716
errors,
@@ -20,8 +19,13 @@
2019
validateOnChange,
2120
} = getContext(FORM);
2221
22+
const choice = writableDerived(
23+
values,
24+
$values => get($values, name, multiple ? [] : ''),
25+
newValue => set($values, name, newValue)
26+
);
27+
2328
function onChange() {
24-
setValue(name, choiceValue);
2529
touchField(name);
2630
2731
if (validateOnChange) {
@@ -46,7 +50,7 @@
4650
{name}
4751
on:change={onChange}
4852
on:blur={onBlur}
49-
bind:group={choiceValue}
53+
bind:group={$choice}
5054
value={option.id} />
5155
{:else}
5256
<input
@@ -55,7 +59,7 @@
5559
{name}
5660
on:change={onChange}
5761
on:blur={onBlur}
58-
bind:group={choiceValue}
62+
bind:group={$choice}
5963
value={option.id} />
6064
{/if}
6165
{#if option.title}

src/components/Form.svelte

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,24 @@
2323
2424
let isValid;
2525
let form;
26-
let fieldPaths;
26+
let fields;
2727
2828
onMount(() => {
29-
fieldPaths = new Set(
30-
Array.from(form.querySelectorAll('input,textarea,select'))
31-
.map(el => el.name)
32-
.filter(name => !!name)
33-
);
34-
fieldPaths.forEach(registerField);
35-
});
29+
fields = Array.from(form.querySelectorAll('input,textarea,select'))
30+
.filter(el => !!el.name)
31+
.map(el => ({ path: el.name }))
32+
.reduce((allElements, currentElement) => {
33+
const isCurrentElement = el => el.path === currentElement.path;
34+
const multiple = !!allElements.find(isCurrentElement);
3635
37-
function registerField(path) {
38-
$values = set($values, path, get(initialValues, path, ''));
39-
$touched = set($touched, path, false);
40-
}
36+
return [
37+
...allElements.filter(el => !isCurrentElement(el)),
38+
{ ...currentElement, multiple },
39+
];
40+
}, []);
41+
42+
resetForm();
43+
});
4144
4245
setContext(FORM, {
4346
touchField,
@@ -52,12 +55,17 @@
5255
});
5356
5457
function resetForm(data) {
55-
fieldPaths.forEach(path => {
56-
$values = set($values, path, get(data ? data : initialValues, path, ''));
58+
fields.forEach(({ path, multiple }) => {
59+
$values = set(
60+
$values,
61+
path,
62+
get(data ? data : initialValues, path, multiple ? [] : '')
63+
);
5764
$touched = set($touched, path, false);
5865
});
5966
$errors = {};
6067
$validatedValues = {};
68+
isValid = undefined;
6169
}
6270
6371
async function validate() {
@@ -95,7 +103,7 @@
95103
}
96104
97105
async function handleSubmit() {
98-
fieldPaths.forEach(name => ($touched = set($touched, name, true)));
106+
fields.forEach(({ path }) => ($touched = set($touched, path, true)));
99107
await validate();
100108
if (!schema || isValid) {
101109
$isSubmitting = true;

tests/Form/Form.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ describe('Form', () => {
173173
expect(component.form.$$.ctx.$values).toMatchObject({
174174
user: { email: '' },
175175
language: '',
176-
os: '',
176+
os: [],
177177
});
178178
expect(component.form.$$.ctx.$touched).toMatchObject({
179179
user: { email: false },
@@ -195,7 +195,7 @@ describe('Form', () => {
195195
expect(component.form.$$.ctx.$values).toMatchObject({
196196
user: { email: 'test@user.com' },
197197
language: '',
198-
os: '',
198+
os: [],
199199
});
200200
});
201201

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ Object {
124124
}
125125
`;
126126

127-
exports[`Form onSubmit event returns values, resetForm, setSubmitting 3`] = `undefined`;
127+
exports[`Form onSubmit event returns values, resetForm, setSubmitting 3`] = `Object {}`;
128128

129129
exports[`Form onSubmit event returns values, resetForm, setSubmitting 4`] = `
130130
Object {
@@ -139,7 +139,7 @@ Object {
139139
exports[`Form onSubmit event returns values, resetForm, setSubmitting 5`] = `
140140
Object {
141141
"language": "",
142-
"os": "",
142+
"os": Array [],
143143
"user": Object {
144144
"email": "",
145145
},

tests/Input/Input.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ describe('Input', () => {
5858
});
5959
await wait();
6060

61-
expect(component.form.$$.ctx.$errors).toEqual(undefined);
61+
expect(component.form.$$.ctx.$errors).toEqual({});
6262
});
6363

6464
it('validates on blur if validateOnBlur is true', async () => {
@@ -97,7 +97,7 @@ describe('Input', () => {
9797
});
9898
await fireEvent.blur(emailInput);
9999
await wait();
100-
expect(component.form.$$.ctx.$errors).toEqual(undefined);
100+
expect(component.form.$$.ctx.$errors).toEqual({});
101101
});
102102

103103
it('matches snapshot', async () => {

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8602,6 +8602,11 @@ svelte-preprocess@3.1.2:
86028602
detect-indent "^6.0.0"
86038603
strip-indent "^2.0.0"
86048604

8605+
svelte-writable-derived@^2.0.1:
8606+
version "2.0.1"
8607+
resolved "https://registry.yarnpkg.com/svelte-writable-derived/-/svelte-writable-derived-2.0.1.tgz#268165145bf44c9349b153381985516c76bf4a58"
8608+
integrity sha512-aQ0p4rpFjcfemh0mzXEzQcAbXCC9r8fnHo49Hlx/e14O2T44pJMYiuBwJcciGtDT+b8HRxikAS+DUdwJf3RIPw==
8609+
86058610
svelte@3.12.1:
86068611
version "3.12.1"
86078612
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.12.1.tgz#ddfacd43272ac3255907c682b74ee7d3d8b06b0c"

0 commit comments

Comments
 (0)