@rjsf/core 5.19.4 → 5.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.umd.js CHANGED
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('@rjsf/utils'), require('lodash/get'), require('lodash/isEmpty'), require('lodash/pick'), require('lodash/toPath'), require('lodash/cloneDeep'), require('lodash/isObject'), require('lodash/set'), require('nanoid'), require('react/jsx-runtime'), require('lodash/omit'), require('markdown-to-jsx'), require('lodash/has'), require('lodash/unset')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'react', '@rjsf/utils', 'lodash/get', 'lodash/isEmpty', 'lodash/pick', 'lodash/toPath', 'lodash/cloneDeep', 'lodash/isObject', 'lodash/set', 'nanoid', 'react/jsx-runtime', 'lodash/omit', 'markdown-to-jsx', 'lodash/has', 'lodash/unset'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.JSONSchemaForm = {}, global.react, global.utils, global.get3, global.isEmpty, global._pick, global._toPath, global.cloneDeep, global.isObject, global.set, global.nanoid, global.jsxRuntime, global.omit2, global.Markdown, global.has, global.unset));
5
- })(this, (function (exports, react, utils, get3, isEmpty, _pick, _toPath, cloneDeep, isObject, set, nanoid, jsxRuntime, omit2, Markdown, has, unset) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('@rjsf/utils'), require('lodash/forEach'), require('lodash/get'), require('lodash/isEmpty'), require('lodash/pick'), require('lodash/toPath'), require('lodash/cloneDeep'), require('lodash/isObject'), require('lodash/set'), require('nanoid'), require('react/jsx-runtime'), require('lodash/omit'), require('markdown-to-jsx'), require('lodash/has'), require('lodash/unset')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'react', '@rjsf/utils', 'lodash/forEach', 'lodash/get', 'lodash/isEmpty', 'lodash/pick', 'lodash/toPath', 'lodash/cloneDeep', 'lodash/isObject', 'lodash/set', 'nanoid', 'react/jsx-runtime', 'lodash/omit', 'markdown-to-jsx', 'lodash/has', 'lodash/unset'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.JSONSchemaForm = {}, global.react, global.utils, global._forEach, global.get3, global.isEmpty, global._pick, global._toPath, global.cloneDeep, global.isObject, global.set, global.nanoid, global.jsxRuntime, global.omit2, global.Markdown, global.has, global.unset));
5
+ })(this, (function (exports, react, utils, _forEach, get3, isEmpty, _pick, _toPath, cloneDeep, isObject, set, nanoid, jsxRuntime, omit2, Markdown, has, unset) { 'use strict';
6
6
 
7
7
  // src/components/Form.tsx
8
8
  function generateRowId() {
@@ -513,7 +513,7 @@
513
513
  } = this.props;
514
514
  const { widgets: widgets2, schemaUtils, formContext, globalUiOptions } = registry;
515
515
  const itemsSchema = schemaUtils.retrieveSchema(schema.items, items);
516
- const enumOptions = utils.optionsList(itemsSchema);
516
+ const enumOptions = utils.optionsList(itemsSchema, uiSchema);
517
517
  const { widget = "select", title: uiTitle, ...options } = utils.getUiOptions(uiSchema, globalUiOptions);
518
518
  const Widget = utils.getWidget(schema, widget, widgets2);
519
519
  const label = uiTitle ?? schema.title ?? name;
@@ -804,18 +804,21 @@
804
804
  let enumOptions;
805
805
  const label = uiTitle ?? schemaTitle ?? title ?? name;
806
806
  if (Array.isArray(schema.oneOf)) {
807
- enumOptions = utils.optionsList({
808
- oneOf: schema.oneOf.map((option) => {
809
- if (isObject(option)) {
810
- return {
811
- ...option,
812
- title: option.title || (option.const === true ? yes : no)
813
- };
814
- }
815
- return void 0;
816
- }).filter((o) => o)
817
- // cast away the error that typescript can't grok is fixed
818
- });
807
+ enumOptions = utils.optionsList(
808
+ {
809
+ oneOf: schema.oneOf.map((option) => {
810
+ if (isObject(option)) {
811
+ return {
812
+ ...option,
813
+ title: option.title || (option.const === true ? yes : no)
814
+ };
815
+ }
816
+ return void 0;
817
+ }).filter((o) => o)
818
+ // cast away the error that typescript can't grok is fixed
819
+ },
820
+ uiSchema
821
+ );
819
822
  } else {
820
823
  const schemaWithEnumNames = schema;
821
824
  const enums = schema.enum ?? [true, false];
@@ -831,11 +834,14 @@
831
834
  }
832
835
  ];
833
836
  } else {
834
- enumOptions = utils.optionsList({
835
- enum: enums,
836
- // NOTE: enumNames is deprecated, but still supported for now.
837
- enumNames: schemaWithEnumNames.enumNames
838
- });
837
+ enumOptions = utils.optionsList(
838
+ {
839
+ enum: enums,
840
+ // NOTE: enumNames is deprecated, but still supported for now.
841
+ enumNames: schemaWithEnumNames.enumNames
842
+ },
843
+ uiSchema
844
+ );
839
845
  }
840
846
  }
841
847
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -1614,7 +1620,7 @@
1614
1620
  } = props;
1615
1621
  const { title, format } = schema;
1616
1622
  const { widgets: widgets2, formContext, schemaUtils, globalUiOptions } = registry;
1617
- const enumOptions = schemaUtils.isSelect(schema) ? utils.optionsList(schema) : void 0;
1623
+ const enumOptions = schemaUtils.isSelect(schema) ? utils.optionsList(schema, uiSchema) : void 0;
1618
1624
  let defaultWidget = enumOptions ? "select" : "text";
1619
1625
  if (format && utils.hasWidget(schema, format, widgets2)) {
1620
1626
  defaultWidget = format;
@@ -3075,6 +3081,10 @@
3075
3081
  errorSchema = merged.errorSchema;
3076
3082
  errors = merged.errors;
3077
3083
  }
3084
+ if (newErrorSchema) {
3085
+ const filteredErrors = this.filterErrorsBasedOnSchema(newErrorSchema, retrievedSchema, newFormData);
3086
+ errorSchema = utils.mergeObjects(errorSchema, filteredErrors, "preventDuplicates");
3087
+ }
3078
3088
  state = {
3079
3089
  formData: newFormData,
3080
3090
  errors,
@@ -3352,7 +3362,15 @@
3352
3362
  if (mustValidate) {
3353
3363
  const schemaValidation = this.validate(formData, schema, schemaUtils, _retrievedSchema);
3354
3364
  errors = schemaValidation.errors;
3355
- errorSchema = schemaValidation.errorSchema;
3365
+ if (isSchemaChanged) {
3366
+ errorSchema = schemaValidation.errorSchema;
3367
+ } else {
3368
+ errorSchema = utils.mergeObjects(
3369
+ this.state?.errorSchema,
3370
+ schemaValidation.errorSchema,
3371
+ "preventDuplicates"
3372
+ );
3373
+ }
3356
3374
  schemaValidationErrors = errors;
3357
3375
  schemaValidationErrorSchema = errorSchema;
3358
3376
  } else {
@@ -3430,6 +3448,28 @@
3430
3448
  }
3431
3449
  return null;
3432
3450
  }
3451
+ // Filtering errors based on your retrieved schema to only show errors for properties in the selected branch.
3452
+ filterErrorsBasedOnSchema(schemaErrors, resolvedSchema, formData) {
3453
+ const { retrievedSchema, schemaUtils } = this.state;
3454
+ const _retrievedSchema = resolvedSchema ?? retrievedSchema;
3455
+ const pathSchema = schemaUtils.toPathSchema(_retrievedSchema, "", formData);
3456
+ const fieldNames = this.getFieldNames(pathSchema, formData);
3457
+ const filteredErrors = _pick(schemaErrors, fieldNames);
3458
+ if (resolvedSchema?.type !== "object" && resolvedSchema?.type !== "array") {
3459
+ filteredErrors.__errors = schemaErrors.__errors;
3460
+ }
3461
+ const filterUndefinedErrors = (errors) => {
3462
+ _forEach(errors, (errorAtKey, errorKey) => {
3463
+ if (errorAtKey === void 0) {
3464
+ delete errors[errorKey];
3465
+ } else if (typeof errorAtKey === "object" && !Array.isArray(errorAtKey.__errors)) {
3466
+ filterUndefinedErrors(errorAtKey);
3467
+ }
3468
+ });
3469
+ return errors;
3470
+ };
3471
+ return filterUndefinedErrors(filteredErrors);
3472
+ }
3433
3473
  /** Returns the registry for the form */
3434
3474
  getRegistry() {
3435
3475
  const { translateString: customTranslateString, uiSchema = {} } = this.props;
package/dist/index.esm.js CHANGED
@@ -16,6 +16,7 @@ import {
16
16
  UI_OPTIONS_KEY as UI_OPTIONS_KEY2,
17
17
  validationDataMerge
18
18
  } from "@rjsf/utils";
19
+ import _forEach from "lodash/forEach";
19
20
  import _get from "lodash/get";
20
21
  import _isEmpty from "lodash/isEmpty";
21
22
  import _pick from "lodash/pick";
@@ -551,7 +552,7 @@ var ArrayField = class extends Component {
551
552
  } = this.props;
552
553
  const { widgets: widgets2, schemaUtils, formContext, globalUiOptions } = registry;
553
554
  const itemsSchema = schemaUtils.retrieveSchema(schema.items, items);
554
- const enumOptions = optionsList(itemsSchema);
555
+ const enumOptions = optionsList(itemsSchema, uiSchema);
555
556
  const { widget = "select", title: uiTitle, ...options } = getUiOptions(uiSchema, globalUiOptions);
556
557
  const Widget = getWidget(schema, widget, widgets2);
557
558
  const label = uiTitle ?? schema.title ?? name;
@@ -852,18 +853,21 @@ function BooleanField(props) {
852
853
  let enumOptions;
853
854
  const label = uiTitle ?? schemaTitle ?? title ?? name;
854
855
  if (Array.isArray(schema.oneOf)) {
855
- enumOptions = optionsList2({
856
- oneOf: schema.oneOf.map((option) => {
857
- if (isObject2(option)) {
858
- return {
859
- ...option,
860
- title: option.title || (option.const === true ? yes : no)
861
- };
862
- }
863
- return void 0;
864
- }).filter((o) => o)
865
- // cast away the error that typescript can't grok is fixed
866
- });
856
+ enumOptions = optionsList2(
857
+ {
858
+ oneOf: schema.oneOf.map((option) => {
859
+ if (isObject2(option)) {
860
+ return {
861
+ ...option,
862
+ title: option.title || (option.const === true ? yes : no)
863
+ };
864
+ }
865
+ return void 0;
866
+ }).filter((o) => o)
867
+ // cast away the error that typescript can't grok is fixed
868
+ },
869
+ uiSchema
870
+ );
867
871
  } else {
868
872
  const schemaWithEnumNames = schema;
869
873
  const enums = schema.enum ?? [true, false];
@@ -879,11 +883,14 @@ function BooleanField(props) {
879
883
  }
880
884
  ];
881
885
  } else {
882
- enumOptions = optionsList2({
883
- enum: enums,
884
- // NOTE: enumNames is deprecated, but still supported for now.
885
- enumNames: schemaWithEnumNames.enumNames
886
- });
886
+ enumOptions = optionsList2(
887
+ {
888
+ enum: enums,
889
+ // NOTE: enumNames is deprecated, but still supported for now.
890
+ enumNames: schemaWithEnumNames.enumNames
891
+ },
892
+ uiSchema
893
+ );
887
894
  }
888
895
  }
889
896
  return /* @__PURE__ */ jsx2(
@@ -1734,7 +1741,7 @@ function StringField(props) {
1734
1741
  } = props;
1735
1742
  const { title, format } = schema;
1736
1743
  const { widgets: widgets2, formContext, schemaUtils, globalUiOptions } = registry;
1737
- const enumOptions = schemaUtils.isSelect(schema) ? optionsList3(schema) : void 0;
1744
+ const enumOptions = schemaUtils.isSelect(schema) ? optionsList3(schema, uiSchema) : void 0;
1738
1745
  let defaultWidget = enumOptions ? "select" : "text";
1739
1746
  if (format && hasWidget(schema, format, widgets2)) {
1740
1747
  defaultWidget = format;
@@ -3425,6 +3432,10 @@ var Form = class extends Component5 {
3425
3432
  errorSchema = merged.errorSchema;
3426
3433
  errors = merged.errors;
3427
3434
  }
3435
+ if (newErrorSchema) {
3436
+ const filteredErrors = this.filterErrorsBasedOnSchema(newErrorSchema, retrievedSchema, newFormData);
3437
+ errorSchema = mergeObjects2(errorSchema, filteredErrors, "preventDuplicates");
3438
+ }
3428
3439
  state = {
3429
3440
  formData: newFormData,
3430
3441
  errors,
@@ -3705,7 +3716,15 @@ var Form = class extends Component5 {
3705
3716
  if (mustValidate) {
3706
3717
  const schemaValidation = this.validate(formData, schema, schemaUtils, _retrievedSchema);
3707
3718
  errors = schemaValidation.errors;
3708
- errorSchema = schemaValidation.errorSchema;
3719
+ if (isSchemaChanged) {
3720
+ errorSchema = schemaValidation.errorSchema;
3721
+ } else {
3722
+ errorSchema = mergeObjects2(
3723
+ this.state?.errorSchema,
3724
+ schemaValidation.errorSchema,
3725
+ "preventDuplicates"
3726
+ );
3727
+ }
3709
3728
  schemaValidationErrors = errors;
3710
3729
  schemaValidationErrorSchema = errorSchema;
3711
3730
  } else {
@@ -3783,6 +3802,28 @@ var Form = class extends Component5 {
3783
3802
  }
3784
3803
  return null;
3785
3804
  }
3805
+ // Filtering errors based on your retrieved schema to only show errors for properties in the selected branch.
3806
+ filterErrorsBasedOnSchema(schemaErrors, resolvedSchema, formData) {
3807
+ const { retrievedSchema, schemaUtils } = this.state;
3808
+ const _retrievedSchema = resolvedSchema ?? retrievedSchema;
3809
+ const pathSchema = schemaUtils.toPathSchema(_retrievedSchema, "", formData);
3810
+ const fieldNames = this.getFieldNames(pathSchema, formData);
3811
+ const filteredErrors = _pick(schemaErrors, fieldNames);
3812
+ if (resolvedSchema?.type !== "object" && resolvedSchema?.type !== "array") {
3813
+ filteredErrors.__errors = schemaErrors.__errors;
3814
+ }
3815
+ const filterUndefinedErrors = (errors) => {
3816
+ _forEach(errors, (errorAtKey, errorKey) => {
3817
+ if (errorAtKey === void 0) {
3818
+ delete errors[errorKey];
3819
+ } else if (typeof errorAtKey === "object" && !Array.isArray(errorAtKey.__errors)) {
3820
+ filterUndefinedErrors(errorAtKey);
3821
+ }
3822
+ });
3823
+ return errors;
3824
+ };
3825
+ return filterUndefinedErrors(filteredErrors);
3826
+ }
3786
3827
  /** Returns the registry for the form */
3787
3828
  getRegistry() {
3788
3829
  const { translateString: customTranslateString, uiSchema = {} } = this.props;