ding-react-admin 1.0.4 → 2.0.4

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 (230) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +254 -201
  3. package/dist/index.css +2 -0
  4. package/dist/index.js +2073 -1202
  5. package/dist/src/components/NavMenuLabel.d.ts +8 -0
  6. package/dist/src/components/NavMenuLabel.d.ts.map +1 -0
  7. package/dist/src/components/NavMenuSearch.d.ts +9 -0
  8. package/dist/src/components/NavMenuSearch.d.ts.map +1 -0
  9. package/dist/src/components/ScrollableArea.d.ts +10 -0
  10. package/dist/src/components/ScrollableArea.d.ts.map +1 -0
  11. package/dist/src/components/index.d.ts +3 -0
  12. package/dist/src/components/index.d.ts.map +1 -1
  13. package/dist/src/context/AuthProvider.d.ts +2 -0
  14. package/dist/src/context/AuthProvider.d.ts.map +1 -1
  15. package/dist/src/crud/FormGlobalErrorsAlert.d.ts +5 -0
  16. package/dist/src/crud/FormGlobalErrorsAlert.d.ts.map +1 -0
  17. package/dist/src/crud/InlineFormSet.d.ts +2 -17
  18. package/dist/src/crud/InlineFormSet.d.ts.map +1 -1
  19. package/dist/src/crud/ResourceForm.d.ts +2 -10
  20. package/dist/src/crud/ResourceForm.d.ts.map +1 -1
  21. package/dist/src/crud/ResourceFormModal.d.ts +7 -1
  22. package/dist/src/crud/ResourceFormModal.d.ts.map +1 -1
  23. package/dist/src/crud/ResourceList.d.ts.map +1 -1
  24. package/dist/src/crud/ResourceRecordForm.d.ts +27 -0
  25. package/dist/src/crud/ResourceRecordForm.d.ts.map +1 -0
  26. package/dist/src/crud/columns/ImageColumn.d.ts +14 -0
  27. package/dist/src/crud/columns/ImageColumn.d.ts.map +1 -0
  28. package/dist/src/crud/context/InlineFieldsRegistry.d.ts +15 -0
  29. package/dist/src/crud/context/InlineFieldsRegistry.d.ts.map +1 -0
  30. package/dist/src/crud/context/PayloadFieldsContext.d.ts +18 -0
  31. package/dist/src/crud/context/PayloadFieldsContext.d.ts.map +1 -0
  32. package/dist/src/crud/fields/FileField.d.ts +12 -0
  33. package/dist/src/crud/fields/FileField.d.ts.map +1 -0
  34. package/dist/src/crud/fields/ImageField.d.ts +14 -0
  35. package/dist/src/crud/fields/ImageField.d.ts.map +1 -0
  36. package/dist/src/crud/fields/ReferenceField.d.ts +12 -2
  37. package/dist/src/crud/fields/ReferenceField.d.ts.map +1 -1
  38. package/dist/src/crud/fields/ReferenceInputActions.d.ts +16 -0
  39. package/dist/src/crud/fields/ReferenceInputActions.d.ts.map +1 -0
  40. package/dist/src/crud/fields/ReferenceManyField.d.ts +10 -1
  41. package/dist/src/crud/fields/ReferenceManyField.d.ts.map +1 -1
  42. package/dist/src/crud/fields/uploadFieldUtils.d.ts +5 -0
  43. package/dist/src/crud/fields/uploadFieldUtils.d.ts.map +1 -0
  44. package/dist/src/crud/fields/useUploadPreviewUrl.d.ts +4 -0
  45. package/dist/src/crud/fields/useUploadPreviewUrl.d.ts.map +1 -0
  46. package/dist/src/crud/filters/ReferenceFilter.d.ts +1 -1
  47. package/dist/src/crud/filters/ReferenceFilter.d.ts.map +1 -1
  48. package/dist/src/crud/index.d.ts +27 -9
  49. package/dist/src/crud/index.d.ts.map +1 -1
  50. package/dist/src/crud/types.d.ts +21 -7
  51. package/dist/src/crud/types.d.ts.map +1 -1
  52. package/dist/src/crud/utils/buildFormPayload.d.ts +6 -0
  53. package/dist/src/crud/utils/buildFormPayload.d.ts.map +1 -0
  54. package/dist/src/crud/utils/buildInlineRowsPayload.d.ts +6 -0
  55. package/dist/src/crud/utils/buildInlineRowsPayload.d.ts.map +1 -0
  56. package/dist/src/crud/utils/buildResourceFormSubmitBody.d.ts +5 -0
  57. package/dist/src/crud/utils/buildResourceFormSubmitBody.d.ts.map +1 -0
  58. package/dist/src/crud/utils/choiceSelectionUtils.d.ts +10 -0
  59. package/dist/src/crud/utils/choiceSelectionUtils.d.ts.map +1 -0
  60. package/dist/src/crud/utils/choiceSelectionUtils.test.d.ts +2 -0
  61. package/dist/src/crud/utils/choiceSelectionUtils.test.d.ts.map +1 -0
  62. package/dist/src/crud/utils/formErrors.d.ts +18 -7
  63. package/dist/src/crud/utils/formErrors.d.ts.map +1 -1
  64. package/dist/src/crud/utils/formErrors.test.d.ts +2 -0
  65. package/dist/src/crud/utils/formErrors.test.d.ts.map +1 -0
  66. package/dist/src/crud/utils/getFormValue.d.ts +3 -0
  67. package/dist/src/crud/utils/getFormValue.d.ts.map +1 -0
  68. package/dist/src/crud/utils/hasUploadValues.d.ts +3 -0
  69. package/dist/src/crud/utils/hasUploadValues.d.ts.map +1 -0
  70. package/dist/src/crud/utils/nestedFieldPath.d.ts +3 -0
  71. package/dist/src/crud/utils/nestedFieldPath.d.ts.map +1 -0
  72. package/dist/src/crud/utils/prepareFormSubmitBody.d.ts +8 -0
  73. package/dist/src/crud/utils/prepareFormSubmitBody.d.ts.map +1 -0
  74. package/dist/src/crud/utils/referenceSelectNotFoundContent.d.ts +4 -0
  75. package/dist/src/crud/utils/referenceSelectNotFoundContent.d.ts.map +1 -0
  76. package/dist/src/crud/utils/setFormValue.d.ts +3 -0
  77. package/dist/src/crud/utils/setFormValue.d.ts.map +1 -0
  78. package/dist/src/crud/utils/toFormData.d.ts +13 -0
  79. package/dist/src/crud/utils/toFormData.d.ts.map +1 -0
  80. package/dist/src/crud/utils/uploadReferenceUtils.d.ts +5 -0
  81. package/dist/src/crud/utils/uploadReferenceUtils.d.ts.map +1 -0
  82. package/dist/src/crud/utils/useChoices.d.ts +27 -1
  83. package/dist/src/crud/utils/useChoices.d.ts.map +1 -1
  84. package/dist/src/crud/utils/useFormRecord.d.ts +44 -0
  85. package/dist/src/crud/utils/useFormRecord.d.ts.map +1 -0
  86. package/dist/src/data/createRestResourceHandlers.d.ts +5 -5
  87. package/dist/src/data/createRestResourceHandlers.d.ts.map +1 -1
  88. package/dist/src/data/dataProviderTypes.d.ts +6 -5
  89. package/dist/src/data/dataProviderTypes.d.ts.map +1 -1
  90. package/dist/src/data/parseFormErrorHelpers.d.ts +23 -6
  91. package/dist/src/data/parseFormErrorHelpers.d.ts.map +1 -1
  92. package/dist/src/data/resourceHandlers.d.ts +1 -1
  93. package/dist/src/data/resourceHandlers.d.ts.map +1 -1
  94. package/dist/src/index.d.ts +4 -4
  95. package/dist/src/index.d.ts.map +1 -1
  96. package/dist/src/layouts/AdminLayout.d.ts +1 -1
  97. package/dist/src/layouts/AdminLayout.d.ts.map +1 -1
  98. package/dist/src/layouts/AuthPageLayout.d.ts.map +1 -1
  99. package/dist/src/layouts/navFilter.d.ts +5 -0
  100. package/dist/src/layouts/navFilter.d.ts.map +1 -0
  101. package/dist/src/layouts/navMenuItems.d.ts +6 -0
  102. package/dist/src/layouts/navMenuItems.d.ts.map +1 -0
  103. package/dist/src/types.d.ts +12 -0
  104. package/dist/src/types.d.ts.map +1 -1
  105. package/package.json +79 -59
  106. package/src/app/AdminApp.tsx +34 -34
  107. package/src/components/AuthAlternateLink.tsx +23 -23
  108. package/src/components/DensitySwitch.tsx +31 -31
  109. package/src/components/NavMenuLabel.tsx +26 -0
  110. package/src/components/NavMenuSearch.tsx +76 -0
  111. package/src/components/ScrollableArea.tsx +46 -0
  112. package/src/components/ThemeSwitch.tsx +28 -28
  113. package/src/components/ThemeToolbar.tsx +34 -34
  114. package/src/components/index.ts +7 -4
  115. package/src/components/navMenu.css +21 -0
  116. package/src/components/scrollable.css +28 -0
  117. package/src/context/AppThemeProvider.tsx +128 -128
  118. package/src/context/AuthProvider.tsx +89 -77
  119. package/src/context/DataProvider.tsx +30 -30
  120. package/src/context/PermissionsProvider.tsx +57 -57
  121. package/src/crud/FilterBar.tsx +36 -36
  122. package/src/crud/FormGlobalErrorsAlert.tsx +36 -0
  123. package/src/crud/FormSteps.tsx +135 -135
  124. package/src/crud/FormTabs.tsx +126 -126
  125. package/src/crud/InlineFormSet.tsx +162 -219
  126. package/src/crud/ListActionsBar.tsx +106 -106
  127. package/src/crud/ResourceForm.tsx +83 -166
  128. package/src/crud/ResourceFormModal.tsx +75 -133
  129. package/src/crud/ResourceList.tsx +1 -0
  130. package/src/crud/ResourceRecordForm.tsx +166 -0
  131. package/src/crud/columns/BooleanColumn.tsx +32 -32
  132. package/src/crud/columns/CustomColumn.tsx +33 -33
  133. package/src/crud/columns/DateColumn.tsx +28 -28
  134. package/src/crud/columns/ImageColumn.tsx +58 -0
  135. package/src/crud/columns/NumberColumn.tsx +31 -31
  136. package/src/crud/columns/ReferenceColumn.tsx +85 -85
  137. package/src/crud/columns/ReferenceManyColumn.tsx +67 -67
  138. package/src/crud/columns/TextColumn.tsx +38 -38
  139. package/src/crud/context/FilterContext.tsx +71 -71
  140. package/src/crud/context/FormContext.tsx +39 -39
  141. package/src/crud/context/FormSectionContext.tsx +22 -22
  142. package/src/crud/context/InlineFieldsRegistry.tsx +61 -0
  143. package/src/crud/context/ListContext.tsx +93 -93
  144. package/src/crud/context/PayloadFieldsContext.tsx +62 -0
  145. package/src/crud/fields/BooleanField.tsx +38 -38
  146. package/src/crud/fields/DateField.tsx +53 -53
  147. package/src/crud/fields/FieldWrapper.tsx +87 -87
  148. package/src/crud/fields/FileField.tsx +123 -0
  149. package/src/crud/fields/ImageField.tsx +120 -0
  150. package/src/crud/fields/NumberField.tsx +52 -52
  151. package/src/crud/fields/PasswordField.tsx +99 -99
  152. package/src/crud/fields/ReferenceField.tsx +237 -96
  153. package/src/crud/fields/ReferenceInputActions.tsx +106 -0
  154. package/src/crud/fields/ReferenceManyField.tsx +200 -76
  155. package/src/crud/fields/SelectField.tsx +48 -48
  156. package/src/crud/fields/TextField.tsx +46 -46
  157. package/src/crud/fields/uploadFieldUtils.ts +21 -0
  158. package/src/crud/fields/useUploadPreviewUrl.ts +20 -0
  159. package/src/crud/filters/BooleanFilter.tsx +38 -38
  160. package/src/crud/filters/DateFilter.tsx +35 -35
  161. package/src/crud/filters/NumberFilter.tsx +33 -33
  162. package/src/crud/filters/ReferenceFilter.tsx +192 -173
  163. package/src/crud/filters/SelectFilter.tsx +44 -44
  164. package/src/crud/filters/TextFilter.tsx +36 -36
  165. package/src/crud/index.ts +99 -90
  166. package/src/crud/types.ts +146 -132
  167. package/src/crud/utils/buildFormPayload.ts +24 -0
  168. package/src/crud/utils/buildInlineRowsPayload.ts +37 -0
  169. package/src/crud/utils/buildResourceFormSubmitBody.ts +29 -0
  170. package/src/crud/utils/choiceSelectionUtils.test.ts +45 -0
  171. package/src/crud/utils/choiceSelectionUtils.ts +116 -0
  172. package/src/crud/utils/formErrors.test.ts +168 -0
  173. package/src/crud/utils/formErrors.ts +138 -38
  174. package/src/crud/utils/formSectionErrors.ts +85 -85
  175. package/src/crud/utils/{getByPath.ts → getFormValue.ts} +13 -13
  176. package/src/crud/utils/hasUploadValues.ts +9 -0
  177. package/src/crud/utils/nestedFieldPath.ts +8 -0
  178. package/src/crud/utils/prepareFormSubmitBody.ts +22 -0
  179. package/src/crud/utils/referenceSelectNotFoundContent.tsx +7 -0
  180. package/src/crud/utils/{setByPath.ts → setFormValue.ts} +18 -18
  181. package/src/crud/utils/sortQueryParam.ts +37 -37
  182. package/src/crud/utils/toFormData.ts +79 -0
  183. package/src/crud/utils/uploadReferenceUtils.ts +44 -0
  184. package/src/crud/utils/useAbortableEffect.ts +17 -17
  185. package/src/crud/utils/useChoices.ts +330 -182
  186. package/src/crud/utils/useFormRecord.ts +179 -0
  187. package/src/crud/utils/useListQueryState.ts +191 -191
  188. package/src/data/abortError.test.ts +19 -19
  189. package/src/data/abortError.ts +10 -10
  190. package/src/data/createMemoryResourceHandlers.ts +78 -78
  191. package/src/data/createRestResourceHandlers.ts +63 -57
  192. package/src/data/dataProviderTypes.ts +7 -5
  193. package/src/data/dataUtils.test.ts +228 -108
  194. package/src/data/inMemoryList.ts +97 -97
  195. package/src/data/parseFormErrorHelpers.test.ts +201 -84
  196. package/src/data/parseFormErrorHelpers.ts +376 -224
  197. package/src/data/resourceHandlers.ts +1 -1
  198. package/src/data/sortHelpers.ts +48 -48
  199. package/src/index.ts +211 -195
  200. package/src/layouts/AdminLayout.tsx +530 -381
  201. package/src/layouts/AuthPageLayout.tsx +87 -81
  202. package/src/layouts/navFilter.ts +49 -0
  203. package/src/layouts/navMenuItems.tsx +44 -0
  204. package/src/pages/LoginPage.tsx +80 -80
  205. package/src/pages/PlaceholderPage.tsx +9 -9
  206. package/src/permissions/resourcePermissions.ts +47 -47
  207. package/src/router/createAdminRouter.tsx +64 -64
  208. package/src/router/guards.tsx +63 -63
  209. package/src/router/routeAccess.ts +89 -89
  210. package/src/types.ts +10 -0
  211. package/src/vite-env.d.ts +1 -1
  212. package/dist/src/crud/context/SubmitFieldsContext.d.ts +0 -18
  213. package/dist/src/crud/context/SubmitFieldsContext.d.ts.map +0 -1
  214. package/dist/src/crud/utils/getByPath.d.ts +0 -3
  215. package/dist/src/crud/utils/getByPath.d.ts.map +0 -1
  216. package/dist/src/crud/utils/inlineArrayName.d.ts +0 -3
  217. package/dist/src/crud/utils/inlineArrayName.d.ts.map +0 -1
  218. package/dist/src/crud/utils/inlineFieldName.d.ts +0 -3
  219. package/dist/src/crud/utils/inlineFieldName.d.ts.map +0 -1
  220. package/dist/src/crud/utils/pickBySources.d.ts +0 -6
  221. package/dist/src/crud/utils/pickBySources.d.ts.map +0 -1
  222. package/dist/src/crud/utils/setByPath.d.ts +0 -3
  223. package/dist/src/crud/utils/setByPath.d.ts.map +0 -1
  224. package/dist/src/crud/utils/useResourceFormData.d.ts +0 -47
  225. package/dist/src/crud/utils/useResourceFormData.d.ts.map +0 -1
  226. package/src/crud/context/SubmitFieldsContext.tsx +0 -62
  227. package/src/crud/utils/inlineArrayName.ts +0 -4
  228. package/src/crud/utils/inlineFieldName.ts +0 -8
  229. package/src/crud/utils/pickBySources.ts +0 -24
  230. package/src/crud/utils/useResourceFormData.ts +0 -231
@@ -1,3 +1,3 @@
1
1
  import { AdminLayoutProps } from '../types';
2
- export declare function AdminLayout({ navItems, brand, collapsedBrand, mobileDrawerTitle, headerExtras, userMenuItems, onUserMenuClick, loginPath, siderCollapsedStorageKey, }: AdminLayoutProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function AdminLayout({ navItems, brand, collapsedBrand, mobileDrawerTitle, headerExtras, userMenuItems, onUserMenuClick, loginPath, siderCollapsedStorageKey, navSearch, }: AdminLayoutProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=AdminLayout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../src/layouts/AdminLayout.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,gBAAgB,EAAW,MAAM,UAAU,CAAC;AAyG1D,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,KAAe,EACf,cAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,SAAoB,EACpB,wBAA4C,GAC7C,EAAE,gBAAgB,2CAiPlB"}
1
+ {"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../src/layouts/AdminLayout.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,gBAAgB,EAAW,MAAM,UAAU,CAAC;AAC1D,OAAO,2BAA2B,CAAC;AA4InC,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,KAAe,EACf,cAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,SAAoB,EACpB,wBAA4C,EAC5C,SAAgB,GACjB,EAAE,gBAAgB,2CA0VlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"AuthPageLayout.d.ts","sourceRoot":"","sources":["../../../src/layouts/AuthPageLayout.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,KAAK,EACL,MAAM,EACN,gBAAuB,GACxB,EAAE,mBAAmB,2CA8DrB"}
1
+ {"version":3,"file":"AuthPageLayout.d.ts","sourceRoot":"","sources":["../../../src/layouts/AuthPageLayout.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,KAAK,EACL,MAAM,EACN,gBAAuB,GACxB,EAAE,mBAAmB,2CAmErB"}
@@ -0,0 +1,5 @@
1
+ import { NavItem } from '../types';
2
+ export declare function getNavItemLabel(item: NavItem): string;
3
+ export declare function filterNavItems(items: NavItem[], query: string): NavItem[];
4
+ export declare function collectSubmenuKeys(items: NavItem[]): string[];
5
+ //# sourceMappingURL=navFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navFilter.d.ts","sourceRoot":"","sources":["../../../src/layouts/navFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAKrD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAyBzE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAY7D"}
@@ -0,0 +1,6 @@
1
+ import { MenuProps } from 'antd';
2
+ import { NavItem } from '../types';
3
+ export declare function navItemsToAntdItems(items: NavItem[], options?: {
4
+ showLabelTooltip?: boolean;
5
+ }): NonNullable<MenuProps["items"]>;
6
+ //# sourceMappingURL=navMenuItems.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navMenuItems.d.ts","sourceRoot":"","sources":["../../../src/layouts/navMenuItems.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGxC,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EAAE,EAChB,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,GACvC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAmCjC"}
@@ -30,6 +30,11 @@ export type AuthAdapter = {
30
30
  logout: () => void;
31
31
  /** Synchronous read of session (e.g. token). Used after mount and after login/logout. */
32
32
  getToken: () => string | null;
33
+ /**
34
+ * Label for the account menu in `AdminLayout` (top-right button).
35
+ * Return `null` when no user is loaded. Defaults to `"User"` when omitted.
36
+ */
37
+ getUserLabel?: () => string | null;
33
38
  };
34
39
  /** How a route participates in auth when using `AdminApp` / `createAdminRouter`. */
35
40
  export type RouteAccess =
@@ -68,6 +73,13 @@ export type AdminLayoutProps = {
68
73
  loginPath?: string;
69
74
  /** localStorage key for sider collapsed state. Default `ding-react-admin-sider-collapsed`. */
70
75
  siderCollapsedStorageKey?: string;
76
+ /**
77
+ * Sidebar menu search. Enabled by default; pass `false` to hide.
78
+ * Use an object to customize the placeholder.
79
+ */
80
+ navSearch?: boolean | {
81
+ placeholder?: string;
82
+ };
71
83
  };
72
84
  export type { AuthPageLayoutProps } from './layouts/AuthPageLayout';
73
85
  export type { AuthAlternateLinkProps } from './components/AuthAlternateLink';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,59 +1,79 @@
1
- {
2
- "name": "ding-react-admin",
3
- "version": "1.0.4",
4
- "type": "module",
5
- "license": "MIT",
6
- "description": "Composable admin shell (Ant Design + React Router): quick-start AdminApp or build your own layout.",
7
- "repository": {
8
- "type": "git",
9
- "url": "https://github.com/Muhammadinaam/ding-react-admin.git"
10
- },
11
- "main": "./dist/index.js",
12
- "module": "./dist/index.js",
13
- "types": "./dist/index.d.ts",
14
- "exports": {
15
- ".": {
16
- "types": "./dist/index.d.ts",
17
- "import": "./dist/index.js"
18
- }
19
- },
20
- "files": [
21
- "dist",
22
- "src",
23
- "docs/assets"
24
- ],
25
- "scripts": {
26
- "build": "vite build && node -e \"require('fs').writeFileSync('dist/index.d.ts','export * from \\\"./src/index\\\";\\n')\"",
27
- "dev:example": "yarn --cwd examples/playground dev",
28
- "build:example": "yarn --cwd examples/playground build",
29
- "build:example:gh-pages": "yarn --cwd examples/playground build:gh-pages",
30
- "test": "vitest run",
31
- "prepublishOnly": "yarn build"
32
- },
33
- "peerDependencies": {
34
- "@ant-design/icons": ">=6",
35
- "antd": ">=6",
36
- "dayjs": ">=1",
37
- "react": ">=18",
38
- "react-dom": ">=18",
39
- "react-hook-form": ">=7",
40
- "react-router-dom": ">=6"
41
- },
42
- "devDependencies": {
43
- "@ant-design/icons": "^6.0.0",
44
- "@types/react": "^19.2.14",
45
- "@types/react-dom": "^19.2.3",
46
- "@vitejs/plugin-react": "^6.0.1",
47
- "antd": "^6.0.0",
48
- "dayjs": "^1.11.13",
49
- "react": "^19.2.5",
50
- "react-dom": "^19.2.5",
51
- "react-hook-form": "^7.56.4",
52
- "react-router-dom": "^7.14.2",
53
- "typescript": "~6.0.2",
54
- "vite": "^8.0.9",
55
- "vite-plugin-dts": "^4.5.4",
56
- "vitest": "^3.2.4"
57
- },
58
- "dependencies": {}
59
- }
1
+ {
2
+ "name": "ding-react-admin",
3
+ "version": "2.0.4",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "description": "Composable admin shell (Ant Design + React Router): quick-start AdminApp or build your own layout.",
7
+ "keywords": [
8
+ "react",
9
+ "admin",
10
+ "dashboard",
11
+ "antd",
12
+ "ant-design",
13
+ "crud",
14
+ "react-router",
15
+ "react-hook-form",
16
+ "data-grid",
17
+ "forms",
18
+ "typescript"
19
+ ],
20
+ "homepage": "https://muhammadinaam.github.io/ding-react-admin/",
21
+ "bugs": {
22
+ "url": "https://github.com/Muhammadinaam/ding-react-admin/issues"
23
+ },
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "https://github.com/Muhammadinaam/ding-react-admin.git"
27
+ },
28
+ "publishConfig": {
29
+ "provenance": true
30
+ },
31
+ "main": "./dist/index.js",
32
+ "module": "./dist/index.js",
33
+ "types": "./dist/index.d.ts",
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "import": "./dist/index.js"
38
+ }
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "src",
43
+ "docs/assets"
44
+ ],
45
+ "scripts": {
46
+ "build": "vite build && node -e \"require('fs').writeFileSync('dist/index.d.ts','export * from \\\"./src/index\\\";\\n')\"",
47
+ "dev:example": "yarn --cwd examples/playground dev",
48
+ "build:example": "yarn --cwd examples/playground build",
49
+ "build:example:gh-pages": "yarn --cwd examples/playground build:gh-pages",
50
+ "test": "vitest run",
51
+ "prepublishOnly": "yarn build"
52
+ },
53
+ "peerDependencies": {
54
+ "@ant-design/icons": ">=6",
55
+ "antd": ">=6",
56
+ "dayjs": ">=1",
57
+ "react": ">=18",
58
+ "react-dom": ">=18",
59
+ "react-hook-form": ">=7",
60
+ "react-router-dom": ">=6"
61
+ },
62
+ "devDependencies": {
63
+ "@ant-design/icons": "^6.0.0",
64
+ "@types/react": "^19.2.14",
65
+ "@types/react-dom": "^19.2.3",
66
+ "@vitejs/plugin-react": "^6.0.1",
67
+ "antd": "^6.0.0",
68
+ "dayjs": "^1.11.13",
69
+ "react": "^19.2.5",
70
+ "react-dom": "^19.2.5",
71
+ "react-hook-form": "^7.56.4",
72
+ "react-router-dom": "^7.14.2",
73
+ "typescript": "~6.0.2",
74
+ "vite": "^8.0.9",
75
+ "vite-plugin-dts": "^4.5.4",
76
+ "vitest": "^3.2.4"
77
+ },
78
+ "dependencies": {}
79
+ }
@@ -1,34 +1,34 @@
1
- import { useMemo } from "react";
2
- import { RouterProvider } from "react-router-dom";
3
- import { AppThemeProvider } from "../context/AppThemeProvider";
4
- import { createAdminRouter } from "../router/createAdminRouter";
5
- import type { AdminAppProps } from "../types";
6
-
7
- /**
8
- * Declarative admin shell: theme, router, and layout from your route list.
9
- * Wrap in `<AuthProvider adapter={...}>` — auth is not configured on this component.
10
- */
11
- export function AdminApp({
12
- navItems,
13
- routes,
14
- authRedirects,
15
- layoutProps,
16
- theme: themeKeys,
17
- }: AdminAppProps) {
18
- const router = useMemo(
19
- () =>
20
- createAdminRouter({
21
- navItems,
22
- children: routes,
23
- layoutProps,
24
- redirects: authRedirects,
25
- }),
26
- [navItems, routes, layoutProps, authRedirects],
27
- );
28
-
29
- return (
30
- <AppThemeProvider {...themeKeys}>
31
- <RouterProvider router={router} />
32
- </AppThemeProvider>
33
- );
34
- }
1
+ import { useMemo } from "react";
2
+ import { RouterProvider } from "react-router-dom";
3
+ import { AppThemeProvider } from "../context/AppThemeProvider";
4
+ import { createAdminRouter } from "../router/createAdminRouter";
5
+ import type { AdminAppProps } from "../types";
6
+
7
+ /**
8
+ * Declarative admin shell: theme, router, and layout from your route list.
9
+ * Wrap in `<AuthProvider adapter={...}>` — auth is not configured on this component.
10
+ */
11
+ export function AdminApp({
12
+ navItems,
13
+ routes,
14
+ authRedirects,
15
+ layoutProps,
16
+ theme: themeKeys,
17
+ }: AdminAppProps) {
18
+ const router = useMemo(
19
+ () =>
20
+ createAdminRouter({
21
+ navItems,
22
+ children: routes,
23
+ layoutProps,
24
+ redirects: authRedirects,
25
+ }),
26
+ [navItems, routes, layoutProps, authRedirects],
27
+ );
28
+
29
+ return (
30
+ <AppThemeProvider {...themeKeys}>
31
+ <RouterProvider router={router} />
32
+ </AppThemeProvider>
33
+ );
34
+ }
@@ -1,23 +1,23 @@
1
- import { Typography } from "antd";
2
- import { Link } from "react-router-dom";
3
-
4
- export type AuthAlternateLinkProps = {
5
- prompt: string;
6
- linkText: string;
7
- to: string;
8
- };
9
-
10
- export function AuthAlternateLink({
11
- prompt,
12
- linkText,
13
- to,
14
- }: AuthAlternateLinkProps) {
15
- return (
16
- <Typography.Paragraph
17
- type="secondary"
18
- style={{ textAlign: "center", marginBottom: 0 }}
19
- >
20
- {prompt} <Link to={to}>{linkText}</Link>
21
- </Typography.Paragraph>
22
- );
23
- }
1
+ import { Typography } from "antd";
2
+ import { Link } from "react-router-dom";
3
+
4
+ export type AuthAlternateLinkProps = {
5
+ prompt: string;
6
+ linkText: string;
7
+ to: string;
8
+ };
9
+
10
+ export function AuthAlternateLink({
11
+ prompt,
12
+ linkText,
13
+ to,
14
+ }: AuthAlternateLinkProps) {
15
+ return (
16
+ <Typography.Paragraph
17
+ type="secondary"
18
+ style={{ textAlign: "center", marginBottom: 0 }}
19
+ >
20
+ {prompt} <Link to={to}>{linkText}</Link>
21
+ </Typography.Paragraph>
22
+ );
23
+ }
@@ -1,31 +1,31 @@
1
- import { ColumnHeightOutlined, LayoutOutlined } from "@ant-design/icons";
2
- import { Segmented } from "antd";
3
- import type { SegmentedProps } from "antd";
4
- import { useThemeMode } from "../context/AppThemeProvider";
5
- import type { ThemeDensity } from "../types";
6
-
7
- const OPTIONS: SegmentedProps["options"] = [
8
- {
9
- label: "Comfortable",
10
- value: "comfortable",
11
- icon: <LayoutOutlined />,
12
- },
13
- {
14
- label: "Compact",
15
- value: "compact",
16
- icon: <ColumnHeightOutlined />,
17
- },
18
- ];
19
-
20
- export function DensitySwitch() {
21
- const { density, setDensity } = useThemeMode();
22
-
23
- return (
24
- <Segmented
25
- size="small"
26
- value={density}
27
- options={OPTIONS}
28
- onChange={(v) => setDensity(v as ThemeDensity)}
29
- />
30
- );
31
- }
1
+ import { ColumnHeightOutlined, LayoutOutlined } from "@ant-design/icons";
2
+ import { Segmented } from "antd";
3
+ import type { SegmentedProps } from "antd";
4
+ import { useThemeMode } from "../context/AppThemeProvider";
5
+ import type { ThemeDensity } from "../types";
6
+
7
+ const OPTIONS: SegmentedProps["options"] = [
8
+ {
9
+ label: "Comfortable",
10
+ value: "comfortable",
11
+ icon: <LayoutOutlined />,
12
+ },
13
+ {
14
+ label: "Compact",
15
+ value: "compact",
16
+ icon: <ColumnHeightOutlined />,
17
+ },
18
+ ];
19
+
20
+ export function DensitySwitch() {
21
+ const { density, setDensity } = useThemeMode();
22
+
23
+ return (
24
+ <Segmented
25
+ size="small"
26
+ value={density}
27
+ options={OPTIONS}
28
+ onChange={(v) => setDensity(v as ThemeDensity)}
29
+ />
30
+ );
31
+ }
@@ -0,0 +1,26 @@
1
+ import { Tooltip } from "antd";
2
+ import type { ReactNode } from "react";
3
+ import "./navMenu.css";
4
+
5
+ export type NavMenuLabelProps = {
6
+ label: ReactNode;
7
+ /** Plain-text tooltip shown on hover. */
8
+ title: string;
9
+ };
10
+
11
+ export function NavMenuLabel({ label, title }: NavMenuLabelProps) {
12
+ if (!title) {
13
+ return <span className="ding-admin-menu-label">{label}</span>;
14
+ }
15
+
16
+ return (
17
+ <Tooltip
18
+ title={title}
19
+ placement="right"
20
+ mouseEnterDelay={1}
21
+ destroyOnHidden
22
+ >
23
+ <span className="ding-admin-menu-label">{label}</span>
24
+ </Tooltip>
25
+ );
26
+ }
@@ -0,0 +1,76 @@
1
+ import { SearchOutlined } from "@ant-design/icons";
2
+ import { ConfigProvider, Input, theme } from "antd";
3
+ import type { ChangeEvent } from "react";
4
+
5
+ export type NavMenuSearchProps = {
6
+ value: string;
7
+ onChange: (value: string) => void;
8
+ placeholder?: string;
9
+ /** Lighter styling for the classic dark navy sidebar. */
10
+ variant?: "on-dark" | "app";
11
+ };
12
+
13
+ export function NavMenuSearch({
14
+ value,
15
+ onChange,
16
+ placeholder = "Search menu…",
17
+ variant = "on-dark",
18
+ }: NavMenuSearchProps) {
19
+ const { token } = theme.useToken();
20
+ const onDark = variant === "on-dark";
21
+
22
+ const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
23
+ onChange(event.target.value);
24
+ };
25
+
26
+ return (
27
+ <div
28
+ style={{
29
+ flexShrink: 0,
30
+ paddingInline: token.paddingSM,
31
+ paddingBlock: token.paddingXS,
32
+ }}
33
+ >
34
+ <ConfigProvider
35
+ theme={
36
+ onDark
37
+ ? { token: { colorTextPlaceholder: "rgba(255, 255, 255, 0.45)" } }
38
+ : undefined
39
+ }
40
+ >
41
+ <Input
42
+ allowClear
43
+ size="small"
44
+ value={value}
45
+ onChange={handleChange}
46
+ placeholder={placeholder}
47
+ prefix={
48
+ <SearchOutlined
49
+ style={{
50
+ color: onDark
51
+ ? "rgba(255, 255, 255, 0.45)"
52
+ : token.colorTextDescription,
53
+ }}
54
+ />
55
+ }
56
+ aria-label={placeholder}
57
+ styles={{
58
+ input: onDark
59
+ ? { color: "rgba(255, 255, 255, 0.88)" }
60
+ : undefined,
61
+ clear: onDark
62
+ ? { color: "rgba(255, 255, 255, 0.45)" }
63
+ : undefined,
64
+ }}
65
+ style={{
66
+ background: onDark
67
+ ? "rgba(255, 255, 255, 0.08)"
68
+ : token.colorFillTertiary,
69
+ borderColor: "transparent",
70
+ boxShadow: "none",
71
+ }}
72
+ />
73
+ </ConfigProvider>
74
+ </div>
75
+ );
76
+ }
@@ -0,0 +1,46 @@
1
+ import { theme } from "antd";
2
+ import { forwardRef } from "react";
3
+ import type { CSSProperties, ReactNode } from "react";
4
+ import "./scrollable.css";
5
+
6
+ export type ScrollableAreaProps = {
7
+ children: ReactNode;
8
+ className?: string;
9
+ style?: CSSProperties;
10
+ /** Use lighter thumbs on dark sidebar backgrounds. */
11
+ variant?: "default" | "on-dark";
12
+ };
13
+
14
+ export const ScrollableArea = forwardRef<HTMLDivElement, ScrollableAreaProps>(
15
+ function ScrollableArea(
16
+ { children, className, style, variant = "default" },
17
+ ref,
18
+ ) {
19
+ const { token } = theme.useToken();
20
+
21
+ const thumb =
22
+ variant === "on-dark"
23
+ ? "rgba(255, 255, 255, 0.22)"
24
+ : token.colorTextQuaternary;
25
+ const thumbHover =
26
+ variant === "on-dark"
27
+ ? "rgba(255, 255, 255, 0.38)"
28
+ : token.colorTextTertiary;
29
+
30
+ return (
31
+ <div
32
+ ref={ref}
33
+ className={["ding-admin-scroll", className].filter(Boolean).join(" ")}
34
+ style={
35
+ {
36
+ ...style,
37
+ "--ding-scroll-thumb": thumb,
38
+ "--ding-scroll-thumb-hover": thumbHover,
39
+ } as CSSProperties
40
+ }
41
+ >
42
+ {children}
43
+ </div>
44
+ );
45
+ },
46
+ );
@@ -1,28 +1,28 @@
1
- import {
2
- DesktopOutlined,
3
- MoonOutlined,
4
- SunOutlined,
5
- } from "@ant-design/icons";
6
- import { Segmented } from "antd";
7
- import type { SegmentedProps } from "antd";
8
- import type { ThemeMode } from "../types";
9
- import { useThemeMode } from "../context/AppThemeProvider";
10
-
11
- const OPTIONS: SegmentedProps["options"] = [
12
- { label: "Light", value: "light", icon: <SunOutlined /> },
13
- { label: "Dark", value: "dark", icon: <MoonOutlined /> },
14
- { label: "Auto", value: "system", icon: <DesktopOutlined /> },
15
- ];
16
-
17
- export function ThemeSwitch() {
18
- const { mode, setMode } = useThemeMode();
19
-
20
- return (
21
- <Segmented
22
- size="small"
23
- value={mode}
24
- options={OPTIONS}
25
- onChange={(v) => setMode(v as ThemeMode)}
26
- />
27
- );
28
- }
1
+ import {
2
+ DesktopOutlined,
3
+ MoonOutlined,
4
+ SunOutlined,
5
+ } from "@ant-design/icons";
6
+ import { Segmented } from "antd";
7
+ import type { SegmentedProps } from "antd";
8
+ import type { ThemeMode } from "../types";
9
+ import { useThemeMode } from "../context/AppThemeProvider";
10
+
11
+ const OPTIONS: SegmentedProps["options"] = [
12
+ { label: "Light", value: "light", icon: <SunOutlined /> },
13
+ { label: "Dark", value: "dark", icon: <MoonOutlined /> },
14
+ { label: "Auto", value: "system", icon: <DesktopOutlined /> },
15
+ ];
16
+
17
+ export function ThemeSwitch() {
18
+ const { mode, setMode } = useThemeMode();
19
+
20
+ return (
21
+ <Segmented
22
+ size="small"
23
+ value={mode}
24
+ options={OPTIONS}
25
+ onChange={(v) => setMode(v as ThemeMode)}
26
+ />
27
+ );
28
+ }