216 KiB
@refinedev/core
4.46.2
Patch Changes
-
#5423
75bb61dd3b
Thanks @aliemir! - UpdatedflattenObjectKeys
method to support both nested and non-nested variables when propagating server side errors to form fields. Resolves #5461 -
#5401
93e00fd770
Thanks @alicanerdurmaz! - fix:queryKey
is not overrideable. To fix this,useQuery
overloads refactored with single argument objects.- useQuery(queryKey, queryFn, options); + useQuery({ queryKey, queryFn, ...options });
From now on, you can pass
queryKey
as an object property.// all data hooks can be used with this syntax. useList({ queryOptions: { queryKey: ["my-query-key"], }, });
-
#5406
e5888b6b9c
Thanks @aliemir! -useMenu
hook was using outdatedmeta
and routerparams
due to missing dependency of the callback function. This was causing dynamic menu items to use wrong paths as links. (Resolves #5432) -
#5452
b621223bfb
Thanks @aliemir! - Added the ability to passmeta
properties when usinguseGo
'sgo
function withto
as a resource object. This allows you to pass additional path parameters to the path defined in the resources array within the<Refine />
component. Resolves #5451Assume we have the following resource defined in the
<Refine />
component:{ name: "posts", list: "/posts", edit: "/:foo/posts/:id/edit", }
import { useGo } from "@refinedev/core"; const MyButton = () => { const go = useGo(); return ( <Button onClick={() => { go({ to: { resource: "posts", action: "edit", id: "1", meta: { foo: "bar", }, }, type: "push", }); // generated path will be "/bar/posts/1/edit" }} > Go Posts </Button> ); };
-
#5381
19ceffbe9f
Thanks @aberhamm! - fix: MissingloginLink
attribute inAuthPageProps
for<AuthPage type="register" />
. #5381
4.46.1
Patch Changes
-
#5409
0026fe34d0
Thanks @BatuhanW! - fix: excludegqlMutation
andgqlQuery
from building query keys foruseUpdate
,useUpdateMany
,useDelete
, anduseDeleteMany
hooks. -
#5409
0026fe34d0
Thanks @BatuhanW! - feat: add optionalgqlQuery
andgqlMutation
fields toMetaQuery
type to be used indata hooks
.We plan to utilize these fields on our GraphQL data providers in the future.
You can build your queries/mutations with
graphql-tag
package and pass it to thegqlQuery
/gqlMutation
fields.For now, only
@refinedev/nestjs-query
package supports it.import { useList } from "@refinedev/core"; import gql from "graphql-tag"; const PRODUCTS_QUERY = gql` query ProductsList( $paging: OffsetPaging! $filter: BlogPostFilter $sorting: [BlogPostSort!]! ) { products(paging: $paging, filter: $filter, sorting: $sorting) { nodes { id name } totalCount } } `; const { data } = useList({ resource: "products", meta: { gqlQuery: PRODUCTS_QUERY }, });
4.46.0
Minor Changes
-
#5343
dd8f1270f6
Thanks @alicanerdurmaz! - fix:hideForm
should remove all form fields. (submit button, form fields, rememberMe checkbox, forgot password link, etc.) but the/register
link should be visible. -
#5307
f8e407f850
Thanks @jackprogramsjp! - feat: addedhideForm
props forLoginPage
andRegisterPage
forAuthPage
feature.Now with the
hideForm
props feature, you can be able to hide the forms (like email/password) to only show the OAuth providers. This avoids having to make your own entire AuthPage.
Patch Changes
-
#5323
17aa8c1cd6
Thanks @alicanerdurmaz! - ### Breaking changesfix: added required
key
prop to<Authenticated />
component to resolve issues of rendering of the unwanted content and wrongful redirections. #4782Why is it required?
Due to the nature of React, components are not unmounted and remounted again if props are changed. While this is mostly a good practice for performance, in some cases you'll want your component to re-mount instead of updating; for example, if you don't want to use any of the previous states and effects initiated with the old props.
The
<Authenticated />
component has this kind of scenario when it's used for page-level authentication checks. If the previous check results were used for the rendering of the content (fallback
orchildren
) this may lead to unexpected behaviors and flashing of the unwanted content.To avoid this, a key property must be set with different values for each use of the
<Authenticated />
components. This will make sure that React will unmount and remount the component instead of updating the props.import { Refine, Authenticated, AuthPage } from "@refinedev/core"; import { CatchAllNavigate, } from "@refinedev/react-router-v6"; import { BrowserRouter, Routes, Route, Outlet, Navigate } from "react-router-dom"; const App = () => { return ( <BrowserRouter> <Refine {/* ... */}> <Routes> <Route element={ <Authenticated key="authenticated-routes" fallback={<CatchAllNavigate to="/login" />} > <Outlet /> </Authenticated> } > <Route index element={<h1>Dashboard Page</h1>} /> </Route> <Route element={ <Authenticated key="unauthenticated-routes" fallback={<Outlet />}> <Navigate to="/" replace /> </Authenticated> } > <Route path="/login" element={<AuthPage type="login" />} /> </Route> </Routes> </Refine> </BrowserRouter> ); };
In the example above, the
<Authenticated />
is rendered as the wrapper of both theindex
route and/login
route. Without akey
property,<Authenticated />
will not be re-mounted and can result in rendering the content depending on the previous authentication check. This will lead to redirecting to/login
when trying to access theindex
route instead of rendering the content of theindex
or navigating toindex
route instead of/login
if the user just logged out. -
#5339
4c49ef0a06
Thanks @alicanerdurmaz! - feat:<WelcomePage />
component redesigned. -
#5316
3bdb9cb1cb
Thanks @ksankeerth! - fix: Return type is not mentioned correctly in useOne, useSelect, useForm, useMany and useShow hooksThis fix has improved type safety of return type of useOne, useSelect, useForm, useMany and useShow hooks.
4.45.1
Patch Changes
-
#5289
0d1e269c0283
Thanks @alicanerdurmaz! - feat:<GitHubBanner />
styles updated.fix:
<GitHubBanner />
hydration error. #5295
4.45.0
Minor Changes
-
#5259
eac3df87ffb
Thanks @aliemir! - Added<AutoSaveIndicator />
component and updated theAutoSaveIndicatorProps
type to allowelements
to be passed in.elements
prop is an object withsuccess
,error
,loading
andidle
keys. Each key is a React element that will be rendered when the corresponding state is active.By default every state will render a
span
with the translated text of theautoSave.${state}
key.
Patch Changes
- #5257
c35fdda7c61
Thanks @omeraplak! - chore: update GitHub support banner text
4.44.12
Patch Changes
- #5208
72f9f608f42
Thanks @BatuhanW! - chore: update commit frequency branch from next to master in README.
4.44.11
Patch Changes
-
#5199
2b8d658a17a
Thanks @aliemir! - ExportedBaseOption
type as successor of the deprecatedOption
type.BaseOption
is{ label: any; value: any; }
.Usage of the deprecated
Option
type was correctly assuming that thevalue
property of the option is of typestring
. This assumption was wrong and now the types are changed to reflect the correct values of options with the ability to change it via 4th generic typeTOption
ofuseSelect
hook. -
#5199
2b8d658a17a
Thanks @aliemir! - Reverted the faulty assumption on option values ofuseSelect
hook to be of typestring
. Now changed the types and the logic to reflect the correct values of options with the ability to change it via 4th generic typeTOption
ofuseSelect
hook. (Reverted PR #5160)By default
TOption
will be equal toBaseOption
type which is{ label: any; value: any; }
. If you want to change the type of options, you can do it like this:import { HttpError, useSelect } from "@refinedev/core"; type MyData = { id: number; title: string; description: string; category: { id: string }; }; type Option = { label: MyData["title"]; value: MyData["id"] }; // equals to { label: string; value: number; } useSelect<MyData, HttpError, MyData, Option>({ resource: "posts", });
-
#5194
9df999ca643
Thanks @fitrahfm! - fix: use relative path instead of path alias to import FlatTreeItemUsing path alias causes imported types being any during build/compilation process which should be TreeMenuItem[]
-
#5201
760cfbaaa2a
Thanks @aliemir! - Exported theflattenObjectKeys
andpropertyPathToArray
helpers from@refinedev/core
package.
4.44.10
Patch Changes
-
#5199
2b8d658a17a
Thanks @aliemir! - ExportedBaseOption
type as successor of the deprecatedOption
type.BaseOption
is{ label: any; value: any; }
.Usage of the deprecated
Option
type was correctly assuming that thevalue
property of the option is of typestring
. This assumption was wrong and now the types are changed to reflect the correct values of options with the ability to change it via 4th generic typeTOption
ofuseSelect
hook. -
#5199
2b8d658a17a
Thanks @aliemir! - Reverted the faulty assumption on option values ofuseSelect
hook to be of typestring
. Now changed the types and the logic to reflect the correct values of options with the ability to change it via 4th generic typeTOption
ofuseSelect
hook. (Reverted PR #5160)By default
TOption
will be equal toBaseOption
type which is{ label: any; value: any; }
. If you want to change the type of options, you can do it like this:import { HttpError, useSelect } from "@refinedev/core"; type MyData = { id: number; title: string; description: string; category: { id: string }; }; type Option = { label: MyData["title"]; value: MyData["id"] }; // equals to { label: string; value: number; } useSelect<MyData, HttpError, MyData, Option>({ resource: "posts", });
-
#5194
9df999ca643
Thanks @fitrahfm! - fix: use relative path instead of path alias to import FlatTreeItemUsing path alias causes imported types being any during build/compilation process which should be TreeMenuItem[]
-
#5201
760cfbaaa2a
Thanks @aliemir! - Exported theflattenObjectKeys
andpropertyPathToArray
helpers from@refinedev/core
package.
4.44.9
Patch Changes
-
#5177
4e0f6f9a69f
Thanks @aliemir! - Fixed the issue ofuseList
hook requiring an empty object as prop even if there was no parameter passed to it. -
#5132
f616d6ffd94
Thanks @mlukasik-dev! - fix:useSelect
'soptionLabel
andoptionValue
types are wrong. -
#5160
9b9d5032b3a
Thanks @an-tran511! - fix: convert type of an option'svalue
tostring
4.44.8
Patch Changes
-
#5177
4e0f6f9a69f
Thanks @aliemir! - Fixed the issue ofuseList
hook requiring an empty object as prop even if there was no parameter passed to it. -
#5132
f616d6ffd94
Thanks @mlukasik-dev! - fix:useSelect
'soptionLabel
andoptionValue
types are wrong. -
#5160
9b9d5032b3a
Thanks @an-tran511! - fix: convert type of an option'svalue
tostring
4.44.7
Patch Changes
- #5138
0e22d5804b2
Thanks @aliemir! - PreventauthProvider.getIdentity
to be called inuseLog
ifauditLogProvider
is not defined.
4.44.6
Patch Changes
- #5138
0e22d5804b2
Thanks @aliemir! - PreventauthProvider.getIdentity
to be called inuseLog
ifauditLogProvider
is not defined.
4.44.5
Patch Changes
-
#5087
88d52d639b9
Thanks @alicanerdurmaz! - feat:meta
props addedliveProvider.subscribe
andliveProvider.publish
methods. From now on, you can usemeta
to distinguish between methods bymeta
.meta
type:import { QueryFunctionContext } from "@tanstack/react-query"; type Fields = Array<string | object | NestedField>; type VariableOptions = | { type?: string; name?: string; value: any; list?: boolean; required?: boolean; } | { [k: string]: any }; type Meta = { dataProviderName?: string; operation?: string; fields?: Fields; variables?: VariableOptions; queryContext?: QueryFunctionContext; [k: string]: any; };
Usage
import { LiveProvider, LiveEvent } from "@refinedev/core"; export const liveProvider = (client: any): LiveProvider => { return { subscribe: ({ channel, types, params, callback, meta }) => { console.log({ meta }); }, publish: ({ channel, type, payload, date, meta }: LiveEvent) => { console.log({ meta }); }, }; };
4.44.4
Patch Changes
-
#5087
88d52d639b9
Thanks @alicanerdurmaz! - feat:meta
props addedliveProvider.subscribe
andliveProvider.publish
methods. From now on, you can usemeta
to distinguish between methods bymeta
.meta
type:import { QueryFunctionContext } from "@tanstack/react-query"; type Fields = Array<string | object | NestedField>; type VariableOptions = | { type?: string; name?: string; value: any; list?: boolean; required?: boolean; } | { [k: string]: any }; type Meta = { dataProviderName?: string; operation?: string; fields?: Fields; variables?: VariableOptions; queryContext?: QueryFunctionContext; [k: string]: any; };
Usage
import { LiveProvider, LiveEvent } from "@refinedev/core"; export const liveProvider = (client: any): LiveProvider => { return { subscribe: ({ channel, types, params, callback, meta }) => { console.log({ meta }); }, publish: ({ channel, type, payload, date, meta }: LiveEvent) => { console.log({ meta }); }, }; };
4.44.3
Patch Changes
-
#5050
613af0021f6
Thanks @alicanerdurmaz! - feat: passdataProviderName
toliveProvider.subscribe
method. From now on, you can usedataProviderName
to distinguish between different data providers in live provider.Refer to documentation for more info about multiple data providers ->
Usage
import { useForm, useList } from "@refinedev/core"; useList({ dataProviderName: "first-data-provider", }); useForm({ dataProviderName: "second-data-provider", });
import { LiveProvider } from "@refinedev/core"; export const liveProvider = (client: any): LiveProvider => { return { subscribe: ({ channel, types, params, callback, dataProviderName, }) => { console.log({ dataProviderName }); // "second-data-provider" }, }; };
-
#5053
857d4020a30
Thanks @alicanerdurmaz! - feat: The parameter types of data provider methods have been exported. From now on, you can use the parameter types of Data Provider methods.import type { DataProvider, GetListResponse // new exported types GetListParams, GetManyParams, GetOneParams, CreateParams, CreateManyParams, UpdateParams, UpdateManyParams, DeleteOneParams, DeleteManyParams, CustomParams, } from "@refinedev/core"; const myDataProvider: DataProvider = { getList: async (params: GetListParams): Promise<GetListResponse<any>> => { return { data: [], total: 0 }; }, };
4.44.2
Patch Changes
-
#5050
613af0021f6
Thanks @alicanerdurmaz! - feat: passdataProviderName
toliveProvider.subscribe
method. From now on, you can usedataProviderName
to distinguish between different data providers in live provider.Refer to documentation for more info about multiple data providers ->
Usage
import { useForm, useList } from "@refinedev/core"; useList({ dataProviderName: "first-data-provider", }); useForm({ dataProviderName: "second-data-provider", });
import { LiveProvider } from "@refinedev/core"; export const liveProvider = (client: any): LiveProvider => { return { subscribe: ({ channel, types, params, callback, dataProviderName, }) => { console.log({ dataProviderName }); // "second-data-provider" }, }; };
-
#5053
857d4020a30
Thanks @alicanerdurmaz! - feat: The parameter types of data provider methods have been exported. From now on, you can use the parameter types of Data Provider methods.import type { DataProvider, GetListResponse // new exported types GetListParams, GetManyParams, GetOneParams, CreateParams, CreateManyParams, UpdateParams, UpdateManyParams, DeleteOneParams, DeleteManyParams, CustomParams, } from "@refinedev/core"; const myDataProvider: DataProvider = { getList: async (params: GetListParams): Promise<GetListResponse<any>> => { return { data: [], total: 0 }; }, };
4.44.1
Patch Changes
-
#5050
613af0021f6
Thanks @alicanerdurmaz! - feat: passdataProviderName
toliveProvider.subscribe
method. From now on, you can usedataProviderName
to distinguish between different data providers in live provider.Refer to documentation for more info about multiple data providers ->
Usage
import { useForm, useList } from "@refinedev/core"; useList({ dataProviderName: "first-data-provider", }); useForm({ dataProviderName: "second-data-provider", });
import { LiveProvider } from "@refinedev/core"; export const liveProvider = (client: any): LiveProvider => { return { subscribe: ({ channel, types, params, callback, dataProviderName, }) => { console.log({ dataProviderName }); // "second-data-provider" }, }; };
-
#5053
857d4020a30
Thanks @alicanerdurmaz! - feat: The parameter types of data provider methods have been exported. From now on, you can use the parameter types of Data Provider methods.import type { DataProvider, GetListResponse // new exported types GetListParams, GetManyParams, GetOneParams, CreateParams, CreateManyParams, UpdateParams, UpdateManyParams, DeleteOneParams, DeleteManyParams, CustomParams, } from "@refinedev/core"; const myDataProvider: DataProvider = { getList: async (params: GetListParams): Promise<GetListResponse<any>> => { return { data: [], total: 0 }; }, };
4.44.0
Minor Changes
-
#5034
85bcff15d1e
Thanks @alicanerdurmaz! - feat: Thego
function returned byuseGo
now accepts aresource
object as theto
parameter. From now now, you can provide either a string or a resource object to thego
function. When a resource object is passed, it will be transformed into the path defined within the resources array of the<Refine />
component.to
accepts an object with the following shape to navigate to a resource:Name Type Description resource string
resource name or identifier. id [ BaseKey
][basekey]required when action
is"edit"
,"show"
, or"clone"
.action "list"
|"create"
|"edit"
|"show"
|"clone"
action name. import { useGo } from "@refinedev/core"; const MyComponent = () => { const go = useGo(); return ( <Button onClick={() => { go({ to: { resource: "posts", // resource name or identifier action: "edit", id: "1", } query: { foo: "bar", }, type: "push", }); }} > Go Posts With Default Filters </Button> ); };
4.43.0
Minor Changes
-
#5034
85bcff15d1e
Thanks @alicanerdurmaz! - feat: Thego
function returned byuseGo
now accepts aresource
object as theto
parameter. From now now, you can provide either a string or a resource object to thego
function. When a resource object is passed, it will be transformed into the path defined within the resources array of the<Refine />
component.to
accepts an object with the following shape to navigate to a resource:Name Type Description resource string
resource name or identifier. id [ BaseKey
][basekey]required when action
is"edit"
,"show"
, or"clone"
.action "list"
|"create"
|"edit"
|"show"
|"clone"
action name. import { useGo } from "@refinedev/core"; const MyComponent = () => { const go = useGo(); return ( <Button onClick={() => { go({ to: { resource: "posts", // resource name or identifier action: "edit", id: "1", } query: { foo: "bar", }, type: "push", }); }} > Go Posts With Default Filters </Button> ); };
4.42.4
Patch Changes
- Updated dependencies [
80513a4e42f
]:- @refinedev/devtools-internal@1.1.4
4.42.3
Patch Changes
- Updated dependencies [
80513a4e42f
]:- @refinedev/devtools-internal@1.1.3
4.42.2
Patch Changes
-
#5008
c8499114e55
Thanks @aliemir! - Fixing the version of@refinedev/devtools-internal
dependency to avoid breaking projects in mismatching releases. -
Updated dependencies [
c8499114e55
]:- @refinedev/devtools-internal@1.1.2
4.42.1
Patch Changes
-
#5008
c8499114e55
Thanks @aliemir! - Fixing the version of@refinedev/devtools-internal
dependency to avoid breaking projects in mismatching releases. -
Updated dependencies [
c8499114e55
]:- @refinedev/devtools-internal@1.1.1
4.42.0
Minor Changes
- #4960
d8e464fa2c4
Thanks @aliemir! - Added devtools internals and integrated with the core hooks. Now users will be able to track the queries and mutation made by refine through refine devtools.
Patch Changes
- Updated dependencies [
d8e464fa2c4
]:- @refinedev/devtools-internal@1.1.0
4.41.0
Minor Changes
- #4960
d8e464fa2c4
Thanks @aliemir! - Added devtools internals and integrated with the core hooks. Now users will be able to track the queries and mutation made by refine through refine devtools.
Patch Changes
- Updated dependencies [
d8e464fa2c4
]:- @refinedev/devtools-internal@1.0.0
4.40.0
Minor Changes
-
#4914
91a4d0da9f1
Thanks @yildirayunlu! - feat: addoptimisticUpdateMap
prop to theuseUpdate
anduseUpdateMany
hookslist
,many
anddetail
are the keys of theoptimisticUpdateMap
object. To automatically update the cache, you should passtrue
. If you don't want to update the cache, you should passfalse
.If you wish to customize the cache update, you have the option to provide functions for the
list
,many
, anddetail
keys. These functions will be invoked with theprevious
data,values
, andid
parameters. Your responsibility is to return the updated data within these functions.const { mutate } = useUpdateMany(); mutate({ //... mutationMode: "optimistic", optimisticUpdateMap: { list: true, many: true, detail: (previous, values, id) => { if (!previous) { return null; } const data = { id, ...previous.data, ...values, foo: "bar", }; return { ...previous, data, }; }, }, });
feat: add
optimisticUpdateMap
prop to theuseForm
hookconst { formProps, saveButtonProps } = useForm({ mutationMode: "optimistic", optimisticUpdateMap: { list: true, many: true, detail: (previous, values, id) => { if (!previous) { return null; } const data = { id, ...previous.data, ...values, foo: "bar", }; return { ...previous, data, }; }, }, });
Patch Changes
- #4903
e327cadc011
Thanks @yildirayunlu! - feat: addinvalidateOnUnmount
prop touseForm
hook. From now on, you can use theinvalidateOnUnmount
prop to invalidate queries upon unmount.
4.39.0
Minor Changes
-
#4914
91a4d0da9f1
Thanks @yildirayunlu! - feat: addoptimisticUpdateMap
prop to theuseUpdate
anduseUpdateMany
hookslist
,many
anddetail
are the keys of theoptimisticUpdateMap
object. To automatically update the cache, you should passtrue
. If you don't want to update the cache, you should passfalse
.If you wish to customize the cache update, you have the option to provide functions for the
list
,many
, anddetail
keys. These functions will be invoked with theprevious
data,values
, andid
parameters. Your responsibility is to return the updated data within these functions.const { mutate } = useUpdateMany(); mutate({ //... mutationMode: "optimistic", optimisticUpdateMap: { list: true, many: true, detail: (previous, values, id) => { if (!previous) { return null; } const data = { id, ...previous.data, ...values, foo: "bar", }; return { ...previous, data, }; }, }, });
feat: add
optimisticUpdateMap
prop to theuseForm
hookconst { formProps, saveButtonProps } = useForm({ mutationMode: "optimistic", optimisticUpdateMap: { list: true, many: true, detail: (previous, values, id) => { if (!previous) { return null; } const data = { id, ...previous.data, ...values, foo: "bar", }; return { ...previous, data, }; }, }, });
Patch Changes
- #4903
e327cadc011
Thanks @yildirayunlu! - feat: addinvalidateOnUnmount
prop touseForm
hook. From now on, you can use theinvalidateOnUnmount
prop to invalidate queries upon unmount.
4.38.4
Patch Changes
- #4951
04837c62077
Thanks @aliemir! - - Update build configuration foresbuild
to use the shared plugins.- Fix the lodash replacement plugin to skip redundant files.
4.38.3
Patch Changes
- #4951
04837c62077
Thanks @aliemir! - - Update build configuration foresbuild
to use the shared plugins.- Fix the lodash replacement plugin to skip redundant files.
4.38.2
Patch Changes
- #4948
8e5efffbb23
Thanks @aliemir! - Keep the hook and component names in builds for better debugging.
4.38.1
Patch Changes
- #4948
8e5efffbb23
Thanks @aliemir! - Keep the hook and component names in builds for better debugging.
4.38.0
Minor Changes
-
#4906
58d3d605510
Thanks @alicanerdurmaz! - feat: addedonUnauthorized
callback to<CanAccess />
component. This callback to be called whenuseCan
returns false.<CanAccess onUnauthorized={({ resource, reason, action, params }) => console.log( `You cannot access ${resource}-${params.id} resource with ${action} action because ${reason}`, ) } > <YourComponent /> </CanAccess>
Patch Changes
- #4926
053798ae52b
Thanks @salihozdemir! - fix: updateuseForm
warn condition
4.37.0
Minor Changes
-
#4906
58d3d605510
Thanks @alicanerdurmaz! - feat: addedonUnauthorized
callback to<CanAccess />
component. This callback to be called whenuseCan
returns false.<CanAccess onUnauthorized={({ resource, reason, action, params }) => console.log( `You cannot access ${resource}-${params.id} resource with ${action} action because ${reason}`, ) } > <YourComponent /> </CanAccess>
Patch Changes
- #4926
053798ae52b
Thanks @salihozdemir! - fix: updateuseForm
warn condition
4.36.2
Patch Changes
-
#4896
daabcd666be
Thanks @aliemir! -useInvalidate
now returns a promise that resolves when the invalidation is completed. -
#4896
daabcd666be
Thanks @aliemir! - Fine-tuning the invalidation process by setting up additional filters and options for the invalidation.Now after a successful mutation, refine will invalidate all the queries in the scope but trigger a refetch only for the active queries. If there are any ongoing queries, they will be kept as they are.
After receiving a realtime subscription event, refine will invalidate and refetch only the active queries.
4.36.1
Patch Changes
-
#4896
daabcd666be
Thanks @aliemir! -useInvalidate
now returns a promise that resolves when the invalidation is completed. -
#4896
daabcd666be
Thanks @aliemir! - Fine-tuning the invalidation process by setting up additional filters and options for the invalidation.Now after a successful mutation, refine will invalidate all the queries in the scope but trigger a refetch only for the active queries. If there are any ongoing queries, they will be kept as they are.
After receiving a realtime subscription event, refine will invalidate and refetch only the active queries.
4.36.0
Minor Changes
-
#4865
946e13408e7
Thanks @aliemir! - Updated query keys to be more consistent and structured.Added mutation keys to the
useMutation
calls with the same structure as the query keys.Added
options.useNewQueryKeys
option to the<Refine>
component for opting into the new query keys.Check out the documentation for more information.
4.35.0
Minor Changes
-
#4865
946e13408e7
Thanks @aliemir! - Updated query keys to be more consistent and structured.Added mutation keys to the
useMutation
calls with the same structure as the query keys.Added
options.useNewQueryKeys
option to the<Refine>
component for opting into the new query keys.Check out the documentation for more information.
4.34.0
Minor Changes
-
#4775
3052fb22449
Thanks @alicanerdurmaz! - feat:queryKeys
andpickDataProvider
functions are exported.pickDataProvider
: returns the data provider name based on the provided name or fallbacks to resource definition, ordefault
.queryKeys
: returns the query keys used by the data hooks based on theresource
definition
4.33.0
Minor Changes
-
#4775
3052fb22449
Thanks @alicanerdurmaz! - feat:queryKeys
andpickDataProvider
functions are exported.pickDataProvider
: returns the data provider name based on the provided name or fallbacks to resource definition, ordefault
.queryKeys
: returns the query keys used by the data hooks based on theresource
definition
4.32.2
Patch Changes
- #4765
e3e38de4114
Thanks @yildirayunlu! - chore: removerefine cloud
early access message
4.32.1
Patch Changes
- #4765
e3e38de4114
Thanks @yildirayunlu! - chore: removerefine cloud
early access message
4.32.0
Minor Changes
- #4741
026ccf34356
Thanks @aliemir! - AddedsideEffects: false
topackage.json
to help bundlers tree-shake unused code.
4.31.0
Minor Changes
- #4741
026ccf34356
Thanks @aliemir! - AddedsideEffects: false
topackage.json
to help bundlers tree-shake unused code.
4.30.0
Minor Changes
-
#4742
61950c8fe18
Thanks @aliemir! - Removed@tanstack/react-query-devtools
package and its usage from refine's core. This means that you will no longer see the dev tools icon in the bottom right corner of your app by default. If you want to use the dev tools, you can install the package (@tanstack/react-query-devtools
) and use it in your app.options.reactQuery.devtoolConfig
property has been removed from the<Refine>
components props. This option will no longer be functional and will be removed in the next major release. If you have any configuration for the dev tools, you can pass it to theReactQueryDevtools
component directly.
Patch Changes
- #4740
41018fde9ff
Thanks @aliemir! - Usefetch
for telemetry calls as a fallback forImage
when it's not available. This fixes an issue where telemetry calls would fail in some environments.
4.29.0
Minor Changes
-
#4742
61950c8fe18
Thanks @aliemir! - Removed@tanstack/react-query-devtools
package and its usage from refine's core. This means that you will no longer see the dev tools icon in the bottom right corner of your app by default. If you want to use the dev tools, you can install the package (@tanstack/react-query-devtools
) and use it in your app.options.reactQuery.devtoolConfig
property has been removed from the<Refine>
components props. This option will no longer be functional and will be removed in the next major release. If you have any configuration for the dev tools, you can pass it to theReactQueryDevtools
component directly.
Patch Changes
- #4740
41018fde9ff
Thanks @aliemir! - Usefetch
for telemetry calls as a fallback forImage
when it's not available. This fixes an issue where telemetry calls would fail in some environments.
4.28.2
Patch Changes
- #4696
35a2c695a74
Thanks @BatuhanW! - feat: add optional projectId field to component options prop. Project ID will be sent with telemetry data if it exists.
4.28.1
Patch Changes
- #4696
35a2c695a74
Thanks @BatuhanW! - feat: add optional projectId field to component options prop. Project ID will be sent with telemetry data if it exists.
4.28.0
Minor Changes
-
#4652
96af6d25b7a
Thanks @alicanerdurmaz! - feat: addederrros
field toHttpError
type. From now on, you can passerrors
field toHttpError
. This field will be used to update theuseForm
's error state.export interface ValidationErrors { [field: string]: | string | string[] | boolean | { key: string; message: string }; } export interface HttpError extends Record<string, any> { message: string; statusCode: number; errors?: ValidationErrors; }
Usage example:
import { HttpError } from "@refinedev/core"; const App = () => { return ( <Refine routerProvider={routerProvider} dataProvider={{ // ... update: async () => { // assume that the server returns the following error const error: HttpError = { message: "An error occurred while updating the record.", statusCode: 400, //This field will be used to update the `useForm`'s error state errors: { title: [ "Title is required.", "Title should have at least 5 characters.", ], "category.id": ["Category is required."], status: true, content: { key: "form.error.content", message: "Content is required.", }, }, }; return Promise.reject(error); }, }} > {/* ... */} </Refine> ); };
Refer to the server-side form validation documentation for more information. →
-
#4652
96af6d25b7a
Thanks @alicanerdurmaz! - feat: addeddisableServerSideValidation
to the refine options for globally disabling server-side validation.import { Refine } from "@refinedev/core"; <Refine options={{ disableServerSideValidation: true, }} > // ... </Refine>;
-
#4591
f8891ead2bd
Thanks @yildirayunlu! - feat:autoSave
feature for useForm hook now acceptautoSave
object.enabled
is a boolean value anddebounce
is a number value in milliseconds.debounce
is optional and default value is1000
.autoSaveProps
is an object that containsdata
,error
andstatus
values.data
is the saved data,error
is the error object andstatus
is the status of the request.status
can beloading
,error
,idle
andsuccess
.const { autoSaveProps } = useForm({ autoSave: { enabled: true, debounce: 2000, // not required, default is 1000 }, });
Patch Changes
-
#4659
3af99896101
Thanks @salihozdemir! - chore: fix tsdoc description ofonCancel
property on following hooks:useUpdate
useUpdateMany
useDelete
useDeleteMany
-
#4665
3442f4bd00a
Thanks @yildirayunlu! - feat: addfalse
return type onSuccessErrorNotification
This issue has been fixed in this PR, where the
successNotification
anderrorNotification
methods can now returnfalse
when a callback function is given. This allows the conditional notification to be displayed.const { mutate } = useCreate<IPost>({}); mutate({ resource: "posts", values: { title: "Hello World", status: "published", }, successNotification: (data) => { if (data?.data.status === "published") { return { type: "success", message: "Post published", }; } return false; }, });
4.27.0
Minor Changes
-
#4652
96af6d25b7a
Thanks @alicanerdurmaz! - feat: addederrros
field toHttpError
type. From now on, you can passerrors
field toHttpError
. This field will be used to update theuseForm
's error state.export interface ValidationErrors { [field: string]: | string | string[] | boolean | { key: string; message: string }; } export interface HttpError extends Record<string, any> { message: string; statusCode: number; errors?: ValidationErrors; }
Usage example:
import { HttpError } from "@refinedev/core"; const App = () => { return ( <Refine routerProvider={routerProvider} dataProvider={{ // ... update: async () => { // assume that the server returns the following error const error: HttpError = { message: "An error occurred while updating the record.", statusCode: 400, //This field will be used to update the `useForm`'s error state errors: { title: [ "Title is required.", "Title should have at least 5 characters.", ], "category.id": ["Category is required."], status: true, content: { key: "form.error.content", message: "Content is required.", }, }, }; return Promise.reject(error); }, }} > {/* ... */} </Refine> ); };
Refer to the server-side form validation documentation for more information. →
-
#4652
96af6d25b7a
Thanks @alicanerdurmaz! - feat: addeddisableServerSideValidation
to the refine options for globally disabling server-side validation.import { Refine } from "@refinedev/core"; <Refine options={{ disableServerSideValidation: true, }} > // ... </Refine>;
-
#4591
f8891ead2bd
Thanks @yildirayunlu! - feat:autoSave
feature for useForm hook now acceptautoSave
object.enabled
is a boolean value anddebounce
is a number value in milliseconds.debounce
is optional and default value is1000
.autoSaveProps
is an object that containsdata
,error
andstatus
values.data
is the saved data,error
is the error object andstatus
is the status of the request.status
can beloading
,error
,idle
andsuccess
.const { autoSaveProps } = useForm({ autoSave: { enabled: true, debounce: 2000, // not required, default is 1000 }, });
Patch Changes
-
#4659
3af99896101
Thanks @salihozdemir! - chore: fix tsdoc description ofonCancel
property on following hooks:useUpdate
useUpdateMany
useDelete
useDeleteMany
-
#4665
3442f4bd00a
Thanks @yildirayunlu! - feat: addfalse
return type onSuccessErrorNotification
This issue has been fixed in this PR, where the
successNotification
anderrorNotification
methods can now returnfalse
when a callback function is given. This allows the conditional notification to be displayed.const { mutate } = useCreate<IPost>({}); mutate({ resource: "posts", values: { title: "Hello World", status: "published", }, successNotification: (data) => { if (data?.data.status === "published") { return { type: "success", message: "Post published", }; } return false; }, });
4.26.4
Patch Changes
- #4626
03597ed8a9a
Thanks @aliemir! - Addedresource
sanitization to theuseCanWithoutCache
hook to avoid cyclic value errors.
4.26.3
Patch Changes
- #4626
03597ed8a9a
Thanks @aliemir! - Addedresource
sanitization to theuseCanWithoutCache
hook to avoid cyclic value errors.
4.26.2
Patch Changes
- #4614
c9fecca3c33
Thanks @omeraplak! - chore: add refine cloud early access message
4.26.1
Patch Changes
- #4614
c9fecca3c33
Thanks @omeraplak! - chore: add refine cloud early access message
4.26.0
Minor Changes
-
#4568
8c2b3be35b0
Thanks @salihozdemir! - feat: add thetextTransformers
option to<Refine/>
componentThe
textTransformers
option in refine is used to transform the resource name displayed on the user interface (UI). By default, if you define a resource namedposts
, refine will display it asPosts
. Similarly, when you delete a record, notification messages will be shown asPost deleted successfully.
.You have the flexibility to customize these messages by using the
textTransformers
option. For instance, if you wish to disable any transformation, you can set thetextTransformers
option as shown in the example below:const App: React.FC = () => ( <Refine // ... options={{ textTransformers: { humanize: (text) => text, plural: (text) => text, singular: (text) => text, }, }} /> );
Patch Changes
-
#4583
c3c0deed564
Thanks @aliemir! - Added the missingresource
property inparams
of theuseCan
call, which was leading to missing resource details in the access control checks in thecan
function.The provided
resource
item is sanitized to remove non-serializable properties such asicon
etc. If you need such items, you should try to access yourresource
item directly from your defitinions. -
#4599
5bb6f47a4d4
Thanks @aliemir! - Update default document title generation to use the fallback title wheni18n
'stranslate
function returns thekey
value.
4.25.1
Patch Changes
- #4599
5bb6f47a4d4
Thanks @aliemir! - Update default document title generation to use the fallback title wheni18n
'stranslate
function returns thekey
value.
4.25.0
Minor Changes
-
#4568
8c2b3be35b0
Thanks @salihozdemir! - feat: add thetextTransformers
option to<Refine/>
componentThe
textTransformers
option in refine is used to transform the resource name displayed on the user interface (UI). By default, if you define a resource namedposts
, refine will display it asPosts
. Similarly, when you delete a record, notification messages will be shown asPost deleted successfully.
.You have the flexibility to customize these messages by using the
textTransformers
option. For instance, if you wish to disable any transformation, you can set thetextTransformers
option as shown in the example below:const App: React.FC = () => ( <Refine // ... options={{ textTransformers: { humanize: (text) => text, plural: (text) => text, singular: (text) => text, }, }} /> );
Patch Changes
-
#4583
c3c0deed564
Thanks @aliemir! - Added the missingresource
property inparams
of theuseCan
call, which was leading to missing resource details in the access control checks in thecan
function.The provided
resource
item is sanitized to remove non-serializable properties such asicon
etc. If you need such items, you should try to access yourresource
item directly from your defitinions.
4.24.0
Minor Changes
-
#4523
18d446b1069
Thanks @yildirayunlu! - feat: adduseLoadingOvertime
hook and implement primitive hooksIf you need to do something when the loading time exceeds the specified time, refine provides the
useLoadingOvertime
hook. It returns the elapsed time in milliseconds.const { elapsedTime } = useLoadingOvertime({ isLoading, interval: 1000, onInterval(elapsedInterval) { console.log("loading overtime", elapsedInterval); }, }); console.log(elapsedTime); // 1000, 2000, 3000, ...
This hook implements the primitive data hooks:
-
#4527
ceadcd29fc9
Thanks @salihozdemir! - fix: support multipleresource
usage with the same name via theidentifier
Previously, data hooks only worked with resource name. So if you had multiple
resource
usage with the same name, it would cause issues.Now the following hooks and its derivatives support
identifier
to distinguish between the resources:useList
useInfiniteList
useOne
useMany
useCreate
useCreateMany
useUpdate
useUpdateMany
useDelete
useDeleteMany
fix: generate correct
queryKey
's for queries withidentifier
Previously, the
queryKey
was generated usingname
. This caused issues when you had multipleresource
usage with the same name. Now thequeryKey
's are generated usingidentifier
if it's present. -
#4523
18d446b1069
Thanks @yildirayunlu! - feat: adduseLoadingOvertime
hookif you need to do something when the loading time exceeds the specified time, refine provides the
useLoadingOvertime
hook. It returns the elapsed time in milliseconds.const { elapsedTime } = useLoadingOvertime({ isLoading, interval: 1000, onInterval(elapsedInterval) { console.log("loading overtime", elapsedInterval); }, });
interval
andonInterval
are optional. It can be controlled globally from<Refine />
options.<Refine //... options={{ //... overtime: { interval: 2000, // default 1000 onInterval(elapsedInterval) { console.log( "loading overtime", elapsedInterval, ); }, }, }} >
4.23.0
Minor Changes
-
#4523
18d446b1069
Thanks @yildirayunlu! - feat: adduseLoadingOvertime
hook and implement primitive hooksIf you need to do something when the loading time exceeds the specified time, refine provides the
useLoadingOvertime
hook. It returns the elapsed time in milliseconds.const { elapsedTime } = useLoadingOvertime({ isLoading, interval: 1000, onInterval(elapsedInterval) { console.log("loading overtime", elapsedInterval); }, }); console.log(elapsedTime); // 1000, 2000, 3000, ...
This hook implements the primitive data hooks:
-
#4527
ceadcd29fc9
Thanks @salihozdemir! - fix: support multipleresource
usage with the same name via theidentifier
Previously, data hooks only worked with resource name. So if you had multiple
resource
usage with the same name, it would cause issues.Now the following hooks and its derivatives support
identifier
to distinguish between the resources:useList
useInfiniteList
useOne
useMany
useCreate
useCreateMany
useUpdate
useUpdateMany
useDelete
useDeleteMany
fix: generate correct
queryKey
's for queries withidentifier
Previously, the
queryKey
was generated usingname
. This caused issues when you had multipleresource
usage with the same name. Now thequeryKey
's are generated usingidentifier
if it's present. -
#4523
18d446b1069
Thanks @yildirayunlu! - feat: adduseLoadingOvertime
hookif you need to do something when the loading time exceeds the specified time, refine provides the
useLoadingOvertime
hook. It returns the elapsed time in milliseconds.const { elapsedTime } = useLoadingOvertime({ isLoading, interval: 1000, onInterval(elapsedInterval) { console.log("loading overtime", elapsedInterval); }, });
interval
andonInterval
are optional. It can be controlled globally from<Refine />
options.<Refine //... options={{ //... overtime: { interval: 2000, // default 1000 onInterval(elapsedInterval) { console.log( "loading overtime", elapsedInterval, ); }, }, }} >
4.22.0
Minor Changes
-
#4449
cc84d61bc5c
Thanks @BatuhanW! - feat: allow access control provider to be configured globally.Now
accessControlProvider
acceptsoptions.buttons
parameter to globally configure UI buttons' behaviour.These configuration will be used as a fallback, if no configuration on button prop level is found.
Default values:
options.buttons.enableAccessControl
=>true
options.buttons.hideIfUnauthorized
=>false
const accessControlProvider: IAccessControlContext = { can: async (params: CanParams): Promise<CanReturnType> => { return { can: true }; }, options: { buttons: { enableAccessControl: true, hideIfUnauthorized: false, }, }, };
Patch Changes
-
#4521
a3c8d4f84c7
Thanks @alicanerdurmaz! - fixed:useExport
'sresource
props is not working. With this fix,useExport
will now work withresource
props.useExport({ resource: "users", });
4.21.0
Minor Changes
-
#4449
cc84d61bc5c
Thanks @BatuhanW! - feat: allow access control provider to be configured globally.Now
accessControlProvider
acceptsoptions.buttons
parameter to globally configure UI buttons' behaviour.These configuration will be used as a fallback, if no configuration on button prop level is found.
Default values:
options.buttons.enableAccessControl
=>true
options.buttons.hideIfUnauthorized
=>false
const accessControlProvider: IAccessControlContext = { can: async (params: CanParams): Promise<CanReturnType> => { return { can: true }; }, options: { buttons: { enableAccessControl: true, hideIfUnauthorized: false, }, }, };
Patch Changes
-
#4521
a3c8d4f84c7
Thanks @alicanerdurmaz! - fixed:useExport
'sresource
props is not working. With this fix,useExport
will now work withresource
props.useExport({ resource: "users", });
4.20.0
Minor Changes
- #4448
c82006f712a
Thanks @BatuhanW! - feat: useApiUrl hook tries to infer data provider from current resource. If current resource has a different data provider than the default one, it will be inferred without needing to explicitly pass data provider name.
4.19.0
Minor Changes
- #4448
c82006f712a
Thanks @BatuhanW! - feat: useApiUrl hook tries to infer data provider from current resource. If current resource has a different data provider than the default one, it will be inferred without needing to explicitly pass data provider name.
4.18.2
Patch Changes
-
#4446
5936d9cd4d4
Thanks @salihozdemir! - refactor: increase accessibility of auth page componentsadd
htmlFor
tolabel
elements to associate them with their inputs
4.18.1
Patch Changes
-
#4446
5936d9cd4d4
Thanks @salihozdemir! - refactor: increase accessibility of auth page componentsadd
htmlFor
tolabel
elements to associate them with their inputs
4.18.0
Minor Changes
-
#4430
cf07d59587f
Thanks @aliemir! - AddedqueryMeta
andmutationMeta
properties to theuseForm
hook. These properties are used to pass specific meta values to the query or mutation. This is useful when you have overlapping values in your data provider'sgetOne
andupdate
methods. For example, you may want to change themethod
of the mutation toPATCH
but if you pass it in themeta
property, you'll end up changing the method of thegetOne
request as well.queryMeta
andmutationMeta
has precedence overmeta
. This means that if you have the same property inqueryMeta
andmeta
, the value inqueryMeta
will be used.Usage
import { useForm } from "@refinedev/core"; export const MyEditPage = () => { const form = useForm({ // this is passed both to the mutation and the query requests meta: { myValue: "myValue", }, // this is only passed to the query request queryMeta: { propertyOnlyWorksForQuery: "propertyOnlyWorksForQuery", }, // this is only passed to the mutation request mutationMeta: { propertyOnlyWorksForMutation: "propertyOnlyWorksForMutation", }, }); };
Patch Changes
-
#4430
cf07d59587f
Thanks @aliemir! - Fix missingmeta
values inuseForm
redirects after submission. -
#4431
c29a3618cf6
Thanks @aliemir! - Updated the TSDoc comments to fix the broken links in the documentation. -
#4426
0602f4cdf1c
Thanks @yildirayunlu! - fix:resource
parameter in thelegacyResourceTransform
helper is not optional but used as optional
4.17.0
Minor Changes
-
#4430
cf07d59587f
Thanks @aliemir! - AddedqueryMeta
andmutationMeta
properties to theuseForm
hook. These properties are used to pass specific meta values to the query or mutation. This is useful when you have overlapping values in your data provider'sgetOne
andupdate
methods. For example, you may want to change themethod
of the mutation toPATCH
but if you pass it in themeta
property, you'll end up changing the method of thegetOne
request as well.queryMeta
andmutationMeta
has precedence overmeta
. This means that if you have the same property inqueryMeta
andmeta
, the value inqueryMeta
will be used.Usage
import { useForm } from "@refinedev/core"; export const MyEditPage = () => { const form = useForm({ // this is passed both to the mutation and the query requests meta: { myValue: "myValue", }, // this is only passed to the query request queryMeta: { propertyOnlyWorksForQuery: "propertyOnlyWorksForQuery", }, // this is only passed to the mutation request mutationMeta: { propertyOnlyWorksForMutation: "propertyOnlyWorksForMutation", }, }); };
Patch Changes
-
#4430
cf07d59587f
Thanks @aliemir! - Fix missingmeta
values inuseForm
redirects after submission. -
#4431
c29a3618cf6
Thanks @aliemir! - Updated the TSDoc comments to fix the broken links in the documentation. -
#4426
0602f4cdf1c
Thanks @yildirayunlu! - fix:resource
parameter in thelegacyResourceTransform
helper is not optional but used as optional
4.16.4
Patch Changes
- #4415
54837825fcc
Thanks @alicanerdurmaz! - fixed:queryOptions
not working as expected inuseSelect
hook.
4.16.3
Patch Changes
- #4415
54837825fcc
Thanks @alicanerdurmaz! - fixed:queryOptions
not working as expected inuseSelect
hook.
4.16.2
Patch Changes
-
#4407
473bbe5b31d
Thanks @aliemir! - Added missingclone
action for document title generation. This fixes the issue of the document title not being generated when theclone
action is used.This change introduces the
documentTitle.{resourceName}.clone
key to the list ofi18n
keys that are used to generate the document title.Default title for the
clone
action is"#{{id}} Clone {{resourceName}} | refine"
. -
#4407
473bbe5b31d
Thanks @aliemir! - Fixed the issue oflabel
not taken into account with auto generated document titles.label
will be prioritized over the resource name when generating the document title and thelabel
will not be capitalized.
4.16.1
Patch Changes
-
#4407
473bbe5b31d
Thanks @aliemir! - Added missingclone
action for document title generation. This fixes the issue of the document title not being generated when theclone
action is used.This change introduces the
documentTitle.{resourceName}.clone
key to the list ofi18n
keys that are used to generate the document title.Default title for the
clone
action is"#{{id}} Clone {{resourceName}} | refine"
. -
#4407
473bbe5b31d
Thanks @aliemir! - Fixed the issue oflabel
not taken into account with auto generated document titles.label
will be prioritized over the resource name when generating the document title and thelabel
will not be capitalized.
4.16.0
Minor Changes
-
#4313
28fe67047a0
Thanks @abdellah711! - feat: implementgenerateDefaultDocumentTitle
functionThis function generates a default document title based on the current route by following these rules (
resource
in this case is "Post"):- list ->
Posts | refine
- edit ->
#{id} Edit Post | refine
- show ->
#{id} Show Post | refine
- create ->
Create new Post | refine
- default (not a
resource
) ->refine
- list ->
Patch Changes
- #4381
500cf2becc2
Thanks @yildirayunlu! - feat: exportTranslationContext
4.15.0
Minor Changes
-
#4313
28fe67047a0
Thanks @abdellah711! - feat: implementgenerateDefaultDocumentTitle
functionThis function generates a default document title based on the current route by following these rules (
resource
in this case is "Post"):- list ->
Posts | refine
- edit ->
#{id} Edit Post | refine
- show ->
#{id} Show Post | refine
- create ->
Create new Post | refine
- default (not a
resource
) ->refine
- list ->
Patch Changes
- #4381
500cf2becc2
Thanks @yildirayunlu! - feat: exportTranslationContext
4.14.3
Patch Changes
- #4279
3e4c977b8d3
Thanks @yildirayunlu! - fix: queryKey method params foruseDelete
,useDeleteMany
anduseUpdate
hooks
4.14.2
Patch Changes
- #4279
3e4c977b8d3
Thanks @yildirayunlu! - fix: queryKey method params foruseDelete
,useDeleteMany
anduseUpdate
hooks
4.14.1
Patch Changes
- #4279
3e4c977b8d3
Thanks @yildirayunlu! - fix: queryKey method params foruseDelete
,useDeleteMany
anduseUpdate
hooks
4.14.0
Minor Changes
-
#4241
fbe109b5a8b
Thanks @salihozdemir! - Added new generic types to theuseForm
hooks. Now you can pass the query types and the mutation types to the hook.import { useForm } from "@refinedev/core"; useForm< TQueryFnData, TError, TVariables, TData, TResponse, TResponseError >();
4.13.0
Minor Changes
-
#4241
fbe109b5a8b
Thanks @salihozdemir! - Added new generic types to theuseForm
hooks. Now you can pass the query types and the mutation types to the hook.import { useForm } from "@refinedev/core"; useForm< TQueryFnData, TError, TVariables, TData, TResponse, TResponseError >();
4.12.0
Minor Changes
-
#4194
8df15fe0e4e
Thanks @alicanerdurmaz! - feat:sorters.mode
prop added touseTable
anduseDataGrid
hooks. This prop handles the sorting mode of the table. It can be eitherserver
oroff
.- "off":
sorters
are not sent to the server. You can use thesorters
value to sort the records on the client side. - "server": Sorting is done on the server side. Records will be fetched by using the
sorters
value.
feat:
filters.mode
prop added touseTable
anduseDataGrid
hooks. This prop handles the filtering mode of the table. It can be eitherserver
oroff
.- "off":
filters
are not sent to the server. You can use thefilters
value to filter the records on the client side. - "server": Filtering is done on the server side. Records will be fetched by using the
filters
value.
- "off":
Patch Changes
- #4194
8df15fe0e4e
Thanks @alicanerdurmaz! - fix:filters
,sorters
,current
, and,pageSize
removed fromuseMeta
returned object.
4.11.0
Minor Changes
-
#4194
8df15fe0e4e
Thanks @alicanerdurmaz! - feat:sorters.mode
prop added touseTable
anduseDataGrid
hooks. This prop handles the sorting mode of the table. It can be eitherserver
oroff
.- "off":
sorters
are not sent to the server. You can use thesorters
value to sort the records on the client side. - "server": Sorting is done on the server side. Records will be fetched by using the
sorters
value.
feat:
filters.mode
prop added touseTable
anduseDataGrid
hooks. This prop handles the filtering mode of the table. It can be eitherserver
oroff
.- "off":
filters
are not sent to the server. You can use thefilters
value to filter the records on the client side. - "server": Filtering is done on the server side. Records will be fetched by using the
filters
value.
- "off":
Patch Changes
- #4194
8df15fe0e4e
Thanks @alicanerdurmaz! - fix:filters
,sorters
,current
, and,pageSize
removed fromuseMeta
returned object.
4.10.0
Minor Changes
-
#4135
e72c0d2b41f
Thanks @salihozdemir! - feat: Expose the query params to themeta
and add the ability to pass globalmeta
to data provider methods-
Added the ability to pass
meta
to data provider methods globally for specific resources.For example, to pass the
role
property to all data provider methods for theposts
resource, use the following code:import { Refine } from "@refinedev/core"; const App: React.FC = () => { return ( <Refine resources={[ { name: "posts", meta: { role: "editor", }, }, ]} /> ); };
Now, when you call any data hook with the
posts
resource, themeta
property will be accessible in the data provider methods.const dataProvider = { getList: async ({ resource, meta }) => { console.log(meta.role); // "editor" }, };
-
Added the query params to the
meta
property by default.For example, if you call the
useList
hook on theexample.com/posts?status=published
URL, themeta
property will be accessible in the data provider methods as follows:const dataProvider = { getList: async ({ resource, meta }) => { console.log(meta.status); // "published" }, };
-
Patch Changes
-
#4159
f7f590589e7
Thanks @aliemir! - fixed: missing resource meta in route compositionsAdded missing resource meta values when composing routes. This fixes the bug where the resource meta values does not included in the route composition.
4.9.0
Minor Changes
-
#4135
e72c0d2b41f
Thanks @salihozdemir! - feat: Expose the query params to themeta
and add the ability to pass globalmeta
to data provider methods-
Added the ability to pass
meta
to data provider methods globally for specific resources.For example, to pass the
role
property to all data provider methods for theposts
resource, use the following code:import { Refine } from "@refinedev/core"; const App: React.FC = () => { return ( <Refine resources={[ { name: "posts", meta: { role: "editor", }, }, ]} /> ); };
Now, when you call any data hook with the
posts
resource, themeta
property will be accessible in the data provider methods.const dataProvider = { getList: async ({ resource, meta }) => { console.log(meta.role); // "editor" }, };
-
Added the query params to the
meta
property by default.For example, if you call the
useList
hook on theexample.com/posts?status=published
URL, themeta
property will be accessible in the data provider methods as follows:const dataProvider = { getList: async ({ resource, meta }) => { console.log(meta.status); // "published" }, };
-
Patch Changes
-
#4159
f7f590589e7
Thanks @aliemir! - fixed: missing resource meta in route compositionsAdded missing resource meta values when composing routes. This fixes the bug where the resource meta values does not included in the route composition.
4.8.5
Patch Changes
- #4139
e4c60056a4d
Thanks @alicanerdurmaz! - - Fixed: incorrect css syntax on gh-banner
4.8.4
Patch Changes
- #4139
e4c60056a4d
Thanks @alicanerdurmaz! - - Fixed: incorrect css syntax on gh-banner
4.8.3
Patch Changes
- #4139
e4c60056a4d
Thanks @alicanerdurmaz! - - Fixed: incorrect css syntax on gh-banner
4.8.2
Patch Changes
- #4133
68f035dc4c0
Thanks @alicanerdurmaz! - Added: Hide<GithubBanner />
on mobile.
4.8.1
Patch Changes
- #4133
68f035dc4c0
Thanks @alicanerdurmaz! - Added: Hide<GithubBanner />
on mobile.
4.8.0
Minor Changes
-
#4113
1c13602e308
Thanks @salihozdemir! - Added missing third generic parameter to hooks which are usinguseQuery
internally.For example:
import { useOne, HttpError } from "@refinedev/core"; const { data } = useOne<{ count: string }, HttpError, { count: number }>({ resource: "product-count", queryOptions: { select: (rawData) => { return { data: { count: Number(rawData?.data?.count), }, }; }, }, }); console.log(typeof data?.data.count); // number
Patch Changes
-
#4129
e64ffe999b3
Thanks @aliemir! - Added the missing connection between the data provider's and theuseMany
hook'smeta
property. -
#4113
1c13602e308
Thanks @salihozdemir! - Updated the generic type name of hooks that useuseQuery
to synchronize generic type names withtanstack-query
.
4.7.2
Patch Changes
- #4102
44e403aa654
Thanks @aliemir! - Revert changes in<GithubBanner />
to promote github stars.
4.7.1
Patch Changes
- #4102
44e403aa654
Thanks @aliemir! - Revert changes in<GithubBanner />
to promote github stars.
4.7.0
Minor Changes
- #4040
8a1100cf9ed
Thanks @aliemir! - Add a generic type touseParse
anduseParsed
for type-safe additional params.
Patch Changes
- #4089
65f2a9fa223
Thanks @salihozdemir! - Update Github banner to Product Hunt banner for temporary.
4.6.0
Minor Changes
- #4040
8a1100cf9ed
Thanks @aliemir! - Add a generic type touseParse
anduseParsed
for type-safe additional params.
Patch Changes
- #4089
65f2a9fa223
Thanks @salihozdemir! - Update Github banner to Product Hunt banner for temporary.
4.5.10
Patch Changes
-
#4035
e0c75450f97
Thanks @salihozdemir! - Add types for notification methods arguments based on given generic types. -
#4071
98cd4b0f203
Thanks @salihozdemir! - UpdateauthBindings
error type to provide changeable error messages on notifcations.Example for
login
method:import { AuthBindings } from "@refinedev/core"; const authProvider: AuthBindings = { login: async ({ email, password }) => { ... return { success: false, error: { message: "Login Failed!", name: "The email or password that you've entered doesn't match any account.", }, }; }, ... };
4.5.9
Patch Changes
-
#4035
e0c75450f97
Thanks @salihozdemir! - Add types for notification methods arguments based on given generic types. -
#4071
98cd4b0f203
Thanks @salihozdemir! - UpdateauthBindings
error type to provide changeable error messages on notifcations.Example for
login
method:import { AuthBindings } from "@refinedev/core"; const authProvider: AuthBindings = { login: async ({ email, password }) => { ... return { success: false, error: { message: "Login Failed!", name: "The email or password that you've entered doesn't match any account.", }, }; }, ... };
4.5.8
Patch Changes
- #4014
3db450fade0
Thanks @salihozdemir! - Add console warning foruseForm
anduseShow
hooks when custom resource is provided andid
prop is not passed.
4.5.7
Patch Changes
- #4014
3db450fade0
Thanks @salihozdemir! - Add console warning foruseForm
anduseShow
hooks when custom resource is provided andid
prop is not passed.
4.5.6
Patch Changes
- #3974
4dcc20d6a60
Thanks @salihozdemir! - Updated the design of theWelcomePage
component.
4.5.5
Patch Changes
- #3974
4dcc20d6a60
Thanks @salihozdemir! - Updated the design of theWelcomePage
component.
4.5.4
Patch Changes
- #3987
d7d68e3ff68
Thanks @aliemir! - Watch forid
changes inuseForm
hook.
4.5.3
Patch Changes
- #3987
d7d68e3ff68
Thanks @aliemir! - Watch forid
changes inuseForm
hook.
4.5.2
Patch Changes
- #3911
5f9c70ebf2f
Thanks @salihozdemir! - In forms that useuseForm
, theonFinish
was resetting the currentid
toundefined
when the mutation is successful. Now, theid
will not be set toundefined
.
4.5.1
Patch Changes
- #3911
5f9c70ebf2f
Thanks @salihozdemir! - In forms that useuseForm
, theonFinish
was resetting the currentid
toundefined
when the mutation is successful. Now, theid
will not be set toundefined
.
4.5.0
Minor Changes
- #3912
0ffe70308b2
Thanks @alicanerdurmaz! - -title
prop added toAuthPage
'srenderContent
prop to use in the custom content.title
prop added toAuthPage
to render a custom title.- ⚠️ These features have not been implemented yet. Only types were added. It will be implemented in the next release.
4.4.0
Minor Changes
- #3912
0ffe70308b2
Thanks @alicanerdurmaz! - -title
prop added toAuthPage
'srenderContent
prop to use in the custom content.title
prop added toAuthPage
to render a custom title.- ⚠️ These features have not been implemented yet. Only types were added. It will be implemented in the next release.
4.3.0
Minor Changes
- #3892
41a4525454c
Thanks @BatuhanW! - feat: make CanAccess component props optional. Now CanAccess component infers resource and action automagically.
4.2.0
Minor Changes
- #3892
41a4525454c
Thanks @BatuhanW! - feat: make CanAccess component props optional. Now CanAccess component infers resource and action automagically.
4.1.6
Patch Changes
- #3890
db12d60095f
Thanks @aliemir! - - Fixed layout flickering on authenticated routes.- Fixed repeated navigations issue on routes with
<Authenticated>
component. - Fixed conflicting navigation paths with
authProvider
methods and<Authenticated>
component.
- Fixed repeated navigations issue on routes with
4.1.5
Patch Changes
- #3890
db12d60095f
Thanks @aliemir! - - Fixed layout flickering on authenticated routes.- Fixed repeated navigations issue on routes with
<Authenticated>
component. - Fixed conflicting navigation paths with
authProvider
methods and<Authenticated>
component.
- Fixed repeated navigations issue on routes with
4.1.4
Patch Changes
-
#3884
c507c10c351
Thanks @omeraplak! - fix: resource's icon parameter sanitized on useCan hook -
#3883
64b8292c5e8
Thanks @omeraplak! - feat: add custom query key support for useCustom hook
4.1.3
Patch Changes
-
#3884
c507c10c351
Thanks @omeraplak! - fix: resource's icon parameter sanitized on useCan hook -
#3883
64b8292c5e8
Thanks @omeraplak! - feat: add custom query key support for useCustom hook
4.1.2
Patch Changes
- #3874
5ed083a8050
Thanks @aliemir! - Add fallback option forlabel
frommeta
andoptions
.
4.1.1
Patch Changes
- #3874
5ed083a8050
Thanks @aliemir! - Add fallback option forlabel
frommeta
andoptions
.
4.1.0
Minor Changes
-
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk!
🪄 Migrating your project automatically with refine-codemod ✨
@refinedev/codemod
package handles the breaking changes for your project automatically, without any manual steps. It migrates your project from3.x.x
to4.x.x
.Just
cd
into root folder of your project (wherepackage.json
is contained) and run this command:npx @refinedev/codemod@latest refine3-to-refine4
And it's done. Now your project uses
refine@4.x.x
.📝 Changelog
We're releasing a new way to connect routers to refine. Now the
routerProvider
prop is marked as optional in<Refine>
component.New
routerProvider
property is smaller and more flexible than the previous one which is now can be used withlegacyRouterProvider
property.We've redesigned our bindings to the router libraries. Instead of handling the route creation process, now refine leaves this to the user and only uses a way to communicate with the router and the routes through the bindings provided to
routerProvider
property.The changes in routing system comes with a new way to define resource actions as well. Actions now can be defined as paths, components or both. We're encouraging our users to use paths, which enables our users to use all the optimizations that the router libraries provide without giving up any features of refine.
Router libraries are also comes with components like
RefineRoutes
which can be used to define routes for resources when you pass components to the actions of the resources. Please refer to the documentation for more information.Changes in
resources
Now you can define actions in multiple ways;
- As a path
<Refine resources={[ { name: "posts", list: "/posts", }, ]} > ... </Refine>
- As a component
import { PostList } from "src/posts"; <Refine resources={[ { name: "posts", list: PostList, }, ]} > ... </Refine>;
- As both
import { PostList } from "src/posts"; <Refine resources={[ { name: "posts", list: { path: "/posts", component: PostList, }, }, ]} > ... </Refine>;
This also comes with some additional changes;
options
property is renamed tometa
for consistency.parentName
is now defined withparent
property inmeta
object.auditLog
is renamed toaudit
.route
inoptions
is now deprecated for the new routing system. If you want to define a custom route for a resource, you can define such routes in action definitions.- Parents are not included in the routes by default. If you want to inclue parents in the routes, you need to define action paths explicitly.
identifier
can be passed to the resource definition to distinguish between resources with the same name. This is useful when you have multiple resources with the same name.
Nested routes
Now, refine supports nested routes with parameters. You can define the action paths for a resource with parameters. Parameters will be filled with the current ones in the URL and additional ones can be provided via
meta
properties in hooks and components.<Refine resources={[ { name: "posts", list: "users/:authorId/posts", show: "users/:authorId/posts/:id", }, ]} >
When you're in the
list
page of theposts
resource, assuming you already have theauthorId
parameter present in the URL, theshow
action will be rendered with theauthorId
parameter filled with the current one in the URL. If you want to use a differentauthorId
, you can passmeta
properties to the components or hooks, such asuseGetToPath
hook to get the navigation path.const { go } = useGo(); const getToPath = useGetToPath(); const to = getToPath({ resource: "posts", action: "show", meta: { id: 1, authorId: 2, }, }); // "to" will be "/users/2/posts/1" go({ to, type: "push" });
Changes in
routerProvider
routerProvider
is now smaller and more flexible. It only contains the following properties;Link
: A component that acceptsto
prop and renders a link to the given path.go
: A function that returns a function that accepts a config object and navigates to the given path.back
: A function that returns a function that navigates back to the previous page.parse
: A function that returns a function that returns theresource
,id
,action
and additionalparams
from the given path. This is the refine's way to communicate with the router library.
None of the properties are required. Missing properties may result in some features not working but it won't break refine.
Our users are able to provide different implementations for the router bindings, such as handling the search params in the path with a different way or customizing the navigation process.
Note: Existing
routerProvider
implementation is preserved aslegacyRouterProvider
and will continue working as before. We're planning to remove it in the next major version.Note: New routing system do not handle the authentication process. You can now wrap your components with
Authenticated
component or handle the authentication check inside your components throughuseIsAuthenticated
hook to provide more flexible auth concepts in your app.Changes in hooks
We're now providing new hooks for the new routing system. You're free to use them or use the ones provided by your router library.
useGo
useBack
useParsed
useLink
useGetToPath
are provided by refine to use the properties of
routerProvider
in a more convenient way.useResourceWithRoute
is now deprecated and only works with the legacy routing system.useResource
has changed its definition and now accepts a single argument which is theresource
name. It returns theresource
object depending on the current route or the givenresource
name. Ifresource
is provided but not found, it will create a temporary one to use with the givenresource
name.useNavigation
's functions in its return value are now acceptingmeta
object as an argument. This can be used to provide parameters to the target routes. For example, if your path for theedit
action of a resource is/:userId/posts/:id/edit
, you can provideuserId
parameter inmeta
object and it will be used in the path.- Hooks using routes, redirection etc. are now accepts
meta
property in their arguments. This can be used to provide parameters to the target routes. This change includesuseMenu
anduseBreadcrumb
which are creating paths to the resources for their purposes. selectedKey
inuseMenu
hook's return type now can beundefined
if the current route is not found in the menu items.
warnWhenUnsavedChanges
propIn earlier versions, refine was handling this feature in
beforeunload
event. This was causing unintended dependencies to thewindow
and was not customizable. Now, refine is leaving this to the router libraries. Router packages@refinedev/react-router-v6
,@refinedev/nextjs-router
and@refinedev/remix-router
are now exporting a componentUnsavedChangesNotifier
which can be placed under the<Refine>
component and registers a listener to the necessary events to handle thewarnWhenUnsavedChanges
feature.Changes in
Authenticated
component.<Authenticated>
component now acceptsredirectOnFail
to override the redirection path on authentication failure. This can be used to redirect to a different page when the user is not authenticated. This property only works if thefallback
prop is not provided.redirectOnFail
also respects the newly introducedappendCurrentPathToQuery
prop which can be used to append the current path to the query string of the redirection path. This can be used to redirect the user to the page they were trying to access after they logged in.Changes in
<Refine>
We've removed the long deprecated props from
<Refine />
component and deprecated some more to encourage users to use the new routing system.In earlier versions, we've accepted layout related props such as
Layout
,Sider
,Header
,Footer
,OffLayoutArea
andTitle
. All these props were used in the route creation process while wrapping the components to theLayout
and others were passed to theLayout
for configuration. Now, we've deprecated these props and we're encouraging users to useLayout
prop and its props in thechildren
of<Refine />
component. This will allow users to customize the layout easily and provide custom layouts per route.We've also deprecated the route related props such as;
catchAll
, which was used in rendering 404 pages and was unclear to the user when its going to be rendered in the app.LoginPage
, which was rendered at/login
path and was not customizable enough.DashboardPage
, which wass rendered at/
path and was limiting our users to handle the index page just with a single prop.ReadyPage
, which was shown when<Refine>
had no resources defined. Now, we're accepting empty resources array and rendering nothing in this case.
We're encouraging our users to create their own routes for the above props and give them the flexibility to use the full potential of the router library they're using.
Integration with existing apps
We've made the changes to the routing system, the resource definitions and some additional changes to make the integration with existing apps possible.
Now you can migrate your existing apps to refine with ease and incrementally adopt refine's features.
Backward compatibility
We've made all the changes in a backward compatible way. You can continue using the old routing system and the old props of
<Refine />
component. Migrating to the new behaviors are optional but encouraged.We're planning to keep the support for the deprecated props and the old behaviors until the next major version.
-
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk! Added audit log support for the following hooks:
useCreateMany
useDeleteMany
useUpdateMany
-
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk! Added a helper function to pick not deprecated value. Gives priority according to the order of the arguments.
const sorter = undefined; const sorters = [{ id: 1 }]; const value = pickNotDeprecated(sorter, sorters) ?? 10; // [{ id: 1 }]
-
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk!
useList
hook- Added default value for
pagination.current
property. It is set to 1. - Added default value for
pagination.pageSize
property. It is set to 10. - Added
pagination.mode
property. By default, it is "server".- When it is "off", all records will be fetched from the API.
- When it is "client", all records will be fetched from the API and pagination will be handled by the
useList
hook. - When it is "server", pagination will be handled by the API using
current
andpageSize
properties of yourpagination
object.
useTable
hookuseTable
return values and properties are updated.-
initialCurrent
andinitialPageSize
props are now deprecated. Usepagination
prop instead. -
To ensure backward compatibility,
initialCurrent
andinitialPageSize
props will work as before.useTable({ - initialCurrent, - initialPageSize, + pagination: { + current, + pageSize, + }, })
-
hasPagination
prop is now deprecated. Usepagination.mode
instead. -
To ensure backward compatibility,
hasPagination
prop will work as before.useTable({ - hasPagination, + pagination: { + mode: "off" | "server" | "client", + }, })
-
initialSorter
andpermanentSorter
props are now deprecated. Usesorters.initial
andsorters.permanent
instead. -
To ensure backward compatibility,
initialSorter
andpermanentSorter
props will work as before.useTable({ - initialSorter, - permanentSorter, + sorters: { + initial, + permanent, + }, })
-
initialFilter
,permanentFilter
, anddefaultSetFilterBehavior
props are now deprecated. Usefilters.initial
,filters.permanent
, andfilters.defaultBehavior
instead. -
To ensure backward compatibility,
initialFilter
,permanentFilter
, anddefaultSetFilterBehavior
props will work as before.useTable({ - initialFilter, - permanentFilter, - defaultSetFilterBehavior, + filters: { + initial, + permanent, + defaultBehavior, + }, })
-
sorter
andsetSorter
return values are now deprecated. Usesorters
andsetSorters
instead. -
To ensure backward compatibility,
sorter
andsetSorter
return values will work as before.const { - sorter, + sorters, - setSorter, + setSorters, } = useTable();
- Added default value for
-
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk! All
@tanstack/react-query
imports re-exported from@refinedev/core
have been removed. You should import them from@tanstack/react-query
package directly.If the package is not installed, you can install it with your package manager:
npm install @tanstack/react-query # or pnpm add @tanstack/react-query # or yarn add @tanstack/react-query
After that, you can import them from
@tanstack/react-query
package directly instead of@refinedev/core
package.- import { QueryClient } from "@refinedev/core"; + import { QueryClient } from "@tanstack/react-query";
-
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk!
options
prop of resource is now deprecated. Usemeta
prop instead.- To ensure backward compatibility,
options
prop will be used ifmeta
prop is not provided.
<Refine resources={[ { name: "posts", - options: {}, + meta: {}, }, ]} />
-
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk!
AuthProvider
deprecated and renamed toLegacyAuthProvider
.legacyAuthProvider
prop is added to<Refine>
component for backward compatibility.legacy
prop added to auth hooks supportAuthProvider
andLegacyAuthProvider
.
-
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk!
<ReadyPage>
isnow deprecated.- Created a
<WelcomePage>
component to welcome users.
-
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk!
useList
anduseInfiniteList
'sconfig
prop is now deprecated. Usesorters
,filters
,pagination
andhasPagination
props instead.
useList({ - config: { - sort, - filters, - pagination, - hasPagination, - }, + sorters, + filters, + pagination, + hasPagination, }) useInfiniteList({ - config: { - sort, - filters, - pagination, - hasPagination, - }, + sorters, + filters, + pagination, + hasPagination, })
useImport
anduseExport
'sresourceName
prop is now deprecated. Useresource
prop instead.
useImport({ - resourceName, + resource, }) useExport({ - resourceName, + resource, })
useExport
'ssorter
prop is now deprecated. Usesorters
prop instead.
useExport({ - sorter, + sorters, })
useSelect
'ssort
prop is now deprecated. Usesorters
prop instead.
useSelect({ - sort, + sorters, })
useSelect
'sconfig.sort
prop is now deprecated. Useconfig.sorters
prop instead.
useCustom({ config: { - sort, + sorters, } })
-
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk!
hasPagination
default value set tofalse
onuseSelect
. So all of the records will be fetched by default. -
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk! Updated
useSelect
hook to supportoptionLabel
andoptionValue
type askeyof TData
instead ofstring
.So
optionLabel
andoptionValue
have an interface based on the givenTData
type.- optionLabel?: string; - optionValue?: string; + optionLabel?: keyof TData extends string ? keyof TData : never; + optionValue?: keyof TData extends string ? keyof TData : never;
-
Thanks @aliemir, @alicanerdurmaz, @batuhanW, @salihozdemir, @yildirayunlu, @recepkutuk! Moving to the
@refinedev
scope 🎉🎉Moved to the
@refinedev
scope and updated our packages to use the new scope. From now on, all packages will be published under the@refinedev
scope with their new names.Now, we're also removing the
refine
prefix from all packages. So, the@pankod/refine-core
package is now@refinedev/core
,@pankod/refine-antd
is now@refinedev/antd
, and so on.
Patch Changes
3.103.0
Minor Changes
- #3822
0baa99ba787
Thanks @BatuhanW! - - refine v4 release announcement added to "postinstall". - refine v4 is released 🎉 The new version is 100% backward compatible. You can upgrade to v4 with a single command! See the migration guide here: https://refine.dev/docs/migration-guide/3x-to-4x
3.102.0
Minor Changes
- #3822
0baa99ba787
Thanks @BatuhanW! - - refine v4 release announcement added to "postinstall". - refine v4 is released 🎉 The new version is 100% backward compatible. You can upgrade to v4 with a single command! See the migration guide here: https://refine.dev/docs/migration-guide/3x-to-4x
3.101.2
Patch Changes
- #3768
38eb18ab795
Thanks @BatuhanW! - Update URL for GitHubBanner component
3.101.1
Patch Changes
- #3768
38eb18ab795
Thanks @BatuhanW! - Update URL for GitHubBanner component
3.101.0
Minor Changes
- #3716
03177f8aa06
Thanks @BatuhanW! - Added GitHubBanner component.
3.100.0
Minor Changes
- #3716
03177f8aa06
Thanks @BatuhanW! - Added GitHubBanner component.
3.99.6
Patch Changes
- #3657
5868456194f
Thanks @fuunnx! - Fix optimistic updates of list's query data following a mutation usinguseUpdate
3.99.5
Patch Changes
- #3657
5868456194f
Thanks @fuunnx! - Fix optimistic updates of list's query data following a mutation usinguseUpdate
3.99.4
Patch Changes
-
#3548
8795efb04dd
Thanks @alicanerdurmaz! - fixed: wronginitialCurrent
value onuseTable
jsDoc- * @default 10 + * @default 1 ```
3.99.3
Patch Changes
-
#3548
8795efb04dd
Thanks @alicanerdurmaz! - fixed: wronginitialCurrent
value onuseTable
jsDoc- * @default 10 + * @default 1 ```
3.99.2
Patch Changes
- #3455
0405eb18e88
Thanks @yildirayunlu! - Fix error translation key onuseInfiniteList
hook.
3.99.1
Patch Changes
- #3455
0405eb18e88
Thanks @yildirayunlu! - Fix error translation key onuseInfiniteList
hook.
3.99.0
Minor Changes
-
0767d7a07a7
Thanks @yildirayunlu! - Added theuseInfiniteList
hook 🥳. This hook is a modified version of react-query'suseInfiniteQuery
used for retrieving items from a resource with pagination, sort, and filter configurations.
3.98.0
Minor Changes
-
0767d7a07a7
Thanks @yildirayunlu! - Added theuseInfiniteList
hook 🥳. This hook is a modified version of react-query'suseInfiniteQuery
used for retrieving items from a resource with pagination, sort, and filter configurations.
3.97.0
Minor Changes
-
#3442
8f2954611fa
Thanks @salihozdemir! - Added swizzle support for@pankod/refine-core
package.Swizzleable components:
Authenticated
CanAccess
ErrorPage
- Authentication Pages
Login
Logout
Register
ForgotPassword
UpdatePassword
Patch Changes
-
#3436
ea74f3a8408
Thanks @sevkioruc! - Fix useList, useCustom and useCustomMutation hooks i18n issue in the error messages. -
#3440
96d93eb2d71
Thanks @salihozdemir! - Made the auth provider'susePermissions
method optional.
3.96.0
Minor Changes
-
#3442
8f2954611fa
Thanks @salihozdemir! - Added swizzle support for@pankod/refine-core
package.Swizzleable components:
Authenticated
CanAccess
ErrorPage
- Authentication Pages
Login
Logout
Register
ForgotPassword
UpdatePassword
Patch Changes
-
#3436
ea74f3a8408
Thanks @sevkioruc! - Fix useList, useCustom and useCustomMutation hooks i18n issue in the error messages. -
#3440
96d93eb2d71
Thanks @salihozdemir! - Made the auth provider'susePermissions
method optional.
3.95.3
Patch Changes
-
#3382
6604586b030
Thanks @alicanerdurmaz! - Fixed: The link in the jsDOC of theliveMode
replaced with the correct link.- * @type [`"auto" | "manual" | "off"`](/docs/api-reference/core/interfaceReferences/#crudsorting) + * @type [`"auto" | "manual" | "off"`](/docs/api-reference/core/providers/live-provider/#livemode)
3.95.2
Patch Changes
-
#3382
6604586b030
Thanks @alicanerdurmaz! - Fixed: The link in the jsDOC of theliveMode
replaced with the correct link.- * @type [`"auto" | "manual" | "off"`](/docs/api-reference/core/interfaceReferences/#crudsorting) + * @type [`"auto" | "manual" | "off"`](/docs/api-reference/core/providers/live-provider/#livemode)
3.95.1
Patch Changes
- #3399
22b44a857a8
Thanks @yildirayunlu! - FixuseTable
hook error return type.
3.95.0
Minor Changes
22b44a857a8
Thanks @yildirayunlu! - FixuseTable
hook error return type.
3.94.2
Patch Changes
-
#3364
98a1fbec65a
Thanks @aliemir! - ChangedIResourceComponents
fromIResourceContext
to useReact.ComponentType
rather thanReact.FunctionComponent
to make it compatible with other types and interfaces. -
#3356
310ebd05990
Thanks @omeraplak! - Fixed checkError hook is not called in onError of useCustomMutation
3.94.1
Patch Changes
-
#3364
98a1fbec65a
Thanks @aliemir! - ChangedIResourceComponents
fromIResourceContext
to useReact.ComponentType
rather thanReact.FunctionComponent
to make it compatible with other types and interfaces. -
#3356
310ebd05990
Thanks @omeraplak! - Fixed checkError hook is not called in onError of useCustomMutation
3.94.0
Minor Changes
- #3335
ce6acf2b3d4
Thanks @omeraplak! - feat:useResource
hook can now also return the currentaction
3.93.0
Minor Changes
- #3335
ce6acf2b3d4
Thanks @omeraplak! - feat:useResource
hook can now also return the currentaction
3.92.0
Minor Changes
- #3324
9bfb34749bc
Thanks @aliemir! - Added the ability to pass mutation options touseMutation
hooks in mutation hooks:useCreate
(data)useUpdate
(data)useDelete
(data)useDeleteMany
(data)useUpdateMany
(data)useCreateMany
(data)useCustomMutation
(data)useLogin
(auth)useLogout
(auth)useRegister
(auth)useForgotPassword
(auth)useUpdatePassword
(auth)useForm
(form)
Patch Changes
814eb1009da
Thanks @omeraplak! - chore: re-exported@tanstack/react-query
3.91.0
Minor Changes
- #3324
9bfb34749bc
Thanks @aliemir! - Added the ability to pass mutation options touseMutation
hooks in mutation hooks:useCreate
(data)useUpdate
(data)useDelete
(data)useDeleteMany
(data)useUpdateMany
(data)useCreateMany
(data)useCustomMutation
(data)useLogin
(auth)useLogout
(auth)useRegister
(auth)useForgotPassword
(auth)useUpdatePassword
(auth)useForm
(form)
Patch Changes
814eb1009da
Thanks @omeraplak! - chore: re-exported@tanstack/react-query
3.90.6
Patch Changes
-
#3224
a47f17931a8
Thanks @leapful! - Restore filter operator after clear it by using filter dropdown -
#3220
b867497f469
Thanks @aliemir! - Updated image links inREADME.MD
with CDN
3.90.5
Patch Changes
-
#3224
a47f17931a8
Thanks @leapful! - Restore filter operator after clear it by using filter dropdown -
#3220
b867497f469
Thanks @aliemir! - Updated image links inREADME.MD
with CDN
3.90.4
Patch Changes
- #3098
a241ef3c957
Thanks @aliemir! - UpdatenotificationProvider
prop handling by converting to a custom hook to prevent hook usage errors.
3.90.3
Patch Changes
- #3098
a241ef3c957
Thanks @aliemir! - UpdatenotificationProvider
prop handling by converting to a custom hook to prevent hook usage errors.
3.90.2
Patch Changes
- #3073
38dfde0c2ec
Thanks @samelhusseini! - FixedqueryOptions
parameter ofuseShow
hook
3.90.1
Patch Changes
- #3073
38dfde0c2ec
Thanks @samelhusseini! - FixedqueryOptions
parameter ofuseShow
hook
3.90.0
Minor Changes
- #3030
d0998d66cd0
Thanks @yildirayunlu! - AddqueryOptions
params onuseShow
hook.
3.89.0
Minor Changes
- #3030
d0998d66cd0
Thanks @yildirayunlu! - AddqueryOptions
params onuseShow
hook.
3.88.4
Patch Changes
- #2975
249f9521c4
Thanks @salihozdemir! - AddedhasPagination
property touseSelect
hook for disabling pagination.
3.88.3
Patch Changes
- #2975
249f9521c4
Thanks @salihozdemir! - AddedhasPagination
property touseSelect
hook for disabling pagination.
3.88.2
Patch Changes
- #2953
e3642eafa2
Thanks @alicanerdurmaz! - FixuseLogout()
'sonSuccess
behavious according toAuthProvider
resolved-rejected
values.
3.88.1
Patch Changes
- #2953
e3642eafa2
Thanks @alicanerdurmaz! - FixuseLogout()
'sonSuccess
behavious according toAuthProvider
resolved-rejected
values.
3.88.0
Minor Changes
-
#2872
da3fc4a702
Thanks @TDP17! - Feat: Added ability to manage breadcrumb component globally via optionsUsage
<Refine options= {{ breadcrumb: false, // hide globally }} /> or ```jsx <Refine options= {{ breadcrumb: <MyCustomBreadcrumbComponent /> // custom component }} />
3.87.0
Minor Changes
-
#2872
da3fc4a702
Thanks @TDP17! - Feat: Added ability to manage breadcrumb component globally via optionsUsage
<Refine options= {{ breadcrumb: false, // hide globally }} /> or ```jsx <Refine options= {{ breadcrumb: <MyCustomBreadcrumbComponent /> // custom component }} />
3.86.2
Patch Changes
- #2839
5388a338ab
Thanks @aliemir! -useCan
hook was returning the stale value if same call is made with skipped access control.
3.86.1
Patch Changes
- #2839
5388a338ab
Thanks @aliemir! -useCan
hook was returning the stale value if same call is made with skipped access control.
3.86.0
Minor Changes
-
Only
or
was supported as a conditional filter. Nowand
andor
can be used together and nested. 🚀{ operator: "or", value: [ { operator: "and", value: [ { field: "name", operator: "eq", value: "John Doe", }, { field: "age", operator: "eq", value: 30, }, ], }, { operator: "and", value: [ { field: "name", operator: "eq", value: "JR Doe", }, { field: "age", operator: "eq", value: 1, }, ], }, ], }
3.85.0
Minor Changes
-
#2751
addff64c77
Thanks @yildirayunlu! - Onlyor
was supported as a conditional filter. Nowand
andor
can be used together and nested. 🚀{ operator: "or", value: [ { operator: "and", value: [ { field: "name", operator: "eq", value: "John Doe", }, { field: "age", operator: "eq", value: 30, }, ], }, { operator: "and", value: [ { field: "name", operator: "eq", value: "JR Doe", }, { field: "age", operator: "eq", value: 1, }, ], }, ], }
3.84.0
Minor Changes
-
Marked
getMany
,createMany
,updateMany
anddeleteMany
functions as optional and substituted withgetOne
,create
,update
anddeleteOne
respectively. Now users can choose to skip implementinggetMany
,createMany
,updateMany
anddeleteMany
functions and usegetOne
,create
,update
anddeleteOne
functions instead.Breaking Change
getMany
,createMany
,updateMany
anddeleteMany
functions are now optional and may cause type issues if used outside of the refine hooks.
3.83.0
Minor Changes
-
#2688
508045ac30
Thanks @aliemir! - MarkedgetMany
,createMany
,updateMany
anddeleteMany
functions as optional and substituted withgetOne
,create
,update
anddeleteOne
respectively. Now users can choose to skip implementinggetMany
,createMany
,updateMany
anddeleteMany
functions and usegetOne
,create
,update
anddeleteOne
functions instead.Breaking Change
getMany
,createMany
,updateMany
anddeleteMany
functions are now optional and may cause type issues if used outside of the refine hooks.
3.82.0
Minor Changes
-
Added
useSelect()
, setState handler functions are memoizedFixed when
queryOptions.enabled = true
onuseSelect()
, fetches all data. #2691
Patch Changes
- fix:
useSelect()
's overriddenonSearch
function is not calling when value is empty.
3.81.0
Minor Changes
-
#2704
e4d78052ef
Thanks @alicanerdurmaz! - AddeduseSelect()
, setState handler functions are memoizedFixed when
queryOptions.enabled = true
onuseSelect()
, fetches all data. #2691
Patch Changes
- #2705
031f67707c
Thanks @alicanerdurmaz! - fix:useSelect()
's overriddenonSearch
function is not calling when value is empty.
3.80.0
Minor Changes
-
Added infinite loading example to antd
useSelect()
useSelect()
fetchSize
prop is deprecated. From nowpagination
should be used -
Added
dataProviderName
property to resource options. Now you can define default data provider per resource.Usage
<Refine dataProvider={{ default: myProvider, second: mySecondProvider, }} resources={[ { name: "posts", options: { dataProviderName: "second", }, }, ]} />
Patch Changes
-
Add AuthProps type export
-
Mark
default
key as required for multiple data providers indataProvider
prop of<Refine />
component.
3.79.0
Minor Changes
-
#2629
bc89228e73
Thanks @bungambohlah! - Added infinite loading example to antduseSelect()
useSelect()
fetchSize
prop is deprecated. From nowpagination
should be used -
#2674
3bd6196056
Thanks @aliemir! - AddeddataProviderName
property to resource options. Now you can define default data provider per resource.Usage
<Refine dataProvider={{ default: myProvider, second: mySecondProvider, }} resources={[ { name: "posts", options: { dataProviderName: "second", }, }, ]} />
Patch Changes
-
#2666
8a562d2114
Thanks @omeraplak! - Add AuthProps type export -
#2684
38c3876af5
Thanks @aliemir! - Markdefault
key as required for multiple data providers indataProvider
prop of<Refine />
component.
3.78.0
Minor Changes
-
clientConfig
property now acceptsQueryClient
instance - #2665Usage
import { QueryClient } from "@tanstack/react-query"; const queryClient = new QueryClient(); const App: React.FC = () => ( <Refine ... options={{ reactQuery: { clientConfig: queryClient }, }} /> );
3.77.0
Minor Changes
-
#2670
f260932051
Thanks @alicanerdurmaz! -clientConfig
property now acceptsQueryClient
instance - #2665Usage
import { QueryClient } from "@tanstack/react-query"; const queryClient = new QueryClient(); const App: React.FC = () => ( <Refine ... options={{ reactQuery: { clientConfig: queryClient }, }} /> );
3.76.0
Minor Changes
-
- Added new component core and mantine support.
- Move Auth types
@pankod/refine-ui-types
to@pankod/refine-core
Patch Changes
- fix core data hooks type errors
3.75.1
Patch Changes
- #2667
6e6a9e98e5
Thanks @alicanerdurmaz! - fix core data hooks type errors
3.75.0
Minor Changes
- #2627
c5fb45d61f
Thanks @yildirayunlu! - - Added new component core and mantine support.- Move Auth types
@pankod/refine-ui-types
to@pankod/refine-core
- Move Auth types
3.74.8
Patch Changes
- add props table to useCan documentation
3.74.7
Patch Changes
- #2615
ad3947d847
Thanks @alicanerdurmaz! - add props table to useCan documentation
3.74.6
Patch Changes
- Updated
devtoolConfig
type.
3.74.5
Patch Changes
- #2505
a4dbb63c88
Thanks @salihozdemir! - UpdateddevtoolConfig
type.
3.74.4
Patch Changes
- Fixed useMenu hook is not reacting to locale change - #2598
3.74.3
Patch Changes
- #2600
3ed69bba17
Thanks @omeraplak! - Fixed useMenu hook is not reacting to locale change - #2598
3.74.2
Patch Changes
- Removed redundant type inheritance
3.74.1
Patch Changes
- #2586
d7c8b7642b
Thanks @necatiozmen! - Removed redundant type inheritance
3.74.0
Minor Changes
-
Combine action related types into a single file and derive types from it to avoid future inconsistencies.
Renamed
RedirectionTypes
type toRedirectAction
.Updated every type definition of actions to use the new
Action
type or derivations of it.
Patch Changes
-
Fixed the issue in resource routes not taking
options.route
of parent resource into account. -
Rename
reset-password
->forgot-password
on docs.
3.73.0
Minor Changes
-
Combine action related types into a single file and derive types from it to avoid future inconsistencies.
Renamed
RedirectionTypes
type toRedirectAction
.Updated every type definition of actions to use the new
Action
type or derivations of it.
Patch Changes
-
Fixed the issue in resource routes not taking
options.route
of parent resource into account. -
Rename
reset-password
->forgot-password
on docs.
3.72.1
Patch Changes
- #2568
efe99f7843
Thanks @yildirayunlu! - Renamereset-password
->forgot-password
on docs.
3.72.0
Minor Changes
-
#2486
ee4d0d112a
Thanks @aliemir! - Combine action related types into a single file and derive types from it to avoid future inconsistencies.Renamed
RedirectionTypes
type toRedirectAction
.Updated every type definition of actions to use the new
Action
type or derivations of it.
Patch Changes
- #2486
ee4d0d112a
Thanks @aliemir! - Fixed the issue in resource routes not takingoptions.route
of parent resource into account.
3.71.2
Patch Changes
-
Fix
useImport
hook requests with properly invoking requests sequentially and manage progress state. -
Removed
children
property fromuseCan
sparams.resource
since it can be inITreeMenu
type andReact.ReactNode
breaks thereact-query
s key stringify function. -
Fixed undoable mutation is called many times - #2556
3.71.1
Patch Changes
-
#2560
373cee23ba
Thanks @aliemir! - FixuseImport
hook requests with properly invoking requests sequentially and manage progress state. -
#2537
4407bf8825
Thanks @ozkalai! - Removedchildren
property fromuseCan
sparams.resource
since it can be inITreeMenu
type andReact.ReactNode
breaks thereact-query
s key stringify function. -
#2559
75b699cd6c
Thanks @omeraplak! - Fixed undoable mutation is called many times - #2556
3.71.0
Minor Changes
-
- Renamed
resetPassword
in AuthProvider toforgotPassword
- Renamed
useResetPassword
hook touseForgotPassword
- Renamed
3.70.0
Minor Changes
- #2524
27bf81bebb
Thanks @biskuvit! - - RenamedresetPassword
in AuthProvider toforgotPassword
- Renamed
useResetPassword
hook touseForgotPassword
- Renamed
3.69.9
Patch Changes
-
Add register function to
AuthContextProvider
for invalidate auth store queries. -
Fixed version of react-router to
6.3.0
3.69.8
Patch Changes
- #2501
4095a578d4
Thanks @omeraplak! - Fixed version of react-router to6.3.0
3.69.7
Patch Changes
- #2447
628a37a675
Thanks @biskuvit! - Add register function toAuthContextProvider
for invalidate auth store queries.
3.69.6
Patch Changes
- Fix import of react-query
DevtoolsOptions
interface
3.69.5
Patch Changes
- #2481
7820454ae7
Thanks @omeraplak! - Fix import of react-queryDevtoolsOptions
interface
3.69.4
Patch Changes
- Fixed default login page for headless
3.69.3
Patch Changes
- #2475
fc859677d9
Thanks @omeraplak! - Fixed default login page for headless
3.69.2
Patch Changes
- Update
useForm
anduseShow
hooks to watch forid
fromprops
and update the query with the newid
when it changes.
3.69.1
Patch Changes
- #2467
21bb649bc7
Thanks @aliemir! - UpdateuseForm
anduseShow
hooks to watch forid
fromprops
and update the query with the newid
when it changes.
3.69.0
Minor Changes
- Adding more CRUD Filter Operators
- Add
initialData
support toDashboardPage
for@pankod/refine-nextjs-router
.
3.68.0
Minor Changes
- #2456
f20a0ed621
Thanks @workatease! - Adding more CRUD Filter Operators
- #2142
dd00de215a
Thanks @ozkalai! - AddinitialData
support toDashboardPage
for@pankod/refine-nextjs-router
.
3.67.0
Minor Changes
- Updated the generation of type declarations, moved the declarations from
tsup
totsc
for a better experience withPeek Definition
andGo to Definition
features. After this change, it's expected to navigate to the source code of therefine
packages instead of thedist
directory with combined declarations.
- Removed
jose
dependency.
- Remove
decamelize
dependency fromhumanizeString
helper and replace the functionality with regExp.
Patch Changes
- Fixed the issue with the TS compiler and
useResource
hooks return type.
- Pass
dataProviderName
prop to mutations in@pankod/refine-core
'suseImport
hook.
3.66.1
Patch Changes
- #2448
f1edb19979
Thanks @aliemir! - PassdataProviderName
prop to mutations in@pankod/refine-core
'suseImport
hook.
3.66.0
Minor Changes
- #2440
0150dcd070
Thanks @aliemir! - Updated the generation of type declarations, moved the declarations fromtsup
totsc
for a better experience withPeek Definition
andGo to Definition
features. After this change, it's expected to navigate to the source code of therefine
packages instead of thedist
directory with combined declarations.
- #2439
f2faf99f25
Thanks @yildirayunlu! - Removedjose
dependency.
- #2443
2c428b3105
Thanks @ozkalai! - Removedecamelize
dependency fromhumanizeString
helper and replace the functionality with regExp.
Patch Changes
- #2440
0150dcd070
Thanks @aliemir! - Fixed the issue with the TS compiler anduseResource
hooks return type.
3.65.3
Patch Changes
- Fixed,
loginLink
andregisterLink
texts and remove unnecessary props from forms
- Fixed syncWithLocation not tracking when useTable filters were reset
3.65.2
Patch Changes
- #2435
bdf32c6cf9
Thanks @omeraplak! - Fixed syncWithLocation not tracking when useTable filters were reset
3.65.1
Patch Changes
- #2433
3ce29dda52
Thanks @biskuvit! - Fixed,loginLink
andregisterLink
texts and remove unnecessary props from forms
3.65.0
Minor Changes
-
🎉 Added
AuthPage
component to therefine
app. This page is used to login, register, forgot password and update password. Login page is default page and oldLoginPage
component is deprecated.New Auth Hooks
📌 Added
useRegister
hook. This hook is used to register new user.useRegister
falls into register function ofAuthProvider
.📌 Added
useForgotPassword
hook. This hook is used to forgot password.useForgotPassword
falls intoforgotPassword
function ofAuthProvider
.📌 Added
useUpdatePassword
hook. This hook is used to update password.useUpdatePassword
falls intoupdatePassword
function ofAuthProvider
.- <LoginPage> + <AuthPage>
New
AuthPage
props:interface IAuthPageProps extends IAuthCommonProps { type?: "login" | "register" | "forgotPassword" | "updatePassword"; } interface IAuthCommonProps { submitButton?: React.ReactNode; registerLink?: React.ReactNode; loginLink?: React.ReactNode; forgotPasswordLink?: React.ReactNode; updatePasswordLink?: React.ReactNode; backLink?: React.ReactNode; providers?: IProvider[]; } interface IProvider { name: string; icon?: React.ReactNode; label?: string; }
Patch Changes
-
Fixed
<AuthPage>
by adding missing props to "login" and "register" pages.Fixed
<Refine>
componentLoginPage
property.
3.64.2
Patch Changes
-
#2415
f7c98f0ef9
Thanks @biskuvit! - Fixed<AuthPage>
by adding missing props to "login" and "register" pages.Fixed
<Refine>
componentLoginPage
property.
3.64.1
Patch Changes
-
#2299
a02cb9e8ef
Thanks @biskuvit! - 🎉 AddedAuthPage
to therefine
app. This page is used to login, register, forgot password and update password. Login page is default page and oldLoginPage
component is deprecated.New Auth Hooks
📌 Added
useRegister
hook. This hook is used to register new user.useRegister
falls into register function ofAuthProvider
.📌 Added
useForgotPassword
hook. This hook is used to forgot password.useForgotPassword
falls intoforgotPassword
function ofAuthProvider
.📌 Added
useUpdatePassword
hook. This hook is used to update password.useUpdatePassword
falls intoupdatePassword
function ofAuthProvider
.- <LoginPage> + <AuthPage>
New
AuthPage
props:interface IAuthPageProps extends IAuthCommonProps { type?: "login" | "register" | "forgotPassword" | "updatePassword"; } interface IAuthCommonProps { registerLink?: React.ReactNode; loginLink?: React.ReactNode; forgotPasswordLink?: React.ReactNode; updatePasswordLink?: React.ReactNode; backLink?: React.ReactNode; providers?: IProvider[]; } interface IProvider { name: string; icon?: React.ReactNode; label?: string; }
Add
AuthPage
as a default page to Routers📌 Added
AuthPage
to therefine-nextjs-router
. Default page isAuthPage
.📌 Added
AuthPage
to therefine-react-location
. Default page isAuthPage
.📌 Added
AuthPage
to therefine-react-router-v6
. Default page isAuthPage
.📌 Added
AuthPage
to therefine-remix-router
. Default page isAuthPage
.
3.64.0
Minor Changes
-
Add an option to hide
resources
from theSider
menu<Refine ... ... resources={[ { name: "posts", list: PostList, options: { hide: true, }, }, ]} />
-
Add object path syntax support for the useSelect hook
useSelect({ resource: "posts", optionLabel: "nested.title", optionLabel: "nested.id", });
3.63.0
Minor Changes
-
#2391
e530670c2d
Thanks @omeraplak! - Add an option to hideresources
from theSider
menu<Refine ... ... resources={[ { name: "posts", list: PostList, options: { hide: true, }, }, ]} />
-
#2395
3019fae7a0
Thanks @omeraplak! - Add object path syntax support for the useSelect hookuseSelect({ resource: "posts", optionLabel: "nested.title", optionLabel: "nested.id", });
3.62.1
Patch Changes
- fix redirectPage return value #2377
3.62.0
Minor Changes
-
Added a new
<Refine>
component property:options
.Previously, the options were passed as a property to the
<Refine>
component. Now, the options are passed to the<Refine>
viaoptions
property like this:<Refine - mutationMode="undoable" - undoableTimeout={5000} - warnWhenUnsavedChanges - syncWithLocation - liveMode="off" - disableTelemetry={false} + options={{ + mutationMode: "undoable", + undoableTimeout: 5000, + warnWhenUnsavedChanges: true, + syncWithLocation: true, + liveMode: "off", + disableTelemetry: false, + }} />
-
Added a new redirect feature. It is now possible to set default redirects.
By default, when a form is submitted, it will redirect to the "list" page of the current resource. You can change this behavior by setting the
redirect
parameter like this:<Refine ... options={{ redirect: { afterCreate: "show", afterClone: "edit", afterEdit: false }, }} />
Patch Changes
-
lodash
moved to "dependencies" for CommonJS builds
-
- Fixed
lodash-es
usage for ESM builds
- Fixed
3.61.1
Patch Changes
- #2377
c62fb114b1
Thanks @alicanerdurmaz! - fix redirectPage return value #2377
3.61.0
Minor Changes
-
Added a new
<Refine>
component property:options
.Previously, the options were passed as a property to the
<Refine>
component. Now, the options are passed to the<Refine>
viaoptions
property like this:<Refine - mutationMode="undoable" - undoableTimeout={5000} - warnWhenUnsavedChanges - syncWithLocation - liveMode="off" - disableTelemetry={false} + options={{ + mutationMode: "undoable", + undoableTimeout: 5000, + warnWhenUnsavedChanges: true, + syncWithLocation: true, + liveMode: "off", + disableTelemetry: false, + }} />
-
Added a new redirect feature. It is now possible to set default redirects.
By default, when a form is submitted, it will redirect to the "list" page of the current resource. You can change this behavior by setting the
redirect
parameter like this:<Refine ... options={{ redirect: { afterCreate: "show", afterClone: "edit", afterEdit: false }, }} />
Patch Changes
-
lodash
moved to "dependencies" for CommonJS builds
-
- Fixed
lodash-es
usage for ESM builds
- Fixed
3.60.0
Minor Changes
-
Added a new
<Refine>
component property:options
.Previously, the options were passed as a property to the
<Refine>
component. Now, the options are passed to the<Refine>
viaoptions
property like this:<Refine - mutationMode="undoable" - undoableTimeout={5000} - warnWhenUnsavedChanges - syncWithLocation - liveMode="off" - disableTelemetry={false} + options={{ + mutationMode: "undoable", + undoableTimeout: 5000, + warnWhenUnsavedChanges: true, + syncWithLocation: true, + liveMode: "off", + disableTelemetry: false, + }} />
-
Added a new redirect feature. It is now possible to set default redirects.
By default, when a form is submitted, it will redirect to the "list" page of the current resource. You can change this behavior by setting the
redirect
parameter like this:<Refine ... options={{ redirect: { afterCreate: "show", afterClone: "edit", afterEdit: false }, }} />
Patch Changes
-
lodash
moved to "dependencies" for CommonJS builds
-
- Fixed
lodash-es
usage for ESM builds
- Fixed
3.59.0
Minor Changes
-
#2352
e4d39eff33
Thanks @salihozdemir! - Added a new<Refine>
component property:options
.Previously, the options were passed as a property to the
<Refine>
component. Now, the options are passed to the<Refine>
viaoptions
property like this:<Refine - mutationMode="undoable" - undoableTimeout={5000} - warnWhenUnsavedChanges - syncWithLocation - liveMode="off" - disableTelemetry={false} + options={{ + mutationMode: "undoable", + undoableTimeout: 5000, + warnWhenUnsavedChanges: true, + syncWithLocation: true, + liveMode: "off", + disableTelemetry: false, + }} />
-
#2361
95e1a17cd1
Thanks @salihozdemir! - Added a new redirect feature. It is now possible to set default redirects.By default, when a form is submitted, it will redirect to the "list" page of the current resource. You can change this behavior by setting the
redirect
parameter like this:<Refine ... options={{ redirect: { afterCreate: "show", afterClone: "edit", afterEdit: false }, }} />
Patch Changes
- #2366
de87f13dad
Thanks @omeraplak! - -lodash
moved to "dependencies" for CommonJS builds
- #2366
de87f13dad
Thanks @omeraplak! - - Fixedlodash-es
usage for ESM builds
3.58.5
Patch Changes
lodash
moved to dependencies.
3.58.4
Patch Changes
- #2350
f8e5d99598
Thanks @ozkalai! -lodash
moved to dependencies.
3.58.3
Patch Changes
- Fixed react-query devtools was consuming high CPU
3.58.2
Patch Changes
- #2333
2f0255ec95
Thanks @omeraplak! - Fixed react-query devtools was consuming high CPU
3.58.1
Patch Changes
AuthProvider
'slogin
method can now return a value forRemix
's authentication flow
3.58.0
Minor Changes
- Updated
reactQueryDevtoolConfig
prop type and addedfalse
option to disable the React Query Devtools.
3.57.0
Minor Changes
- #2311
645391a3d9
Thanks @aliemir! - UpdatedreactQueryDevtoolConfig
prop type and addedfalse
option to disable the React Query Devtools.
3.56.11
Patch Changes
- Fixed user-defined URL query parameters being deleted when using
syncWithLocation
3.56.10
Patch Changes
- Added QueryFunctionContext's values to
queryContext
inmetaData
.
3.56.9
Patch Changes
- #2294
c67a232861
Thanks @salihozdemir! - Added QueryFunctionContext's values toqueryContext
inmetaData
.
3.56.8
Patch Changes
- Fixed
@tanstack/react-query-devtools
dependency
3.56.7
Patch Changes
754da29b34
Thanks @omeraplak! - Fixed@tanstack/react-query-devtools
dependency
3.56.6
Patch Changes
- Upgraded
react-query
version to 4.
- Updated the return value of
useGetIdentity
. When thegetUserIdentity
function is not defined, it returns{}
instead ofundefined
.
3.56.5
Patch Changes
- #2260
a97ec592df
Thanks @salihozdemir! - Upgradedreact-query
version to 4.
- #2260
a97ec592df
Thanks @salihozdemir! - Updated the return value ofuseGetIdentity
. When thegetUserIdentity
function is not defined, it returns{}
instead ofundefined
.
3.56.4
Patch Changes
-
Fix useCan hook params keys.
Since
react-query
stringifies the query keys, it will throw an error for a circular dependency if we includeReact.ReactNode
elements inside the keys. The feature in #2220(https://github.com/refinedev/refine/issues/2220) includes such change and to fix this, we need to removeicon
property in theresource
-
Updated
<Refine/>
component with memoization to prevent unwanted effects.- Fixed the issue:
react-query
'squeryClient
was re-initializing on every render which was causing it to reset the query cache. - Memoized the
notificationProvider
prop to prevent unnecessary re-renders. - Memoized the
resources
prop to prevent unnecessary transform calls on every render.
- Fixed the issue:
-
- Fixed Browser back navigation is broken with
syncWithLocation
and paginateduseTable
- #2276 - Updated
push
andreplace
args ofuseNavigation
- Fixed Browser back navigation is broken with
3.56.3
Patch Changes
-
#2278
8b11f8a267
Thanks @biskuvit! - Fix useCan hook params keys.Since
react-query
stringifies the query keys, it will throw an error for a circular dependency if we includeReact.ReactNode
elements inside the keys. The feature in #2220(https://github.com/refinedev/refine/issues/2220) includes such change and to fix this, we need to removeicon
property in theresource
-
#2280
e22cac6d8b
Thanks @aliemir! - Updated<Refine/>
component with memoization to prevent unwanted effects.- Fixed the issue:
react-query
'squeryClient
was re-initializing on every render which was causing it to reset the query cache. - Memoized the
notificationProvider
prop to prevent unnecessary re-renders. - Memoized the
resources
prop to prevent unnecessary transform calls on every render.
- Fixed the issue:
- #2279
786fb08b8b
Thanks @omeraplak! - - Fixed Browser back navigation is broken withsyncWithLocation
and paginateduseTable
- #2276- Updated
push
andreplace
args ofuseNavigation
- Updated
3.56.2
Patch Changes
- Fixed invalidation of authentication caches every time
checkAuth
is run
3.56.1
Patch Changes
- #2271
40b84d35a3
Thanks @omeraplak! - Fixed invalidation of authentication caches every timecheckAuth
is run
3.56.0
Minor Changes
- Add React@18 support 🚀
3.55.0
Minor Changes
- #1718
b38620d842
Thanks @omeraplak! - Add React@18 support 🚀
3.54.0
Minor Changes
-
Added config parameter to useCustomMutationHook to send headers.
const apiUrl = useApiUrl(); const { mutate } = useCustomMutation<ICategory>(); mutate({ url: `${API_URL}/categories`, method: "post", values: { title: "New Category", }, config: { headers: { Authorization: "Bearer ****", }, }, });
3.53.0
Minor Changes
-
#2245
e949df7f1c
Thanks @yildirayunlu! - Added config parameter to useCustomMutationHook to send headers.const apiUrl = useApiUrl(); const { mutate } = useCustomMutation<ICategory>(); mutate({ url: `${API_URL}/categories`, method: "post", values: { title: "New Category", }, config: { headers: { Authorization: "Bearer ****", }, }, });
3.52.0
Minor Changes
-
Added
useCustomMutation
hook for custom mutation requests.import { useCustomMutation } from "@pankod/refine-core"; const { mutation } = useCustomMutation(); mutation({ url: "https://api.example.com/users", method: "POST", values: { name: "John Doe", email: "johndoe@mail.com", }, });
3.51.0
Minor Changes
-
#2229
878e9a105e
Thanks @yildirayunlu! - AddeduseCustomMutation
hook for custom mutation requests.import { useCustomMutation } from "@pankod/refine-core"; const { mutation } = useCustomMutation(); mutation({ url: "https://api.example.com/users", method: "POST", values: { name: "John Doe", email: "johndoe@mail.com", }, });
3.50.0
Minor Changes
-
Pass the full
resource
to theaccessControlProvider
can method. This will enable Attribute Based Access Control (ABAC), for example granting permissions based on the value of a field in the resource object.const App: React.FC = () => { <Refine // other providers and props accessControlProvider={{ can: async ({ resource, action, params }) => { if (resource === "posts" && action === "edit") { return Promise.resolve({ can: false, reason: "Unauthorized", }); } // or you can access directly *resource object // const resourceName = params?.resource?.name; // const anyUsefulOption = params?.resource?.options?.yourUsefulOption; // if (resourceName === "posts" && anyUsefulOption === true && action === "edit") { // return Promise.resolve({ // can: false, // reason: "Unauthorized", // }); // } return Promise.resolve({ can: true }); }, }} />; };
3.49.0
Minor Changes
-
#2222
43e92b9785
Thanks @omeraplak! - Pass the fullresource
to theaccessControlProvider
can method. This will enable Attribute Based Access Control (ABAC), for example granting permissions based on the value of a field in the resource object.const App: React.FC = () => { <Refine // other providers and props accessControlProvider={{ can: async ({ resource, action, params }) => { if (resource === "posts" && action === "edit") { return Promise.resolve({ can: false, reason: "Unauthorized", }); } // or you can access directly *resource object // const resourceName = params?.resource?.name; // const anyUsefulOption = params?.resource?.options?.yourUsefulOption; // if (resourceName === "posts" && anyUsefulOption === true && action === "edit") { // return Promise.resolve({ // can: false, // reason: "Unauthorized", // }); // } return Promise.resolve({ can: true }); }, }} />; };
3.48.0
Minor Changes
-
All of the refine packages have dependencies on the
@pankod/refine-core
package. So far we have managed these dependencies withpeerDependencies
+dependencies
but this causes issues like #2183. (having more than one @pankod/refine-core version in node_modules and creating different instances)Managing as
peerDependencies
+devDependencies
seems like the best way for now to avoid such issues.
Patch Changes
- Fix adding the current path to the
to
parameter when redirecting to the login page afterlogout
- #2211
3.47.0
Minor Changes
-
#2217
b4aae00f77
Thanks @omeraplak! - All of the refine packages have dependencies on the@pankod/refine-core
package. So far we have managed these dependencies withpeerDependencies
+dependencies
but this causes issues like #2183. (having more than one @pankod/refine-core version in node_modules and creating different instances)Managing as
peerDependencies
+devDependencies
seems like the best way for now to avoid such issues.
3.46.0
Minor Changes
-
Update notification props in data hooks of
@pankod/refine-core
to cover dynamic notifications.Now users will be able to show notifications according to the API response by assigning a function which returns
OpenNotificationParams
instead of anOpenNotificationParams
object.Example
{ const { mutate } = useCreate({ /* ... */ successNotification: (data, values, resource) => ({ message: data?.message ?? "Success!", type: "success", description: data?.description; }), errorNotification: (error, values, resource) => ({ message: error?.message ?? error?.code ?? "Error!", type: "error", description: error?.reason; }) /* ... */ }); }
3.45.0
Minor Changes
-
#2177
5a805c789a
Thanks @aliemir! - Update notification props in data hooks of@pankod/refine-core
to cover dynamic notifications.Now users will be able to show notifications according to the API response by assigning a function which returns
OpenNotificationParams
instead of anOpenNotificationParams
object.Example
{ const { mutate } = useCreate({ /* ... */ successNotification: (data, values, resource) => ({ message: data?.message ?? "Success!", type: "success", description: data?.description; }), errorNotification: (error, values, resource) => ({ message: error?.message ?? error?.code ?? "Error!", type: "error", description: error?.reason; }) /* ... */ }); }
3.44.0
Minor Changes
- Added ability to compare
or
filters. This was a missing feature on filters inuseTable
hook. With this feature, we will preventor
filter bugs (Resolves #2124) such as re-adding the same filters and being unable to modifyor
filter. To removeor
filter withmerge
behavior, you should pass an empty object asvalue
.
Patch Changes
-
Fix redirection after submit in
useForm
. Bothedit
andcreate
will redirect tolist
(it wasedit
previously)Resolves #2123
3.43.1
Patch Changes
-
#2172
c33d13eb15
Thanks @aliemir! - Fix redirection after submit inuseForm
. Bothedit
andcreate
will redirect tolist
(it wasedit
previously)Resolves #2123
3.43.0
Minor Changes
- #2164
4d5f6b25e5
Thanks @aliemir! - Added ability to compareor
filters. This was a missing feature on filters inuseTable
hook. With this feature, we will preventor
filter bugs (Resolves #2124) such as re-adding the same filters and being unable to modifyor
filter. To removeor
filter withmerge
behavior, you should pass an empty object asvalue
.
3.42.0
Minor Changes
-
@pankod/refine-core
- Added extra params to
useSubscription
anduseResourceSubscription
useOne
,useMany
anduseList
passed extra params to own subscription hook.
@pankod/refine-hasura
- Added
liveProvider
.
To see an example of how to use it, check out
here
.@pankod/refine-nhost
- Added
liveProvider
.
To see an example of how to use it, check out
here
.@pankod/refine-graphql
- Added
liveProvider
.
- Added extra params to
Patch Changes
- Fixed it to appear in menu items even if
List
is not given in resources #2147
3.41.1
Patch Changes
- #2151
d4c7377361
Thanks @omeraplak! - Fixed it to appear in menu items even ifList
is not given in resources #2147
3.41.0
Minor Changes
-
#2120
2aa7aace52
Thanks @salihozdemir! - ###@pankod/refine-core
- Added extra params to
useSubscription
anduseResourceSubscription
useOne
,useMany
anduseList
passed extra params to own subscription hook.
@pankod/refine-hasura
- Added
liveProvider
.
To see an example of how to use it, check out
here
.@pankod/refine-nhost
- Added
liveProvider
.
To see an example of how to use it, check out
here
.@pankod/refine-graphql
- Added
liveProvider
.
- Added extra params to
3.40.0
Minor Changes
-
Add a simple and transparent telemetry module to collect usage statistics defined within a very limited scope.
Tracking is completely safe and anonymous. It does not contain any personally identifiable information and does not use cookies. Participation is optional and users can opt out easily.
For more information, you can check the documentation.
3.39.0
Minor Changes
-
#2078
868bb943ad
Thanks @yildirayunlu! - Add a simple and transparent telemetry module to collect usage statistics defined within a very limited scope.Tracking is completely safe and anonymous. It does not contain any personally identifiable information and does not use cookies. Participation is optional and users can opt out easily.
For more information, you can check the documentation.
3.38.2
Patch Changes
-
- The redirect method that return from
useForm
updated to be avaiable for passingid
.
const { redirect } = useForm(); redirect("edit", id);
- Returning API response to
onFinish
function for successful mutations
- The redirect method that return from
3.38.1
Patch Changes
-
#2089
ee8e8bbd6c
Thanks @ozkalai! - - The redirect method that return fromuseForm
updated to be avaiable for passingid
.const { redirect } = useForm(); redirect("edit", id);
- Returning API response to
onFinish
function for successful mutations
- Returning API response to
3.38.0
Minor Changes
-
useLog
is converted to useQuery mutation.// before const { log } = useLog(); log({ resource: 'posts', action: 'create', data: { id: 1 } });
// after const { log } = useLog(); const { mutation } = log; mutation({ resource: 'posts', action: 'create', data: { id: 1 } });
Patch Changes
- Fixed
useBreadcrumb
hook throwsconsole.warn
even if i18nProvider is not used - #2103
3.37.0
Minor Changes
-
#2049
98966b586f
Thanks @yildirayunlu! -useLog
is converted to useQuery mutation.// before const { log } = useLog(); log({ resource: 'posts', action: 'create', data: { id: 1 } });
// after const { log } = useLog(); const { mutation } = log; mutation({ resource: 'posts', action: 'create', data: { id: 1 } });
Patch Changes
- #2104
9d77c63a92
Thanks @omeraplak! - FixeduseBreadcrumb
hook throwsconsole.warn
even if i18nProvider is not used - #2103
3.36.0
Minor Changes
-
Ability to disable server-side pagination on
useTable
anduseList
hooks.Implementation
Added
hasPagination
property touseTable
to enable/disable pagination. UpdateduseList
config with no pagination option. SethasPagination
tofalse
to disable pagination.useTable
hook uses theuseList
hook under the hood and propagates thehasPagination
property to it. Also setting pagination related return values toundefined
for better type check on the user side.Use Cases
In some data providers, some of the resources might not support pagination which was not supported prior to these changes. To handle the pagination on the client-side or to disable completely, users can set
hasPagination
tofalse
.
Patch Changes
-
Added
actions
translate support for CRUD operations (list
,create
,edit
,show
) in theuseBreadcrumb
useBreadcrumb
hook.#️⃣ First, We need to add the
actions
key to the translation file."actions": { "list": "List", "create": "Create", "edit": "Edit", "show": "Show" },
#️⃣ If you don't provide the
actions
key,useBreadcrumb
will try to find thebuttons
key in thetranslation
file for backward compatibility."buttons": { "list": "List", "create": "Create", "edit": "Edit", "show": "Show" },
🎉 You can check the code part of this pull request to see how it works here👇🏼
const key = `actions.${action}`; const actionLabel = translate(key); if (actionLabel === key) { console.warn( `Breadcrumb missing translate key for the "${action}" action. Please add "actions.${action}" key to your translation file. For more information, see https://refine.dev/docs/core/hooks/useBreadcrumb/#i18n-support`, ); breadcrumbs.push({ label: translate(`buttons.${action}`, humanizeString(action)), }); } else { breadcrumbs.push({ label: translate(key, humanizeString(action)), }); }
3.35.0
Minor Changes
-
#2050
635cfe9fdb
Thanks @ozkalai! - Ability to disable server-side pagination onuseTable
anduseList
hooks.Implementation
Added
hasPagination
property touseTable
to enable/disable pagination. UpdateduseList
config with no pagination option. SethasPagination
tofalse
to disable pagination.useTable
hook uses theuseList
hook under the hood and propagates thehasPagination
property to it. Also setting pagination related return values toundefined
for better type check on the user side.Use Cases
In some data providers, some of the resources might not support pagination which was not supported prior to these changes. To handle the pagination on the client-side or to disable completely, users can set
hasPagination
tofalse
.
Patch Changes
-
#2069
ecde34a9b3
Thanks @biskuvit! - Addedactions
translate support for CRUD operations (list
,create
,edit
,show
) in theuseBreadcrumb
useBreadcrumb
hook.#️⃣ First, We need to add the
actions
key to the translation file."actions": { "list": "List", "create": "Create", "edit": "Edit", "show": "Show" },
#️⃣ If you don't provide the
actions
key,useBreadcrumb
will try to find thebuttons
key in thetranslation
file for backward compatibility."buttons": { "list": "List", "create": "Create", "edit": "Edit", "show": "Show" },
🎉 You can check the code part of this pull request to see how it works here👇🏼
const key = `actions.${action}`; const actionLabel = translate(key); if (actionLabel === key) { console.warn( `Breadcrumb missing translate key for the "${action}" action. Please add "actions.${action}" key to your translation file. For more information, see https://refine.dev/docs/core/hooks/useBreadcrumb/#i18n-support`, ); breadcrumbs.push({ label: translate(`buttons.${action}`, humanizeString(action)), }); } else { breadcrumbs.push({ label: translate(key, humanizeString(action)), }); }
3.34.2
Patch Changes
- Fixed
useImport
onFinish
twice call bug.
3.34.1
Patch Changes
- #2047
0338ce9d6b
Thanks @salihozdemir! - FixeduseImport
onFinish
twice call bug.
3.34.0
Minor Changes
- Added i18n support for resource names on
useBreadcrumb
hook.
- Export
RefineProps
andResourceProps
type.
Patch Changes
- We have fixed texts with translations of default login pages in Material UI and Headless.
3.33.0
Minor Changes
- #2030
d96ba1e9c8
Thanks @biskuvit! - Added i18n support for resource names onuseBreadcrumb
hook.
- #1922
12f08ae6a3
Thanks @yildirayunlu! - ExportRefineProps
andResourceProps
type.
Patch Changes
- #2029
b257d87fef
Thanks @ozkalai! - We have fixed texts with translations of default login pages in Material UI and Headless.
3.32.0
Minor Changes
- Add
useMenu
hook to@pankod/refine-core
Patch Changes
- Add custom route support to
defaultOpenKeys
inuseMenu
- Handle the
undefined
case at audit-log logger in data hooks.
- Remove dashboard item in
useMenu
hook
3.31.0
Minor Changes
498c425a0e
Thanks @omeraplak! - AdduseMenu
hook to@pankod/refine-core
Patch Changes
498c425a0e
Thanks @omeraplak! - Add custom route support todefaultOpenKeys
inuseMenu
498c425a0e
Thanks @omeraplak! - Handle theundefined
case at audit-log logger in data hooks.
- #2009
5b893a9bff
Thanks @aliemir! - Remove dashboard item inuseMenu
hook
3.30.0
Minor Changes
- Add
useMenu
hook to@pankod/refine-core
Patch Changes
- Add custom route support to
defaultOpenKeys
inuseMenu
- Handle the
undefined
case at audit-log logger in data hooks.
3.29.2
Patch Changes
- Fix hook-inside-hook call in
notificationProvider
setup at<Refine/>
3.29.1
Patch Changes
- #1973
206540971b
Thanks @aliemir! - Fix hook-inside-hook call innotificationProvider
setup at<Refine/>
3.29.0
Minor Changes
- Updated
notificationProvider
prop in theRefine
wrapper component to be able to lazily initialized.
3.28.0
Minor Changes
- Updated
notificationProvider
prop in theRefine
wrapper component to be able to lazily initialized.
3.27.0
Minor Changes
- Updated
notificationProvider
prop in theRefine
wrapper component to be able to lazily initialized.
3.26.0
Minor Changes
- #1896
2ba2a96fd2
Thanks @aliemir! - UpdatednotificationProvider
prop in theRefine
wrapper component to be able to lazily initialized.
3.23.2
Patch Changes
-
#1873
2deb19babf
Thanks @aliemir! - Removed dummy default values from internal contexts. Updated contexts:- Auth
- Access Control
- Notification
- Translation (i18n)
- unsavedWarn
BREAKING:
useGetLocale
hook now can returnundefined
instead of a fallback value ofen
in cases ofi18nProvider
beingundefined
.
3.23.1
Patch Changes
3281378b11
Thanks @rassie! - Fix: Don't "humanize" labels in breadcrumbs
3.23.0
Minor Changes
- #1843
31850119e0
Thanks @salihozdemir! - AdduseBreadcrumb
hook andBreadrumb
component for@pankod/refine-antd
package