Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/spicy-plants-begin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': minor
---

feat: expose `submitted` property of remote forms
2 changes: 2 additions & 0 deletions packages/kit/src/exports/public.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2191,6 +2191,8 @@ export type RemoteForm<Input extends RemoteFormInput | void, Output> = {
get result(): Output | undefined;
/** The number of pending submissions */
get pending(): number;
/** True if the form has been submitted at least once */
get submitted(): boolean;
/** Access form fields using object notation */
fields: RemoteFormFieldsRoot<Input>;
};
Expand Down
4 changes: 4 additions & 0 deletions packages/kit/src/runtime/app/server/remote/form.js
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@ export function form(validate_or_fn, maybe_fn) {
get: () => 0
});

Object.defineProperty(instance, 'submitted', {
get: () => false
});

Object.defineProperty(instance, 'preflight', {
// preflight is a noop on the server
value: () => instance
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ export function form(id) {
/** @type {Record<string, boolean>} */
let touched = {};

let submitted = false;
let submitted = $state(false);

/** @type {InternalRemoteFormIssue[] | null} */
let unread_issues = null;
Expand Down Expand Up @@ -625,6 +625,9 @@ export function form(id) {
pending: {
get: () => pending_count
},
submitted: {
get: () => submitted
},
Comment thread
hrueger marked this conversation as resolved.
preflight: {
/** @type {RemoteForm<T, U>['preflight']} */
value: (schema) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@

<p>set_message.input.message: {set_message.fields.message.value()}</p>
<p>set_message.pending: {set_message.pending}</p>
<p>set_message.submitted: {set_message.submitted}</p>
<p>set_message.result: {set_message.result}</p>

<hr />
Expand Down
6 changes: 6 additions & 0 deletions packages/kit/test/apps/async/test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,12 +90,18 @@ test.describe('remote functions', () => {
await expect(page.getByText('message.current:')).toHaveText('message.current: initial');
}
await expect(page.getByText('await get_message():')).toHaveText('await get_message(): initial');
await expect(page.getByText('set_message.submitted:')).toHaveText(
'set_message.submitted: false'
);

await page.fill('[data-unscoped] input', 'hello');
await page.getByText('set message').click();

if (javaScriptEnabled) {
await expect(page.getByText('set_message.pending:')).toHaveText('set_message.pending: 1');
await expect(page.getByText('set_message.submitted:')).toHaveText(
'set_message.submitted: true'
);
await page.getByText('resolve deferreds').click();
await expect(page.getByText('set_message.pending:')).toHaveText('set_message.pending: 0');
await expect(page.getByText('message.current:')).toHaveText('message.current: hello');
Expand Down
2 changes: 2 additions & 0 deletions packages/kit/types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2165,6 +2165,8 @@ declare module '@sveltejs/kit' {
get result(): Output | undefined;
/** The number of pending submissions */
get pending(): number;
/** True if the form has been submitted at least once */
get submitted(): boolean;
/** Access form fields using object notation */
fields: RemoteFormFieldsRoot<Input>;
};
Expand Down
Loading