{"record":{"id":"648479bc15502b63","repo":"marmelab/react-admin","slug":"filterbutton-must-be-called-inside-a-resourcecon","errorCode":null,"errorMessage":"<FilterButton> must be called inside a ResourceContextProvider, or must provide a resource prop","messagePattern":"<FilterButton> must be called inside a ResourceContextProvider, or must provide a resource prop","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/ra-ui-materialui/src/list/filter/FilterButton.tsx","lineNumber":59,"sourceCode":"\nexport const FilterButton = (inProps: FilterButtonProps) => {\n    const props = useThemeProps({\n        props: inProps,\n        name: PREFIX,\n    });\n    const {\n        filters: filtersProp,\n        className,\n        disableSaveQuery,\n        size,\n        variant,\n        ...rest\n    } = props;\n    const filters = useFilterContext() || filtersProp;\n    const resource = useResourceContext(props);\n    const translate = useTranslate();\n    if (!resource && !disableSaveQuery) {\n        throw new Error(\n            '<FilterButton> must be called inside a ResourceContextProvider, or must provide a resource prop'\n        );\n    }\n    const [savedQueries] = useSavedQueries(resource || '');\n    const navigate = useNavigate();\n    const {\n        displayedFilters = {},\n        filterValues,\n        perPage,\n        setFilters,\n        showFilter,\n        hideFilter,\n        sort,\n    } = useListContext();\n    const hasFilterValues = !isEqual(filterValues, {});\n    const validSavedQueries = extractValidSavedQueries(savedQueries);\n    const hasSavedCurrentQuery = validSavedQueries.some(savedQuery =>\n        isEqual(savedQuery.value, {","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/marmelab/react-admin/blob/051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0/packages/ra-ui-materialui/src/list/filter/FilterButton.tsx#L41-L77","documentation":"FilterButton supports saving queries, which is keyed per resource. When no resource is resolvable from context or props and saved queries are not disabled, react-admin throws because useSavedQueries needs a resource key.","triggerScenarios":"Rendering <FilterButton /> outside a ListContext/ResourceContextProvider without a resource prop while saved-query features are enabled (disableSaveQuery not set).","commonSituations":"Custom filter toolbars on non-list pages, or embedding FilterButton in a standalone layout without the resource.","solutions":["Pass resource=\"posts\" to <FilterButton>.","Move FilterButton inside the <List> toolbar / ResourceContextProvider.","Set disableSaveQuery if saved-query features are not needed and no resource is available."],"exampleFix":"// before\n<FilterButton filters={filters} />\n// after\n<FilterButton filters={filters} resource=\"posts\" />","handlingStrategy":"validation","validationCode":"const resource = useResourceContext(props);\nif (!resource && !disableSaveQuery) { /* provide resource or set disableSaveQuery before rendering */ }","typeGuard":"const canRender = (p: { resource?: string; disableSaveQuery?: boolean }): p is { resource: string } => typeof p.resource === 'string' || p.disableSaveQuery === true;","tryCatchPattern":"try { renderFilterButton(); } catch (e) { if (String(e).includes('<FilterButton> must be called')) return <FilterButton resource=\"posts\" {...props} />; throw e; }","preventionTips":["Keep FilterButton inside the default List actions/toolbar.","Pass resource explicitly when embedding elsewhere.","Set disableSaveQuery when no resource context exists."],"tags":["react-admin","missing-context","filter-button"],"backgroundTag":"missing-context-provider","analyzedSha":"051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0","analyzedAt":"2026-08-30T02:28:14.926Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}