Skip to content

Commit 8216ae1

Browse files
committed
feat(Form): add id and saveToLocalStorage props to Form
1 parent 142b27e commit 8216ae1

File tree

3 files changed

+70
-3
lines changed

3 files changed

+70
-3
lines changed

components/custom/Form/Form.svelte

+57-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,65 @@
1+
<script>
2+
import { onMount } from 'svelte'
3+
import generateRandomID from '../../../random'
4+
5+
export let id = generateRandomID('form-')
6+
export let saveToLocalStorage = false
7+
8+
let form = {}
9+
10+
onMount(() => {
11+
listenForBlurOnForm(form)
12+
})
13+
14+
$: saveToLocalStorage && restoreFormValues(form)
15+
16+
const getValuesFromForm = (form) => Object.fromEntries(new FormData(form))
17+
18+
const storeFormValues = (formId, valuesFromForm) => {
19+
sessionStorage.setItem(formId, JSON.stringify(valuesFromForm))
20+
}
21+
22+
const setValuesOnForm = (form, valuesForForm) => {
23+
Object.entries(valuesForForm).forEach((keyValuePair) => {
24+
const [key, value] = keyValuePair
25+
form[key].value = value
26+
})
27+
}
28+
29+
const restoreFormValues = (form) => {
30+
const sessionStorageKey = form.id
31+
const formValuesJson = sessionStorage.getItem(sessionStorageKey)
32+
if (formValuesJson) {
33+
const valuesForForm = JSON.parse(formValuesJson)
34+
if (valuesForForm) {
35+
setValuesOnForm(form, valuesForForm)
36+
sessionStorage.removeItem(sessionStorageKey)
37+
}
38+
}
39+
}
40+
41+
const onBlur = (value) => {
42+
if (value) {
43+
storeFormValues(form.id, getValuesFromForm(form))
44+
}
45+
}
46+
47+
const listenForBlurOnForm = (form) => {
48+
const inputs = form.querySelectorAll('input, textarea')
49+
inputs.forEach((input) => {
50+
input.addEventListener('blur', function () {
51+
onBlur(this.value)
52+
})
53+
})
54+
}
55+
</script>
56+
157
<style>
258
:global(form > *) {
359
margin-top: 2rem;
460
}
561
</style>
662

7-
<form class="w-100 {$$props.class}" on:submit|preventDefault autocomplete="off">
63+
<form bind:this={form} {id} class="w-100 {$$props.class}" on:submit|preventDefault autocomplete="off">
864
<slot />
965
</form>

index.d.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ declare module '@silintl/ui-components' {
167167
interface MoneyInputProps extends svelte.JSX.HTMLAttributes<HTMLElementTagNameMap['div']> {
168168
label?: string
169169
value?: number
170+
name?: string
170171
placeholder?: string
171172
autofocus?: boolean
172173
disabled?: boolean
@@ -228,6 +229,7 @@ declare module '@silintl/ui-components' {
228229
interface TextAreaProps extends svelte.JSX.HTMLAttributes<HTMLElementTagNameMap['div']> {
229230
label?: string
230231
value?: string
232+
name?: string
231233
placeholder?: string
232234
rows?: number | string
233235
required?: boolean
@@ -241,6 +243,7 @@ declare module '@silintl/ui-components' {
241243
interface TextFieldProps extends svelte.JSX.HTMLAttributes<HTMLElementTagNameMap['div']> {
242244
label?: string
243245
value?: string
246+
name?: string
244247
placeholder?: string
245248
maxlength?: number
246249
autofocus?: boolean
@@ -300,7 +303,8 @@ declare module '@silintl/ui-components' {
300303
export class FileDropArea extends SvelteComponentTyped<FileDropAreaProps> {}
301304

302305
interface FormProps extends svelte.JSX.HTMLAttributes<HTMLElementTagNameMap['div']> {
303-
// no exported members
306+
id?: string
307+
saveToLocalStorage?: boolean
304308
}
305309
export class Form extends SvelteComponentTyped<FormProps> {}
306310

stories/Form.stories.svelte

+8-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
import { Meta, Template, Story } from '@storybook/addon-svelte-csf'
33
import { TextField } from '../components/mdc'
44
import { Form } from '../components/custom'
5+
import { copyAndModifyArgs } from './helpers'
56
67
const args = {
78
class: '', //only works for global classes
9+
id: '',
10+
saveToLocalStorage: false,
811
onSubmit: () => {},
912
}
1013
</script>
@@ -13,8 +16,12 @@ const args = {
1316

1417
<Template let:args>
1518
<Form on:submit={args.onSubmit} {...args}>
16-
<TextField />
19+
<TextField name='first'/>
1720
</Form>
1821
</Template>
1922

2023
<Story name="Default" {args} />
24+
25+
<Story name="Id" args={copyAndModifyArgs(args, { id: '123' })} />
26+
27+
<Story name="Save To Local Storage" args={copyAndModifyArgs(args, { saveToLocalStorage: true })} />

0 commit comments

Comments
 (0)