diff --git a/examples/simple/package.json b/examples/simple/package.json index 3d30fdf41cf..ed1ed01cd99 100644 --- a/examples/simple/package.json +++ b/examples/simple/package.json @@ -25,7 +25,7 @@ "react": "^18.3.1", "react-admin": "^5.12.0", "react-dom": "^18.3.1", - "react-hook-form": "^7.53.0", + "react-hook-form": "^7.65.0", "react-router": "^6.28.1", "react-router-dom": "^6.28.1" }, diff --git a/packages/ra-core/package.json b/packages/ra-core/package.json index 3cd6824479c..90935c445c5 100644 --- a/packages/ra-core/package.json +++ b/packages/ra-core/package.json @@ -43,7 +43,7 @@ "jscodeshift": "^0.15.2", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-hook-form": "^7.53.0", + "react-hook-form": "^7.65.0", "react-router": "^6.28.1", "react-router-dom": "^6.28.1", "rimraf": "^3.0.2", @@ -54,7 +54,7 @@ "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", - "react-hook-form": "^7.53.0", + "react-hook-form": "^7.65.0", "react-router": "^6.28.1 || ^7.1.1", "react-router-dom": "^6.28.1 || ^7.1.1" }, diff --git a/packages/ra-core/src/core/SourceContext.tsx b/packages/ra-core/src/core/SourceContext.tsx index 404549bd78d..42ec74390ce 100644 --- a/packages/ra-core/src/core/SourceContext.tsx +++ b/packages/ra-core/src/core/SourceContext.tsx @@ -33,6 +33,7 @@ export type SourceContextValue = { export const SourceContext = createContext( undefined ); +SourceContext.displayName = 'SourceContext'; const defaultContextValue = { getSource: (source: string) => source, diff --git a/packages/ra-core/src/form/FilterLiveForm.tsx b/packages/ra-core/src/form/FilterLiveForm.tsx index 453218072ff..d9e74d3832c 100644 --- a/packages/ra-core/src/form/FilterLiveForm.tsx +++ b/packages/ra-core/src/form/FilterLiveForm.tsx @@ -79,8 +79,7 @@ export const FilterLiveForm = (props: FilterLiveFormProps) => { resolver: finalResolver, ...rest, }); - const { handleSubmit, getValues, reset, watch, formState } = formContext; - const { isValid } = formState; + const { handleSubmit, getValues, reset, trigger, watch } = formContext; const hasJustBeenModifiedByUser = React.useRef(false); @@ -103,17 +102,15 @@ export const FilterLiveForm = (props: FilterLiveFormProps) => { }, [JSON.stringify(filterValues), getValues, reset]); const onSubmit = (values: any): void => { - // Do not call setFilters if the form is invalid - if (!isValid) { - return; - } setFilters(mergeObjNotArray(filterValues, values)); }; const debouncedOnSubmit = useDebouncedEvent(onSubmit, debounce || 0); // Submit the form on values change useEffect(() => { - const { unsubscribe } = watch((values, { name }) => { + const { unsubscribe } = watch(async (values, { name }) => { + // Trigger validation manually + if (!(await trigger())) return; // Check that the name is present to avoid setting filters when // watch was triggered by a reset if (name) { @@ -129,7 +126,7 @@ export const FilterLiveForm = (props: FilterLiveFormProps) => { } }); return () => unsubscribe(); - }, [watch, debouncedOnSubmit]); + }, [watch, debouncedOnSubmit, trigger]); const sourceContext = React.useMemo( () => ({ diff --git a/packages/ra-core/src/form/groups/FormGroupsContext.tsx b/packages/ra-core/src/form/groups/FormGroupsContext.tsx index 5a1f3cc9a8d..69d90771496 100644 --- a/packages/ra-core/src/form/groups/FormGroupsContext.tsx +++ b/packages/ra-core/src/form/groups/FormGroupsContext.tsx @@ -3,6 +3,7 @@ import { createContext } from 'react'; export const FormGroupsContext = createContext< FormGroupsContextValue | undefined >(undefined); +FormGroupsContext.displayName = 'FormGroupsContext'; export type FormGroupSubscriber = () => void; diff --git a/packages/ra-core/src/form/useApplyInputDefaultValues.ts b/packages/ra-core/src/form/useApplyInputDefaultValues.ts index 1857964f42d..fb9baf75b5d 100644 --- a/packages/ra-core/src/form/useApplyInputDefaultValues.ts +++ b/packages/ra-core/src/form/useApplyInputDefaultValues.ts @@ -1,4 +1,4 @@ -import { useEffect } from 'react'; +import { useEffect, useRef } from 'react'; import { FieldValues, UseFieldArrayReturn, @@ -36,12 +36,21 @@ export const useApplyInputDefaultValues = ({ const finalSource = useWrappedSource(source); const record = useRecordContext(inputProps); - const { getValues, resetField, formState, reset } = useFormContext(); + const { getValues, resetField, reset, subscribe } = useFormContext(); const recordValue = get(record, finalSource); const formValue = get(getValues(), finalSource); - const { dirtyFields } = formState; - const isDirty = Object.keys(dirtyFields).includes(finalSource); + const isDirty = useRef(undefined); + useEffect(() => { + return subscribe({ + formState: { dirtyFields: true }, + callback: ({ dirtyFields }) => { + isDirty.current = Object.keys(dirtyFields ?? {}).includes( + finalSource + ); + }, + }); + }, [finalSource, subscribe]); useEffect(() => { if ( defaultValue == null || @@ -52,7 +61,7 @@ export const useApplyInputDefaultValues = ({ // We check strictly for undefined to avoid setting default value // when the field is null recordValue !== undefined || - isDirty + isDirty.current === true ) { return; } diff --git a/packages/ra-core/src/form/useAugmentedForm.ts b/packages/ra-core/src/form/useAugmentedForm.ts index 6f47a36fb43..0ebee65d2f5 100644 --- a/packages/ra-core/src/form/useAugmentedForm.ts +++ b/packages/ra-core/src/form/useAugmentedForm.ts @@ -76,20 +76,24 @@ export const useAugmentedForm = ( const form = useForm({ criteriaMode, - values: defaultValuesIncludingRecord, + defaultValues: defaultValuesIncludingRecord, reValidateMode, resolver: finalResolver, ...rest, }); const formRef = useRef(form); + const { reset } = form; + + useEffect(() => { + reset(defaultValuesIncludingRecord); + }, [defaultValuesIncludingRecord, reset]); // notify on invalid form useNotifyIsFormInvalid(form.control, !disableInvalidFormNotification); const recordFromLocation = useRecordFromLocation(); const recordFromLocationApplied = useRef(false); - const { reset } = form; useEffect(() => { if (recordFromLocation && !recordFromLocationApplied.current) { reset(merge({}, defaultValuesIncludingRecord, recordFromLocation), { diff --git a/packages/ra-core/src/form/useInput.stories.tsx b/packages/ra-core/src/form/useInput.stories.tsx index e663872d0d7..8e3f8c86079 100644 --- a/packages/ra-core/src/form/useInput.stories.tsx +++ b/packages/ra-core/src/form/useInput.stories.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import { useForm, FormProvider, useFieldArray } from 'react-hook-form'; import { CoreAdminContext } from '../core'; import { Form } from './Form'; import { InputProps, useInput } from './useInput'; @@ -7,12 +8,15 @@ export default { title: 'ra-core/form/useInput', }; -const Input = (props: InputProps) => { +const Input = (props: InputProps & { log?: boolean }) => { + const { label, log } = props; const { id, field, fieldState } = useInput(props); - + if (log) { + console.log(`Input ${id} rendered:`); + } return ( ); @@ -86,3 +90,38 @@ DefaultValue.argTypes = { control: { type: 'select' }, }, }; + +export const Large = () => { + const [submittedData, setSubmittedData] = React.useState(); + const fields = Array.from({ length: 15 }).map((_, index) => ( + + )); + return ( + +
setSubmittedData(data)} + record={Array.from({ length: 15 }).reduce((acc, _, index) => { + acc[`field${index + 1}`] = `value${index + 1}`; + return acc; + }, {})} + > +
+ {fields} +
+ +
+
{JSON.stringify(submittedData, null, 2)}
+
+ ); +}; diff --git a/packages/ra-input-rich-text/package.json b/packages/ra-input-rich-text/package.json index 6b61881af86..dee2dcdb382 100644 --- a/packages/ra-input-rich-text/package.json +++ b/packages/ra-input-rich-text/package.json @@ -57,7 +57,7 @@ "ra-ui-materialui": "^5.12.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-hook-form": "^7.53.0", + "react-hook-form": "^7.65.0", "rimraf": "^3.0.2", "tippy.js": "^6.3.7", "typescript": "^5.1.3" diff --git a/packages/ra-ui-materialui/package.json b/packages/ra-ui-materialui/package.json index d8a0cc01be1..bd214d223e8 100644 --- a/packages/ra-ui-materialui/package.json +++ b/packages/ra-ui-materialui/package.json @@ -47,7 +47,7 @@ "ra-language-english": "^5.12.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-hook-form": "^7.53.0", + "react-hook-form": "^7.65.0", "react-is": "^18.2.0 || ^19.0.0", "react-router": "^6.28.1", "react-router-dom": "^6.28.1", diff --git a/packages/ra-ui-materialui/src/input/ArrayInput/ArrayInput.stories.tsx b/packages/ra-ui-materialui/src/input/ArrayInput/ArrayInput.stories.tsx index 8588c226888..796662e9705 100644 --- a/packages/ra-ui-materialui/src/input/ArrayInput/ArrayInput.stories.tsx +++ b/packages/ra-ui-materialui/src/input/ArrayInput/ArrayInput.stories.tsx @@ -173,6 +173,44 @@ export const ReadOnly = () => ( ); +export const DefaultValues = () => ( + + + { + return ( + { + console.log(data); + }, + }} + > + + + + + + + + + + + ); + }} + /> + + +); + const BookEditWithAutocomplete = () => { return ( { const parentSourceContext = useSourceContext(); const finalSource = parentSourceContext.getSource(arraySource); - const { getFieldState, formState } = useFormContext(); - const { error } = getFieldState(finalSource, formState); + const { subscribe } = useFormContext(); + + const [error, setError] = React.useState(); + React.useEffect(() => { + return subscribe({ + formState: { errors: true }, + callback: ({ errors }) => { + const error = get(errors ?? {}, finalSource); + setError(error); + }, + }); + }, [finalSource, subscribe]); const renderHelperText = helperText !== false || !!error; if (isPending) { diff --git a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.stories.tsx b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.stories.tsx index fa8aecbe361..80d82bd75fb 100644 --- a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.stories.tsx +++ b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.stories.tsx @@ -5,6 +5,7 @@ import { Edit } from '../../detail'; import { SimpleForm } from '../../form'; import { ArrayInput } from './ArrayInput'; import { SimpleFormIterator } from './SimpleFormIterator'; +import { NumberInput } from '../NumberInput'; import { TextInput } from '../TextInput'; import { AdminContext } from '../../AdminContext'; import { defaultTheme } from '../../theme/defaultTheme'; @@ -14,6 +15,7 @@ import { testDataProvider, useSimpleFormIteratorItem, } from 'ra-core'; +import { AutocompleteInput } from '../AutocompleteInput'; export default { title: 'ra-ui-materialui/input/SimpleFormIterator' }; @@ -286,3 +288,43 @@ export const WithFormDataConsumer = () => ( ); + +const largeDataProvider = { + getOne: async () => ({ + data: { + id: 1, + name: 'Book 1', + authors: Array.from({ length: 100 }, (_, i) => ({ + id: i + 1, + first_name: `Author ${i + 1}`, + last_name: `LastName ${i + 1}`, + age: 30 + (i % 20), + })), + }, + }), +} as any; + +export const Large = () => ( + + + + + + + + + + + + + + + +); diff --git a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIteratorItem.tsx b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIteratorItem.tsx index 7302ff23e00..bc1244b3ae6 100644 --- a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIteratorItem.tsx +++ b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIteratorItem.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import type { ReactNode } from 'react'; +import { type ReactNode, forwardRef, memo } from 'react'; import { Typography, Stack } from '@mui/material'; import clsx from 'clsx'; import { @@ -14,74 +14,79 @@ import { SimpleFormIteratorClasses } from './useSimpleFormIteratorStyles'; import { RemoveItemButton as DefaultRemoveItemButton } from './RemoveItemButton'; import { ReOrderButtons as DefaultReOrderButtons } from './ReOrderButtons'; -export const SimpleFormIteratorItem = React.forwardRef< - HTMLLIElement, - SimpleFormIteratorItemProps ->(function SimpleFormIteratorItem(props, ref) { - const { - children, - disabled, - disableReordering, - disableRemove, - getItemLabel, - index, - inline, - removeButton = , - reOrderButtons = , - } = props; +export const SimpleFormIteratorItem = memo( + forwardRef( + function SimpleFormIteratorItem(props, ref) { + const { + children, + disabled, + disableReordering, + disableRemove, + getItemLabel, + index, + inline, + removeButton = , + reOrderButtons = , + } = props; - const record = useRecordContext(props); - if (!record) { - throw new Error( - 'SimpleFormIteratorItem must be used in a RecordContextProvider.' - ); - } + const record = useRecordContext(props); + if (!record) { + throw new Error( + 'SimpleFormIteratorItem must be used in a RecordContextProvider.' + ); + } - // Returns a boolean to indicate whether to disable the remove button for certain fields. - // If disableRemove is a function, then call the function with the current record to - // determining if the button should be disabled. Otherwise, use a boolean property that - // enables or disables the button for all of the fields. - const disableRemoveField = (record: RaRecord) => { - if (typeof disableRemove === 'boolean') { - return disableRemove; - } - return disableRemove && disableRemove(record); - }; + // Returns a boolean to indicate whether to disable the remove button for certain fields. + // If disableRemove is a function, then call the function with the current record to + // determining if the button should be disabled. Otherwise, use a boolean property that + // enables or disables the button for all of the fields. + const disableRemoveField = (record: RaRecord) => { + if (typeof disableRemove === 'boolean') { + return disableRemove; + } + return disableRemove && disableRemove(record); + }; - const label = - typeof getItemLabel === 'function' ? getItemLabel(index) : getItemLabel; + const label = + typeof getItemLabel === 'function' + ? getItemLabel(index) + : getItemLabel; - return ( - -
  • - {label != null && label !== false && ( - - {label} - - )} - - {children} - - {!disabled && ( - - {!disableReordering && reOrderButtons} + return ( + +
  • + {label != null && label !== false && ( + + {label} + + )} + + {children} + + {!disabled && ( + + {!disableReordering && reOrderButtons} - {!disableRemoveField(record) && removeButton} - - )} -
  • -
    - ); -}); + {!disableRemoveField(record) && removeButton} + + )} + + + ); + } + ) +); export type SimpleFormIteratorGetItemLabelFunc = ( index: number diff --git a/packages/ra-ui-materialui/src/input/NumberInput.stories.tsx b/packages/ra-ui-materialui/src/input/NumberInput.stories.tsx index 0ea04faa15d..53cde342bf0 100644 --- a/packages/ra-ui-materialui/src/input/NumberInput.stories.tsx +++ b/packages/ra-ui-materialui/src/input/NumberInput.stories.tsx @@ -2,13 +2,15 @@ import * as React from 'react'; import { required } from 'ra-core'; import { useFormState, useFormContext } from 'react-hook-form'; import { createTheme } from '@mui/material/styles'; +import fakeRestDataProvider from 'ra-data-fakerest'; import { NumberInput } from './NumberInput'; import { AdminContext } from '../AdminContext'; -import { Create } from '../detail'; -import { SimpleForm } from '../form'; +import { Create, Edit } from '../detail'; +import { SimpleForm, Toolbar } from '../form'; import { FormInspector } from './common'; import { TextInput } from './TextInput'; +import { SaveButton } from '../button'; export default { title: 'ra-ui-materialui/input/NumberInput' }; @@ -95,6 +97,66 @@ export const DefaultValue = () => ( ); +export const NullValueInCreate = () => ( + + + + + + } + > + + + + + +); + +export const NullValueInEdit = () => ( + + + + + + } + > + + + + + + +); + export const HelperText = () => ( diff --git a/packages/react-admin/package.json b/packages/react-admin/package.json index 2990f04056e..b0a3214547c 100644 --- a/packages/react-admin/package.json +++ b/packages/react-admin/package.json @@ -47,7 +47,7 @@ "ra-i18n-polyglot": "^5.12.0", "ra-language-english": "^5.12.0", "ra-ui-materialui": "^5.12.0", - "react-hook-form": "^7.53.0", + "react-hook-form": "^7.65.0", "react-router": "^6.28.1 || ^7.1.1", "react-router-dom": "^6.28.1 || ^7.1.1" }, diff --git a/yarn.lock b/yarn.lock index 1fec90be30c..cd0faf0fee6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -582,16 +582,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": - version: 7.21.0-placeholder-for-preset-env.2 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: e605e0070da087f6c35579499e65801179a521b6842c15181a1e305c04fded2393f11c1efd09b087be7f8b083d1b75e8f3efcbc1292b4f60d3369e14812cff63 - languageName: node - linkType: hard - -"@babel/plugin-proposal-private-property-in-object@npm:^7.21.11": +"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2, @babel/plugin-proposal-private-property-in-object@npm:^7.21.11": version: 7.21.11 resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.11" dependencies: @@ -4643,6 +4634,18 @@ __metadata: languageName: node linkType: hard +"@shikijs/core@npm:3.8.1": + version: 3.8.1 + resolution: "@shikijs/core@npm:3.8.1" + dependencies: + "@shikijs/types": "npm:3.8.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + hast-util-to-html: "npm:^9.0.5" + checksum: 7653d2b1dbd8e8eb8e5fb841cdb80090fb97838b359ff638bfb007d678bbd35d109df9307b92ee4c116e49d9178118777b4af1f491f65bd1dcf574b167597ab8 + languageName: node + linkType: hard + "@shikijs/engine-javascript@npm:3.12.2": version: 3.12.2 resolution: "@shikijs/engine-javascript@npm:3.12.2" @@ -4654,6 +4657,17 @@ __metadata: languageName: node linkType: hard +"@shikijs/engine-javascript@npm:3.8.1": + version: 3.8.1 + resolution: "@shikijs/engine-javascript@npm:3.8.1" + dependencies: + "@shikijs/types": "npm:3.8.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" + oniguruma-to-es: "npm:^4.3.3" + checksum: bac21caf03498df4b328f9380cbb934e68df6c012db2db3c32ddb7e497ef7e0653160c5f4c3c6a4e519c0fe5b9797cc4c91306fae49890b84377ccc614723fb6 + languageName: node + linkType: hard + "@shikijs/engine-oniguruma@npm:3.12.2": version: 3.12.2 resolution: "@shikijs/engine-oniguruma@npm:3.12.2" @@ -4664,6 +4678,16 @@ __metadata: languageName: node linkType: hard +"@shikijs/engine-oniguruma@npm:3.8.1": + version: 3.8.1 + resolution: "@shikijs/engine-oniguruma@npm:3.8.1" + dependencies: + "@shikijs/types": "npm:3.8.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" + checksum: e3a09dfee55594ee999a26f8487cdb4bd47eceb1a55fa8d019b06e092a5357f9735945eae4ff1c4ea3d9a6e35f2ef40f9e9d5bfab0fe09502b7de5d2fbd5bf08 + languageName: node + linkType: hard + "@shikijs/langs@npm:3.12.2": version: 3.12.2 resolution: "@shikijs/langs@npm:3.12.2" @@ -4673,6 +4697,15 @@ __metadata: languageName: node linkType: hard +"@shikijs/langs@npm:3.8.1": + version: 3.8.1 + resolution: "@shikijs/langs@npm:3.8.1" + dependencies: + "@shikijs/types": "npm:3.8.1" + checksum: cbf2fc6dc3fcfbaefb1865eef68bbba16d8de1dd0e7b4b121bcece52a71d921eb5a865900c6e6ce0342fb4054a8bf49696e279e6241ffddb4617ba0b2aaa1c90 + languageName: node + linkType: hard + "@shikijs/themes@npm:3.12.2": version: 3.12.2 resolution: "@shikijs/themes@npm:3.12.2" @@ -4682,6 +4715,15 @@ __metadata: languageName: node linkType: hard +"@shikijs/themes@npm:3.8.1": + version: 3.8.1 + resolution: "@shikijs/themes@npm:3.8.1" + dependencies: + "@shikijs/types": "npm:3.8.1" + checksum: 932ed924aef9e51b2984f3023a7db082d8b6a54581ebc470ce6a3ada37f7a6783f99961a34a924972dd6d46323b06d83b08cc47626716fabfb485aec014b2610 + languageName: node + linkType: hard + "@shikijs/types@npm:3.12.2": version: 3.12.2 resolution: "@shikijs/types@npm:3.12.2" @@ -4692,6 +4734,16 @@ __metadata: languageName: node linkType: hard +"@shikijs/types@npm:3.8.1": + version: 3.8.1 + resolution: "@shikijs/types@npm:3.8.1" + dependencies: + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + checksum: e007cf1a8a4c16ad402f6e811ba9487ef9277a828715d6e279de0dba830808b9df7ff3fe947171241d5a2c0b3df61ddc542c971575562c508151f835d0d6f05e + languageName: node + linkType: hard + "@shikijs/vscode-textmate@npm:^10.0.2": version: 10.0.2 resolution: "@shikijs/vscode-textmate@npm:10.0.2" @@ -10243,13 +10295,13 @@ __metadata: linkType: hard "ejs@npm:^3.1.7": - version: 3.1.10 - resolution: "ejs@npm:3.1.10" + version: 3.1.8 + resolution: "ejs@npm:3.1.8" dependencies: jake: "npm:^10.8.5" bin: ejs: bin/cli.js - checksum: 52eade9e68416ed04f7f92c492183340582a36482836b11eab97b159fcdcfdedc62233a1bf0bf5e5e1851c501f2dca0e2e9afd111db2599e4e7f53ee29429ae1 + checksum: a6bd58633c5b3ae19a2bfea1b94033585ad85c87ec15961f8c89c93ffdafb8b2358af827f37f7552b35d9f5393fdbd98d35a8cbcd0ee2540b7f9f7a194e86a1a languageName: node linkType: hard @@ -19305,7 +19357,7 @@ __metadata: react: "npm:^18.3.1" react-dom: "npm:^18.3.1" react-error-boundary: "npm:^4.0.13" - react-hook-form: "npm:^7.53.0" + react-hook-form: "npm:^7.65.0" react-is: "npm:^18.2.0 || ^19.0.0" react-router: "npm:^6.28.1" react-router-dom: "npm:^6.28.1" @@ -19316,7 +19368,7 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - react-hook-form: ^7.53.0 + react-hook-form: ^7.65.0 react-router: ^6.28.1 || ^7.1.1 react-router-dom: ^6.28.1 || ^7.1.1 languageName: unknown @@ -19489,7 +19541,7 @@ __metadata: ra-ui-materialui: "npm:^5.12.0" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" - react-hook-form: "npm:^7.53.0" + react-hook-form: "npm:^7.65.0" rimraf: "npm:^3.0.2" tippy.js: "npm:^6.3.7" typescript: "npm:^5.1.3" @@ -19589,7 +19641,7 @@ __metadata: react-dom: "npm:^18.3.1" react-dropzone: "npm:^14.2.3" react-error-boundary: "npm:^4.0.13" - react-hook-form: "npm:^7.53.0" + react-hook-form: "npm:^7.65.0" react-hotkeys-hook: "npm:^5.1.0" react-is: "npm:^18.2.0 || ^19.0.0" react-router: "npm:^6.28.1" @@ -19789,7 +19841,7 @@ __metadata: ra-i18n-polyglot: "npm:^5.12.0" ra-language-english: "npm:^5.12.0" ra-ui-materialui: "npm:^5.12.0" - react-hook-form: "npm:^7.53.0" + react-hook-form: "npm:^7.65.0" react-router: "npm:^6.28.1" react-router-dom: "npm:^6.28.1" rimraf: "npm:^3.0.2" @@ -19885,12 +19937,12 @@ __metadata: languageName: node linkType: hard -"react-hook-form@npm:^7.53.0": - version: 7.53.0 - resolution: "react-hook-form@npm:7.53.0" +"react-hook-form@npm:^7.65.0": + version: 7.65.0 + resolution: "react-hook-form@npm:7.65.0" peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 6d62b150618a833c17d59e669b707661499e2bb516a8d340ca37699f99eb448bbba7b5b78324938c8948014e21efaa32e3510c2ba246fd5e97a96fca0cfa7c98 + checksum: 119afeaf33510d1ed6c12109f03d22d9e88f9eb01b8e4fb3cd8f40d5fc113cbcfc6154789d1d143151de8119bd08ffc7214d504e0e550ea28a9051ed6a30ae28 languageName: node linkType: hard @@ -21457,7 +21509,7 @@ __metadata: languageName: node linkType: hard -"shiki@npm:^3.12.0, shiki@npm:^3.2.1, shiki@npm:^3.2.2": +"shiki@npm:^3.12.0": version: 3.12.2 resolution: "shiki@npm:3.12.2" dependencies: @@ -21473,6 +21525,22 @@ __metadata: languageName: node linkType: hard +"shiki@npm:^3.2.1, shiki@npm:^3.2.2": + version: 3.8.1 + resolution: "shiki@npm:3.8.1" + dependencies: + "@shikijs/core": "npm:3.8.1" + "@shikijs/engine-javascript": "npm:3.8.1" + "@shikijs/engine-oniguruma": "npm:3.8.1" + "@shikijs/langs": "npm:3.8.1" + "@shikijs/themes": "npm:3.8.1" + "@shikijs/types": "npm:3.8.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + checksum: 84d2287d66ba457cad15dbe8d56b6194d8da95ad545b758c3277f8b268b57d17c07db54a754d0984c256dd8ba1010ff57f0bbba979c40e6d01f95afa324ce4ac + languageName: node + linkType: hard + "side-channel-list@npm:^1.0.0": version: 1.0.0 resolution: "side-channel-list@npm:1.0.0" @@ -21580,7 +21648,7 @@ __metadata: react: "npm:^18.3.1" react-admin: "npm:^5.12.0" react-dom: "npm:^18.3.1" - react-hook-form: "npm:^7.53.0" + react-hook-form: "npm:^7.65.0" react-router: "npm:^6.28.1" react-router-dom: "npm:^6.28.1" react-simple-animate: "npm:^3.5.3"