@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.cjs CHANGED
@@ -485,8 +485,7 @@ var FormPresenter = class {
485
485
  convert,
486
486
  create
487
487
  } = adapter2;
488
- const accessor = model.accessors[valuePath];
489
- const value = accessor == null ? create(valuePath, model.value) : accessor.value;
488
+ const value = create(valuePath, model.value);
490
489
  const {
491
490
  value: displayValue
492
491
  } = convert(value, valuePath, model.value);
@@ -507,7 +506,7 @@ var FormPresenter = class {
507
506
  const keys = new Set(Object.keys(values));
508
507
  return keys.has(valuePath);
509
508
  }
510
- validateField(model, valuePath) {
509
+ validateField(model, valuePath, ignoreDefaultValue = false) {
511
510
  const {
512
511
  convert,
513
512
  revert,
@@ -526,6 +525,14 @@ var FormPresenter = class {
526
525
  const value = fieldOverride != null ? fieldOverride[0] : storedValue;
527
526
  const dirty = storedValue !== value;
528
527
  (0, import_base2.assertExists)(revert, "changing field directly not supported {}", valuePath);
528
+ if (ignoreDefaultValue) {
529
+ const {
530
+ value: defaultDisplayValue
531
+ } = convert(create(valuePath, model.value), valuePath, model.value);
532
+ if (defaultDisplayValue === value) {
533
+ return true;
534
+ }
535
+ }
529
536
  const conversion = revert(value, valuePath, model.value);
530
537
  return (0, import_mobx.runInAction)(function() {
531
538
  switch (conversion.type) {
@@ -596,13 +603,6 @@ var FormPresenter = class {
596
603
  );
597
604
  });
598
605
  }
599
- createModel(value) {
600
- return new FormModel(
601
- this.type,
602
- value,
603
- this.adapters
604
- );
605
- }
606
606
  };
607
607
  var FormModel = class {
608
608
  constructor(type, value, adapters) {
@@ -740,19 +740,173 @@ var FormModel = class {
740
740
  }
741
741
  };
742
742
 
743
- // core/mobx/hooks.ts
743
+ // core/mobx/hooks.tsx
744
+ var import_react2 = require("react");
745
+
746
+ // util/partial.tsx
747
+ var import_mobx_react = require("mobx-react");
744
748
  var import_react = require("react");
749
+ var import_jsx_runtime = require("react/jsx-runtime");
750
+ function createSimplePartialComponent(Component, curriedProps) {
751
+ return (0, import_react.forwardRef)(
752
+ function(exposedProps, ref) {
753
+ const C = Component;
754
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
755
+ C,
756
+ {
757
+ ref,
758
+ ...curriedProps,
759
+ ...exposedProps
760
+ }
761
+ );
762
+ }
763
+ );
764
+ }
765
+ function createPartialComponent(Component, curriedPropsSource, additionalPropKeys = []) {
766
+ return (0, import_react.forwardRef)(
767
+ function(props, ref) {
768
+ const C = Component;
769
+ const [
770
+ additionalProps,
771
+ exposedProps
772
+ ] = additionalPropKeys.reduce(
773
+ function([
774
+ additionalProps2,
775
+ exposedProps2
776
+ ], key) {
777
+ const value = props[
778
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
779
+ key
780
+ ];
781
+ delete exposedProps2[key];
782
+ additionalProps2[key] = value;
783
+ return [
784
+ additionalProps2,
785
+ exposedProps2
786
+ ];
787
+ },
788
+ [
789
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
790
+ {},
791
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
792
+ { ...props }
793
+ ]
794
+ );
795
+ const curriedProps = curriedPropsSource(additionalProps);
796
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
797
+ C,
798
+ {
799
+ ref,
800
+ ...curriedProps,
801
+ ...exposedProps
802
+ }
803
+ );
804
+ }
805
+ );
806
+ }
807
+ function usePartialComponent(curriedPropsSource, deps, Component, additionalPropKeys = []) {
808
+ return (0, import_react.useMemo)(
809
+ function() {
810
+ return createPartialComponent(
811
+ Component,
812
+ curriedPropsSource,
813
+ additionalPropKeys
814
+ );
815
+ },
816
+ // eslint-disable-next-line react-hooks/exhaustive-deps
817
+ [
818
+ // eslint-disable-next-line react-hooks/exhaustive-deps
819
+ ...deps,
820
+ Component,
821
+ // eslint-disable-next-line react-hooks/exhaustive-deps
822
+ ...additionalPropKeys
823
+ ]
824
+ );
825
+ }
826
+ function createPartialObserverComponent(Component, curriedPropsSource, additionalPropKeys = []) {
827
+ return createUnsafePartialObserverComponent(
828
+ Component,
829
+ curriedPropsSource,
830
+ additionalPropKeys
831
+ );
832
+ }
833
+ function createUnsafePartialObserverComponent(Component, curriedPropsSource, additionalPropKeys = []) {
834
+ return (0, import_mobx_react.observer)(
835
+ (0, import_react.forwardRef)(
836
+ function(props, ref) {
837
+ const C = Component;
838
+ const [
839
+ additionalProps,
840
+ exposedProps
841
+ ] = additionalPropKeys.reduce(
842
+ function([
843
+ additionalProps2,
844
+ exposedProps2
845
+ ], key) {
846
+ const value = props[
847
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
848
+ key
849
+ ];
850
+ delete exposedProps2[key];
851
+ additionalProps2[key] = value;
852
+ return [
853
+ additionalProps2,
854
+ exposedProps2
855
+ ];
856
+ },
857
+ [
858
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
859
+ {},
860
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
861
+ { ...props }
862
+ ]
863
+ );
864
+ const curriedProps = curriedPropsSource(additionalProps);
865
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
866
+ C,
867
+ {
868
+ ref,
869
+ ...curriedProps,
870
+ ...exposedProps
871
+ }
872
+ );
873
+ }
874
+ )
875
+ );
876
+ }
877
+ function usePartialObserverComponent(curriedPropsSource, deps, Component, additionalPropKeys = []) {
878
+ return (0, import_react.useMemo)(
879
+ function() {
880
+ return createPartialObserverComponent(
881
+ Component,
882
+ curriedPropsSource,
883
+ additionalPropKeys
884
+ );
885
+ },
886
+ // eslint-disable-next-line react-hooks/exhaustive-deps
887
+ [
888
+ // eslint-disable-next-line react-hooks/exhaustive-deps
889
+ ...deps,
890
+ Component,
891
+ // eslint-disable-next-line react-hooks/exhaustive-deps
892
+ ...additionalPropKeys
893
+ ]
894
+ );
895
+ }
896
+
897
+ // core/mobx/hooks.tsx
745
898
  function useDefaultMobxFormHooks(presenter, value, {
746
899
  onValidFieldSubmit,
747
- onValidFormSubmit
900
+ onValidFormSubmit,
901
+ FormFieldsView
748
902
  } = {}) {
749
- const model = (0, import_react.useMemo)(function() {
903
+ const model = (0, import_react2.useMemo)(function() {
750
904
  return presenter.createModel(value);
751
905
  }, [
752
906
  presenter,
753
907
  value
754
908
  ]);
755
- const onFieldValueChange = (0, import_react.useCallback)(
909
+ const onFieldValueChange = (0, import_react2.useCallback)(
756
910
  function(path, value2) {
757
911
  presenter.clearFieldError(model, path);
758
912
  presenter.setFieldValue(model, path, value2);
@@ -762,7 +916,7 @@ function useDefaultMobxFormHooks(presenter, value, {
762
916
  model
763
917
  ]
764
918
  );
765
- const onFieldSubmit = (0, import_react.useCallback)(
919
+ const onFieldSubmit = (0, import_react2.useCallback)(
766
920
  function(valuePath) {
767
921
  if (presenter.validateField(model, valuePath)) {
768
922
  onValidFieldSubmit?.(model, valuePath);
@@ -775,11 +929,11 @@ function useDefaultMobxFormHooks(presenter, value, {
775
929
  onValidFieldSubmit
776
930
  ]
777
931
  );
778
- const onFieldBlur = (0, import_react.useCallback)(
932
+ const onFieldBlur = (0, import_react2.useCallback)(
779
933
  function(path) {
780
934
  setTimeout(function() {
781
935
  if (presenter.isValuePathActive(model, path)) {
782
- presenter.validateField(model, path);
936
+ presenter.validateField(model, path, true);
783
937
  }
784
938
  }, 100);
785
939
  },
@@ -788,7 +942,7 @@ function useDefaultMobxFormHooks(presenter, value, {
788
942
  model
789
943
  ]
790
944
  );
791
- const onFormSubmit = (0, import_react.useCallback)(
945
+ const onFormSubmit = (0, import_react2.useCallback)(
792
946
  function() {
793
947
  if (presenter.validateAll(model)) {
794
948
  onValidFormSubmit?.(model, model.value);
@@ -800,12 +954,33 @@ function useDefaultMobxFormHooks(presenter, value, {
800
954
  onValidFormSubmit
801
955
  ]
802
956
  );
957
+ const FormFields = (0, import_react2.useMemo)(() => {
958
+ if (FormFieldsView == null) {
959
+ return void 0;
960
+ }
961
+ return createUnsafePartialObserverComponent(FormFieldsView, () => {
962
+ return {
963
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
964
+ fields: model.fields,
965
+ onFieldBlur,
966
+ onFieldSubmit,
967
+ onFieldValueChange
968
+ };
969
+ });
970
+ }, [
971
+ model,
972
+ FormFieldsView,
973
+ onFieldBlur,
974
+ onFieldSubmit,
975
+ onFieldValueChange
976
+ ]);
803
977
  return {
804
978
  model,
805
979
  onFieldValueChange,
806
980
  onFieldSubmit,
807
981
  onFieldBlur,
808
- onFormSubmit
982
+ onFormSubmit,
983
+ FormFields
809
984
  };
810
985
  }
811
986
 
@@ -1117,157 +1292,6 @@ var import_base6 = require("@strictly/base");
1117
1292
  var import_mobx2 = require("mobx");
1118
1293
  var import_react4 = require("react");
1119
1294
 
1120
- // util/partial.tsx
1121
- var import_mobx_react = require("mobx-react");
1122
- var import_react2 = require("react");
1123
- var import_jsx_runtime = require("react/jsx-runtime");
1124
- function createSimplePartialComponent(Component, curriedProps) {
1125
- return (0, import_react2.forwardRef)(
1126
- function(exposedProps, ref) {
1127
- const C = Component;
1128
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1129
- C,
1130
- {
1131
- ref,
1132
- ...curriedProps,
1133
- ...exposedProps
1134
- }
1135
- );
1136
- }
1137
- );
1138
- }
1139
- function createPartialComponent(Component, curriedPropsSource, additionalPropKeys = []) {
1140
- return (0, import_react2.forwardRef)(
1141
- function(props, ref) {
1142
- const C = Component;
1143
- const [
1144
- additionalProps,
1145
- exposedProps
1146
- ] = additionalPropKeys.reduce(
1147
- function([
1148
- additionalProps2,
1149
- exposedProps2
1150
- ], key) {
1151
- const value = props[
1152
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1153
- key
1154
- ];
1155
- delete exposedProps2[key];
1156
- additionalProps2[key] = value;
1157
- return [
1158
- additionalProps2,
1159
- exposedProps2
1160
- ];
1161
- },
1162
- [
1163
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1164
- {},
1165
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1166
- { ...props }
1167
- ]
1168
- );
1169
- const curriedProps = curriedPropsSource(additionalProps);
1170
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1171
- C,
1172
- {
1173
- ref,
1174
- ...curriedProps,
1175
- ...exposedProps
1176
- }
1177
- );
1178
- }
1179
- );
1180
- }
1181
- function usePartialComponent(curriedPropsSource, deps, Component, additionalPropKeys = []) {
1182
- return (0, import_react2.useMemo)(
1183
- function() {
1184
- return createPartialComponent(
1185
- Component,
1186
- curriedPropsSource,
1187
- additionalPropKeys
1188
- );
1189
- },
1190
- // eslint-disable-next-line react-hooks/exhaustive-deps
1191
- [
1192
- // eslint-disable-next-line react-hooks/exhaustive-deps
1193
- ...deps,
1194
- Component,
1195
- // eslint-disable-next-line react-hooks/exhaustive-deps
1196
- ...additionalPropKeys
1197
- ]
1198
- );
1199
- }
1200
- function createPartialObserverComponent(Component, curriedPropsSource, additionalPropKeys = []) {
1201
- return createUnsafePartialObserverComponent(
1202
- Component,
1203
- curriedPropsSource,
1204
- additionalPropKeys
1205
- );
1206
- }
1207
- function createUnsafePartialObserverComponent(Component, curriedPropsSource, additionalPropKeys = []) {
1208
- return (0, import_mobx_react.observer)(
1209
- (0, import_react2.forwardRef)(
1210
- function(props, ref) {
1211
- const C = Component;
1212
- const [
1213
- additionalProps,
1214
- exposedProps
1215
- ] = additionalPropKeys.reduce(
1216
- function([
1217
- additionalProps2,
1218
- exposedProps2
1219
- ], key) {
1220
- const value = props[
1221
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1222
- key
1223
- ];
1224
- delete exposedProps2[key];
1225
- additionalProps2[key] = value;
1226
- return [
1227
- additionalProps2,
1228
- exposedProps2
1229
- ];
1230
- },
1231
- [
1232
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1233
- {},
1234
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1235
- { ...props }
1236
- ]
1237
- );
1238
- const curriedProps = curriedPropsSource(additionalProps);
1239
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1240
- C,
1241
- {
1242
- ref,
1243
- ...curriedProps,
1244
- ...exposedProps
1245
- }
1246
- );
1247
- }
1248
- )
1249
- );
1250
- }
1251
- function usePartialObserverComponent(curriedPropsSource, deps, Component, additionalPropKeys = []) {
1252
- return (0, import_react2.useMemo)(
1253
- function() {
1254
- return createPartialObserverComponent(
1255
- Component,
1256
- curriedPropsSource,
1257
- additionalPropKeys
1258
- );
1259
- },
1260
- // eslint-disable-next-line react-hooks/exhaustive-deps
1261
- [
1262
- // eslint-disable-next-line react-hooks/exhaustive-deps
1263
- ...deps,
1264
- Component,
1265
- // eslint-disable-next-line react-hooks/exhaustive-deps
1266
- ...additionalPropKeys
1267
- ]
1268
- );
1269
- }
1270
-
1271
1295
  // mantine/create_checkbox.tsx
1272
1296
  var import_jsx_runtime2 = require("react/jsx-runtime");
1273
1297
  function createCheckbox(valuePath, Checkbox) {
@@ -1338,34 +1362,46 @@ function createFieldsView(valuePath, FieldsView, observableProps) {
1338
1362
  function onFieldSubmit(subKey) {
1339
1363
  observableProps.onFieldSubmit?.(toKey(subKey));
1340
1364
  }
1341
- return (0, import_mobx_react2.observer)(function(props) {
1342
- const subFields = Object.entries(observableProps.fields).reduce(
1343
- (acc, [
1344
- fieldKey,
1345
- fieldValue
1346
- ]) => {
1347
- if (fieldKey.startsWith(valuePath)) {
1348
- acc[toSubKey(fieldKey)] = fieldValue;
1365
+ const Component = (0, import_mobx_react2.observer)(
1366
+ function(props) {
1367
+ const subFields = Object.entries(observableProps.fields).reduce(
1368
+ (acc, [
1369
+ fieldKey,
1370
+ fieldValue
1371
+ ]) => {
1372
+ if (fieldKey.startsWith(valuePath)) {
1373
+ acc[toSubKey(fieldKey)] = fieldValue;
1374
+ }
1375
+ return acc;
1376
+ },
1377
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1378
+ {}
1379
+ );
1380
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1381
+ FieldsView,
1382
+ {
1383
+ // maybe we can do this in a more type safe way
1384
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions
1385
+ ...props,
1386
+ fields: subFields,
1387
+ onFieldBlur,
1388
+ onFieldFocus,
1389
+ onFieldSubmit,
1390
+ onFieldValueChange
1349
1391
  }
1350
- return acc;
1351
- },
1352
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1353
- {}
1354
- );
1355
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1356
- FieldsView,
1357
- {
1358
- // maybe we can do this in a more type safe way
1359
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions
1360
- ...props,
1361
- fields: subFields,
1362
- onFieldBlur,
1363
- onFieldFocus,
1364
- onFieldSubmit,
1365
- onFieldValueChange
1366
- }
1367
- );
1368
- });
1392
+ );
1393
+ }
1394
+ );
1395
+ const callbackMapper = (callback) => {
1396
+ return (subFormValuePath, ...args) => {
1397
+ const valuePath2 = toKey(subFormValuePath);
1398
+ return callback(valuePath2, ...args);
1399
+ };
1400
+ };
1401
+ return {
1402
+ Component,
1403
+ callbackMapper
1404
+ };
1369
1405
  }
1370
1406
 
1371
1407
  // mantine/create_form.tsx
package/dist/index.d.cts 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