Skip to content

Commit 6fdb1aa

Browse files
committed
feat(form): call form object
1 parent 0fa1424 commit 6fdb1aa

File tree

4 files changed

+28
-9
lines changed

4 files changed

+28
-9
lines changed

docs/guide/data/form.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ createTodo.$onSuccess(() => {
5454
</template>
5555
```
5656

57+
You can also call the form object to submit it:
58+
59+
```ts
60+
const createTodo = store.todos.createForm()
61+
createTodo.title = 'My new todo'
62+
const todo = await createTodo()
63+
```
64+
5765
## Update Form
5866

5967
You can also create a form object to update an existing item with the `updateForm` method.

packages/playground/app/pages/todo/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ createTodo.$onSuccess(() => {
1717
:state="createTodo"
1818
:schema="createTodo.$schema"
1919
class="mb-4"
20-
@submit="createTodo.$submit()"
20+
@submit="createTodo()"
2121
>
2222
<UButtonGroup
2323
class="w-full"

packages/vue/src/api.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { createItem, deleteItem, findFirst, findMany, peekFirst, peekMany, subsc
77
import { pickNonSpecialProps } from '@rstore/shared'
88
import { tryOnScopeDispose } from '@vueuse/core'
99
import { ref, toValue, watch } from 'vue'
10-
import { createFormObject, type FormObjectAdditionalProps } from './form'
10+
import { createFormObject, type FormObject } from './form'
1111
import { createQuery } from './query'
1212

1313
export interface VueModelApi<
@@ -86,7 +86,7 @@ export interface VueModelApi<
8686
*/
8787
schema?: StandardSchemaV1
8888
},
89-
) => CreateFormObject<TModel, TModelDefaults, TModelList> & FormObjectAdditionalProps<ResolvedModelItem<TModel, TModelDefaults, TModelList>>
89+
) => CreateFormObject<TModel, TModelDefaults, TModelList> & FormObject<ResolvedModelItem<TModel, TModelDefaults, TModelList>>
9090

9191
/**
9292
* Update an item directly. For a more user-friendly way, use `updateForm` instead.
@@ -118,7 +118,7 @@ export interface VueModelApi<
118118
*/
119119
schema?: StandardSchemaV1
120120
},
121-
) => Promise<UpdateFormObject<TModel, TModelDefaults, TModelList> & FormObjectAdditionalProps<ResolvedModelItem<TModel, TModelDefaults, TModelList>>>
121+
) => Promise<UpdateFormObject<TModel, TModelDefaults, TModelList> & FormObject<ResolvedModelItem<TModel, TModelDefaults, TModelList>>>
122122

123123
/**
124124
* Find all items that match the query.

packages/vue/src/form.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ export interface FormObjectAdditionalProps<
3737
$onChange: EventHookOn<FormObjectChanged<TData>>
3838
}
3939

40+
export type FormObject<
41+
TData extends Record<string, any>,
42+
TSchema extends StandardSchemaV1 = StandardSchemaV1,
43+
TAdditionalProps = Record<string, never>,
44+
> = FormObjectBase<TData, TSchema> & FormObjectAdditionalProps<TData> & TAdditionalProps & Partial<TData> & (() => Promise<TData>)
45+
4046
export function createFormObject<
4147
TData extends Record<string, any> = Record<string, any>,
4248
TSchema extends StandardSchemaV1 = StandardSchemaV1,
@@ -134,7 +140,9 @@ export function createFormObject<
134140
})
135141
}
136142

137-
const proxy = new Proxy(form, {
143+
const base = form.$submit
144+
145+
const proxy = new Proxy(base, {
138146
set(target, key, value) {
139147
if (typeof key === 'string' && !key.startsWith('$')) {
140148
const oldValue = initialData[key as keyof typeof initialData]
@@ -147,17 +155,20 @@ export function createFormObject<
147155
}
148156
queueChange()
149157
}
150-
return Reflect.set(target, key, value)
158+
return Reflect.set(form, key, value)
159+
},
160+
get(target, key) {
161+
return Reflect.get(form, key)
151162
},
152-
ownKeys(target) {
153-
return Reflect.ownKeys(target).filter(key => typeof key !== 'string' || !key.startsWith('$'))
163+
ownKeys() {
164+
return Reflect.ownKeys(form).filter(key => typeof key !== 'string' || !key.startsWith('$'))
154165
},
155166
})
156167

157168
// Validate initially (don't await for it)
158169
queueChange()
159170

160-
return proxy as FormObjectBase<TData, TSchema> & FormObjectAdditionalProps<TData> & TAdditionalProps & Partial<TData>
171+
return proxy as FormObject<TData, TSchema, TAdditionalProps>
161172
}
162173

163174
/**

0 commit comments

Comments
 (0)