@strictly/react-form 0.0.9 → 0.0.10

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.
Files changed (35) hide show
  1. package/.out/core/mobx/form_presenter.d.ts +5 -5
  2. package/.out/core/mobx/form_presenter.js +8 -6
  3. package/.out/core/mobx/hooks.d.ts +24 -4
  4. package/.out/core/mobx/hooks.js +24 -3
  5. package/.out/core/mobx/specs/form_presenter.tests.js +10 -5
  6. package/.out/core/mobx/sub_form_field_adapters.d.ts +2 -2
  7. package/.out/mantine/create_fields_view.d.ts +9 -1
  8. package/.out/mantine/create_fields_view.js +13 -1
  9. package/.out/mantine/hooks.d.ts +2 -1
  10. package/.out/mantine/hooks.js +1 -1
  11. package/.out/mantine/specs/create_fields_view.tests.d.ts +1 -0
  12. package/.out/mantine/specs/create_fields_view.tests.js +17 -0
  13. package/.out/mantine/specs/fields_view_hooks.stories.d.ts +6 -2
  14. package/.out/mantine/specs/fields_view_hooks.stories.js +26 -7
  15. package/.out/mantine/specs/fields_view_hooks.tests.js +21 -1
  16. package/.out/tsconfig.tsbuildinfo +1 -1
  17. package/.turbo/turbo-build.log +7 -7
  18. package/.turbo/turbo-check-types.log +1 -1
  19. package/.turbo/turbo-release$colon$exports.log +1 -1
  20. package/core/mobx/form_presenter.ts +15 -14
  21. package/core/mobx/hooks.tsx +196 -0
  22. package/core/mobx/specs/form_presenter.tests.ts +24 -5
  23. package/core/mobx/sub_form_field_adapters.ts +14 -3
  24. package/dist/index.cjs +233 -197
  25. package/dist/index.d.cts +52 -26
  26. package/dist/index.d.ts +52 -26
  27. package/dist/index.js +232 -196
  28. package/mantine/create_fields_view.tsx +66 -31
  29. package/mantine/hooks.tsx +9 -6
  30. package/mantine/specs/__snapshots__/fields_view_hooks.tests.tsx.snap +194 -197
  31. package/mantine/specs/create_fields_view.tests.ts +29 -0
  32. package/mantine/specs/fields_view_hooks.stories.tsx +58 -15
  33. package/mantine/specs/fields_view_hooks.tests.tsx +26 -0
  34. package/package.json +1 -1
  35. package/core/mobx/hooks.ts +0 -112
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Maybe, ElementOfArray, StringConcatOf, StringKeyOf as StringKeyOf$1, ExhaustiveArrayOfUnion, FriendlyExhaustiveArrayOfUnion } from '@strictly/base';
1
+ import { Maybe, ElementOfArray, FriendlyExhaustiveArrayOfUnion, StringConcatOf, StringKeyOf as StringKeyOf$1, ExhaustiveArrayOfUnion } from '@strictly/base';
2
2
  import { Type, ValueOfType, ReadonlyTypeOfType, FlattenedTypesOfType, ListTypeDef, FlattenedValuesOfType, MobxValueOfType, Accessor, Validator, UnionTypeDef, ValueTypesOfDiscriminatedUnion, LiteralTypeDef } from '@strictly/define';
3
3
  import { ValueOf, SimplifyDeep, ReadonlyDeep, StringKeyOf, Simplify } from 'type-fest';
4
4
  import { ComponentType, ComponentProps, ForwardRefExoticComponent, PropsWithoutRef, DependencyList } from 'react';
@@ -117,9 +117,9 @@ type FlattenedErrors<ValuePathsToAdapters extends Readonly<Record<string, FieldA
117
117
  type ValuePathsToAdaptersOf<TypePathsToAdapters extends Partial<Readonly<Record<string, FieldAdapter>>>, ValuePathsToTypePaths extends Readonly<Record<string, string>>> = keyof TypePathsToAdapters extends ValueOf<ValuePathsToTypePaths> ? {
118
118
  readonly [K in keyof ValuePathsToTypePaths as unknown extends TypePathsToAdapters[ValuePathsToTypePaths[K]] ? never : K]: NonNullable<TypePathsToAdapters[ValuePathsToTypePaths[K]]>;
119
119
  } : never;
120
- declare class FormPresenter<T extends Type, ValueToTypePaths extends Readonly<Record<string, string>>, TypePathsToAdapters extends FlattenedTypePathsToAdaptersOf<FlattenedValuesOfType<T, '*'>, ValueOfType<ReadonlyTypeOfType<T>>>, ValuePathsToAdapters extends ValuePathsToAdaptersOf<TypePathsToAdapters, ValueToTypePaths> = ValuePathsToAdaptersOf<TypePathsToAdapters, ValueToTypePaths>> {
120
+ declare abstract class FormPresenter<T extends Type, ValueToTypePaths extends Readonly<Record<string, string>>, TypePathsToAdapters extends FlattenedTypePathsToAdaptersOf<FlattenedValuesOfType<T, '*'>, ValueOfType<ReadonlyTypeOfType<T>>>, ValuePathsToAdapters extends ValuePathsToAdaptersOf<TypePathsToAdapters, ValueToTypePaths> = ValuePathsToAdaptersOf<TypePathsToAdapters, ValueToTypePaths>> {
121
121
  readonly type: T;
122
- private readonly adapters;
122
+ protected readonly adapters: TypePathsToAdapters;
123
123
  constructor(type: T, adapters: TypePathsToAdapters);
124
124
  private maybeGetAdapterForValuePath;
125
125
  private getAdapterForValuePath;
@@ -130,12 +130,12 @@ declare class FormPresenter<T extends Type, ValueToTypePaths extends Readonly<Re
130
130
  removeListItem<K extends keyof FlattenedListTypesOfType<T>>(model: FormModel<T, ValueToTypePaths, TypePathsToAdapters, ValuePathsToAdapters>, elementValuePath: `${K}.${number}`): void;
131
131
  private internalSetFieldValue;
132
132
  clearFieldError<K extends keyof ValuePathsToAdapters>(model: FormModel<T, ValueToTypePaths, TypePathsToAdapters, ValuePathsToAdapters>, valuePath: K): void;
133
- clearFieldValue<K extends StringKeyOf<ValuePathsToAdapters>>(model: FormModel<T, ValueToTypePaths, TypePathsToAdapters, ValuePathsToAdapters>, valuePath: K): void;
133
+ clearFieldValue<K extends StringKeyOf<ValueToTypePaths>>(model: FormModel<T, ValueToTypePaths, TypePathsToAdapters, ValuePathsToAdapters>, valuePath: K): void;
134
134
  clearAll(model: FormModel<T, ValueToTypePaths, TypePathsToAdapters, ValuePathsToAdapters>, value: ValueOfType<T>): void;
135
135
  isValuePathActive<K extends keyof ValuePathsToAdapters>(model: FormModel<T, ValueToTypePaths, TypePathsToAdapters, ValuePathsToAdapters>, valuePath: K): boolean;
136
- validateField<K extends keyof ValuePathsToAdapters>(model: FormModel<T, ValueToTypePaths, TypePathsToAdapters, ValuePathsToAdapters>, valuePath: K): boolean;
136
+ validateField<K extends keyof ValuePathsToAdapters>(model: FormModel<T, ValueToTypePaths, TypePathsToAdapters, ValuePathsToAdapters>, valuePath: K, ignoreDefaultValue?: boolean): boolean;
137
137
  validateAll(model: FormModel<T, ValueToTypePaths, TypePathsToAdapters, ValuePathsToAdapters>): boolean;
138
- createModel(value: ValueOfType<ReadonlyTypeOfType<T>>): FormModel<T, ValueToTypePaths, TypePathsToAdapters, ValuePathsToAdapters>;
138
+ abstract createModel(value: ValueOfType<ReadonlyTypeOfType<T>>): FormModel<T, ValueToTypePaths, TypePathsToAdapters, ValuePathsToAdapters>;
139
139
  }
140
140
  declare class FormModel<T extends Type, ValueToTypePaths extends Readonly<Record<string, string>>, TypePathsToAdapters extends FlattenedTypePathsToAdaptersOf<FlattenedValuesOfType<T, '*'>, ValueOfType<ReadonlyTypeOfType<T>>>, ValuePathsToAdapters extends ValuePathsToAdaptersOf<TypePathsToAdapters, ValueToTypePaths> = ValuePathsToAdaptersOf<TypePathsToAdapters, ValueToTypePaths>> {
141
141
  private readonly type;
@@ -165,6 +165,21 @@ type FormProps<O> = {
165
165
  onValueChange: (value: O) => void;
166
166
  };
167
167
 
168
+ type PartialComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps = {}> = Exclude<keyof CurriedProps, keyof ComponentProps<Component>> extends never ? UnsafePartialComponent<Component, CurriedProps, AdditionalProps> : keyof CurriedProps extends (string | number) ? `unmatched prop: ${Exclude<keyof CurriedProps, keyof ComponentProps<Component>>}` : Exclude<keyof CurriedProps, keyof ComponentProps<Component>>;
169
+ type UnsafePartialComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps = {}> = ForwardRefExoticComponent<PropsWithoutRef<RemainingComponentProps<Component, CurriedProps> & AdditionalProps>>;
170
+ declare function createSimplePartialComponent<Component extends ComponentType<any>, CurriedProps extends Partial<ComponentProps<Component>>>(Component: Component, curriedProps: CurriedProps): PartialComponent<Component, CurriedProps>;
171
+ declare function createPartialComponent<Component extends ComponentType<any>, CurriedProps>(Component: Component, curriedPropsSource: () => CurriedProps): PartialComponent<Component, CurriedProps, {}>;
172
+ declare function createPartialComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps, AllAdditionalPropKeys extends readonly (keyof AdditionalProps)[]>(Component: Component, curriedPropsSource: (additionalProps: AdditionalProps) => CurriedProps, additionalPropKeys: FriendlyExhaustiveArrayOfUnion<keyof AdditionalProps, AllAdditionalPropKeys>): PartialComponent<Component, CurriedProps, AdditionalProps>;
173
+ declare function usePartialComponent<Component extends ComponentType<any>, CurriedProps>(curriedPropsSource: () => CurriedProps, deps: DependencyList, Component: Component): PartialComponent<Component, CurriedProps, {}>;
174
+ declare function usePartialComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps, AllAdditionalPropKeys extends readonly (keyof AdditionalProps)[]>(curriedPropsSource: (additionalProps: AdditionalProps) => CurriedProps, deps: DependencyList, Component: Component, additionalPropKeys: FriendlyExhaustiveArrayOfUnion<keyof AdditionalProps, AllAdditionalPropKeys>): PartialComponent<Component, CurriedProps, AdditionalProps>;
175
+ declare function createPartialObserverComponent<Component extends ComponentType<any>, CurriedProps>(Component: Component, curriedPropsSource: () => CurriedProps): PartialComponent<Component, CurriedProps, {}>;
176
+ declare function createPartialObserverComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps, AllAdditionalPropKeys extends readonly (keyof AdditionalProps)[]>(Component: Component, curriedPropsSource: (additionalProps: AdditionalProps) => CurriedProps, additionalPropKeys: FriendlyExhaustiveArrayOfUnion<keyof AdditionalProps, AllAdditionalPropKeys>): PartialComponent<Component, CurriedProps, AdditionalProps>;
177
+ declare function createUnsafePartialObserverComponent<Component extends ComponentType<any>, CurriedProps>(Component: Component, curriedPropsSource: () => CurriedProps): UnsafePartialComponent<Component, CurriedProps, {}>;
178
+ declare function createUnsafePartialObserverComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps, AllAdditionalPropKeys extends readonly (keyof AdditionalProps)[]>(Component: Component, curriedPropsSource: (additionalProps: AdditionalProps) => CurriedProps, additionalPropKeys: FriendlyExhaustiveArrayOfUnion<keyof AdditionalProps, AllAdditionalPropKeys>): UnsafePartialComponent<Component, CurriedProps, AdditionalProps>;
179
+ declare function usePartialObserverComponent<Component extends ComponentType<any>, CurriedProps>(curriedPropsSource: () => CurriedProps, deps: DependencyList, Component: Component): PartialComponent<Component, CurriedProps, {}>;
180
+ declare function usePartialObserverComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps, AllAdditionalPropKeys extends readonly (keyof AdditionalProps)[]>(curriedPropsSource: (additionalProps: AdditionalProps) => CurriedProps, deps: DependencyList, Component: Component, additionalPropKeys: FriendlyExhaustiveArrayOfUnion<keyof AdditionalProps, AllAdditionalPropKeys>): PartialComponent<Component, CurriedProps, AdditionalProps>;
181
+ type RemainingComponentProps<Component extends ComponentType, CurriedProps> = Omit<ComponentProps<Component>, keyof CurriedProps> & JSX.IntrinsicAttributes;
182
+
168
183
  /**
169
184
  * Used to extract the supported value paths from a presenter
170
185
  */
@@ -185,13 +200,31 @@ type FormFieldsOfPresenter<Presenter extends FormPresenter<any, any, any, any>>
185
200
 
186
201
  type ValueOfPresenter<P extends FormPresenter<any, any, any, any>> = P extends FormPresenter<infer T, any, any, any> ? ValueOfType<ReadonlyTypeOfType<T>> : never;
187
202
  type ModelOfPresenter<P extends FormPresenter<any, any, any, any>> = ReturnType<P['createModel']>;
188
- declare function useDefaultMobxFormHooks<P extends FormPresenter<any, any, any, any>>(presenter: P, value: ValueOfPresenter<P>, { onValidFieldSubmit, onValidFormSubmit, }?: {
203
+ declare function useDefaultMobxFormHooks<P extends FormPresenter<any, any, any, any>, C extends ComponentType<FieldsViewProps<F>>, F extends FormFieldsOfPresenter<P> = FormFieldsOfPresenter<P>>(presenter: P, value: ValueOfPresenter<P>, options?: {
204
+ onValidFieldSubmit?: <Path extends ValuePathsOfPresenter<P>>(model: ModelOfPresenter<P>, valuePath: Path) => void;
205
+ onValidFormSubmit?: (model: ModelOfPresenter<P>, value: ValueOfPresenter<P>) => void;
206
+ }): {
207
+ model: ModelOfPresenter<P>;
208
+ FormFields?: UnsafePartialComponent<C, FieldsViewProps<F>>;
209
+ onFormSubmit: () => void;
210
+ onFieldValueChange<K extends keyof F>(this: void, key: K, value: F[K]['value']): void;
211
+ onFieldFocus?(this: void, key: keyof F): void;
212
+ onFieldBlur?(this: void, key: keyof F): void;
213
+ onFieldSubmit?(this: void, key: keyof F): boolean | void;
214
+ };
215
+ declare function useDefaultMobxFormHooks<P extends FormPresenter<any, any, any, any>, C extends ComponentType<FieldsViewProps<F>>, F extends FormFieldsOfPresenter<P> = FormFieldsOfPresenter<P>>(presenter: P, value: ValueOfPresenter<P>, options: {
189
216
  onValidFieldSubmit?: <Path extends ValuePathsOfPresenter<P>>(model: ModelOfPresenter<P>, valuePath: Path) => void;
190
217
  onValidFormSubmit?: (model: ModelOfPresenter<P>, value: ValueOfPresenter<P>) => void;
218
+ FormFieldsView: C;
191
219
  }): {
192
220
  model: ModelOfPresenter<P>;
193
- onFormSubmit?: () => void;
194
- } & Omit<FieldsViewProps<ModelOfPresenter<P>['fields']>, 'fields'>;
221
+ FormFields: UnsafePartialComponent<C, FieldsViewProps<F>>;
222
+ onFormSubmit: () => void;
223
+ onFieldValueChange<K extends keyof F>(this: void, key: K, value: F[K]['value']): void;
224
+ onFieldFocus?(this: void, key: keyof F): void;
225
+ onFieldBlur?(this: void, key: keyof F): void;
226
+ onFieldSubmit?(this: void, key: keyof F): boolean | void;
227
+ };
195
228
 
196
229
  type MergedOfFieldAdaptersWithTwoWayConverter<FieldAdapters extends Readonly<Record<string, FieldAdapter>>, E, Context> = {
197
230
  [K in keyof FieldAdapters]: FieldAdapter<FromOfFieldAdapter<FieldAdapters[K]>, ToOfFieldAdapter<FieldAdapters[K]>, ErrorOfFieldAdapter<FieldAdapters[K]> | E, ValuePathOfFieldAdapter<FieldAdapters[K]>, Context>;
@@ -216,7 +249,7 @@ type SubFormFieldAdapter<F extends FieldAdapter, ValuePath extends string, Conte
216
249
  type SubFormFieldAdapters<SubAdapters extends Record<string, FieldAdapter>, TypePath extends string, ValuePath extends string, Context> = {
217
250
  [K in keyof SubAdapters as K extends StringConcatOf<'$', infer TypePathSuffix> ? `${TypePath}${TypePathSuffix}` : never]: SubFormFieldAdapter<SubAdapters[K], ValuePath, Context>;
218
251
  };
219
- declare function subFormFieldAdapters<SubAdapters extends Record<string, FieldAdapter>, TypePath extends string, TypePathsToValuePaths extends Record<TypePath, string>, ContextType extends Type>(subAdapters: SubAdapters, parentTypePath: TypePath, contextType: ContextType): SubFormFieldAdapters<SubAdapters, TypePath, TypePathsToValuePaths[TypePath], ValueOfType<ContextType>>;
252
+ declare function subFormFieldAdapters<SubAdapters extends Record<string, FieldAdapter>, TypePath extends string, TypePathsToValuePaths extends Record<TypePath, string>, ContextType extends Type>(subAdapters: SubAdapters, parentTypePath: TypePath, contextType: ContextType): SubFormFieldAdapters<SubAdapters, TypePath, TypePathsToValuePaths[TypePath], ValueOfType<ReadonlyTypeOfType<ContextType>>>;
220
253
 
221
254
  declare class IntegerToStringConverter<E, ValuePath extends string, Context> implements TwoWayFieldConverter<number, string, E, ValuePath, Context> {
222
255
  private readonly isNanError;
@@ -306,21 +339,6 @@ type SubFormFields<F extends Fields, P extends keyof F> = P extends string ? {
306
339
  $: F[P];
307
340
  } : never;
308
341
 
309
- type PartialComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps = {}> = Exclude<keyof CurriedProps, keyof ComponentProps<Component>> extends never ? UnsafePartialComponent<Component, CurriedProps, AdditionalProps> : keyof CurriedProps extends (string | number) ? `unmatched prop: ${Exclude<keyof CurriedProps, keyof ComponentProps<Component>>}` : Exclude<keyof CurriedProps, keyof ComponentProps<Component>>;
310
- type UnsafePartialComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps = {}> = ForwardRefExoticComponent<PropsWithoutRef<RemainingComponentProps<Component, CurriedProps> & AdditionalProps>>;
311
- declare function createSimplePartialComponent<Component extends ComponentType<any>, CurriedProps extends Partial<ComponentProps<Component>>>(Component: Component, curriedProps: CurriedProps): PartialComponent<Component, CurriedProps>;
312
- declare function createPartialComponent<Component extends ComponentType<any>, CurriedProps>(Component: Component, curriedPropsSource: () => CurriedProps): PartialComponent<Component, CurriedProps, {}>;
313
- declare function createPartialComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps, AllAdditionalPropKeys extends readonly (keyof AdditionalProps)[]>(Component: Component, curriedPropsSource: (additionalProps: AdditionalProps) => CurriedProps, additionalPropKeys: FriendlyExhaustiveArrayOfUnion<keyof AdditionalProps, AllAdditionalPropKeys>): PartialComponent<Component, CurriedProps, AdditionalProps>;
314
- declare function usePartialComponent<Component extends ComponentType<any>, CurriedProps>(curriedPropsSource: () => CurriedProps, deps: DependencyList, Component: Component): PartialComponent<Component, CurriedProps, {}>;
315
- declare function usePartialComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps, AllAdditionalPropKeys extends readonly (keyof AdditionalProps)[]>(curriedPropsSource: (additionalProps: AdditionalProps) => CurriedProps, deps: DependencyList, Component: Component, additionalPropKeys: FriendlyExhaustiveArrayOfUnion<keyof AdditionalProps, AllAdditionalPropKeys>): PartialComponent<Component, CurriedProps, AdditionalProps>;
316
- declare function createPartialObserverComponent<Component extends ComponentType<any>, CurriedProps>(Component: Component, curriedPropsSource: () => CurriedProps): PartialComponent<Component, CurriedProps, {}>;
317
- declare function createPartialObserverComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps, AllAdditionalPropKeys extends readonly (keyof AdditionalProps)[]>(Component: Component, curriedPropsSource: (additionalProps: AdditionalProps) => CurriedProps, additionalPropKeys: FriendlyExhaustiveArrayOfUnion<keyof AdditionalProps, AllAdditionalPropKeys>): PartialComponent<Component, CurriedProps, AdditionalProps>;
318
- declare function createUnsafePartialObserverComponent<Component extends ComponentType<any>, CurriedProps>(Component: Component, curriedPropsSource: () => CurriedProps): UnsafePartialComponent<Component, CurriedProps, {}>;
319
- declare function createUnsafePartialObserverComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps, AllAdditionalPropKeys extends readonly (keyof AdditionalProps)[]>(Component: Component, curriedPropsSource: (additionalProps: AdditionalProps) => CurriedProps, additionalPropKeys: FriendlyExhaustiveArrayOfUnion<keyof AdditionalProps, AllAdditionalPropKeys>): UnsafePartialComponent<Component, CurriedProps, AdditionalProps>;
320
- declare function usePartialObserverComponent<Component extends ComponentType<any>, CurriedProps>(curriedPropsSource: () => CurriedProps, deps: DependencyList, Component: Component): PartialComponent<Component, CurriedProps, {}>;
321
- declare function usePartialObserverComponent<Component extends ComponentType<any>, CurriedProps, AdditionalProps, AllAdditionalPropKeys extends readonly (keyof AdditionalProps)[]>(curriedPropsSource: (additionalProps: AdditionalProps) => CurriedProps, deps: DependencyList, Component: Component, additionalPropKeys: FriendlyExhaustiveArrayOfUnion<keyof AdditionalProps, AllAdditionalPropKeys>): PartialComponent<Component, CurriedProps, AdditionalProps>;
322
- type RemainingComponentProps<Component extends ComponentType, CurriedProps> = Omit<ComponentProps<Component>, keyof CurriedProps> & JSX.IntrinsicAttributes;
323
-
324
342
  type MantineForm<F extends Fields> = {
325
343
  fields: F;
326
344
  onFieldValueChange: (<K extends keyof F>(this: void, key: K, value: F[K]['value']) => void) | undefined;
@@ -336,6 +354,14 @@ type MantineFieldComponent<T, P = T, E = any> = UnsafePartialComponent<Component
336
354
 
337
355
  type SuppliedCheckboxProps = Pick<CheckboxProps, 'name' | 'checked' | 'disabled' | 'required' | 'error' | 'onChange' | 'onFocus' | 'onBlur' | 'onKeyUp'>;
338
356
 
357
+ type CallbackMapper<ValuePath extends string> = {
358
+ <Cb extends (...args: any[]) => any>(cb: Cb): Parameters<Cb> extends [infer SubFormValuePath extends string, ...(infer Rest)] ? SubFormValuePath extends StringConcatOf<ValuePath, infer Postfix> ? (valuePath: `$${Postfix}`, ...rest: Rest) => ReturnType<Cb> : never : never;
359
+ };
360
+ type FieldsView<ValuePath extends string = string, C extends ComponentType<any> = ComponentType<any>> = {
361
+ Component: C;
362
+ callbackMapper: CallbackMapper<ValuePath>;
363
+ };
364
+
339
365
  type SuppliedListProps<Value = any, ListPath extends string = string> = {
340
366
  values: readonly Value[];
341
367
  listPath: ListPath;
@@ -408,7 +434,7 @@ declare class MantineFormImpl<F extends Fields> implements MantineForm<F> {
408
434
  pill<K extends keyof AllFieldsOfFields<F>>(valuePath: K): MantineFieldComponent<SuppliedPillProps, PillProps, ErrorOfField<F[K]>>;
409
435
  pill<K extends keyof AllFieldsOfFields<F>, P extends SuppliedPillProps>(valuePath: K, Pill: ComponentType<P>): MantineFieldComponent<SuppliedPillProps, P, ErrorOfField<F[K]>>;
410
436
  list<K extends keyof ListFieldsOfFields<F>>(valuePath: K): MantineFieldComponent<SuppliedListProps<`${K}.${number}`>, ComponentProps<typeof DefaultList<ElementOfArray<F[K]['value']>, K>>, never>;
411
- fieldsView<K extends keyof AllFieldsOfFields<F>, P extends FieldsViewProps<Fields> = FieldsViewProps<SubFormFields<F, K>>>(valuePath: K, FieldsView: ComponentType<P>): MantineFieldComponent<FieldsViewProps<P['fields']>, P, never>;
437
+ fieldsView<K extends keyof AllFieldsOfFields<F>, P extends FieldsViewProps<Fields> = FieldsViewProps<SubFormFields<F, K>>>(valuePath: K, FieldsView: ComponentType<P>): FieldsView<K, MantineFieldComponent<FieldsViewProps<P['fields']>, P, never>>;
412
438
  form<K extends keyof AllFieldsOfFields<F>, P extends FormProps<ValueTypeOfField<F[K]>> = FormProps<ValueTypeOfField<F[K]>>>(valuePath: K, Form: ComponentType<P>): MantineFieldComponent<FormProps<ValueTypeOfField<F[K]>>, P, never>;
413
439
  }
414
440
 
package/dist/index.js CHANGED
@@ -451,8 +451,7 @@ var FormPresenter = class {
451
451
  convert,
452
452
  create
453
453
  } = adapter2;
454
- const accessor = model.accessors[valuePath];
455
- const value = accessor == null ? create(valuePath, model.value) : accessor.value;
454
+ const value = create(valuePath, model.value);
456
455
  const {
457
456
  value: displayValue
458
457
  } = convert(value, valuePath, model.value);
@@ -473,7 +472,7 @@ var FormPresenter = class {
473
472
  const keys = new Set(Object.keys(values));
474
473
  return keys.has(valuePath);
475
474
  }
476
- validateField(model, valuePath) {
475
+ validateField(model, valuePath, ignoreDefaultValue = false) {
477
476
  const {
478
477
  convert,
479
478
  revert,
@@ -492,6 +491,14 @@ var FormPresenter = class {
492
491
  const value = fieldOverride != null ? fieldOverride[0] : storedValue;
493
492
  const dirty = storedValue !== value;
494
493
  assertExists(revert, "changing field directly not supported {}", valuePath);
494
+ if (ignoreDefaultValue) {
495
+ const {
496
+ value: defaultDisplayValue
497
+ } = convert(create(valuePath, model.value), valuePath, model.value);
498
+ if (defaultDisplayValue === value) {
499
+ return true;
500
+ }
501
+ }
495
502
  const conversion = revert(value, valuePath, model.value);
496
503
  return runInAction(function() {
497
504
  switch (conversion.type) {
@@ -562,13 +569,6 @@ var FormPresenter = class {
562
569
  );
563
570
  });
564
571
  }
565
- createModel(value) {
566
- return new FormModel(
567
- this.type,
568
- value,
569
- this.adapters
570
- );
571
- }
572
572
  };
573
573
  var FormModel = class {
574
574
  constructor(type, value, adapters) {
@@ -706,16 +706,173 @@ var FormModel = class {
706
706
  }
707
707
  };
708
708
 
709
- // core/mobx/hooks.ts
709
+ // core/mobx/hooks.tsx
710
710
  import {
711
711
  useCallback,
712
+ useMemo as useMemo2
713
+ } from "react";
714
+
715
+ // util/partial.tsx
716
+ import { observer } from "mobx-react";
717
+ import {
718
+ forwardRef,
712
719
  useMemo
713
720
  } from "react";
721
+ import { jsx } from "react/jsx-runtime";
722
+ function createSimplePartialComponent(Component, curriedProps) {
723
+ return forwardRef(
724
+ function(exposedProps, ref) {
725
+ const C = Component;
726
+ return /* @__PURE__ */ jsx(
727
+ C,
728
+ {
729
+ ref,
730
+ ...curriedProps,
731
+ ...exposedProps
732
+ }
733
+ );
734
+ }
735
+ );
736
+ }
737
+ function createPartialComponent(Component, curriedPropsSource, additionalPropKeys = []) {
738
+ return forwardRef(
739
+ function(props, ref) {
740
+ const C = Component;
741
+ const [
742
+ additionalProps,
743
+ exposedProps
744
+ ] = additionalPropKeys.reduce(
745
+ function([
746
+ additionalProps2,
747
+ exposedProps2
748
+ ], key) {
749
+ const value = props[
750
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
751
+ key
752
+ ];
753
+ delete exposedProps2[key];
754
+ additionalProps2[key] = value;
755
+ return [
756
+ additionalProps2,
757
+ exposedProps2
758
+ ];
759
+ },
760
+ [
761
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
762
+ {},
763
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
764
+ { ...props }
765
+ ]
766
+ );
767
+ const curriedProps = curriedPropsSource(additionalProps);
768
+ return /* @__PURE__ */ jsx(
769
+ C,
770
+ {
771
+ ref,
772
+ ...curriedProps,
773
+ ...exposedProps
774
+ }
775
+ );
776
+ }
777
+ );
778
+ }
779
+ function usePartialComponent(curriedPropsSource, deps, Component, additionalPropKeys = []) {
780
+ return useMemo(
781
+ function() {
782
+ return createPartialComponent(
783
+ Component,
784
+ curriedPropsSource,
785
+ additionalPropKeys
786
+ );
787
+ },
788
+ // eslint-disable-next-line react-hooks/exhaustive-deps
789
+ [
790
+ // eslint-disable-next-line react-hooks/exhaustive-deps
791
+ ...deps,
792
+ Component,
793
+ // eslint-disable-next-line react-hooks/exhaustive-deps
794
+ ...additionalPropKeys
795
+ ]
796
+ );
797
+ }
798
+ function createPartialObserverComponent(Component, curriedPropsSource, additionalPropKeys = []) {
799
+ return createUnsafePartialObserverComponent(
800
+ Component,
801
+ curriedPropsSource,
802
+ additionalPropKeys
803
+ );
804
+ }
805
+ function createUnsafePartialObserverComponent(Component, curriedPropsSource, additionalPropKeys = []) {
806
+ return observer(
807
+ forwardRef(
808
+ function(props, ref) {
809
+ const C = Component;
810
+ const [
811
+ additionalProps,
812
+ exposedProps
813
+ ] = additionalPropKeys.reduce(
814
+ function([
815
+ additionalProps2,
816
+ exposedProps2
817
+ ], key) {
818
+ const value = props[
819
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
820
+ key
821
+ ];
822
+ delete exposedProps2[key];
823
+ additionalProps2[key] = value;
824
+ return [
825
+ additionalProps2,
826
+ exposedProps2
827
+ ];
828
+ },
829
+ [
830
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
831
+ {},
832
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
833
+ { ...props }
834
+ ]
835
+ );
836
+ const curriedProps = curriedPropsSource(additionalProps);
837
+ return /* @__PURE__ */ jsx(
838
+ C,
839
+ {
840
+ ref,
841
+ ...curriedProps,
842
+ ...exposedProps
843
+ }
844
+ );
845
+ }
846
+ )
847
+ );
848
+ }
849
+ function usePartialObserverComponent(curriedPropsSource, deps, Component, additionalPropKeys = []) {
850
+ return useMemo(
851
+ function() {
852
+ return createPartialObserverComponent(
853
+ Component,
854
+ curriedPropsSource,
855
+ additionalPropKeys
856
+ );
857
+ },
858
+ // eslint-disable-next-line react-hooks/exhaustive-deps
859
+ [
860
+ // eslint-disable-next-line react-hooks/exhaustive-deps
861
+ ...deps,
862
+ Component,
863
+ // eslint-disable-next-line react-hooks/exhaustive-deps
864
+ ...additionalPropKeys
865
+ ]
866
+ );
867
+ }
868
+
869
+ // core/mobx/hooks.tsx
714
870
  function useDefaultMobxFormHooks(presenter, value, {
715
871
  onValidFieldSubmit,
716
- onValidFormSubmit
872
+ onValidFormSubmit,
873
+ FormFieldsView
717
874
  } = {}) {
718
- const model = useMemo(function() {
875
+ const model = useMemo2(function() {
719
876
  return presenter.createModel(value);
720
877
  }, [
721
878
  presenter,
@@ -748,7 +905,7 @@ function useDefaultMobxFormHooks(presenter, value, {
748
905
  function(path) {
749
906
  setTimeout(function() {
750
907
  if (presenter.isValuePathActive(model, path)) {
751
- presenter.validateField(model, path);
908
+ presenter.validateField(model, path, true);
752
909
  }
753
910
  }, 100);
754
911
  },
@@ -769,12 +926,33 @@ function useDefaultMobxFormHooks(presenter, value, {
769
926
  onValidFormSubmit
770
927
  ]
771
928
  );
929
+ const FormFields = useMemo2(() => {
930
+ if (FormFieldsView == null) {
931
+ return void 0;
932
+ }
933
+ return createUnsafePartialObserverComponent(FormFieldsView, () => {
934
+ return {
935
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
936
+ fields: model.fields,
937
+ onFieldBlur,
938
+ onFieldSubmit,
939
+ onFieldValueChange
940
+ };
941
+ });
942
+ }, [
943
+ model,
944
+ FormFieldsView,
945
+ onFieldBlur,
946
+ onFieldSubmit,
947
+ onFieldValueChange
948
+ ]);
772
949
  return {
773
950
  model,
774
951
  onFieldValueChange,
775
952
  onFieldSubmit,
776
953
  onFieldBlur,
777
- onFormSubmit
954
+ onFormSubmit,
955
+ FormFields
778
956
  };
779
957
  }
780
958
 
@@ -1113,160 +1291,6 @@ import {
1113
1291
  useMemo as useMemo3
1114
1292
  } from "react";
1115
1293
 
1116
- // util/partial.tsx
1117
- import { observer } from "mobx-react";
1118
- import {
1119
- forwardRef,
1120
- useMemo as useMemo2
1121
- } from "react";
1122
- import { jsx } from "react/jsx-runtime";
1123
- function createSimplePartialComponent(Component, curriedProps) {
1124
- return forwardRef(
1125
- function(exposedProps, ref) {
1126
- const C = Component;
1127
- return /* @__PURE__ */ jsx(
1128
- C,
1129
- {
1130
- ref,
1131
- ...curriedProps,
1132
- ...exposedProps
1133
- }
1134
- );
1135
- }
1136
- );
1137
- }
1138
- function createPartialComponent(Component, curriedPropsSource, additionalPropKeys = []) {
1139
- return forwardRef(
1140
- function(props, ref) {
1141
- const C = Component;
1142
- const [
1143
- additionalProps,
1144
- exposedProps
1145
- ] = additionalPropKeys.reduce(
1146
- function([
1147
- additionalProps2,
1148
- exposedProps2
1149
- ], key) {
1150
- const value = props[
1151
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1152
- key
1153
- ];
1154
- delete exposedProps2[key];
1155
- additionalProps2[key] = value;
1156
- return [
1157
- additionalProps2,
1158
- exposedProps2
1159
- ];
1160
- },
1161
- [
1162
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1163
- {},
1164
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1165
- { ...props }
1166
- ]
1167
- );
1168
- const curriedProps = curriedPropsSource(additionalProps);
1169
- return /* @__PURE__ */ jsx(
1170
- C,
1171
- {
1172
- ref,
1173
- ...curriedProps,
1174
- ...exposedProps
1175
- }
1176
- );
1177
- }
1178
- );
1179
- }
1180
- function usePartialComponent(curriedPropsSource, deps, Component, additionalPropKeys = []) {
1181
- return useMemo2(
1182
- function() {
1183
- return createPartialComponent(
1184
- Component,
1185
- curriedPropsSource,
1186
- additionalPropKeys
1187
- );
1188
- },
1189
- // eslint-disable-next-line react-hooks/exhaustive-deps
1190
- [
1191
- // eslint-disable-next-line react-hooks/exhaustive-deps
1192
- ...deps,
1193
- Component,
1194
- // eslint-disable-next-line react-hooks/exhaustive-deps
1195
- ...additionalPropKeys
1196
- ]
1197
- );
1198
- }
1199
- function createPartialObserverComponent(Component, curriedPropsSource, additionalPropKeys = []) {
1200
- return createUnsafePartialObserverComponent(
1201
- Component,
1202
- curriedPropsSource,
1203
- additionalPropKeys
1204
- );
1205
- }
1206
- function createUnsafePartialObserverComponent(Component, curriedPropsSource, additionalPropKeys = []) {
1207
- return observer(
1208
- forwardRef(
1209
- function(props, ref) {
1210
- const C = Component;
1211
- const [
1212
- additionalProps,
1213
- exposedProps
1214
- ] = additionalPropKeys.reduce(
1215
- function([
1216
- additionalProps2,
1217
- exposedProps2
1218
- ], key) {
1219
- const value = props[
1220
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1221
- key
1222
- ];
1223
- delete exposedProps2[key];
1224
- additionalProps2[key] = value;
1225
- return [
1226
- additionalProps2,
1227
- exposedProps2
1228
- ];
1229
- },
1230
- [
1231
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1232
- {},
1233
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1234
- { ...props }
1235
- ]
1236
- );
1237
- const curriedProps = curriedPropsSource(additionalProps);
1238
- return /* @__PURE__ */ jsx(
1239
- C,
1240
- {
1241
- ref,
1242
- ...curriedProps,
1243
- ...exposedProps
1244
- }
1245
- );
1246
- }
1247
- )
1248
- );
1249
- }
1250
- function usePartialObserverComponent(curriedPropsSource, deps, Component, additionalPropKeys = []) {
1251
- return useMemo2(
1252
- function() {
1253
- return createPartialObserverComponent(
1254
- Component,
1255
- curriedPropsSource,
1256
- additionalPropKeys
1257
- );
1258
- },
1259
- // eslint-disable-next-line react-hooks/exhaustive-deps
1260
- [
1261
- // eslint-disable-next-line react-hooks/exhaustive-deps
1262
- ...deps,
1263
- Component,
1264
- // eslint-disable-next-line react-hooks/exhaustive-deps
1265
- ...additionalPropKeys
1266
- ]
1267
- );
1268
- }
1269
-
1270
1294
  // mantine/create_checkbox.tsx
1271
1295
  import { jsx as jsx2 } from "react/jsx-runtime";
1272
1296
  function createCheckbox(valuePath, Checkbox) {
@@ -1337,34 +1361,46 @@ function createFieldsView(valuePath, FieldsView, observableProps) {
1337
1361
  function onFieldSubmit(subKey) {
1338
1362
  observableProps.onFieldSubmit?.(toKey(subKey));
1339
1363
  }
1340
- return observer2(function(props) {
1341
- const subFields = Object.entries(observableProps.fields).reduce(
1342
- (acc, [
1343
- fieldKey,
1344
- fieldValue
1345
- ]) => {
1346
- if (fieldKey.startsWith(valuePath)) {
1347
- acc[toSubKey(fieldKey)] = fieldValue;
1364
+ const Component = observer2(
1365
+ function(props) {
1366
+ const subFields = Object.entries(observableProps.fields).reduce(
1367
+ (acc, [
1368
+ fieldKey,
1369
+ fieldValue
1370
+ ]) => {
1371
+ if (fieldKey.startsWith(valuePath)) {
1372
+ acc[toSubKey(fieldKey)] = fieldValue;
1373
+ }
1374
+ return acc;
1375
+ },
1376
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1377
+ {}
1378
+ );
1379
+ return /* @__PURE__ */ jsx3(
1380
+ FieldsView,
1381
+ {
1382
+ // maybe we can do this in a more type safe way
1383
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions
1384
+ ...props,
1385
+ fields: subFields,
1386
+ onFieldBlur,
1387
+ onFieldFocus,
1388
+ onFieldSubmit,
1389
+ onFieldValueChange
1348
1390
  }
1349
- return acc;
1350
- },
1351
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1352
- {}
1353
- );
1354
- return /* @__PURE__ */ jsx3(
1355
- FieldsView,
1356
- {
1357
- // maybe we can do this in a more type safe way
1358
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions
1359
- ...props,
1360
- fields: subFields,
1361
- onFieldBlur,
1362
- onFieldFocus,
1363
- onFieldSubmit,
1364
- onFieldValueChange
1365
- }
1366
- );
1367
- });
1391
+ );
1392
+ }
1393
+ );
1394
+ const callbackMapper = (callback) => {
1395
+ return (subFormValuePath, ...args) => {
1396
+ const valuePath2 = toKey(subFormValuePath);
1397
+ return callback(valuePath2, ...args);
1398
+ };
1399
+ };
1400
+ return {
1401
+ Component,
1402
+ callbackMapper
1403
+ };
1368
1404
  }
1369
1405
 
1370
1406
  // mantine/create_form.tsx