Skip to content

Commit

Permalink
overrideArrayMinItemsBehaviour patch
Browse files Browse the repository at this point in the history
  • Loading branch information
MarekBodinger committed Dec 6, 2023
1 parent 12781f3 commit df33db5
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions packages/utils/src/schema/getDefaultFormState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import mergeDefaultsWithFormData from '../mergeDefaultsWithFormData';
import mergeObjects from '../mergeObjects';
import mergeSchemas from '../mergeSchemas';
import {
Experimental_ArrayMinItems,
Experimental_DefaultFormStateBehavior,
FormContextType,
GenericObjectType,
Expand All @@ -38,6 +39,12 @@ export enum AdditionalItemsHandling {
Fallback,
}

declare module 'json-schema' {
export interface JSONSchema7 {
overrideArrayMinItemsBehaviour?: Experimental_ArrayMinItems;
}
}

/** Given a `schema` will return an inner schema that for an array item. This is computed differently based on the
* `additionalItems` enum and the value of `idx`. There are four possible returns:
* 1. If `idx` is >= 0, then if `schema.items` is an array the `idx`th element of the array is returned if it is a valid
Expand Down Expand Up @@ -338,8 +345,11 @@ export function computeDefaults<T = any, S extends StrictRJSFSchema = RJSFSchema
return objectDefaults;
}
case 'array': {
const neverPopulate = experimental_defaultFormStateBehavior?.arrayMinItems?.populate === 'never';
const ignoreMinItemsFlagSet = experimental_defaultFormStateBehavior?.arrayMinItems?.populate === 'requiredOnly';
// On a case by case basis, we may want to override the default behavior of populating array items.
const arrayMinItems =
schema.overrideArrayMinItemsBehaviour ?? experimental_defaultFormStateBehavior?.arrayMinItems;
const neverPopulate = arrayMinItems?.populate === 'never';
const ignoreMinItemsFlagSet = arrayMinItems?.populate === 'requiredOnly';

// Inject defaults into existing array defaults
if (Array.isArray(defaults)) {
Expand Down Expand Up @@ -453,7 +463,10 @@ export default function getDefaultFormState<
// No form data? Use schema defaults.
return defaults;
}
const { mergeExtraDefaults } = experimental_defaultFormStateBehavior?.arrayMinItems || {};
// On a case by case basis, we may want to override the default behavior of populating array items.
const arrayMinItems = schema.overrideArrayMinItemsBehaviour ?? experimental_defaultFormStateBehavior?.arrayMinItems;

const { mergeExtraDefaults } = arrayMinItems || {};
if (isObject(formData)) {
return mergeDefaultsWithFormData<T>(defaults as T, formData, mergeExtraDefaults);
}
Expand Down

0 comments on commit df33db5

Please sign in to comment.