Skip to content

Commit 732de94

Browse files
committed
Adding more cases for issue 164.
1 parent b9b210d commit 732de94

File tree

6 files changed

+202
-2
lines changed

6 files changed

+202
-2
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script>
2+
export let data;
3+
</script>
4+
5+
<a href="/tests/issue-164-3/view">Start here</a>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { superValidate } from "$lib/server";
2+
import { z } from "zod";
3+
4+
const schema = z.object({
5+
name: z.string().min(1, "Cannot be empty"),
6+
});
7+
8+
export const load = async ({request, params}) => {
9+
const initialData = {
10+
name: "Testing"
11+
}
12+
const form = await superValidate(initialData, schema)
13+
console.log("🚀 ~ file: +page.server.ts:13 /issue-164-3", form)
14+
15+
return {form}
16+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<script>
2+
import { page } from '$app/stores';
3+
import { goto, invalidateAll } from '$app/navigation';
4+
import { superForm } from '$lib/client';
5+
import SuperDebug from '$lib/client/SuperDebug.svelte';
6+
7+
export let data;
8+
9+
const baseUrl = '/tests/issue-164-3';
10+
11+
const { form, errors, reset, enhance } = superForm(data.form, {
12+
taintedMessage: null
13+
});
14+
15+
$: editing = $page.params.viewOrEdit === 'edit';
16+
17+
const gotoView = async () => {
18+
goto(baseUrl + '/view');
19+
};
20+
const back = async () => {
21+
history.back();
22+
};
23+
const resetAndBack = async () => {
24+
console.log('BEFORE reset', $form, $page.data.form.data);
25+
reset();
26+
console.log('AFTER reset', $form, $page.data.form.data);
27+
await gotoView();
28+
console.log('AFTER goto', $form, $page.data.form.data);
29+
};
30+
const resetInvalidateBack = async () => {
31+
reset();
32+
await invalidateAll();
33+
gotoView();
34+
};
35+
</script>
36+
37+
<form method="POST" use:enhance>
38+
Name: <input name="name" bind:value={$form.name} disabled={!editing} />
39+
{#if $errors.name}
40+
<span style:color="red">{$errors.name}</span>
41+
{/if}
42+
</form>
43+
44+
{#if !editing}
45+
<a href={baseUrl + '/edit'}>Edit</a>
46+
{:else}
47+
<button on:click={gotoView}>Goto View</button>
48+
<button on:click={back}>Back to View</button>
49+
<button on:click={() => reset()}>Reset</button>
50+
<button on:click={resetAndBack}>Reset & back</button>
51+
<button on:click={resetInvalidateBack}>Reset, invalidate, back</button>
52+
53+
<ul>
54+
<li>Edit the name above</li>
55+
<li>Clicking the "Reset" will reset the form as expected</li>
56+
<li>Clicking the "Reset & back" button doesn't reset the form</li>
57+
<li>
58+
Clicking the browser's back button, "Goto View" or "Back to View" all
59+
are similar to the "Reset & back" button - form is not reset
60+
</li>
61+
<li>Clicking the "Reset, invalidate, back" button works</li>
62+
</ul>
63+
{/if}

src/routes/tests/issue-164/+page.svelte

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
import SuperDebug from '$lib/client/SuperDebug.svelte';
55
66
export let data: PageData;
7+
console.log('🚀 ~ file: +page.svelte:7 ~ page created:', data.form.data);
78
89
let isEditing = false;
910
const toggleEdit = (enable: boolean) => {
1011
isEditing = !!enable;
1112
};
1213
13-
$: console.log('data.form:', data.form.data);
14+
$: console.log('initial data.form:', data.form.data);
1415
</script>
1516

1617
<div>isEditing: {isEditing}</div>

src/routes/tests/issue-164/Form.svelte

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
onMount(() => {
1616
console.log('onMount', data.data);
1717
});
18+
19+
$: {
20+
console.log('Form initial data:', data.data);
21+
console.log('Form $form:', $form);
22+
}
1823
</script>
1924

2025
<SuperDebug data={$form} />
@@ -23,8 +28,9 @@
2328
type="button"
2429
on:click={() => {
2530
//debugger;
31+
console.log('Resetting, before:', $form, 'initial:', data.data);
2632
reset();
27-
console.log('Resetting', $form, data.data);
33+
console.log('Resetting, after:', $form, 'initial:', data.data);
2834
cancel?.();
2935
}}>Close Edit</button
3036
>
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
<script lang="ts">
2+
import {
3+
setError,
4+
setMessage,
5+
superForm,
6+
superValidateSync
7+
} from '$lib/client';
8+
import { page } from '$app/stores';
9+
import { z } from 'zod';
10+
11+
const loginSchema = z.object({
12+
email: z.string().email(),
13+
password: z.string().min(8)
14+
});
15+
16+
const { form, errors, message, constraints, enhance } = superForm(
17+
superValidateSync(loginSchema),
18+
{
19+
SPA: true,
20+
validators: loginSchema,
21+
onUpdate({ form }) {
22+
if (form.data.email.includes('spam')) {
23+
setError(form, 'email', 'Suspicious email address.');
24+
} else if (form.valid) {
25+
setMessage(form, 'Valid data!');
26+
// TODO: Do something with the validated data
27+
}
28+
},
29+
onError({ result, message }) {
30+
message.set(result.error.message);
31+
}
32+
}
33+
);
34+
</script>
35+
36+
<h3>#176</h3>
37+
38+
{#if $message}
39+
<div
40+
class="status"
41+
class:error={$page.status >= 400}
42+
class:success={$page.status == 200}
43+
>
44+
{$message}
45+
</div>
46+
{/if}
47+
48+
<form method="POST" use:enhance>
49+
{#if $errors._errors}
50+
<div class="status error">{$errors._errors}</div>
51+
{/if}
52+
53+
<label for="email">E-mail</label>
54+
<input
55+
name="email"
56+
type="email"
57+
data-invalid={$errors.email}
58+
bind:value={$form.email}
59+
{...$constraints.email}
60+
/>
61+
{#if $errors.email}
62+
<span class="invalid">{$errors.email}</span>
63+
{/if}
64+
65+
<label for="password">Password</label>
66+
<input
67+
name="password"
68+
type="password"
69+
data-invalid={$errors.password}
70+
bind:value={$form.password}
71+
{...$constraints.password}
72+
/>
73+
{#if $errors.password}
74+
<span class="invalid">{$errors.password}</span>
75+
{/if}
76+
77+
<button>Submit</button>
78+
</form>
79+
80+
<style>
81+
.invalid {
82+
color: red;
83+
}
84+
85+
.status {
86+
color: white;
87+
padding: 4px;
88+
padding-left: 8px;
89+
border-radius: 2px;
90+
font-weight: 500;
91+
}
92+
93+
.status.success {
94+
background-color: seagreen;
95+
}
96+
97+
.status.error {
98+
background-color: #ff2a02;
99+
}
100+
101+
input {
102+
background-color: #ddd;
103+
}
104+
105+
form {
106+
padding-top: 1rem;
107+
padding-bottom: 1rem;
108+
}
109+
</style>

0 commit comments

Comments
 (0)