@strictly/react-form 0.0.15 → 0.0.16

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 (38) hide show
  1. package/.out/core/mobx/field_adapter_builder.d.ts +1 -1
  2. package/.out/core/mobx/form_model.d.ts +3 -4
  3. package/.out/core/mobx/form_model.js +27 -23
  4. package/.out/core/mobx/specs/form_model.tests.js +18 -8
  5. package/.out/core/mobx/types.d.ts +4 -4
  6. package/.out/index.d.ts +0 -1
  7. package/.out/index.js +0 -1
  8. package/.out/mantine/create_field_view.d.ts +20 -0
  9. package/.out/mantine/create_field_view.js +54 -0
  10. package/.out/mantine/create_list.js +3 -2
  11. package/.out/mantine/hooks.d.ts +4 -1
  12. package/.out/mantine/hooks.js +13 -1
  13. package/.out/mantine/specs/field_view_hooks.stories.d.ts +12 -0
  14. package/.out/mantine/specs/field_view_hooks.stories.js +61 -0
  15. package/.out/mantine/specs/field_view_hooks.tests.d.ts +1 -0
  16. package/.out/mantine/specs/field_view_hooks.tests.js +12 -0
  17. package/.out/tsconfig.tsbuildinfo +1 -1
  18. package/.turbo/turbo-build.log +8 -8
  19. package/.turbo/turbo-check-types.log +1 -1
  20. package/core/mobx/field_adapter_builder.ts +2 -2
  21. package/core/mobx/form_model.ts +43 -27
  22. package/core/mobx/specs/form_model.tests.ts +28 -11
  23. package/core/mobx/types.ts +4 -4
  24. package/dist/index.cjs +124 -70
  25. package/dist/index.d.cts +26 -26
  26. package/dist/index.d.ts +26 -26
  27. package/dist/index.js +121 -62
  28. package/index.ts +0 -1
  29. package/mantine/create_field_view.tsx +94 -0
  30. package/mantine/create_list.tsx +9 -2
  31. package/mantine/hooks.tsx +18 -1
  32. package/mantine/specs/__snapshots__/field_view_hooks.tests.tsx.snap +153 -0
  33. package/mantine/specs/field_view_hooks.stories.tsx +112 -0
  34. package/mantine/specs/field_view_hooks.tests.tsx +15 -0
  35. package/package.json +1 -1
  36. package/.out/mantine/field_view.d.ts +0 -18
  37. package/.out/mantine/field_view.js +0 -16
  38. package/mantine/field_view.tsx +0 -39
package/dist/index.d.ts CHANGED
@@ -73,7 +73,7 @@ declare function adapterFromPrototype<From, To, ValuePath extends string, Contex
73
73
  declare function adapterFromPrototype<From, To, E, ValuePath extends string, Context>(converter: TwoWayFieldConverter<From, To, E, ValuePath, Context>, prototype: From): FieldAdapterBuilder<From, To, E, ValuePath, Context>;
74
74
  declare function identityAdapter<V, ValuePath extends string, Context>(prototype: V, required?: boolean): FieldAdapterBuilder<V, V, never, ValuePath, Context>;
75
75
  declare function trimmingStringAdapter<ValuePath extends string, Context>(): FieldAdapterBuilder<string, string, never, ValuePath, Context>;
76
- declare function listAdapter<E, ValuePath extends string, Context>(): FieldAdapterBuilder<readonly E[], readonly E[], never, ValuePath, Context>;
76
+ declare function listAdapter<E, ValuePath extends string = string, Context = unknown>(): FieldAdapterBuilder<readonly E[], readonly E[], never, ValuePath, Context>;
77
77
 
78
78
  type FieldAdaptersOfValues<FlattenedValues extends Readonly<Record<string, any>>, TypePathsToValuePaths extends Readonly<Record<keyof FlattenedValues, string>> = Readonly<Record<keyof FlattenedValues, any>>, Context = any> = {
79
79
  readonly [K in keyof FlattenedValues]: FieldAdapter<FlattenedValues[K], any, any, TypePathsToValuePaths[K], Context>;
@@ -119,8 +119,8 @@ type ValuePathsToAdaptersOf<TypePathsToAdapters extends Partial<Readonly<Record<
119
119
  readonly [K in keyof ValuePathsToTypePaths as unknown extends TypePathsToAdapters[ValuePathsToTypePaths[K]] ? never : K]: NonNullable<TypePathsToAdapters[ValuePathsToTypePaths[K]]>;
120
120
  } : never;
121
121
  type ContextOf<TypePathsToAdapters extends Partial<Readonly<Record<string, FieldAdapter>>>> = UnionToIntersection<{
122
- readonly [K in keyof TypePathsToAdapters]: TypePathsToAdapters[K] extends undefined ? undefined : ContextOfFieldAdapter<NonNullable<TypePathsToAdapters[K]>>;
123
- }[keyof TypePathsToAdapters]>;
122
+ readonly [K in keyof TypePathsToAdapters]: TypePathsToAdapters[K] extends undefined ? undefined : unknown extends ContextOfFieldAdapter<NonNullable<TypePathsToAdapters[K]>> ? never : ContextOfFieldAdapter<NonNullable<TypePathsToAdapters[K]>>;
123
+ }[keyof TypePathsToAdapters] | {}>;
124
124
  declare abstract class FormModel<T extends Type, ValueToTypePaths extends Readonly<Record<string, string>>, TypePathsToAdapters extends FlattenedTypePathsToAdaptersOf<FlattenedValuesOfType<T, '*'>, ContextType>, ContextType = ContextOf<TypePathsToAdapters>, ValuePathsToAdapters extends ValuePathsToAdaptersOf<TypePathsToAdapters, ValueToTypePaths> = ValuePathsToAdaptersOf<TypePathsToAdapters, ValueToTypePaths>> {
125
125
  readonly type: T;
126
126
  protected readonly adapters: TypePathsToAdapters;
@@ -129,8 +129,7 @@ declare abstract class FormModel<T extends Type, ValueToTypePaths extends Readon
129
129
  accessor errors: FlattenedErrors<ValuePathsToAdapters>;
130
130
  private readonly flattenedTypeDefs;
131
131
  constructor(type: T, value: ValueOfType<ReadonlyTypeOfType<T>>, adapters: TypePathsToAdapters);
132
- get context(): ContextType;
133
- protected abstract toContext(value: ValueOfType<ReadonlyTypeOfType<T>>): ContextType;
132
+ protected abstract toContext(value: ValueOfType<ReadonlyTypeOfType<T>>, valuePath: keyof ValuePathsToAdapters): ContextType;
134
133
  get fields(): SimplifyDeep<FlattenedConvertedFieldsOf<ValuePathsToAdapters>>;
135
134
  private get knownFields();
136
135
  private maybeSynthesizeFieldByValuePath;
@@ -154,18 +153,18 @@ declare abstract class FormModel<T extends Type, ValueToTypePaths extends Readon
154
153
  }
155
154
 
156
155
  /**
157
- * Used to extract the supported value paths from a presenter
156
+ * Used to extract the supported value paths from a model
158
157
  */
159
158
  type ValuePathsOfModel<Model extends FormModel<any, any, any, any, any>> = Model extends FormModel<infer _1, infer _2, infer _3, infer _4, infer ValuePathsToAdapters> ? keyof ValuePathsToAdapters : never;
160
159
  /**
161
160
  * Used to extract the render type (so the value that is passed to the view) of a given value path
162
- * from a presenter
161
+ * from a model
163
162
  */
164
163
  type ToValueOfModelValuePath<Model extends FormModel<any, any, any, any, any>, K extends ValuePathsOfModel<Model>> = Model extends FormModel<infer _1, infer _2, infer _3, infer _4, infer ValuePathsToAdapters> ? ToOfFieldAdapter<ValuePathsToAdapters[K]> : never;
165
164
  /**
166
- * Extracts the form fields from the presenter. The recommended way is to
165
+ * Extracts the form fields from a form model. The recommended way is to
167
166
  * define the form fields explicitly and use that type to enforce the types
168
- * of your converters, but generating the FormFields from your presenter
167
+ * of your converters, but generating the FormFields from your model
169
168
  * is less typing, albeit at the cost of potentially getting type errors
170
169
  * reported a long way away from the source
171
170
  */
@@ -286,21 +285,6 @@ declare function DefaultErrorRenderer({ error, }: InternalErrorRendererProps<any
286
285
 
287
286
  type ValueTypeOfField<F extends Field> = F extends Field<infer V> ? V : never;
288
287
 
289
- /**
290
- * Displays current value and error of a field
291
- */
292
- declare function FieldView<F extends Fields, K extends keyof F>({ fields, valuePath, children, }: {
293
- fields: F;
294
- valuePath: K;
295
- children: (props: {
296
- value: ValueTypeOfField<F[K]>;
297
- error: ErrorOfField<F[K]> | undefined;
298
- ErrorSink: ComponentType<{
299
- error: ErrorOfField<F[K]>;
300
- }>;
301
- }) => JSX.Element;
302
- }): react_jsx_runtime.JSX.Element;
303
-
304
288
  type AllFieldsOfFields<F extends Fields> = {
305
289
  [K in keyof F as ValueTypeOfField<F[K]> extends any ? K : never]: F[K];
306
290
  };
@@ -353,6 +337,20 @@ type MantineFieldComponent<T, P = T, E = any> = UnsafePartialComponent<Component
353
337
 
354
338
  type SuppliedCheckboxProps = Pick<CheckboxProps, 'name' | 'checked' | 'disabled' | 'required' | 'error' | 'onChange' | 'onFocus' | 'onBlur' | 'onKeyUp'>;
355
339
 
340
+ type FieldViewProps<F extends Fields, K extends keyof F> = {
341
+ children: (props: {
342
+ value: ValueTypeOfField<F[K]>;
343
+ error: ErrorOfField<F[K]> | undefined;
344
+ ErrorSink: ComponentType<{
345
+ error: ErrorOfField<F[K]>;
346
+ }>;
347
+ onFocus: () => void;
348
+ onBlur: () => void;
349
+ onValueChange: (v: ValueTypeOfField<F[K]>) => void;
350
+ onSubmit: () => void;
351
+ }) => JSX.Element;
352
+ };
353
+
356
354
  type CallbackMapper<ValuePath extends string> = {
357
355
  <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;
358
356
  };
@@ -403,7 +401,7 @@ type SuppliedValueInputProps<V, T extends Element = Element> = Partial<{
403
401
  declare function SimpleSelect(props: SelectProps & {
404
402
  onChange?: (value: string | null) => void;
405
403
  }): react_jsx_runtime.JSX.Element;
406
- declare function useMantineFormFields<F extends Fields>({ onFieldValueChange, onFieldBlur, onFieldFocus, onFieldSubmit, fields, }: FieldsViewProps<F>): MantineFormImpl<F>;
404
+ declare function useMantineFormFields<F extends Fields>({ onFieldValueChange, onFieldBlur, onFieldFocus, onFieldSubmit, fields, }: FieldsViewProps<F>): Omit<MantineFormImpl<F>, 'fields'>;
407
405
  declare class MantineFormImpl<F extends Fields> implements MantineForm<F> {
408
406
  private readonly textInputCache;
409
407
  private readonly valueInputCache;
@@ -412,6 +410,7 @@ declare class MantineFormImpl<F extends Fields> implements MantineForm<F> {
412
410
  private readonly radioCache;
413
411
  private readonly pillCache;
414
412
  private readonly listCache;
413
+ private readonly fieldViewCache;
415
414
  private readonly fieldsViewCache;
416
415
  private readonly formCache;
417
416
  accessor fields: F;
@@ -433,6 +432,7 @@ declare class MantineFormImpl<F extends Fields> implements MantineForm<F> {
433
432
  pill<K extends keyof AllFieldsOfFields<F>>(valuePath: K): MantineFieldComponent<SuppliedPillProps, PillProps, ErrorOfField<F[K]>>;
434
433
  pill<K extends keyof AllFieldsOfFields<F>, P extends SuppliedPillProps>(valuePath: K, Pill: ComponentType<P>): MantineFieldComponent<SuppliedPillProps, P, ErrorOfField<F[K]>>;
435
434
  list<K extends keyof ListFieldsOfFields<F>>(valuePath: K): MantineFieldComponent<SuppliedListProps<`${K}.${number}`>, ComponentProps<typeof DefaultList<ElementOfArray<F[K]['value']>, K>>, never>;
435
+ fieldView<K extends keyof AllFieldsOfFields<F>>(valuePath: K): ComponentType<FieldViewProps<F, K>>;
436
436
  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>>;
437
437
  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>;
438
438
  }
@@ -445,4 +445,4 @@ declare function mergeValidators<Validators1 extends Partial<Readonly<Record<Key
445
445
 
446
446
  declare function Empty(): null;
447
447
 
448
- export { AbstractSelectValueTypeConverter, type AnnotatedFieldConversion, type AnnotatedFieldConverter, type Annotation, type ContextOf, type ContextOfFieldAdapter, DefaultErrorRenderer, Empty, type ErrorOfField, type ErrorOfFieldAdapter, type ErrorRenderer, type ErrorRendererProps, type Field, type FieldAdapter, type FieldAdaptersOfValues, type FieldValueFactory, FieldView, type Fields, type FieldsViewProps, type FlattenedAdaptersOfFields, type FlattenedConvertedFieldsOf, type FlattenedTypePathsToAdaptersOf, type FormFieldsOfFieldAdapters, type FormFieldsOfModel, FormModel, type FormProps, type FromOfFieldAdapter, IntegerToStringConverter, type MergedOfFieldAdaptersWithTwoWayConverter, type MergedOfFieldAdaptersWithValidators, type MergedOfValidator, type MergedOfValidators, NullableToBooleanConverter, type PartialComponent, SelectDiscriminatedUnionConverter, SelectLiteralConverter, SelectStringConverter, type ToOfFieldAdapter, type ToValueOfModelValuePath, TrimmingStringConverter, type TwoWayFieldConverter, type TwoWayFieldConverterWithValueFactory, type UnreliableFieldConversion, UnreliableFieldConversionType, type UnreliableFieldConverter, type UnsafePartialComponent, type ValuePathOfFieldAdapter, type ValuePathsOfModel, type ValuePathsToAdaptersOf, adapter, adapterFromPrototype, adapterFromTwoWayConverter, createPartialComponent, createPartialObserverComponent, createSimplePartialComponent, createUnsafePartialObserverComponent, identityAdapter, listAdapter, mergeAdaptersWithValidators, mergeFieldAdaptersWithTwoWayConverter, mergeValidators, prototypingFieldValueFactory, subFormFieldAdapters, trimmingStringAdapter, useDefaultMobxFormHooks, useMantineFormFields, usePartialComponent, usePartialObserverComponent, validatingConverter };
448
+ export { AbstractSelectValueTypeConverter, type AnnotatedFieldConversion, type AnnotatedFieldConverter, type Annotation, type ContextOf, type ContextOfFieldAdapter, DefaultErrorRenderer, Empty, type ErrorOfField, type ErrorOfFieldAdapter, type ErrorRenderer, type ErrorRendererProps, type Field, type FieldAdapter, type FieldAdaptersOfValues, type FieldValueFactory, type Fields, type FieldsViewProps, type FlattenedAdaptersOfFields, type FlattenedConvertedFieldsOf, type FlattenedTypePathsToAdaptersOf, type FormFieldsOfFieldAdapters, type FormFieldsOfModel, FormModel, type FormProps, type FromOfFieldAdapter, IntegerToStringConverter, type MergedOfFieldAdaptersWithTwoWayConverter, type MergedOfFieldAdaptersWithValidators, type MergedOfValidator, type MergedOfValidators, NullableToBooleanConverter, type PartialComponent, SelectDiscriminatedUnionConverter, SelectLiteralConverter, SelectStringConverter, type ToOfFieldAdapter, type ToValueOfModelValuePath, TrimmingStringConverter, type TwoWayFieldConverter, type TwoWayFieldConverterWithValueFactory, type UnreliableFieldConversion, UnreliableFieldConversionType, type UnreliableFieldConverter, type UnsafePartialComponent, type ValuePathOfFieldAdapter, type ValuePathsOfModel, type ValuePathsToAdaptersOf, adapter, adapterFromPrototype, adapterFromTwoWayConverter, createPartialComponent, createPartialObserverComponent, createSimplePartialComponent, createUnsafePartialObserverComponent, identityAdapter, listAdapter, mergeAdaptersWithValidators, mergeFieldAdaptersWithTwoWayConverter, mergeValidators, prototypingFieldValueFactory, subFormFieldAdapters, trimmingStringAdapter, useDefaultMobxFormHooks, useMantineFormFields, usePartialComponent, usePartialObserverComponent, validatingConverter };
package/dist/index.js CHANGED
@@ -326,8 +326,8 @@ import {
326
326
  observable,
327
327
  runInAction
328
328
  } from "mobx";
329
- var _accessors_dec, _knownFields_dec, _fields_dec, _context_dec, _errors_dec, _fieldOverrides_dec, _value_dec, _init, _value, _fieldOverrides, _errors;
330
- _value_dec = [observable.ref], _fieldOverrides_dec = [observable.shallow], _errors_dec = [observable.shallow], _context_dec = [computed.struct], _fields_dec = [computed], _knownFields_dec = [computed], _accessors_dec = [computed];
329
+ var _accessors_dec, _knownFields_dec, _fields_dec, _errors_dec, _fieldOverrides_dec, _value_dec, _init, _value, _fieldOverrides, _errors;
330
+ _value_dec = [observable.ref], _fieldOverrides_dec = [observable.shallow], _errors_dec = [observable.shallow], _fields_dec = [computed], _knownFields_dec = [computed], _accessors_dec = [computed];
331
331
  var FormModel = class {
332
332
  constructor(type, value, adapters) {
333
333
  this.type = type;
@@ -339,13 +339,13 @@ var FormModel = class {
339
339
  __publicField(this, "flattenedTypeDefs");
340
340
  this.value = mobxCopy(type, value);
341
341
  this.flattenedTypeDefs = flattenTypesOfType(type);
342
- const contextValue = this.toContext(value);
343
342
  const conversions = flattenValueTo(
344
343
  type,
345
344
  this.value,
346
345
  () => {
347
346
  },
348
- (_t, value2, _setter, typePath, valuePath) => {
347
+ (_t, fieldValue, _setter, typePath, valuePath) => {
348
+ const contextValue = this.toContext(value, valuePath);
349
349
  const adapter2 = this.adapters[typePath];
350
350
  if (adapter2 == null) {
351
351
  return;
@@ -357,16 +357,13 @@ var FormModel = class {
357
357
  if (revert == null) {
358
358
  return;
359
359
  }
360
- return convert(value2, valuePath, contextValue);
360
+ return convert(fieldValue, valuePath, contextValue);
361
361
  }
362
362
  );
363
363
  this.fieldOverrides = map(conversions, function(_k, v) {
364
364
  return v && [v.value];
365
365
  });
366
366
  }
367
- get context() {
368
- return this.toContext(this.value);
369
- }
370
367
  get fields() {
371
368
  return new Proxy(
372
369
  this.knownFields,
@@ -426,6 +423,7 @@ var FormModel = class {
426
423
  const fieldOverride = this.fieldOverrides[valuePath];
427
424
  const accessor = this.getAccessorForValuePath(valuePath);
428
425
  const fieldTypeDef = this.flattenedTypeDefs[typePath];
426
+ const context = this.toContext(this.value, valuePath);
429
427
  const {
430
428
  value,
431
429
  required,
@@ -434,11 +432,11 @@ var FormModel = class {
434
432
  accessor != null ? accessor.value : fieldTypeDef != null ? mobxCopy(
435
433
  fieldTypeDef,
436
434
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
437
- create(valuePath, this.context)
438
- ) : create(valuePath, this.context),
435
+ create(valuePath, context)
436
+ ) : create(valuePath, context),
439
437
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
440
438
  valuePath,
441
- this.context
439
+ context
442
440
  );
443
441
  const error = this.errors[valuePath];
444
442
  return {
@@ -496,7 +494,9 @@ var FormModel = class {
496
494
  const element = elementValue != null ? elementValue[0] : elementAdapter.create(
497
495
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
498
496
  elementTypePath,
499
- this.context
497
+ // TODO what can we use for the value path here?
498
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
499
+ this.toContext(this.value, valuePath)
500
500
  );
501
501
  const originalList = accessor.value;
502
502
  const newList = [
@@ -614,7 +614,7 @@ var FormModel = class {
614
614
  internalSetFieldValue(valuePath, value, displayValidation) {
615
615
  const { revert } = this.getAdapterForValuePath(valuePath);
616
616
  assertExists(revert, "setting value not supported {}", valuePath);
617
- const conversion = revert(value, valuePath, this.context);
617
+ const conversion = revert(value, valuePath, this.toContext(this.value, valuePath));
618
618
  const accessor = this.getAccessorForValuePath(valuePath);
619
619
  return runInAction(() => {
620
620
  this.fieldOverrides[valuePath] = [value];
@@ -654,10 +654,11 @@ var FormModel = class {
654
654
  convert,
655
655
  create
656
656
  } = adapter2;
657
- const value = create(valuePath, this.context);
657
+ const context = this.toContext(this.value, valuePath);
658
+ const value = create(valuePath, context);
658
659
  const {
659
660
  value: displayValue
660
- } = convert(value, valuePath, this.context);
661
+ } = convert(value, valuePath, context);
661
662
  const key = valuePath;
662
663
  runInAction(() => {
663
664
  this.fieldOverrides[key] = [displayValue];
@@ -683,13 +684,14 @@ var FormModel = class {
683
684
  } = this.getAdapterForValuePath(valuePath);
684
685
  const fieldOverride = this.fieldOverrides[valuePath];
685
686
  const accessor = this.getAccessorForValuePath(valuePath);
687
+ const context = this.toContext(this.value, valuePath);
686
688
  const {
687
689
  value: storedValue
688
690
  } = convert(
689
- accessor != null ? accessor.value : create(valuePath, this.context),
691
+ accessor != null ? accessor.value : create(valuePath, context),
690
692
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
691
693
  valuePath,
692
- this.context
694
+ context
693
695
  );
694
696
  const value = fieldOverride != null ? fieldOverride[0] : storedValue;
695
697
  const dirty = storedValue !== value;
@@ -697,12 +699,12 @@ var FormModel = class {
697
699
  if (ignoreDefaultValue) {
698
700
  const {
699
701
  value: defaultDisplayValue
700
- } = convert(create(valuePath, this.context), valuePath, this.context);
702
+ } = convert(create(valuePath, context), valuePath, context);
701
703
  if (defaultDisplayValue === value) {
702
704
  return true;
703
705
  }
704
706
  }
705
- const conversion = revert(value, valuePath, this.context);
707
+ const conversion = revert(value, valuePath, context);
706
708
  return runInAction(() => {
707
709
  switch (conversion.type) {
708
710
  case 1 /* Failure */:
@@ -745,12 +747,13 @@ var FormModel = class {
745
747
  return success;
746
748
  }
747
749
  const fieldOverride = this.fieldOverrides[adapterPath];
750
+ const context = this.toContext(this.value, valuePath);
748
751
  const {
749
752
  value: storedValue
750
- } = convert(accessor.value, valuePath, this.context);
753
+ } = convert(accessor.value, valuePath, context);
751
754
  const value = fieldOverride != null ? fieldOverride[0] : storedValue;
752
755
  const dirty = fieldOverride != null && fieldOverride[0] !== storedValue;
753
- const conversion = revert(value, valuePath, this.context);
756
+ const conversion = revert(value, valuePath, context);
754
757
  switch (conversion.type) {
755
758
  case 1 /* Failure */:
756
759
  this.errors[adapterPath] = conversion.error;
@@ -780,7 +783,6 @@ _errors = new WeakMap();
780
783
  __decorateElement(_init, 4, "value", _value_dec, FormModel, _value);
781
784
  __decorateElement(_init, 4, "fieldOverrides", _fieldOverrides_dec, FormModel, _fieldOverrides);
782
785
  __decorateElement(_init, 4, "errors", _errors_dec, FormModel, _errors);
783
- __decorateElement(_init, 2, "context", _context_dec, FormModel);
784
786
  __decorateElement(_init, 2, "fields", _fields_dec, FormModel);
785
787
  __decorateElement(_init, 2, "knownFields", _knownFields_dec, FormModel);
786
788
  __decorateElement(_init, 2, "accessors", _accessors_dec, FormModel);
@@ -1149,34 +1151,6 @@ function DefaultErrorRenderer({
1149
1151
  return JSON.stringify(error);
1150
1152
  }
1151
1153
 
1152
- // mantine/field_view.tsx
1153
- import { Observer } from "mobx-react";
1154
-
1155
- // util/empty.tsx
1156
- function Empty() {
1157
- return null;
1158
- }
1159
-
1160
- // mantine/field_view.tsx
1161
- import { jsx } from "react/jsx-runtime";
1162
- function FieldView({
1163
- fields,
1164
- valuePath,
1165
- children
1166
- }) {
1167
- return /* @__PURE__ */ jsx(Observer, { children: () => {
1168
- const {
1169
- value,
1170
- error
1171
- } = fields[valuePath];
1172
- return children({
1173
- value,
1174
- error,
1175
- ErrorSink: Empty
1176
- });
1177
- } });
1178
- }
1179
-
1180
1154
  // mantine/hooks.tsx
1181
1155
  import {
1182
1156
  Checkbox as CheckboxImpl,
@@ -1203,12 +1177,12 @@ import {
1203
1177
  forwardRef,
1204
1178
  useMemo
1205
1179
  } from "react";
1206
- import { jsx as jsx2 } from "react/jsx-runtime";
1180
+ import { jsx } from "react/jsx-runtime";
1207
1181
  function createSimplePartialComponent(Component, curriedProps) {
1208
1182
  return forwardRef(
1209
1183
  function(exposedProps, ref) {
1210
1184
  const C = Component;
1211
- return /* @__PURE__ */ jsx2(
1185
+ return /* @__PURE__ */ jsx(
1212
1186
  C,
1213
1187
  __spreadValues(__spreadValues({
1214
1188
  ref
@@ -1248,7 +1222,7 @@ function createPartialComponent(Component, curriedPropsSource, additionalPropKey
1248
1222
  ]
1249
1223
  );
1250
1224
  const curriedProps = curriedPropsSource(additionalProps);
1251
- return /* @__PURE__ */ jsx2(
1225
+ return /* @__PURE__ */ jsx(
1252
1226
  C,
1253
1227
  __spreadValues(__spreadValues({
1254
1228
  ref
@@ -1315,7 +1289,7 @@ function createUnsafePartialObserverComponent(Component, curriedPropsSource, add
1315
1289
  ]
1316
1290
  );
1317
1291
  const curriedProps = curriedPropsSource(additionalProps);
1318
- return /* @__PURE__ */ jsx2(
1292
+ return /* @__PURE__ */ jsx(
1319
1293
  C,
1320
1294
  __spreadValues(__spreadValues({
1321
1295
  ref
@@ -1346,7 +1320,7 @@ function usePartialObserverComponent(curriedPropsSource, deps, Component, additi
1346
1320
  }
1347
1321
 
1348
1322
  // mantine/create_checkbox.tsx
1349
- import { jsx as jsx3 } from "react/jsx-runtime";
1323
+ import { jsx as jsx2 } from "react/jsx-runtime";
1350
1324
  function createCheckbox(valuePath, Checkbox) {
1351
1325
  const onChange = (e) => {
1352
1326
  var _a;
@@ -1383,7 +1357,7 @@ function createCheckbox(valuePath, Checkbox) {
1383
1357
  checked: value,
1384
1358
  disabled: readonly,
1385
1359
  required,
1386
- error: error && /* @__PURE__ */ jsx3(ErrorRenderer, { error }),
1360
+ error: error && /* @__PURE__ */ jsx2(ErrorRenderer, { error }),
1387
1361
  onChange,
1388
1362
  onFocus,
1389
1363
  onBlur,
@@ -1397,6 +1371,80 @@ function createCheckbox(valuePath, Checkbox) {
1397
1371
  );
1398
1372
  }
1399
1373
 
1374
+ // mantine/create_field_view.tsx
1375
+ import { Observer } from "mobx-react";
1376
+ import {
1377
+ useCallback as useCallback2
1378
+ } from "react";
1379
+
1380
+ // util/empty.tsx
1381
+ function Empty() {
1382
+ return null;
1383
+ }
1384
+
1385
+ // mantine/create_field_view.tsx
1386
+ import { jsx as jsx3 } from "react/jsx-runtime";
1387
+ function FieldView({
1388
+ valuePath,
1389
+ form,
1390
+ children
1391
+ }) {
1392
+ const onFocus = useCallback2(() => {
1393
+ var _a;
1394
+ (_a = form.onFieldFocus) == null ? void 0 : _a.call(form, valuePath);
1395
+ }, [
1396
+ form,
1397
+ valuePath
1398
+ ]);
1399
+ const onBlur = useCallback2(() => {
1400
+ var _a;
1401
+ (_a = form.onFieldBlur) == null ? void 0 : _a.call(form, valuePath);
1402
+ }, [
1403
+ form,
1404
+ valuePath
1405
+ ]);
1406
+ const onValueChange = useCallback2((value) => {
1407
+ var _a;
1408
+ (_a = form.onFieldValueChange) == null ? void 0 : _a.call(form, valuePath, value);
1409
+ }, [
1410
+ form,
1411
+ valuePath
1412
+ ]);
1413
+ const onSubmit = useCallback2(() => {
1414
+ var _a;
1415
+ (_a = form.onFieldSubmit) == null ? void 0 : _a.call(form, valuePath);
1416
+ }, [
1417
+ form,
1418
+ valuePath
1419
+ ]);
1420
+ return /* @__PURE__ */ jsx3(Observer, { children: () => {
1421
+ const {
1422
+ value,
1423
+ error
1424
+ } = form.fields[valuePath];
1425
+ return children({
1426
+ value,
1427
+ error,
1428
+ ErrorSink: Empty,
1429
+ onFocus,
1430
+ onBlur,
1431
+ onValueChange,
1432
+ onSubmit
1433
+ });
1434
+ } });
1435
+ }
1436
+ function createFieldView(valuePath) {
1437
+ return (props) => {
1438
+ return /* @__PURE__ */ jsx3(
1439
+ FieldView,
1440
+ __spreadValues({
1441
+ form: this,
1442
+ valuePath
1443
+ }, props)
1444
+ );
1445
+ };
1446
+ }
1447
+
1400
1448
  // mantine/create_fields_view.tsx
1401
1449
  import {
1402
1450
  jsonPathPrefix,
@@ -1468,13 +1516,13 @@ function createFieldsView(valuePath, FieldsView, observableProps) {
1468
1516
  // mantine/create_form.tsx
1469
1517
  import { observer as observer3 } from "mobx-react";
1470
1518
  import {
1471
- useCallback as useCallback2
1519
+ useCallback as useCallback3
1472
1520
  } from "react";
1473
1521
  import { jsx as jsx5 } from "react/jsx-runtime";
1474
1522
  function createForm(valuePath, Form, observableProps) {
1475
1523
  return observer3((props) => {
1476
1524
  const { value } = observableProps.fields[valuePath];
1477
- const onValueChange = useCallback2((value2) => {
1525
+ const onValueChange = useCallback3((value2) => {
1478
1526
  observableProps.onFieldValueChange(valuePath, value2);
1479
1527
  }, []);
1480
1528
  return /* @__PURE__ */ jsx5(
@@ -1488,7 +1536,10 @@ function createForm(valuePath, Form, observableProps) {
1488
1536
  }
1489
1537
 
1490
1538
  // mantine/create_list.tsx
1491
- import { Fragment, jsx as jsx6 } from "react/jsx-runtime";
1539
+ import {
1540
+ Fragment
1541
+ } from "react";
1542
+ import { Fragment as Fragment2, jsx as jsx6 } from "react/jsx-runtime";
1492
1543
  function createList(valuePath, List) {
1493
1544
  const propSource = () => {
1494
1545
  const values = [...this.fields[valuePath].value];
@@ -1504,9 +1555,9 @@ function DefaultList({
1504
1555
  listPath,
1505
1556
  children
1506
1557
  }) {
1507
- return /* @__PURE__ */ jsx6(Fragment, { children: values.map(function(value, index) {
1558
+ return /* @__PURE__ */ jsx6(Fragment2, { children: values.map(function(value, index) {
1508
1559
  const valuePath = `${listPath}.${index}`;
1509
- return children(valuePath, value, index);
1560
+ return /* @__PURE__ */ jsx6(Fragment, { children: children(valuePath, value, index) }, valuePath);
1510
1561
  }) });
1511
1562
  }
1512
1563
 
@@ -1705,6 +1756,7 @@ function useMantineFormFields({
1705
1756
  onFieldFocus,
1706
1757
  onFieldSubmit,
1707
1758
  fields
1759
+ // should use FieldView rather than observing fields directly from here
1708
1760
  }) {
1709
1761
  const form = useMemo2(
1710
1762
  function() {
@@ -1773,6 +1825,9 @@ var MantineFormImpl = class {
1773
1825
  __publicField(this, "listCache", new Cache(
1774
1826
  createList.bind(this)
1775
1827
  ));
1828
+ __publicField(this, "fieldViewCache", new Cache(
1829
+ createFieldView.bind(this)
1830
+ ));
1776
1831
  __publicField(this, "fieldsViewCache", new Cache(
1777
1832
  createFieldsView.bind(this)
1778
1833
  ));
@@ -1840,6 +1895,11 @@ var MantineFormImpl = class {
1840
1895
  DefaultList
1841
1896
  );
1842
1897
  }
1898
+ fieldView(valuePath) {
1899
+ return this.fieldViewCache.retrieveOrCreate(
1900
+ valuePath
1901
+ );
1902
+ }
1843
1903
  fieldsView(valuePath, FieldsView) {
1844
1904
  return this.fieldsViewCache.retrieveOrCreate(
1845
1905
  valuePath,
@@ -1907,7 +1967,6 @@ export {
1907
1967
  AbstractSelectValueTypeConverter,
1908
1968
  DefaultErrorRenderer,
1909
1969
  Empty,
1910
- FieldView,
1911
1970
  FormModel,
1912
1971
  IntegerToStringConverter,
1913
1972
  NullableToBooleanConverter,
package/index.ts CHANGED
@@ -17,7 +17,6 @@ export * from './field_converters/trimming_string_converter'
17
17
  export * from './field_converters/validating_converter'
18
18
  export * from './field_value_factories/prototyping_field_value_factory'
19
19
  export * from './mantine/error_renderer'
20
- export * from './mantine/field_view'
21
20
  export * from './mantine/hooks'
22
21
  export * from './types/error_of_field'
23
22
  export * from './types/field'
@@ -0,0 +1,94 @@
1
+ import { Observer } from 'mobx-react'
2
+ import {
3
+ type ComponentType,
4
+ useCallback,
5
+ } from 'react'
6
+ import { type AllFieldsOfFields } from 'types/all_fields_of_fields'
7
+ import { type ErrorOfField } from 'types/error_of_field'
8
+ import { type Fields } from 'types/field'
9
+ import { type ValueTypeOfField } from 'types/value_type_of_field'
10
+ import { Empty } from 'util/empty'
11
+ import { type MantineForm } from './types'
12
+
13
+ export type FieldViewProps<F extends Fields, K extends keyof F> = {
14
+ children: (props: {
15
+ value: ValueTypeOfField<F[K]>,
16
+ error: ErrorOfField<F[K]> | undefined,
17
+ ErrorSink: ComponentType<{ error: ErrorOfField<F[K]> }>,
18
+ onFocus: () => void,
19
+ onBlur: () => void,
20
+ onValueChange: (v: ValueTypeOfField<F[K]>) => void,
21
+ onSubmit: () => void,
22
+ }) => JSX.Element,
23
+ }
24
+
25
+ /**
26
+ * Displays current value and error of a field
27
+ */
28
+ function FieldView<F extends Fields, K extends keyof F>({
29
+ valuePath,
30
+ form,
31
+ children,
32
+ }: FieldViewProps<F, K> & {
33
+ valuePath: K,
34
+ form: MantineForm<F>,
35
+ }) {
36
+ const onFocus = useCallback(() => {
37
+ form.onFieldFocus?.(valuePath)
38
+ }, [
39
+ form,
40
+ valuePath,
41
+ ])
42
+ const onBlur = useCallback(() => {
43
+ form.onFieldBlur?.(valuePath)
44
+ }, [
45
+ form,
46
+ valuePath,
47
+ ])
48
+ const onValueChange = useCallback((value: ValueTypeOfField<F[K]>) => {
49
+ form.onFieldValueChange?.(valuePath, value)
50
+ }, [
51
+ form,
52
+ valuePath,
53
+ ])
54
+ const onSubmit = useCallback(() => {
55
+ form.onFieldSubmit?.(valuePath)
56
+ }, [
57
+ form,
58
+ valuePath,
59
+ ])
60
+ return (
61
+ <Observer>
62
+ {() => {
63
+ const {
64
+ value,
65
+ error,
66
+ } = form.fields[valuePath]
67
+ return children({
68
+ value,
69
+ error,
70
+ ErrorSink: Empty,
71
+ onFocus,
72
+ onBlur,
73
+ onValueChange,
74
+ onSubmit,
75
+ })
76
+ }}
77
+ </Observer>
78
+ )
79
+ }
80
+
81
+ export function createFieldView<
82
+ F extends Fields,
83
+ K extends keyof AllFieldsOfFields<F>,
84
+ >(this: MantineForm<F>, valuePath: K): ComponentType<FieldViewProps<F, K>> {
85
+ return (props: FieldViewProps<F, K>) => {
86
+ return (
87
+ <FieldView
88
+ form={this}
89
+ valuePath={valuePath}
90
+ {...props}
91
+ />
92
+ )
93
+ }
94
+ }
@@ -1,5 +1,8 @@
1
1
  import { type ElementOfArray } from '@strictly/base'
2
- import { type ComponentType } from 'react'
2
+ import {
3
+ type ComponentType,
4
+ Fragment,
5
+ } from 'react'
3
6
  import { type Fields } from 'types/field'
4
7
  import { type ListFieldsOfFields } from 'types/list_fields_of_fields'
5
8
  import { type ValueTypeOfField } from 'types/value_type_of_field'
@@ -54,7 +57,11 @@ export function DefaultList<
54
57
  <>
55
58
  {values.map(function (value, index) {
56
59
  const valuePath: `${ListPath}.${number}` = `${listPath}.${index}`
57
- return children(valuePath, value, index)
60
+ return (
61
+ <Fragment key={valuePath}>
62
+ {children(valuePath, value, index)}
63
+ </Fragment>
64
+ )
58
65
  })}
59
66
  </>
60
67
  )