@volverjs/form-vue 1.0.0-beta.25 → 1.0.0-beta.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -58,6 +58,10 @@ const form = createForm({
58
58
  // updateThrottle: number - default 500
59
59
  // continuousValidation: boolean - default false
60
60
  // sideEffects?: (data: any) => void
61
+ // scope?: string - Defines a unique scope for the form instance (singletons)
62
+ // class?: new (data?: any) => Type - Type constructor for form data
63
+ // Example:
64
+ // class: class User { constructor(data?: any) { Object.assign(this, data) } }
61
65
  })
62
66
 
63
67
  app.use(form)
@@ -161,6 +165,8 @@ const { VvForm, VvFormWrapper, VvFormField } = useForm(schema, {
161
165
  // updateThrottle: number - default 500
162
166
  // continuousValidation: boolean - default false
163
167
  // sideEffects?: (formData: any) => void
168
+ // scope?: string
169
+ // class?: new (data?: any) => Type
164
170
  })
165
171
  </script>
166
172
 
@@ -193,7 +199,8 @@ const {
193
199
  VvFormTemplate,
194
200
  formData,
195
201
  status,
196
- errors
202
+ errors,
203
+ wrappers
197
204
  } = useForm(schema, {
198
205
  lazyLoad: true
199
206
  })
@@ -206,7 +213,8 @@ export default {
206
213
  VvFormTemplate,
207
214
  formData,
208
215
  status,
209
- errors
216
+ errors,
217
+ wrappers
210
218
  }
211
219
  ```
212
220
 
@@ -218,13 +226,13 @@ The wrapper status is invalid if at least one of the fields inside it is invalid
218
226
  ```vue
219
227
  <template>
220
228
  <VvForm>
221
- <VvFormWrapper v-slot="{ invalid }">
229
+ <VvFormWrapper v-slot="{ invalid }" name="firstSection">
222
230
  <div class="form-section-1">
223
231
  <span v-if="invalid">There is a validation error</span>
224
232
  <!-- form fields of section 1 -->
225
233
  </div>
226
234
  </VvFormWrapper>
227
- <VvFormWrapper v-slot="{ invalid }">
235
+ <VvFormWrapper v-slot="{ invalid }" name="secondSection">
228
236
  <div class="form-section-2">
229
237
  <span v-if="invalid">There is a validation error</span>
230
238
  <!-- form fields of the section 2 -->
@@ -240,7 +248,7 @@ The wrapper status is invalid if at least one of the fields inside it is invalid
240
248
  <template>
241
249
  <VvForm>
242
250
  <!-- main VvFormWrapper -->
243
- <VvFormWrapper v-slot="{ invalid }">
251
+ <VvFormWrapper v-slot="{ invalid }" name="firstSection">
244
252
  <!-- add VvFormFields to wrapper -->
245
253
  <div class="form-section">
246
254
  <span v-if="invalid">There is a validation error</span>
@@ -257,6 +265,18 @@ The wrapper status is invalid if at least one of the fields inside it is invalid
257
265
  </template>
258
266
  ```
259
267
 
268
+ The `wrappers` map provides access to form wrapper data.
269
+ This allows for better control over form validation state and data management.
270
+
271
+ ```vue
272
+ <script setup>
273
+ const { wrappers } = useForm(schema)
274
+
275
+ // Access wrapper data
276
+ const isFirstSectionInvalid = computed(() => wrappers.get('firstSection').invalid)
277
+ </script>
278
+ ```
279
+
260
280
  ### VvFormField
261
281
 
262
282
  `VvFormField` allow you to render a form field or a [`@volverjs/ui-vue`](https://github.com/volverjs/ui-vue) input component inside a form.
package/dist/VvForm.d.ts CHANGED
@@ -1,19 +1,20 @@
1
1
  import { Component, InjectionKey, PropType, SlotsType } from 'vue';
2
2
  import { z } from 'zod';
3
- import { FormComponentOptions, FormSchema, FormTemplate, InjectedFormData } from './types';
3
+ import { FormComponentOptions, FormSchema, FormTemplate, InjectedFormData, InjectedFormWrapperData } from './types';
4
4
  import { FormStatus } from './enums';
5
- export declare function defineForm<Schema extends FormSchema>(schema: Schema, provideKey: InjectionKey<InjectedFormData<Schema>>, options?: FormComponentOptions<Schema>, VvFormTemplate?: Component): {
5
+ export declare function defineForm<Schema extends FormSchema, Type, FormTemplateComponent extends Component>(schema: Schema, provideKey: InjectionKey<InjectedFormData<Schema, Type>>, options: FormComponentOptions<Schema, Type>, VvFormTemplate: FormTemplateComponent, wrappers: Map<string, InjectedFormWrapperData<Schema>>): {
6
6
  clear: () => void;
7
7
  errors: import('vue').Ref<z.inferFormattedError<Schema, string> | undefined, z.inferFormattedError<Schema, string> | undefined>;
8
- formData: import('vue').Ref<Partial<z.TypeOf<Schema> | undefined>, Partial<z.TypeOf<Schema> | undefined>>;
8
+ formData: import('vue').Ref<(undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined, (undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined>;
9
9
  ignoreUpdates: import('@vueuse/core').IgnoredUpdater;
10
10
  invalid: import('vue').ComputedRef<boolean>;
11
11
  readonly: import('vue').Ref<boolean, boolean>;
12
12
  reset: () => void;
13
13
  status: import('vue').Ref<FormStatus | undefined, FormStatus | undefined>;
14
+ wrappers: Map<string, InjectedFormWrapperData<Schema>>;
14
15
  stopUpdatesWatch: import('vue').WatchStopHandle;
15
16
  submit: () => Promise<boolean>;
16
- validate: (value?: Partial<z.TypeOf<Schema> | undefined>, fields?: Set<string>) => Promise<boolean>;
17
+ validate: (value?: (undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined, fields?: Set<string>) => Promise<boolean>;
17
18
  VvForm: import('vue').DefineComponent<import('vue').ExtractPropTypes<{
18
19
  continuousValidation: {
19
20
  type: BooleanConstructor;
@@ -32,13 +33,13 @@ export declare function defineForm<Schema extends FormSchema>(schema: Schema, pr
32
33
  default: string;
33
34
  };
34
35
  template: {
35
- type: PropType<FormTemplate<Schema>>;
36
+ type: PropType<FormTemplate<Schema, Type>>;
36
37
  default: undefined;
37
38
  };
38
39
  }>, {
39
40
  clear: () => void;
40
41
  errors: Readonly<import('vue').Ref<import('vue').DeepReadonly<z.inferFormattedError<Schema, string>> | undefined, import('vue').DeepReadonly<z.inferFormattedError<Schema, string>> | undefined>>;
41
- formData: import('vue').Ref<Partial<z.TypeOf<Schema> | undefined>, Partial<z.TypeOf<Schema> | undefined>>;
42
+ formData: import('vue').Ref<(undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined, (undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined>;
42
43
  ignoreUpdates: import('@vueuse/core').IgnoredUpdater;
43
44
  invalid: import('vue').ComputedRef<boolean>;
44
45
  isReadonly: import('vue').Ref<boolean, boolean>;
@@ -46,7 +47,8 @@ export declare function defineForm<Schema extends FormSchema>(schema: Schema, pr
46
47
  status: Readonly<import('vue').Ref<FormStatus | undefined, FormStatus | undefined>>;
47
48
  stopUpdatesWatch: import('vue').WatchStopHandle;
48
49
  submit: () => Promise<boolean>;
49
- validate: (value?: Partial<z.TypeOf<Schema> | undefined>, fields?: Set<string>) => Promise<boolean>;
50
+ validate: (value?: (undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined, fields?: Set<string>) => Promise<boolean>;
51
+ wrappers: Map<string, InjectedFormWrapperData<Schema>>;
50
52
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("invalid" | "valid" | "reset" | "submit" | "update:modelValue" | "update:readonly")[], "invalid" | "valid" | "reset" | "submit" | "update:modelValue" | "update:readonly", import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
51
53
  continuousValidation: {
52
54
  type: BooleanConstructor;
@@ -65,7 +67,7 @@ export declare function defineForm<Schema extends FormSchema>(schema: Schema, pr
65
67
  default: string;
66
68
  };
67
69
  template: {
68
- type: PropType<FormTemplate<Schema>>;
70
+ type: PropType<FormTemplate<Schema, Type>>;
69
71
  default: undefined;
70
72
  };
71
73
  }>> & Readonly<{
@@ -78,22 +80,23 @@ export declare function defineForm<Schema extends FormSchema>(schema: Schema, pr
78
80
  }>, {
79
81
  readonly: boolean;
80
82
  tag: string;
81
- template: FormTemplate<Schema>;
83
+ template: FormTemplate<Schema, Type>;
82
84
  continuousValidation: boolean;
83
85
  modelValue: Record<string, any>;
84
86
  }, SlotsType<{
85
87
  default: {
86
88
  errors: Readonly<import('vue').Ref<import('vue').DeepReadonly<z.inferFormattedError<Schema, string>> | undefined, import('vue').DeepReadonly<z.inferFormattedError<Schema, string>> | undefined>>;
87
- formData: import('vue').Ref<Partial<z.TypeOf<Schema> | undefined>, Partial<z.TypeOf<Schema> | undefined>>;
89
+ formData: import('vue').Ref<(undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined, (undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined>;
88
90
  ignoreUpdates: import('@vueuse/core').IgnoredUpdater;
89
91
  invalid: import('vue').ComputedRef<boolean>;
90
92
  readonly: import('vue').Ref<boolean, boolean>;
91
93
  status: Readonly<import('vue').Ref<FormStatus | undefined, FormStatus | undefined>>;
92
94
  stopUpdatesWatch: import('vue').WatchStopHandle;
93
95
  submit: () => Promise<boolean>;
94
- validate: (value?: Partial<z.TypeOf<Schema> | undefined>, fields?: Set<string>) => Promise<boolean>;
96
+ validate: (value?: (undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined, fields?: Set<string>) => Promise<boolean>;
95
97
  clear: () => void;
96
98
  reset: () => void;
99
+ wrappers: typeof wrappers;
97
100
  };
98
101
  }>, {}, {}, "invalid" | "valid" | "reset" | "status" | "readonly" | "clear" | "submit" | "errors" | "tag" | "template" | "validate", import('vue').ComponentProvideOptions, true, {}, any>;
99
102
  };
@@ -1,8 +1,8 @@
1
1
  import { Component, ConcreteComponent, DeepReadonly, InjectionKey, PropType, Ref, SlotsType } from 'vue';
2
- import { inferFormattedError, TypeOf, z } from 'zod';
2
+ import { inferFormattedError, z } from 'zod';
3
3
  import { FormFieldType } from './enums';
4
4
  import { FormFieldComponentOptions, FormSchema, InjectedFormData, InjectedFormFieldData, InjectedFormWrapperData, Path } from './types';
5
- export declare function defineFormField<Schema extends FormSchema>(formProvideKey: InjectionKey<InjectedFormData<Schema>>, wrapperProvideKey: InjectionKey<InjectedFormWrapperData<Schema>>, formFieldInjectionKey: InjectionKey<InjectedFormFieldData<Schema>>, options?: FormFieldComponentOptions): import('vue').DefineComponent<import('vue').ExtractPropTypes<{
5
+ export declare function defineFormField<Schema extends FormSchema, Type>(formProvideKey: InjectionKey<InjectedFormData<Schema, Type>>, wrapperProvideKey: InjectionKey<InjectedFormWrapperData<Schema>>, formFieldInjectionKey: InjectionKey<InjectedFormFieldData<Schema>>, options?: FormFieldComponentOptions): import('vue').DefineComponent<import('vue').ExtractPropTypes<{
6
6
  type: {
7
7
  type: PropType<`${FormFieldType}`>;
8
8
  validator: (value: FormFieldType) => boolean;
@@ -117,14 +117,14 @@ export declare function defineFormField<Schema extends FormSchema>(formProvideKe
117
117
  [key: string]: any;
118
118
  default: {
119
119
  errors: z.inferFormattedError<Schema>;
120
- formData?: Partial<TypeOf<Schema>>;
120
+ formData?: undefined extends Type ? Partial<z.infer<Schema>> : Type;
121
121
  formErrors?: DeepReadonly<inferFormattedError<Schema, string>>;
122
122
  invalid: boolean;
123
123
  invalidLabel?: string[];
124
124
  modelValue: any;
125
125
  onUpdate: (value: unknown) => void;
126
126
  readonly: boolean;
127
- submit?: InjectedFormData<Schema>["submit"];
128
- validate?: InjectedFormData<Schema>["validate"];
127
+ submit?: InjectedFormData<Schema, Type>["submit"];
128
+ validate?: InjectedFormData<Schema, Type>["validate"];
129
129
  };
130
130
  }>, {}, {}, "invalid" | "type" | "errors" | "component" | "hasProps" | "invalidLabel" | "is", import('vue').ComponentProvideOptions, true, {}, any>;
@@ -1,7 +1,7 @@
1
1
  import { Component, DeepReadonly, InjectionKey, PropType, Ref, SlotsType } from 'vue';
2
- import { inferFormattedError, TypeOf, z } from 'zod';
2
+ import { inferFormattedError, z } from 'zod';
3
3
  import { FormSchema, InjectedFormData, InjectedFormFieldsGroupData, InjectedFormWrapperData, Path } from './types';
4
- export declare function defineFormFieldsGroup<Schema extends FormSchema>(formProvideKey: InjectionKey<InjectedFormData<Schema>>, wrapperProvideKey: InjectionKey<InjectedFormWrapperData<Schema>>, formFieldsGroupInjectionKey: InjectionKey<InjectedFormFieldsGroupData<Schema>>): import('vue').DefineComponent<import('vue').ExtractPropTypes<{
4
+ export declare function defineFormFieldsGroup<Schema extends FormSchema, Type>(formProvideKey: InjectionKey<InjectedFormData<Schema, Type>>, wrapperProvideKey: InjectionKey<InjectedFormWrapperData<Schema>>, formFieldsGroupInjectionKey: InjectionKey<InjectedFormFieldsGroupData<Schema>>): import('vue').DefineComponent<import('vue').ExtractPropTypes<{
5
5
  is: {
6
6
  type: PropType<Component | string>;
7
7
  default: undefined;
@@ -94,7 +94,7 @@ export declare function defineFormFieldsGroup<Schema extends FormSchema>(formPro
94
94
  [key: string]: any;
95
95
  default: {
96
96
  errors?: Record<Path<z.infer<Schema>>, z.inferFormattedError<Schema>>;
97
- formData?: Partial<TypeOf<Schema>>;
97
+ formData?: undefined extends Type ? Partial<z.infer<Schema>> : Type;
98
98
  formErrors?: DeepReadonly<inferFormattedError<Schema, string>>;
99
99
  invalid: boolean;
100
100
  invalids: Record<string, boolean>;
@@ -103,7 +103,7 @@ export declare function defineFormFieldsGroup<Schema extends FormSchema>(formPro
103
103
  onUpdate: (value: Record<string, any>) => void;
104
104
  onUpdateField: (name: string, value: any) => void;
105
105
  readonly: boolean;
106
- submit?: InjectedFormData<Schema>["submit"];
107
- validate?: InjectedFormData<Schema>["validate"];
106
+ submit?: InjectedFormData<Schema, Type>["submit"];
107
+ validate?: InjectedFormData<Schema, Type>["validate"];
108
108
  };
109
109
  }>, {}, {}, "invalid" | "errors" | "component" | "hasProps" | "is" | "invalidLabels", import('vue').ComponentProvideOptions, true, {}, any>;
@@ -1,10 +1,10 @@
1
1
  import { Component, DeepReadonly, InjectionKey, PropType, SlotsType, VNode } from 'vue';
2
2
  import { FormSchema, InjectedFormData, FormTemplate } from './types';
3
- import { inferFormattedError, TypeOf } from 'zod';
3
+ import { z, inferFormattedError } from 'zod';
4
4
  import { FormStatus } from './enums';
5
- export declare function defineFormTemplate<Schema extends FormSchema>(formProvideKey: InjectionKey<InjectedFormData<Schema>>, VvFormField: Component): import('vue').DefineComponent<import('vue').ExtractPropTypes<{
5
+ export declare function defineFormTemplate<Schema extends FormSchema, Type>(formProvideKey: InjectionKey<InjectedFormData<Schema, Type>>, VvFormField: Component): import('vue').DefineComponent<import('vue').ExtractPropTypes<{
6
6
  schema: {
7
- type: PropType<FormTemplate<Schema>>;
7
+ type: PropType<FormTemplate<Schema, Type>>;
8
8
  required: true;
9
9
  };
10
10
  scope: {
@@ -17,7 +17,7 @@ export declare function defineFormTemplate<Schema extends FormSchema>(formProvid
17
17
  [key: string]: any;
18
18
  }>[] | undefined)[]) | undefined, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
19
19
  schema: {
20
- type: PropType<FormTemplate<Schema>>;
20
+ type: PropType<FormTemplate<Schema, Type>>;
21
21
  required: true;
22
22
  };
23
23
  scope: {
@@ -29,12 +29,12 @@ export declare function defineFormTemplate<Schema extends FormSchema>(formProvid
29
29
  }, SlotsType<{
30
30
  default: {
31
31
  errors?: DeepReadonly<inferFormattedError<Schema, string>>;
32
- formData?: Partial<TypeOf<Schema>>;
32
+ formData?: undefined extends Type ? Partial<z.infer<Schema>> : Type;
33
33
  invalid: boolean;
34
34
  status?: FormStatus;
35
- submit?: InjectedFormData<Schema>["submit"];
36
- validate?: InjectedFormData<Schema>["validate"];
37
- clear?: InjectedFormData<Schema>["clear"];
38
- reset?: InjectedFormData<Schema>["reset"];
35
+ submit?: InjectedFormData<Schema, Type>["submit"];
36
+ validate?: InjectedFormData<Schema, Type>["validate"];
37
+ clear?: InjectedFormData<Schema, Type>["clear"];
38
+ reset?: InjectedFormData<Schema, Type>["reset"];
39
39
  };
40
40
  }>, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
@@ -1,7 +1,7 @@
1
1
  import { DeepReadonly, InjectionKey, Ref, SlotsType } from 'vue';
2
- import { inferFormattedError, TypeOf, z } from 'zod';
2
+ import { inferFormattedError, z } from 'zod';
3
3
  import { FormSchema, InjectedFormData, InjectedFormWrapperData } from './types';
4
- export declare function defineFormWrapper<Schema extends FormSchema>(formProvideKey: InjectionKey<InjectedFormData<Schema>>, wrapperProvideKey: InjectionKey<InjectedFormWrapperData<Schema>>): import('vue').DefineComponent<import('vue').ExtractPropTypes<{
4
+ export declare function defineFormWrapper<Schema extends FormSchema, Type>(formProvideKey: InjectionKey<InjectedFormData<Schema, Type>>, wrapperProvideKey: InjectionKey<InjectedFormWrapperData<Schema>>): import('vue').DefineComponent<import('vue').ExtractPropTypes<{
5
5
  name: {
6
6
  type: StringConstructor;
7
7
  required: true;
@@ -13,13 +13,13 @@ export declare function defineFormWrapper<Schema extends FormSchema>(formProvide
13
13
  }>, {
14
14
  clear: (() => void) | undefined;
15
15
  errors: Readonly<Ref<DeepReadonly<inferFormattedError<Schema, string>> | undefined, DeepReadonly<inferFormattedError<Schema, string>> | undefined>> | undefined;
16
- fields: Ref<Set<string> & Omit<Set<string>, keyof Set<any>>, Set<string> | (Set<string> & Omit<Set<string>, keyof Set<any>>)>;
16
+ fields: Ref<Map<string, string> & Omit<Map<string, string>, keyof Map<any, any>>, Map<string, string> | (Map<string, string> & Omit<Map<string, string>, keyof Map<any, any>>)>;
17
17
  fieldsErrors: Ref<Map<string, inferFormattedError<Schema, string>>, Map<string, inferFormattedError<Schema, string>>>;
18
- formData: Ref<Partial<TypeOf<Schema>> | undefined, Partial<TypeOf<Schema>> | undefined> | undefined;
18
+ formData: Ref<(undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined, (undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined> | undefined;
19
19
  invalid: import('vue').ComputedRef<boolean>;
20
20
  reset: (() => void) | undefined;
21
21
  submit: (() => Promise<boolean>) | undefined;
22
- validate: ((formData?: Partial<TypeOf<Schema>> | undefined, fields?: Set<string>) => Promise<boolean>) | undefined;
22
+ validate: ((formData?: (undefined extends Type ? Partial<z.TypeOf<Schema>> : Type) | undefined, fields?: Set<string>) => Promise<boolean>) | undefined;
23
23
  validateWrapper: () => Promise<boolean>;
24
24
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("invalid" | "valid")[], "invalid" | "valid", import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
25
25
  name: {
@@ -38,14 +38,14 @@ export declare function defineFormWrapper<Schema extends FormSchema>(formProvide
38
38
  }, SlotsType<{
39
39
  default: {
40
40
  errors?: DeepReadonly<z.inferFormattedError<Schema>>;
41
- formData?: Partial<TypeOf<Schema>>;
41
+ formData?: undefined extends Type ? Partial<z.infer<Schema>> : Type;
42
42
  formErrors?: DeepReadonly<inferFormattedError<Schema, string>>;
43
43
  invalid: boolean;
44
- submit?: InjectedFormData<Schema>["submit"];
45
- validate?: InjectedFormData<Schema>["validate"];
44
+ submit?: InjectedFormData<Schema, Type>["submit"];
45
+ validate?: InjectedFormData<Schema, Type>["validate"];
46
46
  validateWrapper?: () => Promise<boolean>;
47
47
  fieldsErrors: Map<string, inferFormattedError<Schema, string>>;
48
- clear?: InjectedFormData<Schema>["clear"];
49
- reset?: InjectedFormData<Schema>["reset"];
48
+ clear?: InjectedFormData<Schema, Type>["clear"];
49
+ reset?: InjectedFormData<Schema, Type>["reset"];
50
50
  };
51
51
  }>, {}, {}, "invalid" | "reset" | "clear" | "submit" | "errors" | "tag" | "validate" | "formData" | "fields" | "fieldsErrors" | "validateWrapper", import('vue').ComponentProvideOptions, true, {}, any>;