{"record":{"id":"2ed9676b473c32dd","repo":"marmelab/react-admin","slug":"simpleformiteratoritem-must-be-used-in-a-resourcec","errorCode":null,"errorMessage":"SimpleFormIteratorItem must be used in a ResourceContextProvider or be passed a resource prop.","messagePattern":"SimpleFormIteratorItem must be used in a ResourceContextProvider or be passed a resource prop\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/ra-core/src/controller/input/SimpleFormIteratorItemBase.tsx","lineNumber":22,"sourceCode":"    SourceContextProvider,\n    useResourceContext,\n    useSourceContext,\n} from '../../core';\nimport type { RaRecord } from '../../types';\nimport { useSimpleFormIterator } from './useSimpleFormIterator';\nimport {\n    SimpleFormIteratorItemContext,\n    type SimpleFormIteratorItemContextValue,\n} from './SimpleFormIteratorItemContext';\nimport type { ArrayInputContextValue } from './ArrayInputContext';\n\nexport const SimpleFormIteratorItemBase = (\n    props: SimpleFormIteratorItemBaseProps\n) => {\n    const { children, index } = props;\n    const resource = useResourceContext(props);\n    if (!resource) {\n        throw new Error(\n            'SimpleFormIteratorItem must be used in a ResourceContextProvider or be passed a resource prop.'\n        );\n    }\n    const { total, reOrder, remove } = useSimpleFormIterator();\n\n    const context = useMemo<SimpleFormIteratorItemContextValue>(\n        () => ({\n            index,\n            total,\n            reOrder: newIndex => reOrder(index, newIndex),\n            remove: () => remove(index),\n        }),\n        [index, total, reOrder, remove]\n    );\n\n    const parentSourceContext = useSourceContext();\n    const sourceContext = useMemo(\n        () => ({","sourceCodeStart":4,"sourceCodeEnd":40,"githubUrl":"https://github.com/marmelab/react-admin/blob/051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0/packages/ra-core/src/controller/input/SimpleFormIteratorItemBase.tsx#L4-L40","documentation":"SimpleFormIteratorItemBase resolves the current resource via useResourceContext(props) to build per-row labels and actions. If neither a ResourceContextProvider nor an explicit resource prop supplies a value, it cannot proceed and throws.","triggerScenarios":"Rendering SimpleFormIteratorItem (or a custom row component using it) outside any <Resource> / ResourceContextProvider without passing resource=\"...\" as a prop; using it in a standalone test or Storybook render; deeply nested custom render props that break context inheritance.","commonSituations":"Extracting a custom delete button/row component from a Resource page into a shared library rendered outside resources; tests that mount the item in isolation; custom edit views rendered outside the normal <Resource> tree (e.g. in a modal mounted at app root).","solutions":["Pass an explicit resource prop: <SimpleFormIteratorItem resource=\"posts\" index={0} ... />","Ensure the component is rendered inside a ResourceContextProvider (e.g. within a view under <Resource name=\"posts\">)","In tests/stories, wrap with <ResourceContextProvider value=\"posts\">"],"exampleFix":"// before\n<SimpleFormIteratorItem index={0} /> // rendered at app root, no resource context\n// after\n<ResourceContextProvider value=\"posts\">\n  <SimpleFormIteratorItem index={0} />\n</ResourceContextProvider>\n// or\n<SimpleFormIteratorItem resource=\"posts\" index={0} />","handlingStrategy":"type-guard","validationCode":"const r = useResourceContext(props);\nif (!r) return null;","typeGuard":"const hasResource = (r: unknown): r is string =>\n  typeof r === 'string' && r.length > 0;","tryCatchPattern":"try {\n  render(<SimpleFormIteratorItem index={0} />);\n} catch (e) { logAndFallback(e); }","preventionTips":["Pass resource prop to standalone items","Keep items under ResourceContextProvider","Provider in tests","Audit extracted components for context needs"],"tags":["react-admin","react-context","resource","form"],"backgroundTag":"hook-used-outside-provider","analyzedSha":"051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0","analyzedAt":"2026-08-30T02:28:14.926Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}