@refinedev/antd 5.0.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 (288) hide show
  1. package/CHANGELOG.md +1689 -0
  2. package/README.md +285 -0
  3. package/dist/components/breadcrumb/index.d.ts +6 -0
  4. package/dist/components/breadcrumb/index.d.ts.map +1 -0
  5. package/dist/components/buttons/clone/index.d.ts +11 -0
  6. package/dist/components/buttons/clone/index.d.ts.map +1 -0
  7. package/dist/components/buttons/create/index.d.ts +11 -0
  8. package/dist/components/buttons/create/index.d.ts.map +1 -0
  9. package/dist/components/buttons/delete/index.d.ts +10 -0
  10. package/dist/components/buttons/delete/index.d.ts.map +1 -0
  11. package/dist/components/buttons/edit/index.d.ts +11 -0
  12. package/dist/components/buttons/edit/index.d.ts.map +1 -0
  13. package/dist/components/buttons/export/index.d.ts +10 -0
  14. package/dist/components/buttons/export/index.d.ts.map +1 -0
  15. package/dist/components/buttons/import/index.d.ts +11 -0
  16. package/dist/components/buttons/import/index.d.ts.map +1 -0
  17. package/dist/components/buttons/index.d.ts +12 -0
  18. package/dist/components/buttons/index.d.ts.map +1 -0
  19. package/dist/components/buttons/list/index.d.ts +11 -0
  20. package/dist/components/buttons/list/index.d.ts.map +1 -0
  21. package/dist/components/buttons/refresh/index.d.ts +10 -0
  22. package/dist/components/buttons/refresh/index.d.ts.map +1 -0
  23. package/dist/components/buttons/save/index.d.ts +10 -0
  24. package/dist/components/buttons/save/index.d.ts.map +1 -0
  25. package/dist/components/buttons/show/index.d.ts +11 -0
  26. package/dist/components/buttons/show/index.d.ts.map +1 -0
  27. package/dist/components/buttons/types.d.ts +24 -0
  28. package/dist/components/buttons/types.d.ts.map +1 -0
  29. package/dist/components/crud/create/index.d.ts +10 -0
  30. package/dist/components/crud/create/index.d.ts.map +1 -0
  31. package/dist/components/crud/edit/index.d.ts +10 -0
  32. package/dist/components/crud/edit/index.d.ts.map +1 -0
  33. package/dist/components/crud/index.d.ts +6 -0
  34. package/dist/components/crud/index.d.ts.map +1 -0
  35. package/dist/components/crud/list/index.d.ts +10 -0
  36. package/dist/components/crud/list/index.d.ts.map +1 -0
  37. package/dist/components/crud/show/index.d.ts +10 -0
  38. package/dist/components/crud/show/index.d.ts.map +1 -0
  39. package/dist/components/crud/types.d.ts +10 -0
  40. package/dist/components/crud/types.d.ts.map +1 -0
  41. package/dist/components/fields/boolean/index.d.ts +9 -0
  42. package/dist/components/fields/boolean/index.d.ts.map +1 -0
  43. package/dist/components/fields/date/index.d.ts +9 -0
  44. package/dist/components/fields/date/index.d.ts.map +1 -0
  45. package/dist/components/fields/email/index.d.ts +10 -0
  46. package/dist/components/fields/email/index.d.ts.map +1 -0
  47. package/dist/components/fields/file/index.d.ts +9 -0
  48. package/dist/components/fields/file/index.d.ts.map +1 -0
  49. package/dist/components/fields/image/index.d.ts +9 -0
  50. package/dist/components/fields/image/index.d.ts.map +1 -0
  51. package/dist/components/fields/index.d.ts +12 -0
  52. package/dist/components/fields/index.d.ts.map +1 -0
  53. package/dist/components/fields/markdown/index.d.ts +9 -0
  54. package/dist/components/fields/markdown/index.d.ts.map +1 -0
  55. package/dist/components/fields/number/index.d.ts +9 -0
  56. package/dist/components/fields/number/index.d.ts.map +1 -0
  57. package/dist/components/fields/tag/index.d.ts +9 -0
  58. package/dist/components/fields/tag/index.d.ts.map +1 -0
  59. package/dist/components/fields/text/index.d.ts +9 -0
  60. package/dist/components/fields/text/index.d.ts.map +1 -0
  61. package/dist/components/fields/types.d.ts +20 -0
  62. package/dist/components/fields/types.d.ts.map +1 -0
  63. package/dist/components/fields/url/index.d.ts +10 -0
  64. package/dist/components/fields/url/index.d.ts.map +1 -0
  65. package/dist/components/index.d.ts +13 -0
  66. package/dist/components/index.d.ts.map +1 -0
  67. package/dist/components/layout/header/index.d.ts +4 -0
  68. package/dist/components/layout/header/index.d.ts.map +1 -0
  69. package/dist/components/layout/index.d.ts +4 -0
  70. package/dist/components/layout/index.d.ts.map +1 -0
  71. package/dist/components/layout/sider/index.d.ts +4 -0
  72. package/dist/components/layout/sider/index.d.ts.map +1 -0
  73. package/dist/components/layout/sider/styles.d.ts +3 -0
  74. package/dist/components/layout/sider/styles.d.ts.map +1 -0
  75. package/dist/components/layout/title/index.d.ts +4 -0
  76. package/dist/components/layout/title/index.d.ts.map +1 -0
  77. package/dist/components/layout/types.d.ts +3 -0
  78. package/dist/components/layout/types.d.ts.map +1 -0
  79. package/dist/components/pageHeader/index.d.ts +5 -0
  80. package/dist/components/pageHeader/index.d.ts.map +1 -0
  81. package/dist/components/pages/auth/components/forgotPassword/index.d.ts +12 -0
  82. package/dist/components/pages/auth/components/forgotPassword/index.d.ts.map +1 -0
  83. package/dist/components/pages/auth/components/index.d.ts +5 -0
  84. package/dist/components/pages/auth/components/index.d.ts.map +1 -0
  85. package/dist/components/pages/auth/components/login/index.d.ts +12 -0
  86. package/dist/components/pages/auth/components/login/index.d.ts.map +1 -0
  87. package/dist/components/pages/auth/components/register/index.d.ts +12 -0
  88. package/dist/components/pages/auth/components/register/index.d.ts.map +1 -0
  89. package/dist/components/pages/auth/components/styles.d.ts +5 -0
  90. package/dist/components/pages/auth/components/styles.d.ts.map +1 -0
  91. package/dist/components/pages/auth/components/updatePassword/index.d.ts +12 -0
  92. package/dist/components/pages/auth/components/updatePassword/index.d.ts.map +1 -0
  93. package/dist/components/pages/auth/index.d.ts +11 -0
  94. package/dist/components/pages/auth/index.d.ts.map +1 -0
  95. package/dist/components/pages/error/index.d.ts +10 -0
  96. package/dist/components/pages/error/index.d.ts.map +1 -0
  97. package/dist/components/pages/index.d.ts +7 -0
  98. package/dist/components/pages/index.d.ts.map +1 -0
  99. package/dist/components/pages/login/index.d.ts +15 -0
  100. package/dist/components/pages/login/index.d.ts.map +1 -0
  101. package/dist/components/pages/login/styles.d.ts +6 -0
  102. package/dist/components/pages/login/styles.d.ts.map +1 -0
  103. package/dist/components/pages/ready/index.d.ts +10 -0
  104. package/dist/components/pages/ready/index.d.ts.map +1 -0
  105. package/dist/components/pages/welcome/index.d.ts +6 -0
  106. package/dist/components/pages/welcome/index.d.ts.map +1 -0
  107. package/dist/components/table/components/filterDropdown/index.d.ts +13 -0
  108. package/dist/components/table/components/filterDropdown/index.d.ts.map +1 -0
  109. package/dist/components/table/components/index.d.ts +2 -0
  110. package/dist/components/table/components/index.d.ts.map +1 -0
  111. package/dist/components/table/index.d.ts +2 -0
  112. package/dist/components/table/index.d.ts.map +1 -0
  113. package/dist/components/undoableNotification/index.d.ts +10 -0
  114. package/dist/components/undoableNotification/index.d.ts.map +1 -0
  115. package/dist/definitions/index.d.ts +3 -0
  116. package/dist/definitions/index.d.ts.map +1 -0
  117. package/dist/definitions/table/index.d.ts +10 -0
  118. package/dist/definitions/table/index.d.ts.map +1 -0
  119. package/dist/definitions/upload/index.d.ts +4 -0
  120. package/dist/definitions/upload/index.d.ts.map +1 -0
  121. package/dist/esm/index.js +2 -0
  122. package/dist/esm/index.js.map +1 -0
  123. package/dist/hooks/fields/index.d.ts +4 -0
  124. package/dist/hooks/fields/index.d.ts.map +1 -0
  125. package/dist/hooks/fields/useCheckboxGroup/index.d.ts +24 -0
  126. package/dist/hooks/fields/useCheckboxGroup/index.d.ts.map +1 -0
  127. package/dist/hooks/fields/useRadioGroup/index.d.ts +24 -0
  128. package/dist/hooks/fields/useRadioGroup/index.d.ts.map +1 -0
  129. package/dist/hooks/fields/useSelect/index.d.ts +21 -0
  130. package/dist/hooks/fields/useSelect/index.d.ts.map +1 -0
  131. package/dist/hooks/form/index.d.ts +5 -0
  132. package/dist/hooks/form/index.d.ts.map +1 -0
  133. package/dist/hooks/form/useDrawerForm/index.d.ts +2 -0
  134. package/dist/hooks/form/useDrawerForm/index.d.ts.map +1 -0
  135. package/dist/hooks/form/useDrawerForm/useDrawerForm.d.ts +33 -0
  136. package/dist/hooks/form/useDrawerForm/useDrawerForm.d.ts.map +1 -0
  137. package/dist/hooks/form/useForm.d.ts +31 -0
  138. package/dist/hooks/form/useForm.d.ts.map +1 -0
  139. package/dist/hooks/form/useModalForm/index.d.ts +2 -0
  140. package/dist/hooks/form/useModalForm/index.d.ts.map +1 -0
  141. package/dist/hooks/form/useModalForm/useModalForm.d.ts +39 -0
  142. package/dist/hooks/form/useModalForm/useModalForm.d.ts.map +1 -0
  143. package/dist/hooks/form/useStepsForm/index.d.ts +2 -0
  144. package/dist/hooks/form/useStepsForm/index.d.ts.map +1 -0
  145. package/dist/hooks/form/useStepsForm/useStepsForm.d.ts +35 -0
  146. package/dist/hooks/form/useStepsForm/useStepsForm.d.ts.map +1 -0
  147. package/dist/hooks/import/index.d.ts +18 -0
  148. package/dist/hooks/import/index.d.ts.map +1 -0
  149. package/dist/hooks/index.d.ts +8 -0
  150. package/dist/hooks/index.d.ts.map +1 -0
  151. package/dist/hooks/list/index.d.ts +2 -0
  152. package/dist/hooks/list/index.d.ts.map +1 -0
  153. package/dist/hooks/list/useSimpleList/index.d.ts +2 -0
  154. package/dist/hooks/list/useSimpleList/index.d.ts.map +1 -0
  155. package/dist/hooks/list/useSimpleList/useSimpleList.d.ts +23 -0
  156. package/dist/hooks/list/useSimpleList/useSimpleList.d.ts.map +1 -0
  157. package/dist/hooks/modal/index.d.ts +2 -0
  158. package/dist/hooks/modal/index.d.ts.map +1 -0
  159. package/dist/hooks/modal/useModal/index.d.ts +18 -0
  160. package/dist/hooks/modal/useModal/index.d.ts.map +1 -0
  161. package/dist/hooks/table/index.d.ts +3 -0
  162. package/dist/hooks/table/index.d.ts.map +1 -0
  163. package/dist/hooks/table/useEditableTable/index.d.ts +2 -0
  164. package/dist/hooks/table/useEditableTable/index.d.ts.map +1 -0
  165. package/dist/hooks/table/useEditableTable/useEditableTable.d.ts +28 -0
  166. package/dist/hooks/table/useEditableTable/useEditableTable.d.ts.map +1 -0
  167. package/dist/hooks/table/useTable/index.d.ts +2 -0
  168. package/dist/hooks/table/useTable/index.d.ts.map +1 -0
  169. package/dist/hooks/table/useTable/paginationLink.d.ts +8 -0
  170. package/dist/hooks/table/useTable/paginationLink.d.ts.map +1 -0
  171. package/dist/hooks/table/useTable/useTable.d.ts +18 -0
  172. package/dist/hooks/table/useTable/useTable.d.ts.map +1 -0
  173. package/dist/hooks/useFileUploadState/index.d.ts +7 -0
  174. package/dist/hooks/useFileUploadState/index.d.ts.map +1 -0
  175. package/dist/iife/index.js +56 -0
  176. package/dist/iife/index.js.map +1 -0
  177. package/dist/index.d.ts +6 -0
  178. package/dist/index.d.ts.map +1 -0
  179. package/dist/index.js +2 -0
  180. package/dist/index.js.map +1 -0
  181. package/dist/interfaces/field.d.ts +4 -0
  182. package/dist/interfaces/field.d.ts.map +1 -0
  183. package/dist/interfaces/index.d.ts +19 -0
  184. package/dist/interfaces/index.d.ts.map +1 -0
  185. package/dist/interfaces/upload.d.ts +10 -0
  186. package/dist/interfaces/upload.d.ts.map +1 -0
  187. package/dist/providers/index.d.ts +2 -0
  188. package/dist/providers/index.d.ts.map +1 -0
  189. package/dist/providers/notificationProvider/index.d.ts +3 -0
  190. package/dist/providers/notificationProvider/index.d.ts.map +1 -0
  191. package/dist/reset.css +254 -0
  192. package/package.json +72 -0
  193. package/refine.config.js +604 -0
  194. package/src/assets/styles/reset.css +254 -0
  195. package/src/components/breadcrumb/index.tsx +70 -0
  196. package/src/components/buttons/clone/index.tsx +104 -0
  197. package/src/components/buttons/create/index.tsx +103 -0
  198. package/src/components/buttons/delete/index.tsx +122 -0
  199. package/src/components/buttons/edit/index.tsx +105 -0
  200. package/src/components/buttons/export/index.tsx +32 -0
  201. package/src/components/buttons/import/index.tsx +36 -0
  202. package/src/components/buttons/index.ts +11 -0
  203. package/src/components/buttons/list/index.tsx +122 -0
  204. package/src/components/buttons/refresh/index.tsx +61 -0
  205. package/src/components/buttons/save/index.tsx +32 -0
  206. package/src/components/buttons/show/index.tsx +104 -0
  207. package/src/components/buttons/types.ts +44 -0
  208. package/src/components/crud/create/index.tsx +135 -0
  209. package/src/components/crud/edit/index.tsx +221 -0
  210. package/src/components/crud/index.ts +6 -0
  211. package/src/components/crud/list/index.tsx +105 -0
  212. package/src/components/crud/show/index.tsx +215 -0
  213. package/src/components/crud/types.ts +63 -0
  214. package/src/components/fields/boolean/index.tsx +26 -0
  215. package/src/components/fields/date/index.tsx +33 -0
  216. package/src/components/fields/email/index.tsx +20 -0
  217. package/src/components/fields/file/index.tsx +21 -0
  218. package/src/components/fields/image/index.tsx +17 -0
  219. package/src/components/fields/index.ts +11 -0
  220. package/src/components/fields/markdown/index.tsx +16 -0
  221. package/src/components/fields/number/index.tsx +36 -0
  222. package/src/components/fields/tag/index.tsx +13 -0
  223. package/src/components/fields/text/index.tsx +15 -0
  224. package/src/components/fields/types.ts +49 -0
  225. package/src/components/fields/url/index.tsx +24 -0
  226. package/src/components/index.ts +14 -0
  227. package/src/components/layout/header/index.tsx +37 -0
  228. package/src/components/layout/index.tsx +41 -0
  229. package/src/components/layout/sider/index.tsx +261 -0
  230. package/src/components/layout/sider/styles.ts +9 -0
  231. package/src/components/layout/title/index.tsx +48 -0
  232. package/src/components/layout/types.ts +11 -0
  233. package/src/components/pageHeader/index.tsx +52 -0
  234. package/src/components/pages/auth/components/forgotPassword/index.tsx +167 -0
  235. package/src/components/pages/auth/components/index.tsx +4 -0
  236. package/src/components/pages/auth/components/login/index.tsx +239 -0
  237. package/src/components/pages/auth/components/register/index.tsx +210 -0
  238. package/src/components/pages/auth/components/styles.ts +23 -0
  239. package/src/components/pages/auth/components/updatePassword/index.tsx +158 -0
  240. package/src/components/pages/auth/index.tsx +35 -0
  241. package/src/components/pages/error/index.tsx +77 -0
  242. package/src/components/pages/index.tsx +6 -0
  243. package/src/components/pages/login/index.tsx +172 -0
  244. package/src/components/pages/login/styles.ts +25 -0
  245. package/src/components/pages/ready/index.tsx +96 -0
  246. package/src/components/pages/welcome/index.tsx +87 -0
  247. package/src/components/table/components/filterDropdown/index.tsx +112 -0
  248. package/src/components/table/components/index.ts +1 -0
  249. package/src/components/table/index.ts +1 -0
  250. package/src/components/undoableNotification/index.tsx +46 -0
  251. package/src/definitions/index.ts +2 -0
  252. package/src/definitions/table/index.ts +113 -0
  253. package/src/definitions/upload/index.ts +29 -0
  254. package/src/hooks/fields/index.ts +3 -0
  255. package/src/hooks/fields/useCheckboxGroup/index.ts +85 -0
  256. package/src/hooks/fields/useRadioGroup/index.ts +85 -0
  257. package/src/hooks/fields/useSelect/index.ts +47 -0
  258. package/src/hooks/form/index.ts +17 -0
  259. package/src/hooks/form/useDrawerForm/index.ts +6 -0
  260. package/src/hooks/form/useDrawerForm/useDrawerForm.ts +241 -0
  261. package/src/hooks/form/useForm.ts +168 -0
  262. package/src/hooks/form/useModalForm/index.ts +5 -0
  263. package/src/hooks/form/useModalForm/useModalForm.ts +286 -0
  264. package/src/hooks/form/useStepsForm/index.ts +5 -0
  265. package/src/hooks/form/useStepsForm/useStepsForm.ts +91 -0
  266. package/src/hooks/import/index.tsx +134 -0
  267. package/src/hooks/index.ts +7 -0
  268. package/src/hooks/list/index.ts +1 -0
  269. package/src/hooks/list/useSimpleList/index.ts +1 -0
  270. package/src/hooks/list/useSimpleList/useSimpleList.ts +229 -0
  271. package/src/hooks/modal/index.ts +1 -0
  272. package/src/hooks/modal/useModal/index.tsx +43 -0
  273. package/src/hooks/table/index.ts +2 -0
  274. package/src/hooks/table/useEditableTable/index.ts +1 -0
  275. package/src/hooks/table/useEditableTable/useEditableTable.ts +87 -0
  276. package/src/hooks/table/useTable/index.ts +1 -0
  277. package/src/hooks/table/useTable/paginationLink.tsx +27 -0
  278. package/src/hooks/table/useTable/useTable.ts +267 -0
  279. package/src/hooks/useFileUploadState/index.ts +34 -0
  280. package/src/index.tsx +11 -0
  281. package/src/interfaces/field.ts +3 -0
  282. package/src/interfaces/index.ts +23 -0
  283. package/src/interfaces/upload.ts +9 -0
  284. package/src/providers/index.ts +1 -0
  285. package/src/providers/notificationProvider/index.tsx +41 -0
  286. package/src/types/index.d.ts +4 -0
  287. package/src/types/sunflower.d.ts +86 -0
  288. package/tsconfig.json +28 -0
@@ -0,0 +1,105 @@
1
+ import React from "react";
2
+ import { Button } from "antd";
3
+ import { EditOutlined } from "@ant-design/icons";
4
+ import {
5
+ useCan,
6
+ useNavigation,
7
+ useTranslate,
8
+ useResource,
9
+ useRouterContext,
10
+ useRouterType,
11
+ useLink,
12
+ } from "@refinedev/core";
13
+ import { RefineButtonTestIds } from "@refinedev/ui-types";
14
+
15
+ import { EditButtonProps } from "../types";
16
+
17
+ /**
18
+ * `<EditButton>` uses Ant Design's {@link https://ant.design/components/button/ `<Button>`} component.
19
+ * It uses the {@link https://refine.dev/docs/core/hooks/navigation/useNavigation#edit `edit`} method from {@link https://refine.dev/docs/core/hooks/navigation/useNavigation `useNavigation`} under the hood.
20
+ * It can be useful when redirecting the app to the edit page with the record id route of resource}.
21
+ *
22
+ * @see {@link https://refine.dev/docs/ui-frameworks/antd/components/buttons/edit-button} for more details.
23
+ */
24
+ export const EditButton: React.FC<EditButtonProps> = ({
25
+ resource: resourceNameFromProps,
26
+ resourceNameOrRouteName: propResourceNameOrRouteName,
27
+ recordItemId,
28
+ hideText = false,
29
+ accessControl,
30
+ meta,
31
+ children,
32
+ onClick,
33
+ ...rest
34
+ }) => {
35
+ const accessControlEnabled = accessControl?.enabled ?? true;
36
+ const hideIfUnauthorized = accessControl?.hideIfUnauthorized ?? false;
37
+ const translate = useTranslate();
38
+
39
+ const routerType = useRouterType();
40
+ const Link = useLink();
41
+ const { Link: LegacyLink } = useRouterContext();
42
+
43
+ const ActiveLink = routerType === "legacy" ? LegacyLink : Link;
44
+
45
+ const { editUrl: generateEditUrl } = useNavigation();
46
+
47
+ const { id, resource } = useResource(
48
+ resourceNameFromProps ?? propResourceNameOrRouteName,
49
+ );
50
+
51
+ const { data } = useCan({
52
+ resource: resource?.name,
53
+ action: "edit",
54
+ params: { id: recordItemId ?? id, resource },
55
+ queryOptions: {
56
+ enabled: accessControlEnabled,
57
+ },
58
+ });
59
+
60
+ const createButtonDisabledTitle = () => {
61
+ if (data?.can) return "";
62
+ else if (data?.reason) return data.reason;
63
+ else
64
+ return translate(
65
+ "buttons.notAccessTitle",
66
+ "You don't have permission to access",
67
+ );
68
+ };
69
+
70
+ const editUrl =
71
+ resource && (recordItemId ?? id)
72
+ ? generateEditUrl(resource, recordItemId! ?? id!, meta)
73
+ : "";
74
+
75
+ if (accessControlEnabled && hideIfUnauthorized && !data?.can) {
76
+ return null;
77
+ }
78
+
79
+ return (
80
+ <ActiveLink
81
+ to={editUrl}
82
+ replace={false}
83
+ onClick={(e: React.PointerEvent<HTMLButtonElement>) => {
84
+ if (data?.can === false) {
85
+ e.preventDefault();
86
+ return;
87
+ }
88
+ if (onClick) {
89
+ e.preventDefault();
90
+ onClick(e);
91
+ }
92
+ }}
93
+ >
94
+ <Button
95
+ icon={<EditOutlined />}
96
+ disabled={data?.can === false}
97
+ title={createButtonDisabledTitle()}
98
+ data-testid={RefineButtonTestIds.EditButton}
99
+ {...rest}
100
+ >
101
+ {!hideText && (children ?? translate("buttons.edit", "Edit"))}
102
+ </Button>
103
+ </ActiveLink>
104
+ );
105
+ };
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+ import { Button } from "antd";
3
+ import { ExportOutlined } from "@ant-design/icons";
4
+ import { useTranslate } from "@refinedev/core";
5
+ import { RefineButtonTestIds } from "@refinedev/ui-types";
6
+
7
+ import { ExportButtonProps } from "../types";
8
+
9
+ /**
10
+ * `<ExportButton>` is an Ant Design {@link https://ant.design/components/button/ `<Button>`} with a default export icon and a default text with "Export".
11
+ * It only has presentational value.
12
+ *
13
+ * @see {@link https://refine.dev/docs/ui-frameworks/antd/components/buttons/export-button} for more details.
14
+ */
15
+ export const ExportButton: React.FC<ExportButtonProps> = ({
16
+ hideText = false,
17
+ children,
18
+ ...rest
19
+ }) => {
20
+ const translate = useTranslate();
21
+
22
+ return (
23
+ <Button
24
+ type="default"
25
+ icon={<ExportOutlined />}
26
+ data-testid={RefineButtonTestIds.ExportButton}
27
+ {...rest}
28
+ >
29
+ {!hideText && (children ?? translate("buttons.export", "Export"))}
30
+ </Button>
31
+ );
32
+ };
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+ import { Button, Upload } from "antd";
3
+ import { ImportOutlined } from "@ant-design/icons";
4
+ import { useTranslate } from "@refinedev/core";
5
+ import { RefineButtonTestIds } from "@refinedev/ui-types";
6
+
7
+ import { ImportButtonProps } from "../types";
8
+
9
+ /**
10
+ * `<ImportButton>` is compatible with the {@link https://refine.dev/docs/ui-frameworks/antd/hooks/import/useImport `useImport`} hook and is meant to be used as it's upload button.
11
+ * It uses Ant Design's {@link https://ant.design/components/button/ `<Button>`} and {@link https://ant.design/components/upload/ `<Upload>`} components.
12
+ * It wraps a `<Button>` component with an `<Upload>` component and accepts properties for `<Button>` and `<Upload>` components separately.
13
+ *
14
+ * @see {@link https://refine.dev/docs/ui-frameworks/antd/components/buttons/import-button} for more details.
15
+ */
16
+ export const ImportButton: React.FC<ImportButtonProps> = ({
17
+ uploadProps,
18
+ buttonProps,
19
+ hideText = false,
20
+ children,
21
+ }) => {
22
+ const translate = useTranslate();
23
+
24
+ return (
25
+ <Upload {...uploadProps}>
26
+ <Button
27
+ icon={<ImportOutlined />}
28
+ data-testid={RefineButtonTestIds.ImportButton}
29
+ {...buttonProps}
30
+ >
31
+ {!hideText &&
32
+ (children ?? translate("buttons.import", "Import"))}
33
+ </Button>
34
+ </Upload>
35
+ );
36
+ };
@@ -0,0 +1,11 @@
1
+ export { CreateButton } from "./create";
2
+ export { EditButton } from "./edit";
3
+ export { DeleteButton } from "./delete";
4
+ export { RefreshButton } from "./refresh";
5
+ export { ShowButton } from "./show";
6
+ export { ListButton } from "./list";
7
+ export { ExportButton } from "./export";
8
+ export { SaveButton } from "./save";
9
+ export { CloneButton } from "./clone";
10
+ export { ImportButton } from "./import";
11
+ export * from "./types";
@@ -0,0 +1,122 @@
1
+ import React from "react";
2
+ import { Button } from "antd";
3
+ import { BarsOutlined } from "@ant-design/icons";
4
+ import {
5
+ useCan,
6
+ useNavigation,
7
+ useTranslate,
8
+ userFriendlyResourceName,
9
+ useResource,
10
+ useRouterContext,
11
+ useRouterType,
12
+ useLink,
13
+ pickNotDeprecated,
14
+ } from "@refinedev/core";
15
+ import { RefineButtonTestIds } from "@refinedev/ui-types";
16
+
17
+ import { ListButtonProps } from "../types";
18
+
19
+ /**
20
+ * `<ListButton>` is using Ant Design's {@link https://ant.design/components/button/ `<Button>`} component.
21
+ * It uses the {@link https://refine.dev/docs/core/hooks/navigation/useNavigation#list `list`} method from {@link https://refine.dev/docs/core/hooks/navigation/useNavigation `useNavigation`} under the hood.
22
+ * It can be useful when redirecting the app to the list page route of resource}.
23
+ *
24
+ * @see {@link https://refine.dev/docs/ui-frameworks/antd/components/buttons/list-button} for more details.
25
+ */
26
+ export const ListButton: React.FC<ListButtonProps> = ({
27
+ resource: resourceNameFromProps,
28
+ resourceNameOrRouteName: propResourceNameOrRouteName,
29
+ hideText = false,
30
+ accessControl,
31
+ meta,
32
+ children,
33
+ onClick,
34
+ ...rest
35
+ }) => {
36
+ const accessControlEnabled = accessControl?.enabled ?? true;
37
+ const hideIfUnauthorized = accessControl?.hideIfUnauthorized ?? false;
38
+ const { listUrl: generateListUrl } = useNavigation();
39
+ const routerType = useRouterType();
40
+ const Link = useLink();
41
+ const { Link: LegacyLink } = useRouterContext();
42
+
43
+ const ActiveLink = routerType === "legacy" ? LegacyLink : Link;
44
+
45
+ const translate = useTranslate();
46
+
47
+ const { resource } = useResource(
48
+ resourceNameFromProps ?? propResourceNameOrRouteName,
49
+ );
50
+
51
+ const { data } = useCan({
52
+ resource: resource?.name,
53
+ action: "list",
54
+ queryOptions: {
55
+ enabled: accessControlEnabled,
56
+ },
57
+ params: {
58
+ resource,
59
+ },
60
+ });
61
+
62
+ const createButtonDisabledTitle = () => {
63
+ if (data?.can) return "";
64
+ else if (data?.reason) return data.reason;
65
+ else
66
+ return translate(
67
+ "buttons.notAccessTitle",
68
+ "You don't have permission to access",
69
+ );
70
+ };
71
+
72
+ const listUrl = resource ? generateListUrl(resource, meta) : "";
73
+
74
+ if (accessControlEnabled && hideIfUnauthorized && !data?.can) {
75
+ return null;
76
+ }
77
+
78
+ return (
79
+ <ActiveLink
80
+ to={listUrl}
81
+ replace={false}
82
+ onClick={(e: React.PointerEvent<HTMLButtonElement>) => {
83
+ if (data?.can === false) {
84
+ e.preventDefault();
85
+ return;
86
+ }
87
+ if (onClick) {
88
+ e.preventDefault();
89
+ onClick(e);
90
+ }
91
+ }}
92
+ >
93
+ <Button
94
+ icon={<BarsOutlined />}
95
+ disabled={data?.can === false}
96
+ title={createButtonDisabledTitle()}
97
+ data-testid={RefineButtonTestIds.ListButton}
98
+ {...rest}
99
+ >
100
+ {!hideText &&
101
+ (children ??
102
+ translate(
103
+ `${
104
+ resource?.name ??
105
+ resourceNameFromProps ??
106
+ propResourceNameOrRouteName
107
+ }.titles.list`,
108
+ userFriendlyResourceName(
109
+ resource?.meta?.label ??
110
+ resource?.label ??
111
+ resource?.name ??
112
+ pickNotDeprecated(
113
+ resourceNameFromProps,
114
+ propResourceNameOrRouteName,
115
+ ),
116
+ "plural",
117
+ ),
118
+ ))}
119
+ </Button>
120
+ </ActiveLink>
121
+ );
122
+ };
@@ -0,0 +1,61 @@
1
+ import React from "react";
2
+ import { Button } from "antd";
3
+ import { RedoOutlined } from "@ant-design/icons";
4
+ import {
5
+ useOne,
6
+ useTranslate,
7
+ useResource,
8
+ pickNotDeprecated,
9
+ } from "@refinedev/core";
10
+ import { RefineButtonTestIds } from "@refinedev/ui-types";
11
+
12
+ import { RefreshButtonProps } from "../types";
13
+
14
+ /**
15
+ * `<RefreshButton>` uses Ant Design's {@link https://ant.design/components/button/ `<Button>`} component
16
+ * to update the data shown on the page via the {@link https://refine.dev/docs/core/hooks/data/useOne `useOne`} method provided by your dataProvider.
17
+ *
18
+ * @see {@link https://refine.dev/docs/ui-frameworks/antd/components/buttons/refresh-button} for more details.
19
+ */
20
+ export const RefreshButton: React.FC<RefreshButtonProps> = ({
21
+ resource: resourceNameFromProps,
22
+ resourceNameOrRouteName: propResourceNameOrRouteName,
23
+ recordItemId,
24
+ hideText = false,
25
+ meta,
26
+ metaData,
27
+ dataProviderName,
28
+ children,
29
+ onClick,
30
+ ...rest
31
+ }) => {
32
+ const translate = useTranslate();
33
+
34
+ const { resource, id } = useResource(
35
+ resourceNameFromProps ?? propResourceNameOrRouteName,
36
+ );
37
+
38
+ const { refetch, isFetching } = useOne({
39
+ resource: resource?.name,
40
+ id: recordItemId ?? id,
41
+ queryOptions: {
42
+ enabled: false,
43
+ },
44
+ meta: pickNotDeprecated(meta, metaData),
45
+ metaData: pickNotDeprecated(meta, metaData),
46
+ liveMode: "off",
47
+ dataProviderName,
48
+ });
49
+
50
+ return (
51
+ <Button
52
+ // TODO: fix any type
53
+ onClick={(e) => (onClick ? onClick(e as any) : refetch())}
54
+ icon={<RedoOutlined spin={isFetching} />}
55
+ data-testid={RefineButtonTestIds.RefreshButton}
56
+ {...rest}
57
+ >
58
+ {!hideText && (children ?? translate("buttons.refresh", "Refresh"))}
59
+ </Button>
60
+ );
61
+ };
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+ import { Button } from "antd";
3
+ import { SaveOutlined } from "@ant-design/icons";
4
+ import { useTranslate } from "@refinedev/core";
5
+ import { RefineButtonTestIds } from "@refinedev/ui-types";
6
+
7
+ import { SaveButtonProps } from "../types";
8
+
9
+ /**
10
+ * `<SaveButton>` uses Ant Design's {@link https://ant.design/components/button/ `<Button>`} component.
11
+ * It uses it for presantation purposes only. Some of the hooks that refine has adds features to this button.
12
+ *
13
+ * @see {@link https://refine.dev/docs/ui-frameworks/antd/components/buttons/save-button} for more details.
14
+ */
15
+ export const SaveButton: React.FC<SaveButtonProps> = ({
16
+ hideText = false,
17
+ children,
18
+ ...rest
19
+ }) => {
20
+ const translate = useTranslate();
21
+
22
+ return (
23
+ <Button
24
+ type="primary"
25
+ icon={<SaveOutlined />}
26
+ data-testid={RefineButtonTestIds.SaveButton}
27
+ {...rest}
28
+ >
29
+ {!hideText && (children ?? translate("buttons.save", "Save"))}
30
+ </Button>
31
+ );
32
+ };
@@ -0,0 +1,104 @@
1
+ import React from "react";
2
+ import { Button } from "antd";
3
+ import { EyeOutlined } from "@ant-design/icons";
4
+ import {
5
+ useCan,
6
+ useNavigation,
7
+ useTranslate,
8
+ useResource,
9
+ useRouterContext,
10
+ useRouterType,
11
+ useLink,
12
+ } from "@refinedev/core";
13
+ import { RefineButtonTestIds } from "@refinedev/ui-types";
14
+
15
+ import { ShowButtonProps } from "../types";
16
+
17
+ /**
18
+ * `<ShowButton>` uses Ant Design's {@link https://ant.design/components/button/ `<Button>`} component.
19
+ * It uses the {@link https://refine.dev/docs/core/hooks/navigation/useNavigation#show `show`} method from {@link https://refine.dev/docs/core/hooks/navigation/useNavigation `useNavigation`} under the hood.
20
+ * It can be useful when redirecting the app to the show page with the record id route of resource.
21
+ *
22
+ * @see {@link https://refine.dev/docs/ui-frameworks/antd/components/buttons/show-button} for more details.
23
+ */
24
+ export const ShowButton: React.FC<ShowButtonProps> = ({
25
+ resource: resourceNameFromProps,
26
+ resourceNameOrRouteName: propResourceNameOrRouteName,
27
+ recordItemId,
28
+ hideText = false,
29
+ accessControl,
30
+ meta,
31
+ children,
32
+ onClick,
33
+ ...rest
34
+ }) => {
35
+ const accessControlEnabled = accessControl?.enabled ?? true;
36
+ const hideIfUnauthorized = accessControl?.hideIfUnauthorized ?? false;
37
+ const { showUrl: generateShowUrl } = useNavigation();
38
+ const routerType = useRouterType();
39
+ const Link = useLink();
40
+ const { Link: LegacyLink } = useRouterContext();
41
+
42
+ const ActiveLink = routerType === "legacy" ? LegacyLink : Link;
43
+
44
+ const translate = useTranslate();
45
+
46
+ const { id, resource } = useResource(
47
+ resourceNameFromProps ?? propResourceNameOrRouteName,
48
+ );
49
+
50
+ const { data } = useCan({
51
+ resource: resource?.name,
52
+ action: "show",
53
+ params: { id: recordItemId ?? id, resource },
54
+ queryOptions: {
55
+ enabled: accessControlEnabled,
56
+ },
57
+ });
58
+
59
+ const createButtonDisabledTitle = () => {
60
+ if (data?.can) return "";
61
+ else if (data?.reason) return data.reason;
62
+ else
63
+ return translate(
64
+ "buttons.notAccessTitle",
65
+ "You don't have permission to access",
66
+ );
67
+ };
68
+
69
+ const showUrl =
70
+ resource && (recordItemId || id)
71
+ ? generateShowUrl(resource, recordItemId! ?? id!, meta)
72
+ : "";
73
+
74
+ if (accessControlEnabled && hideIfUnauthorized && !data?.can) {
75
+ return null;
76
+ }
77
+
78
+ return (
79
+ <ActiveLink
80
+ to={showUrl}
81
+ replace={false}
82
+ onClick={(e: React.PointerEvent<HTMLButtonElement>) => {
83
+ if (data?.can === false) {
84
+ e.preventDefault();
85
+ return;
86
+ }
87
+ if (onClick) {
88
+ e.preventDefault();
89
+ onClick(e);
90
+ }
91
+ }}
92
+ >
93
+ <Button
94
+ icon={<EyeOutlined />}
95
+ disabled={data?.can === false}
96
+ title={createButtonDisabledTitle()}
97
+ data-testid={RefineButtonTestIds.ShowButton}
98
+ {...rest}
99
+ >
100
+ {!hideText && (children ?? translate("buttons.show", "Show"))}
101
+ </Button>
102
+ </ActiveLink>
103
+ );
104
+ };
@@ -0,0 +1,44 @@
1
+ import { ButtonProps, UploadProps } from "antd";
2
+ import {
3
+ RefineCloneButtonProps,
4
+ RefineCreateButtonProps,
5
+ RefineDeleteButtonProps,
6
+ RefineEditButtonProps,
7
+ RefineExportButtonProps,
8
+ RefineImportButtonProps,
9
+ RefineListButtonProps,
10
+ RefineRefreshButtonProps,
11
+ RefineSaveButtonProps,
12
+ RefineShowButtonProps,
13
+ } from "@refinedev/ui-types";
14
+
15
+ export type ShowButtonProps = RefineShowButtonProps<ButtonProps>;
16
+
17
+ export type CloneButtonProps = RefineCloneButtonProps<ButtonProps>;
18
+
19
+ export type CreateButtonProps = RefineCreateButtonProps<ButtonProps>;
20
+
21
+ export type DeleteButtonProps = RefineDeleteButtonProps<ButtonProps>;
22
+
23
+ export type EditButtonProps = RefineEditButtonProps<ButtonProps>;
24
+
25
+ export type ExportButtonProps = RefineExportButtonProps<ButtonProps>;
26
+
27
+ export type ImportButtonProps = RefineImportButtonProps & {
28
+ /**
29
+ * Sets the button type
30
+ * @type [UploadProps](https://ant.design/components/upload/#API)
31
+ */
32
+ uploadProps: UploadProps;
33
+ /**
34
+ * Sets props of the button
35
+ * @type [ButtonProps](https://ant.design/components/button/#API)
36
+ */
37
+ buttonProps: ButtonProps;
38
+ };
39
+
40
+ export type ListButtonProps = RefineListButtonProps<ButtonProps>;
41
+
42
+ export type RefreshButtonProps = RefineRefreshButtonProps<ButtonProps>;
43
+
44
+ export type SaveButtonProps = RefineSaveButtonProps<ButtonProps>;
@@ -0,0 +1,135 @@
1
+ import React from "react";
2
+ import { Card, Space, Spin } from "antd";
3
+ import {
4
+ useNavigation,
5
+ useTranslate,
6
+ userFriendlyResourceName,
7
+ useRefineContext,
8
+ useRouterType,
9
+ useResource,
10
+ useBack,
11
+ } from "@refinedev/core";
12
+
13
+ import { Breadcrumb, SaveButton, PageHeader } from "@components";
14
+ import { CreateProps } from "../types";
15
+
16
+ /**
17
+ * `<Create>` provides us a layout to display the page.
18
+ * It does not contain any logic but adds extra functionalities like action buttons and giving titles to the page.
19
+ *
20
+ * @see {@link https://refine.dev/docs/ui-frameworks/antd/components/basic-views/create} for more details.
21
+ */
22
+ export const Create: React.FC<CreateProps> = ({
23
+ title,
24
+ saveButtonProps,
25
+ children,
26
+ resource: resourceFromProps,
27
+ isLoading = false,
28
+ breadcrumb: breadcrumbFromProps,
29
+ wrapperProps,
30
+ headerProps,
31
+ contentProps,
32
+ headerButtonProps,
33
+ headerButtons,
34
+ footerButtonProps,
35
+ footerButtons,
36
+ goBack: goBackFromProps,
37
+ }) => {
38
+ const translate = useTranslate();
39
+ const { options: { breadcrumb: globalBreadcrumb } = {} } =
40
+ useRefineContext();
41
+
42
+ const routerType = useRouterType();
43
+ const back = useBack();
44
+ const { goBack } = useNavigation();
45
+
46
+ const { resource, action } = useResource(resourceFromProps);
47
+
48
+ const breadcrumb =
49
+ typeof breadcrumbFromProps === "undefined"
50
+ ? globalBreadcrumb
51
+ : breadcrumbFromProps;
52
+
53
+ const defaultFooterButtons = (
54
+ <>
55
+ <SaveButton
56
+ {...(isLoading ? { disabled: true } : {})}
57
+ {...saveButtonProps}
58
+ htmlType="submit"
59
+ />
60
+ </>
61
+ );
62
+
63
+ return (
64
+ <div {...(wrapperProps ?? {})}>
65
+ <PageHeader
66
+ ghost={false}
67
+ backIcon={goBackFromProps}
68
+ onBack={
69
+ action !== "list" || typeof action !== "undefined"
70
+ ? routerType === "legacy"
71
+ ? goBack
72
+ : back
73
+ : undefined
74
+ }
75
+ title={
76
+ title ??
77
+ translate(
78
+ `${resource?.name}.titles.create`,
79
+ `Create ${userFriendlyResourceName(
80
+ resource?.meta?.label ??
81
+ resource?.options?.label ??
82
+ resource?.label ??
83
+ resource?.name,
84
+ "singular",
85
+ )}`,
86
+ )
87
+ }
88
+ breadcrumb={
89
+ typeof breadcrumb !== "undefined" ? (
90
+ <>{breadcrumb}</> ?? undefined
91
+ ) : (
92
+ <Breadcrumb />
93
+ )
94
+ }
95
+ extra={
96
+ <Space wrap {...(headerButtonProps ?? {})}>
97
+ {headerButtons
98
+ ? typeof headerButtons === "function"
99
+ ? headerButtons({
100
+ defaultButtons: null,
101
+ })
102
+ : headerButtons
103
+ : null}
104
+ </Space>
105
+ }
106
+ {...(headerProps ?? {})}
107
+ >
108
+ <Spin spinning={isLoading}>
109
+ <Card
110
+ bordered={false}
111
+ actions={[
112
+ <Space
113
+ key="action-buttons"
114
+ style={{ float: "right", marginRight: 24 }}
115
+ {...(footerButtonProps ?? {})}
116
+ >
117
+ {footerButtons
118
+ ? typeof footerButtons === "function"
119
+ ? footerButtons({
120
+ defaultButtons:
121
+ defaultFooterButtons,
122
+ })
123
+ : footerButtons
124
+ : defaultFooterButtons}
125
+ </Space>,
126
+ ]}
127
+ {...(contentProps ?? {})}
128
+ >
129
+ {children}
130
+ </Card>
131
+ </Spin>
132
+ </PageHeader>
133
+ </div>
134
+ );
135
+ };