@refinedev/core 4.54.1 → 4.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/dist/components/index.d.cts +1 -0
  3. package/dist/components/index.d.cts.map +1 -1
  4. package/dist/components/index.d.mts +1 -0
  5. package/dist/components/index.d.mts.map +1 -0
  6. package/dist/components/index.d.ts +1 -0
  7. package/dist/components/index.d.ts.map +1 -1
  8. package/dist/components/link/index.d.cts +20 -0
  9. package/dist/components/link/index.d.cts.map +1 -0
  10. package/dist/components/link/index.d.mts +20 -0
  11. package/dist/components/link/index.d.mts.map +20 -0
  12. package/dist/components/link/index.d.ts +20 -0
  13. package/dist/components/link/index.d.ts.map +1 -0
  14. package/dist/contexts/notification/types.d.cts +2 -2
  15. package/dist/contexts/notification/types.d.cts.map +1 -1
  16. package/dist/contexts/notification/types.d.mts +2 -2
  17. package/dist/contexts/notification/types.d.mts.map +2 -2
  18. package/dist/contexts/notification/types.d.ts +2 -2
  19. package/dist/contexts/notification/types.d.ts.map +1 -1
  20. package/dist/hooks/menu/useMenu.d.cts +1 -1
  21. package/dist/hooks/menu/useMenu.d.cts.map +1 -1
  22. package/dist/hooks/menu/useMenu.d.mts +1 -1
  23. package/dist/hooks/menu/useMenu.d.mts.map +1 -1
  24. package/dist/hooks/menu/useMenu.d.ts +1 -1
  25. package/dist/hooks/menu/useMenu.d.ts.map +1 -1
  26. package/dist/hooks/navigation/index.d.cts +1 -1
  27. package/dist/hooks/navigation/index.d.mts +1 -1
  28. package/dist/hooks/navigation/index.d.mts.map +1 -1
  29. package/dist/hooks/navigation/index.d.ts +1 -1
  30. package/dist/hooks/router/use-link/index.d.cts +4 -5
  31. package/dist/hooks/router/use-link/index.d.cts.map +1 -1
  32. package/dist/hooks/router/use-link/index.d.mts +4 -5
  33. package/dist/hooks/router/use-link/index.d.mts.map +4 -5
  34. package/dist/hooks/router/use-link/index.d.ts +4 -5
  35. package/dist/hooks/router/use-link/index.d.ts.map +1 -1
  36. package/dist/hooks/useTable/index.d.cts.map +1 -1
  37. package/dist/hooks/useTable/index.d.ts.map +1 -1
  38. package/dist/index.cjs +10 -10
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.mjs +10 -10
  41. package/dist/index.mjs.map +1 -1
  42. package/package.json +1 -1
  43. package/src/components/index.ts +1 -0
  44. package/src/components/link/index.tsx +74 -0
  45. package/src/contexts/notification/types.ts +2 -2
  46. package/src/hooks/menu/useMenu.tsx +11 -7
  47. package/src/hooks/navigation/index.ts +1 -1
  48. package/src/hooks/router/use-link/index.tsx +2 -14
  49. package/src/hooks/useTable/index.ts +47 -31
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@refinedev/core",
3
- "version": "4.54.1",
3
+ "version": "4.55.0",
4
4
  "private": false,
5
5
  "description": "refine is a React-based framework for building internal tools, rapidly. It ships with Ant Design System, an enterprise-level UI toolkit.",
6
6
  "repository": {
@@ -8,3 +8,4 @@ export { RouteChangeHandler } from "./routeChangeHandler";
8
8
  export { CanAccess, CanAccessProps } from "./canAccess";
9
9
  export { GitHubBanner } from "./gh-banner";
10
10
  export { AutoSaveIndicator, AutoSaveIndicatorProps } from "./autoSaveIndicator";
11
+ export { Link, LinkProps } from "./link";
@@ -0,0 +1,74 @@
1
+ import React, { type Ref, forwardRef, useContext } from "react";
2
+ import { useGo } from "@hooks/router";
3
+ import { RouterContext } from "@contexts/router";
4
+ import type { GoConfigWithResource } from "../../hooks/router/use-go";
5
+ import warnOnce from "warn-once";
6
+
7
+ type LinkPropsWithGo = {
8
+ go: Omit<GoConfigWithResource, "type">;
9
+ };
10
+
11
+ type LinkPropsWithTo = {
12
+ to: string;
13
+ };
14
+
15
+ export type LinkProps<TProps = {}> = React.PropsWithChildren<
16
+ (LinkPropsWithGo | LinkPropsWithTo) &
17
+ React.AnchorHTMLAttributes<HTMLAnchorElement> &
18
+ TProps
19
+ >;
20
+
21
+ /**
22
+ * @param to The path to navigate to.
23
+ * @param go The useGo.go params to navigate to. If `to` provided, this will be ignored.
24
+ * @returns routerProvider.Link if it is provided, otherwise an anchor tag.
25
+ */
26
+ const LinkComponent = <TProps = {}>(
27
+ props: LinkProps<TProps>,
28
+ ref: Ref<HTMLAnchorElement>,
29
+ ) => {
30
+ const routerContext = useContext(RouterContext);
31
+ const LinkFromContext = routerContext?.Link;
32
+
33
+ const goFunction = useGo();
34
+
35
+ let resolvedTo = "";
36
+ if ("to" in props) {
37
+ resolvedTo = props.to;
38
+ }
39
+ if ("go" in props) {
40
+ if (!routerContext?.go) {
41
+ warnOnce(
42
+ true,
43
+ "[Link]: `routerProvider` is not found. To use `go`, Please make sure that you have provided the `routerProvider` for `<Refine />` https://refine.dev/docs/routing/router-provider/ \n",
44
+ );
45
+ }
46
+ resolvedTo = goFunction({ ...props.go, type: "path" }) as string;
47
+ }
48
+
49
+ if (LinkFromContext) {
50
+ return (
51
+ <LinkFromContext
52
+ ref={ref}
53
+ {...props}
54
+ to={resolvedTo}
55
+ // This is a workaround to avoid passing `go` to the Link component.
56
+ go={undefined}
57
+ />
58
+ );
59
+ }
60
+ return (
61
+ <a
62
+ ref={ref}
63
+ href={resolvedTo}
64
+ {...props}
65
+ // This is a workaround to avoid passing `go` and `to` to the anchor tag.
66
+ to={undefined}
67
+ go={undefined}
68
+ />
69
+ );
70
+ };
71
+
72
+ export const Link = forwardRef(LinkComponent) as <T = {}>(
73
+ props: LinkProps<T> & { ref?: Ref<HTMLAnchorElement> },
74
+ ) => ReturnType<typeof LinkComponent>;
@@ -15,7 +15,7 @@ export type SuccessErrorNotification<
15
15
  data?: TData,
16
16
  values?: TVariables,
17
17
  resource?: string,
18
- ) => OpenNotificationParams | false);
18
+ ) => OpenNotificationParams | false | undefined);
19
19
  /**
20
20
  * Error notification configuration to be displayed when the mutation fails.
21
21
  * @default '"There was an error creating resource (status code: `statusCode`)" or "Error when updating resource (status code: statusCode)"'
@@ -27,7 +27,7 @@ export type SuccessErrorNotification<
27
27
  error?: TError,
28
28
  values?: TVariables,
29
29
  resource?: string,
30
- ) => OpenNotificationParams | false);
30
+ ) => OpenNotificationParams | false | undefined);
31
31
  };
32
32
 
33
33
  export type OpenNotificationParams = {
@@ -23,12 +23,14 @@ export type UseMenuProps = {
23
23
  hideOnMissingParameter?: boolean;
24
24
  };
25
25
 
26
- export type TreeMenuItem = FlatTreeItem & {
27
- route?: string;
28
- icon?: React.ReactNode;
29
- label?: string;
30
- children: TreeMenuItem[];
31
- };
26
+ export type TreeMenuItem =
27
+ // Omitted because `label` and `route` are deprecated in `resource` but not in `menuItems`. These are populated in `prepareItem` for ease of use.
28
+ Omit<FlatTreeItem, "label" | "route" | "children"> & {
29
+ route?: string;
30
+ icon?: React.ReactNode;
31
+ label?: string;
32
+ children: TreeMenuItem[];
33
+ };
32
34
 
33
35
  const getCleanPath = (pathname: string) => {
34
36
  return pathname
@@ -86,7 +88,9 @@ export const useMenu = (
86
88
 
87
89
  const prepareItem = React.useCallback(
88
90
  (item: FlatTreeItem): TreeMenuItem | undefined => {
89
- if (item?.meta?.hide ?? item?.options?.hide) return undefined;
91
+ if (pickNotDeprecated(item?.meta?.hide, item?.options?.hide)) {
92
+ return undefined;
93
+ }
90
94
  if (!item?.list && item.children.length === 0) return undefined;
91
95
 
92
96
  const composed = item.list
@@ -13,7 +13,7 @@ import type { IResourceItem } from "../../contexts/resource/types";
13
13
  export type HistoryType = "push" | "replace";
14
14
 
15
15
  /**
16
- * `refine` uses {@link https://reactrouter.com/en/hooks/use-navigate `React Router`} and comes with all redirects out of the box.
16
+ * `refine` uses {@link https://reactrouter.com/en/main/hooks/use-navigate#usenavigate `React Router`} and comes with all redirects out of the box.
17
17
  * It allows you to manage your routing operations in refine.
18
18
  * Using this hook, you can manage all the routing operations of your application very easily.
19
19
  *
@@ -1,17 +1,5 @@
1
- import { RouterContext } from "@contexts/router";
2
- import React, { useContext } from "react";
1
+ import { Link } from "../../../components/link";
3
2
 
4
3
  export const useLink = () => {
5
- const routerContext = useContext(RouterContext);
6
-
7
- if (routerContext?.Link) {
8
- return routerContext.Link;
9
- }
10
-
11
- const FallbackLink: Required<typeof routerContext>["Link"] = ({
12
- to,
13
- ...rest
14
- }) => <a href={to} {...rest} />;
15
-
16
- return FallbackLink;
4
+ return Link;
17
5
  };
@@ -1,4 +1,4 @@
1
- import React, { useState, useEffect } from "react";
1
+ import React, { useState, useEffect, useCallback } from "react";
2
2
 
3
3
  import type {
4
4
  QueryObserverResult,
@@ -520,40 +520,56 @@ export function useTable<
520
520
  dataProviderName,
521
521
  });
522
522
 
523
- const setFiltersAsMerge = (newFilters: CrudFilter[]) => {
524
- setFilters((prevFilters) =>
525
- unionFilters(preferredPermanentFilters, newFilters, prevFilters),
526
- );
527
- };
523
+ const setFiltersAsMerge = useCallback(
524
+ (newFilters: CrudFilter[]) => {
525
+ setFilters((prevFilters) =>
526
+ unionFilters(preferredPermanentFilters, newFilters, prevFilters),
527
+ );
528
+ },
529
+ [preferredPermanentFilters],
530
+ );
528
531
 
529
- const setFiltersAsReplace = (newFilters: CrudFilter[]) => {
530
- setFilters(unionFilters(preferredPermanentFilters, newFilters));
531
- };
532
+ const setFiltersAsReplace = useCallback(
533
+ (newFilters: CrudFilter[]) => {
534
+ setFilters(unionFilters(preferredPermanentFilters, newFilters));
535
+ },
536
+ [preferredPermanentFilters],
537
+ );
532
538
 
533
- const setFiltersWithSetter = (
534
- setter: (prevFilters: CrudFilter[]) => CrudFilter[],
535
- ) => {
536
- setFilters((prev) => unionFilters(preferredPermanentFilters, setter(prev)));
537
- };
539
+ const setFiltersWithSetter = useCallback(
540
+ (setter: (prevFilters: CrudFilter[]) => CrudFilter[]) => {
541
+ setFilters((prev) =>
542
+ unionFilters(preferredPermanentFilters, setter(prev)),
543
+ );
544
+ },
545
+ [preferredPermanentFilters],
546
+ );
538
547
 
539
- const setFiltersFn: useTableReturnType<TQueryFnData>["setFilters"] = (
540
- setterOrFilters,
541
- behavior: SetFilterBehavior = prefferedFilterBehavior,
542
- ) => {
543
- if (typeof setterOrFilters === "function") {
544
- setFiltersWithSetter(setterOrFilters);
545
- } else {
546
- if (behavior === "replace") {
547
- setFiltersAsReplace(setterOrFilters);
548
- } else {
549
- setFiltersAsMerge(setterOrFilters);
550
- }
551
- }
552
- };
548
+ const setFiltersFn: useTableReturnType<TQueryFnData>["setFilters"] =
549
+ useCallback(
550
+ (
551
+ setterOrFilters,
552
+ behavior: SetFilterBehavior = prefferedFilterBehavior,
553
+ ) => {
554
+ if (typeof setterOrFilters === "function") {
555
+ setFiltersWithSetter(setterOrFilters);
556
+ } else {
557
+ if (behavior === "replace") {
558
+ setFiltersAsReplace(setterOrFilters);
559
+ } else {
560
+ setFiltersAsMerge(setterOrFilters);
561
+ }
562
+ }
563
+ },
564
+ [setFiltersWithSetter, setFiltersAsReplace, setFiltersAsMerge],
565
+ );
553
566
 
554
- const setSortWithUnion = (newSorter: CrudSort[]) => {
555
- setSorters(() => unionSorters(preferredPermanentSorters, newSorter));
556
- };
567
+ const setSortWithUnion = useCallback(
568
+ (newSorter: CrudSort[]) => {
569
+ setSorters(() => unionSorters(preferredPermanentSorters, newSorter));
570
+ },
571
+ [preferredPermanentSorters],
572
+ );
557
573
 
558
574
  const { elapsedTime } = useLoadingOvertime({
559
575
  isLoading: queryResult.isFetching,