Skip to content

Commit 9acff4b

Browse files
authored
Merge pull request #70 from dbssman/feature/67-update-to-vue-33
📈 Update lib dependencies
2 parents d429d44 + 6fb4ab6 commit 9acff4b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+3082
-4631
lines changed

README.md

+57
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,63 @@ const successFn = (form: Record<string, any>) => {
113113
</script>
114114
```
115115

116+
### Typescript support
117+
118+
```vue
119+
<template>
120+
<form @submit.prevent="handleSubmit(successFn)">
121+
<q-input v-bind="register('name')" />
122+
<q-checkbox v-bind="register('married')" />
123+
<q-select v-bind="register('pet')" :options="['dog', 'cat', 'mouse']" />
124+
<input type="submit" />
125+
</form>
126+
</template>
127+
<script setup lang="ts">
128+
import { useFormHandler } from 'vue-form-handler'
129+
interface MyFormInterface {
130+
name: string
131+
married: boolean
132+
pet: string
133+
}
134+
const { register, handleSubmit } = useFormHandler<MyFormInterface>()
135+
const successFn = (form: MyFormInterface) => {
136+
console.log({ form })
137+
}
138+
</script>
139+
```
140+
141+
By doing this you will get full type support on all the interactions with any formhandler resource.
142+
143+
### Centralized and declarative form building
144+
145+
```vue
146+
<template>
147+
<form @submit.prevent="handleSubmit(successFn)">
148+
<q-input v-bind="form.name" />
149+
<q-checkbox v-bind="form.married" />
150+
<q-select v-bind="form.pet" :options="['dog', 'cat', 'mouse']" />
151+
<input type="submit" />
152+
</form>
153+
</template>
154+
<script setup lang="ts">
155+
import { useFormHandler } from 'vue-form-handler'
156+
interface MyFormInterface {
157+
name: string,
158+
married: boolean,
159+
pet: string,
160+
}
161+
const { build, handleSubmit } = useFormHandler<MyFormInterface>()
162+
const form = build({
163+
name: {}
164+
married: {}
165+
pet: {}
166+
})
167+
const successFn = (form: MyFormInterface) => {
168+
console.log({ form })
169+
}
170+
</script>
171+
```
172+
116173
### For a more advanced usage visit the [Docs](https://vue-form-handler.com)
117174

118175
## 📈 Project activity

docs/api/use-form-handler/build.md

+10-3
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,14 @@ Notice how the template looks much cleaner with this approach, and this helps us
7575
## Type Declarations
7676

7777
```ts
78-
export type Build = <T extends Record<string, RegisterOptions>>(
79-
configuration: T | Ref<T> | ComputedRef<T>
80-
) => ComputedRef<Record<keyof T, Readonly<RegisterReturn>>>
78+
export type Build<T extends Record<string, any> = Record<string, any>> = <
79+
TBuild extends Partial<T>,
80+
>(
81+
configuration: ComputableUnion<ConfigType<TBuild>>
82+
) => ComputedRef<
83+
Record<
84+
keyof TBuild,
85+
Readonly<RegisterReturn<Partial<Record<keyof TBuild, RegisterOptions>>>>
86+
>
87+
>
8188
```

docs/api/use-form-handler/clear-error.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,5 +106,5 @@ watch(
106106
## Type Declarations
107107

108108
```ts
109-
export type ClearError = (name?: string) => void
109+
export type ClearError = (name?: keyof T | undefined) => void
110110
```

docs/api/use-form-handler/clear-field.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,5 @@ const { register, clearField } = useFormHandler()
6262
## Type Declarations
6363

6464
```ts
65-
export type ClearField = (name: string) => Promise<void>
65+
export type ClearField = (name: keyof T) => Promise<void>
6666
```

docs/api/use-form-handler/form-state.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ const { register, formState } = useFormHandler()
5454
## Type Declarations
5555

5656
```ts
57-
export interface FormState {
57+
export interface FormState<T> {
5858
isDirty: boolean
5959
isTouched: boolean
6060
isValid: boolean
61-
dirty: Record<string, boolean>
62-
touched: Record<string, boolean>
63-
errors: Record<string, string>
61+
dirty: Record<keyof T, boolean>
62+
touched: Record<keyof T, boolean>
63+
errors: Record<keyof T, string | undefined>
6464
}
6565
```

docs/api/use-form-handler/handle-submit.md

+6-5
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,12 @@ const errorFn = (errors: any) => {
9595
## Type Declarations
9696

9797
```ts
98-
export type HandleSubmitSuccessFn = (values: Record<string, any>) => void
99-
export type HandleSubmitErrorFn = (errors: Record<string, string>) => void
98+
export type HandleSubmitErrorFn<T> = (errors: FormState<T>['errors']) => void
10099

101-
export type HandleSubmit = (
102-
successFn: HandleSubmitSuccessFn,
103-
errorFn?: HandleSubmitErrorFn
100+
export type HandleSubmitSuccessFn<T> = (values: Record<keyof T, any>) => void
101+
102+
export type HandleSubmit<T> = (
103+
successFn: HandleSubmitSuccessFn<T>,
104+
errorFn?: HandleSubmitErrorFn<T>
104105
) => void
105106
```

docs/api/use-form-handler/index.md

+42-32
Original file line numberDiff line numberDiff line change
@@ -165,37 +165,47 @@ Using the `always` validationMode will have a more significant impact on perform
165165
## Type Declarations
166166

167167
```ts
168-
export type Interceptor = (_: InterceptorParams) => Promise<boolean> | boolean
169-
170-
export type FormValidation = (
171-
values: Record<string, any>
172-
) => Promise<boolean> | boolean
173-
174-
export interface FormHandlerParams {
175-
initialValues?:
176-
| Record<string, any>
177-
| Ref<Record<string, any>>
178-
| ComputedRef<Record<string, any>>
179-
interceptor?: Interceptor
180-
validate?: FormValidation
181-
validationMode?: 'onChange' | 'onBlur' | 'onSubmit' | 'always'
182-
}
183-
export interface FormHandlerReturn {
184-
formState: FormState
185-
values: Record<string, any>
186-
clearError: ClearError
187-
clearField: ClearField
188-
handleSubmit: HandleSubmit
189-
modifiedValues: ModifiedValues
190-
register: Register
191-
register: Build
192-
resetField: ResetField
193-
resetForm: ResetForm
194-
setError: SetError
195-
setValue: SetValue
196-
triggerValidation: TriggerValidation
197-
unregister: (name: string) => void
168+
export declare const useFormHandler: <
169+
T extends Record<string, any> = Record<string, any>,
170+
R extends T = T,
171+
>({
172+
initialValues,
173+
interceptor,
174+
validate,
175+
validationMode,
176+
injectionKey,
177+
}?: FormHandlerParams<T, R>) => {
178+
build: Build<T>
179+
clearError: (name?: keyof T | undefined) => void
180+
clearField: (name: keyof T) => Promise<void>
181+
formState: {
182+
readonly isDirty: boolean
183+
readonly isTouched: boolean
184+
readonly isValid: boolean
185+
readonly dirty: import('@vue/reactivity').DeepReadonly<
186+
import('@vue/reactivity').UnwrapRef<Record<keyof T, boolean>>
187+
>
188+
readonly touched: import('@vue/reactivity').DeepReadonly<
189+
import('@vue/reactivity').UnwrapRef<Record<keyof T, boolean>>
190+
>
191+
readonly errors: import('@vue/reactivity').DeepReadonly<
192+
import('@vue/reactivity').UnwrapRef<Record<keyof T, string | undefined>>
193+
>
194+
}
195+
handleSubmit: (
196+
successFn: HandleSubmitSuccessFn,
197+
errorFn?: HandleSubmitErrorFn
198+
) => Promise<void>
199+
modifiedValues: <TModified extends T>() => TModified
200+
register: (name: keyof T, options?: RegisterOptions) => RegisterReturn
201+
resetField: (name: keyof T) => void
202+
resetForm: () => void
203+
setError: (name: keyof T, error: string) => void
204+
setValue: (name: keyof T, value?: any) => Promise<void>
205+
triggerValidation: (name?: keyof T | undefined) => Promise<void>
206+
unregister: (name: keyof T) => void
207+
values: import('@vue/reactivity').DeepReadonly<
208+
import('@vue/reactivity').UnwrapNestedRefs<T>
209+
>
198210
}
199-
200-
export type FormHandler = (_?: FormHandlerParams) => FormHandlerReturn
201211
```

docs/api/use-form-handler/modified-values.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# modifiedValues
22

3-
Returns the current modified fields of the form.
3+
Computed property that holds the current modified values of the form e.g values that are different from initial value if any initial value was indicated or different than the default value for the field if no initial values were given.
44

55
## Demo
66

@@ -15,7 +15,7 @@ Coming soon...
1515
<input type="text" v-bind="register('email')" />
1616
<input type="text" v-bind="register('summary')" />
1717
<pre>
18-
{{ modifiedValues() }} //should be initially
18+
{{ modifiedValues }} //should initially be an empty object
1919
</pre
2020
>
2121
<pre>
@@ -41,5 +41,6 @@ Let's say your form is initialized as above, because you're editing an existing
4141
## Type Declarations
4242

4343
```ts
44-
export type ModifiedValues = () => Record<string, any>
44+
type ModifiedValues = ComputedRef<Partial<T>>// T being the form interface
45+
4546
```

docs/api/use-form-handler/register.md

+27-30
Original file line numberDiff line numberDiff line change
@@ -243,38 +243,19 @@ Custom validations are kept very simple, can be synchronous or asynchronous. We
243243
## Type Declarations
244244

245245
```ts
246-
export interface BaseControlProps {
247-
name: string
248-
error: string
249-
ref: any
250-
modelValue: any
251-
'onUpdate:modelValue': (value: any) => Promise<void>
252-
onBlur: () => void
253-
onClear: () => void
254-
disabled?: boolean
255-
isDirty?: boolean
256-
isTouched?: boolean
257-
onChange?: (el: any) => Promise<void>
258-
}
259-
260-
export type ValidationFn = (
261-
value: any
262-
) => Promise<boolean | string> | boolean | string
263246

264-
export type Validations = Record<string, ValidationFn>
265-
266-
export interface ValidationWithMessage {
247+
interface ValidationWithMessage {
267248
value: number | string | RegExp
268249
message: string
269250
}
270251

271-
export interface ValidationsConfiguration {
252+
interface ValidationsConfiguration {
272253
required?: boolean | string
273-
min?: number | ValidationWithMessage
274-
max?: number | ValidationWithMessage
275-
minLength?: number | ValidationWithMessage
276-
maxLength?: number | ValidationWithMessage
277-
pattern?: string | RegExp | ValidationWithMessage
254+
min?: number | ValidationWithMessage<number>
255+
max?: number | ValidationWithMessage<number>
256+
minLength?: number | ValidationWithMessage<number>
257+
maxLength?: number | ValidationWithMessage<number>
258+
pattern?: string | RegExp | ValidationWithMessage<string | RegExp>
278259
}
279260

280261
export interface RegisterOptions extends ValidationsConfiguration {
@@ -284,12 +265,28 @@ export interface RegisterOptions extends ValidationsConfiguration {
284265
withDetails?: boolean
285266
disabled?: boolean
286267
useNativeValidation?: boolean
268+
dependentFields?: string[]
287269
}
288270

289-
export type RegisterReturn = BaseControlProps & ValidationsConfiguration
290-
291271
export type Register = (
292-
name: string,
272+
name: keyof T,
293273
options?: RegisterOptions
294-
) => RegisterReturn
274+
) => {
275+
pattern?: string | undefined
276+
required?: boolean | undefined
277+
min?: number | undefined
278+
max?: number | undefined
279+
minLength?: number | undefined
280+
maxLength?: number | undefined
281+
onChange?: (() => Promise<void>) | undefined
282+
isDirty?: boolean | undefined
283+
isTouched?: boolean | undefined
284+
disabled?: boolean | undefined
285+
name: keyof T
286+
modelValue: T[keyof T]
287+
'onUpdate:modelValue': (value: any) => Promise<void>
288+
ref: (fieldRef: any) => void
289+
onBlur: () => void
290+
onClear: () => Promise<void>
291+
}
295292
```

docs/api/use-form-handler/reset-field.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@ const { register, resetField } = useFormHandler({
3838
## Type Declarations
3939

4040
```ts
41-
export type ResetField = (name: string) => void
41+
export type ResetField = (name: keyof T) => void
4242
```

docs/api/use-form-handler/set-error.md

+1-4
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,5 @@ Notice how we use the combination of [clearError](/api/use-form-handler/clear-er
5151
## Type Declarations
5252

5353
```ts
54-
export type SetError = (
55-
name:string
56-
error:string
57-
) => void
54+
export type SetError = (name: keyof T, error: string) => void
5855
```

docs/api/use-form-handler/set-value.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,5 @@ Just calling `triggerValidation` after a value is set ensures the validations ar
7777
## Type Declarations
7878

7979
```ts
80-
export type SetValue = (name: string, value: any) => Promise<void>
80+
export type SetValue = (name: keyof T, value?: any) => Promise<void>
8181
```

docs/api/use-form-handler/trigger-validation.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,5 +108,5 @@ All the fields get validated when triggering the validation without specifying a
108108
## Type Declarations
109109

110110
```ts
111-
export type TriggerValidation = (name?: string) => Promise<void>
111+
export type TriggerValidation = (name?: keyof T | undefined) => Promise<void>
112112
```

docs/api/use-form-handler/unregister.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,5 @@ The field value or state is not recovered after un-registering it. It starts eve
4646
## Type Declarations
4747

4848
```ts
49-
export type Unregister = (name: string) => void
49+
export type Unregister = (name: keyof T) => void
5050
```

docs/api/use-form-handler/values.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,5 @@ const { register, values } = useFormHandler()
4040
## Type Declarations
4141

4242
```ts
43-
export type Values = Record<string, any>
43+
export type Values = Partial<T>
4444
```

0 commit comments

Comments
 (0)