ding-react-admin 2.0.0 → 2.0.5

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 (169) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +254 -195
  3. package/dist/index.css +1 -0
  4. package/dist/index.js +1773 -1170
  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/ResourceForm.d.ts +1 -4
  18. package/dist/src/crud/ResourceForm.d.ts.map +1 -1
  19. package/dist/src/crud/ResourceFormModal.d.ts +7 -1
  20. package/dist/src/crud/ResourceFormModal.d.ts.map +1 -1
  21. package/dist/src/crud/ResourceRecordForm.d.ts +27 -0
  22. package/dist/src/crud/ResourceRecordForm.d.ts.map +1 -0
  23. package/dist/src/crud/fields/ReferenceField.d.ts +12 -2
  24. package/dist/src/crud/fields/ReferenceField.d.ts.map +1 -1
  25. package/dist/src/crud/fields/ReferenceInputActions.d.ts +16 -0
  26. package/dist/src/crud/fields/ReferenceInputActions.d.ts.map +1 -0
  27. package/dist/src/crud/fields/ReferenceManyField.d.ts +10 -1
  28. package/dist/src/crud/fields/ReferenceManyField.d.ts.map +1 -1
  29. package/dist/src/crud/filters/ReferenceFilter.d.ts +1 -1
  30. package/dist/src/crud/filters/ReferenceFilter.d.ts.map +1 -1
  31. package/dist/src/crud/index.d.ts +5 -0
  32. package/dist/src/crud/index.d.ts.map +1 -1
  33. package/dist/src/crud/types.d.ts +12 -0
  34. package/dist/src/crud/types.d.ts.map +1 -1
  35. package/dist/src/crud/utils/choiceSelectionUtils.d.ts +10 -0
  36. package/dist/src/crud/utils/choiceSelectionUtils.d.ts.map +1 -0
  37. package/dist/src/crud/utils/choiceSelectionUtils.test.d.ts +2 -0
  38. package/dist/src/crud/utils/choiceSelectionUtils.test.d.ts.map +1 -0
  39. package/dist/src/crud/utils/formErrors.d.ts +18 -7
  40. package/dist/src/crud/utils/formErrors.d.ts.map +1 -1
  41. package/dist/src/crud/utils/formErrors.test.d.ts +2 -0
  42. package/dist/src/crud/utils/formErrors.test.d.ts.map +1 -0
  43. package/dist/src/crud/utils/prepareFormSubmitBody.d.ts +1 -0
  44. package/dist/src/crud/utils/prepareFormSubmitBody.d.ts.map +1 -1
  45. package/dist/src/crud/utils/referenceSelectNotFoundContent.d.ts +4 -0
  46. package/dist/src/crud/utils/referenceSelectNotFoundContent.d.ts.map +1 -0
  47. package/dist/src/crud/utils/toFormData.d.ts +1 -1
  48. package/dist/src/crud/utils/toFormData.d.ts.map +1 -1
  49. package/dist/src/crud/utils/uploadReferenceUtils.d.ts +5 -0
  50. package/dist/src/crud/utils/uploadReferenceUtils.d.ts.map +1 -0
  51. package/dist/src/crud/utils/useChoices.d.ts +27 -1
  52. package/dist/src/crud/utils/useChoices.d.ts.map +1 -1
  53. package/dist/src/crud/utils/useFormRecord.d.ts +9 -7
  54. package/dist/src/crud/utils/useFormRecord.d.ts.map +1 -1
  55. package/dist/src/data/parseFormErrorHelpers.d.ts +6 -27
  56. package/dist/src/data/parseFormErrorHelpers.d.ts.map +1 -1
  57. package/dist/src/index.d.ts +2 -2
  58. package/dist/src/index.d.ts.map +1 -1
  59. package/dist/src/layouts/AdminLayout.d.ts +1 -1
  60. package/dist/src/layouts/AdminLayout.d.ts.map +1 -1
  61. package/dist/src/layouts/AuthPageLayout.d.ts.map +1 -1
  62. package/dist/src/layouts/navFilter.d.ts +5 -0
  63. package/dist/src/layouts/navFilter.d.ts.map +1 -0
  64. package/dist/src/layouts/navMenuItems.d.ts +6 -0
  65. package/dist/src/layouts/navMenuItems.d.ts.map +1 -0
  66. package/dist/src/types.d.ts +12 -0
  67. package/dist/src/types.d.ts.map +1 -1
  68. package/package.json +85 -59
  69. package/src/app/AdminApp.tsx +34 -34
  70. package/src/components/AuthAlternateLink.tsx +23 -23
  71. package/src/components/DensitySwitch.tsx +31 -31
  72. package/src/components/NavMenuLabel.tsx +26 -0
  73. package/src/components/NavMenuSearch.tsx +76 -0
  74. package/src/components/ScrollableArea.tsx +46 -0
  75. package/src/components/ThemeSwitch.tsx +28 -28
  76. package/src/components/ThemeToolbar.tsx +34 -34
  77. package/src/components/index.ts +7 -4
  78. package/src/components/navMenu.css +21 -0
  79. package/src/components/scrollable.css +28 -0
  80. package/src/context/AppThemeProvider.tsx +128 -128
  81. package/src/context/AuthProvider.tsx +89 -77
  82. package/src/context/DataProvider.tsx +30 -30
  83. package/src/context/PermissionsProvider.tsx +57 -57
  84. package/src/crud/FilterBar.tsx +36 -36
  85. package/src/crud/FormGlobalErrorsAlert.tsx +36 -0
  86. package/src/crud/FormSteps.tsx +135 -135
  87. package/src/crud/FormTabs.tsx +126 -126
  88. package/src/crud/InlineFormSet.tsx +162 -162
  89. package/src/crud/ListActionsBar.tsx +106 -106
  90. package/src/crud/ResourceForm.tsx +83 -160
  91. package/src/crud/ResourceFormModal.tsx +75 -133
  92. package/src/crud/ResourceRecordForm.tsx +166 -0
  93. package/src/crud/columns/BooleanColumn.tsx +32 -32
  94. package/src/crud/columns/CustomColumn.tsx +33 -33
  95. package/src/crud/columns/DateColumn.tsx +28 -28
  96. package/src/crud/columns/ImageColumn.tsx +58 -58
  97. package/src/crud/columns/NumberColumn.tsx +31 -31
  98. package/src/crud/columns/ReferenceColumn.tsx +85 -85
  99. package/src/crud/columns/ReferenceManyColumn.tsx +67 -67
  100. package/src/crud/columns/TextColumn.tsx +38 -38
  101. package/src/crud/context/FilterContext.tsx +71 -71
  102. package/src/crud/context/FormContext.tsx +39 -39
  103. package/src/crud/context/FormSectionContext.tsx +22 -22
  104. package/src/crud/context/InlineFieldsRegistry.tsx +61 -61
  105. package/src/crud/context/ListContext.tsx +93 -93
  106. package/src/crud/fields/BooleanField.tsx +38 -38
  107. package/src/crud/fields/DateField.tsx +53 -53
  108. package/src/crud/fields/FileField.tsx +123 -123
  109. package/src/crud/fields/ImageField.tsx +120 -120
  110. package/src/crud/fields/NumberField.tsx +52 -52
  111. package/src/crud/fields/PasswordField.tsx +99 -99
  112. package/src/crud/fields/ReferenceField.tsx +237 -96
  113. package/src/crud/fields/ReferenceInputActions.tsx +106 -0
  114. package/src/crud/fields/ReferenceManyField.tsx +200 -76
  115. package/src/crud/fields/SelectField.tsx +48 -48
  116. package/src/crud/fields/TextField.tsx +46 -46
  117. package/src/crud/fields/uploadFieldUtils.ts +21 -21
  118. package/src/crud/fields/useUploadPreviewUrl.ts +20 -20
  119. package/src/crud/filters/BooleanFilter.tsx +38 -38
  120. package/src/crud/filters/DateFilter.tsx +35 -35
  121. package/src/crud/filters/NumberFilter.tsx +33 -33
  122. package/src/crud/filters/ReferenceFilter.tsx +192 -173
  123. package/src/crud/filters/SelectFilter.tsx +44 -44
  124. package/src/crud/filters/TextFilter.tsx +36 -36
  125. package/src/crud/index.ts +99 -94
  126. package/src/crud/types.ts +146 -134
  127. package/src/crud/utils/buildFormPayload.ts +24 -24
  128. package/src/crud/utils/buildInlineRowsPayload.ts +37 -37
  129. package/src/crud/utils/buildResourceFormSubmitBody.ts +29 -29
  130. package/src/crud/utils/choiceSelectionUtils.test.ts +45 -0
  131. package/src/crud/utils/choiceSelectionUtils.ts +116 -0
  132. package/src/crud/utils/formErrors.test.ts +168 -0
  133. package/src/crud/utils/formErrors.ts +138 -42
  134. package/src/crud/utils/formSectionErrors.ts +85 -85
  135. package/src/crud/utils/getFormValue.ts +13 -13
  136. package/src/crud/utils/hasUploadValues.ts +9 -9
  137. package/src/crud/utils/nestedFieldPath.ts +8 -8
  138. package/src/crud/utils/prepareFormSubmitBody.ts +22 -17
  139. package/src/crud/utils/referenceSelectNotFoundContent.tsx +7 -0
  140. package/src/crud/utils/setFormValue.ts +18 -18
  141. package/src/crud/utils/sortQueryParam.ts +37 -37
  142. package/src/crud/utils/toFormData.ts +79 -81
  143. package/src/crud/utils/uploadReferenceUtils.ts +44 -0
  144. package/src/crud/utils/useAbortableEffect.ts +17 -17
  145. package/src/crud/utils/useChoices.ts +330 -182
  146. package/src/crud/utils/useFormRecord.ts +179 -156
  147. package/src/crud/utils/useListQueryState.ts +191 -191
  148. package/src/data/abortError.test.ts +19 -19
  149. package/src/data/abortError.ts +10 -10
  150. package/src/data/createMemoryResourceHandlers.ts +78 -78
  151. package/src/data/createRestResourceHandlers.ts +63 -63
  152. package/src/data/dataUtils.test.ts +228 -220
  153. package/src/data/inMemoryList.ts +97 -97
  154. package/src/data/parseFormErrorHelpers.test.ts +201 -138
  155. package/src/data/parseFormErrorHelpers.ts +376 -311
  156. package/src/data/sortHelpers.ts +48 -48
  157. package/src/index.ts +211 -207
  158. package/src/layouts/AdminLayout.tsx +530 -382
  159. package/src/layouts/AuthPageLayout.tsx +87 -81
  160. package/src/layouts/navFilter.ts +49 -0
  161. package/src/layouts/navMenuItems.tsx +44 -0
  162. package/src/pages/LoginPage.tsx +80 -80
  163. package/src/pages/PlaceholderPage.tsx +9 -9
  164. package/src/permissions/resourcePermissions.ts +47 -47
  165. package/src/router/createAdminRouter.tsx +64 -64
  166. package/src/router/guards.tsx +63 -63
  167. package/src/router/routeAccess.ts +89 -89
  168. package/src/types.ts +10 -0
  169. package/src/vite-env.d.ts +1 -1
@@ -1,35 +1,35 @@
1
- import { DatePicker } from "antd";
2
- import dayjs from "dayjs";
3
- import { useMemo } from "react";
4
- import type { BaseSourceProps } from "../types";
5
- import { useRegisterFilter } from "../context/FilterContext";
6
-
7
- export type DateFilterProps = BaseSourceProps;
8
-
9
- export function DateFilter({ source, label }: DateFilterProps) {
10
- const def = useMemo(
11
- () => ({
12
- key: source,
13
- source,
14
- label,
15
- render: ({
16
- value,
17
- onChange,
18
- }: {
19
- value: unknown;
20
- onChange: (value: unknown) => void;
21
- }) => (
22
- <DatePicker
23
- allowClear
24
- placeholder={label ?? source}
25
- value={value ? dayjs(String(value)) : null}
26
- onChange={(d) => onChange(d ? d.format("YYYY-MM-DD") : undefined)}
27
- style={{ minWidth: 160 }}
28
- />
29
- ),
30
- }),
31
- [source, label],
32
- );
33
- useRegisterFilter(def);
34
- return null;
35
- }
1
+ import { DatePicker } from "antd";
2
+ import dayjs from "dayjs";
3
+ import { useMemo } from "react";
4
+ import type { BaseSourceProps } from "../types";
5
+ import { useRegisterFilter } from "../context/FilterContext";
6
+
7
+ export type DateFilterProps = BaseSourceProps;
8
+
9
+ export function DateFilter({ source, label }: DateFilterProps) {
10
+ const def = useMemo(
11
+ () => ({
12
+ key: source,
13
+ source,
14
+ label,
15
+ render: ({
16
+ value,
17
+ onChange,
18
+ }: {
19
+ value: unknown;
20
+ onChange: (value: unknown) => void;
21
+ }) => (
22
+ <DatePicker
23
+ allowClear
24
+ placeholder={label ?? source}
25
+ value={value ? dayjs(String(value)) : null}
26
+ onChange={(d) => onChange(d ? d.format("YYYY-MM-DD") : undefined)}
27
+ style={{ minWidth: 160 }}
28
+ />
29
+ ),
30
+ }),
31
+ [source, label],
32
+ );
33
+ useRegisterFilter(def);
34
+ return null;
35
+ }
@@ -1,33 +1,33 @@
1
- import { InputNumber } from "antd";
2
- import { useMemo } from "react";
3
- import type { BaseSourceProps } from "../types";
4
- import { useRegisterFilter } from "../context/FilterContext";
5
-
6
- export type NumberFilterProps = BaseSourceProps;
7
-
8
- export function NumberFilter({ source, label }: NumberFilterProps) {
9
- const def = useMemo(
10
- () => ({
11
- key: source,
12
- source,
13
- label,
14
- render: ({
15
- value,
16
- onChange,
17
- }: {
18
- value: unknown;
19
- onChange: (value: unknown) => void;
20
- }) => (
21
- <InputNumber
22
- placeholder={label ?? source}
23
- value={value as number | undefined}
24
- onChange={(v) => onChange(v ?? undefined)}
25
- style={{ minWidth: 120 }}
26
- />
27
- ),
28
- }),
29
- [source, label],
30
- );
31
- useRegisterFilter(def);
32
- return null;
33
- }
1
+ import { InputNumber } from "antd";
2
+ import { useMemo } from "react";
3
+ import type { BaseSourceProps } from "../types";
4
+ import { useRegisterFilter } from "../context/FilterContext";
5
+
6
+ export type NumberFilterProps = BaseSourceProps;
7
+
8
+ export function NumberFilter({ source, label }: NumberFilterProps) {
9
+ const def = useMemo(
10
+ () => ({
11
+ key: source,
12
+ source,
13
+ label,
14
+ render: ({
15
+ value,
16
+ onChange,
17
+ }: {
18
+ value: unknown;
19
+ onChange: (value: unknown) => void;
20
+ }) => (
21
+ <InputNumber
22
+ placeholder={label ?? source}
23
+ value={value as number | undefined}
24
+ onChange={(v) => onChange(v ?? undefined)}
25
+ style={{ minWidth: 120 }}
26
+ />
27
+ ),
28
+ }),
29
+ [source, label],
30
+ );
31
+ useRegisterFilter(def);
32
+ return null;
33
+ }
@@ -1,173 +1,192 @@
1
- import { Select } from "antd";
2
- import { useMemo, useState } from "react";
3
- import type { BaseSourceProps, ChoiceOption, ReferenceProps } from "../types";
4
- import { useRegisterFilter } from "../context/FilterContext";
5
- import { useChoices } from "../utils/useChoices";
6
-
7
- export type SelectFilterProps = BaseSourceProps & {
8
- choices: ChoiceOption[];
9
- multiple?: boolean;
10
- };
11
-
12
- function SelectFilterInput({
13
- source,
14
- label,
15
- choices,
16
- multiple,
17
- value,
18
- onChange,
19
- }: SelectFilterProps & {
20
- value: unknown;
21
- onChange: (value: unknown) => void;
22
- }) {
23
- return (
24
- <Select
25
- allowClear
26
- mode={multiple ? "multiple" : undefined}
27
- placeholder={label ?? source}
28
- value={value as string | number | (string | number)[] | undefined}
29
- onChange={onChange}
30
- options={choices}
31
- style={{ minWidth: 160 }}
32
- />
33
- );
34
- }
35
-
36
- export function SelectFilter({
37
- source,
38
- label,
39
- choices,
40
- multiple,
41
- }: SelectFilterProps) {
42
- const def = useMemo(
43
- () => ({
44
- key: source,
45
- source,
46
- label,
47
- render: ({
48
- value,
49
- onChange,
50
- }: {
51
- value: unknown;
52
- onChange: (value: unknown) => void;
53
- }) => (
54
- <SelectFilterInput
55
- source={source}
56
- label={label}
57
- choices={choices}
58
- multiple={multiple}
59
- value={value}
60
- onChange={onChange}
61
- />
62
- ),
63
- }),
64
- [source, label, choices, multiple],
65
- );
66
- useRegisterFilter(def);
67
- return null;
68
- }
69
-
70
- export type ReferenceFilterProps = BaseSourceProps &
71
- ReferenceProps & {
72
- multiple?: boolean;
73
- search?: boolean;
74
- };
75
-
76
- function ReferenceFilterInput({
77
- source,
78
- label,
79
- reference,
80
- choices,
81
- optionLabel,
82
- optionValue,
83
- multiple,
84
- search,
85
- value,
86
- onChange,
87
- }: ReferenceFilterProps & {
88
- value: unknown;
89
- onChange: (value: unknown) => void;
90
- }) {
91
- const [searchText, setSearchText] = useState<string | undefined>();
92
- const { options, loading } = useChoices(
93
- choices,
94
- reference,
95
- optionLabel,
96
- optionValue,
97
- search ? searchText : undefined,
98
- );
99
- return (
100
- <Select
101
- allowClear
102
- mode={multiple ? "multiple" : undefined}
103
- placeholder={label ?? source}
104
- value={value as string | number | (string | number)[] | undefined}
105
- onChange={onChange}
106
- options={options.map((o) => ({
107
- label: o.label,
108
- value: o.value as string | number,
109
- }))}
110
- loading={loading}
111
- showSearch={search}
112
- filterOption={search ? false : undefined}
113
- onSearch={search ? setSearchText : undefined}
114
- optionFilterProp="label"
115
- style={{ minWidth: 180 }}
116
- />
117
- );
118
- }
119
-
120
- export function ReferenceFilter({
121
- source,
122
- label,
123
- reference,
124
- choices,
125
- optionLabel = "name",
126
- optionValue = "id",
127
- multiple,
128
- search,
129
- }: ReferenceFilterProps) {
130
- const def = useMemo(
131
- () => ({
132
- key: source,
133
- source,
134
- label,
135
- render: ({
136
- value,
137
- onChange,
138
- }: {
139
- value: unknown;
140
- onChange: (value: unknown) => void;
141
- }) => (
142
- <ReferenceFilterInput
143
- source={source}
144
- label={label}
145
- reference={reference}
146
- choices={choices}
147
- optionLabel={optionLabel}
148
- optionValue={optionValue}
149
- multiple={multiple}
150
- search={search}
151
- value={value}
152
- onChange={onChange}
153
- />
154
- ),
155
- }),
156
- [
157
- source,
158
- label,
159
- reference,
160
- choices,
161
- optionLabel,
162
- optionValue,
163
- multiple,
164
- search,
165
- ],
166
- );
167
- useRegisterFilter(def);
168
- return null;
169
- }
170
-
171
- export function ReferenceManyFilter(props: ReferenceFilterProps) {
172
- return <ReferenceFilter {...props} multiple />;
173
- }
1
+ import { Select } from "antd";
2
+ import { useMemo, useState } from "react";
3
+ import type { BaseSourceProps, ChoiceOption, ReferenceProps } from "../types";
4
+ import { useRegisterFilter } from "../context/FilterContext";
5
+ import { useChoices } from "../utils/useChoices";
6
+ import { referenceSelectNotFoundContent } from "../utils/referenceSelectNotFoundContent";
7
+
8
+ export type SelectFilterProps = BaseSourceProps & {
9
+ choices: ChoiceOption[];
10
+ multiple?: boolean;
11
+ };
12
+
13
+ function SelectFilterInput({
14
+ source,
15
+ label,
16
+ choices,
17
+ multiple,
18
+ value,
19
+ onChange,
20
+ }: SelectFilterProps & {
21
+ value: unknown;
22
+ onChange: (value: unknown) => void;
23
+ }) {
24
+ return (
25
+ <Select
26
+ allowClear
27
+ mode={multiple ? "multiple" : undefined}
28
+ placeholder={label ?? source}
29
+ value={value as string | number | (string | number)[] | undefined}
30
+ onChange={onChange}
31
+ options={choices}
32
+ style={{ minWidth: 160 }}
33
+ />
34
+ );
35
+ }
36
+
37
+ export function SelectFilter({
38
+ source,
39
+ label,
40
+ choices,
41
+ multiple,
42
+ }: SelectFilterProps) {
43
+ const def = useMemo(
44
+ () => ({
45
+ key: source,
46
+ source,
47
+ label,
48
+ render: ({
49
+ value,
50
+ onChange,
51
+ }: {
52
+ value: unknown;
53
+ onChange: (value: unknown) => void;
54
+ }) => (
55
+ <SelectFilterInput
56
+ source={source}
57
+ label={label}
58
+ choices={choices}
59
+ multiple={multiple}
60
+ value={value}
61
+ onChange={onChange}
62
+ />
63
+ ),
64
+ }),
65
+ [source, label, choices, multiple],
66
+ );
67
+ useRegisterFilter(def);
68
+ return null;
69
+ }
70
+
71
+ export type ReferenceFilterProps = BaseSourceProps &
72
+ ReferenceProps & {
73
+ multiple?: boolean;
74
+ search?: boolean;
75
+ };
76
+
77
+ function ReferenceFilterInput({
78
+ source,
79
+ label,
80
+ reference,
81
+ choices,
82
+ optionLabel,
83
+ optionValue,
84
+ multiple,
85
+ search,
86
+ lazy = true,
87
+ fetchSelected = true,
88
+ value,
89
+ onChange,
90
+ }: ReferenceFilterProps & {
91
+ value: unknown;
92
+ onChange: (value: unknown) => void;
93
+ }) {
94
+ const [searchText, setSearchText] = useState<string | undefined>();
95
+ const [dropdownOpen, setDropdownOpen] = useState(false);
96
+ const active = dropdownOpen || Boolean(searchText);
97
+
98
+ const { options, loading } = useChoices(
99
+ choices,
100
+ reference,
101
+ optionLabel,
102
+ optionValue,
103
+ search ? searchText : undefined,
104
+ { lazy, active, selectedValues: value, fetchSelected },
105
+ );
106
+
107
+ return (
108
+ <Select
109
+ allowClear
110
+ mode={multiple ? "multiple" : undefined}
111
+ placeholder={label ?? source}
112
+ value={value as string | number | (string | number)[] | undefined}
113
+ onChange={onChange}
114
+ options={options.map((o) => ({
115
+ label: o.label,
116
+ value: o.value as string | number,
117
+ }))}
118
+ loading={loading}
119
+ notFoundContent={referenceSelectNotFoundContent(loading)}
120
+ showSearch={search}
121
+ filterOption={search ? false : undefined}
122
+ onSearch={search ? setSearchText : undefined}
123
+ onDropdownVisibleChange={(open) => {
124
+ setDropdownOpen(open);
125
+ if (!open) setSearchText(undefined);
126
+ }}
127
+ optionFilterProp="label"
128
+ style={{ minWidth: 180 }}
129
+ />
130
+ );
131
+ }
132
+
133
+ export function ReferenceFilter({
134
+ source,
135
+ label,
136
+ reference,
137
+ choices,
138
+ optionLabel = "name",
139
+ optionValue = "id",
140
+ multiple,
141
+ search,
142
+ lazy = true,
143
+ fetchSelected = true,
144
+ }: ReferenceFilterProps) {
145
+ const def = useMemo(
146
+ () => ({
147
+ key: source,
148
+ source,
149
+ label,
150
+ render: ({
151
+ value,
152
+ onChange,
153
+ }: {
154
+ value: unknown;
155
+ onChange: (value: unknown) => void;
156
+ }) => (
157
+ <ReferenceFilterInput
158
+ source={source}
159
+ label={label}
160
+ reference={reference}
161
+ choices={choices}
162
+ optionLabel={optionLabel}
163
+ optionValue={optionValue}
164
+ multiple={multiple}
165
+ search={search}
166
+ lazy={lazy}
167
+ fetchSelected={fetchSelected}
168
+ value={value}
169
+ onChange={onChange}
170
+ />
171
+ ),
172
+ }),
173
+ [
174
+ source,
175
+ label,
176
+ reference,
177
+ choices,
178
+ optionLabel,
179
+ optionValue,
180
+ multiple,
181
+ search,
182
+ lazy,
183
+ fetchSelected,
184
+ ],
185
+ );
186
+ useRegisterFilter(def);
187
+ return null;
188
+ }
189
+
190
+ export function ReferenceManyFilter(props: ReferenceFilterProps) {
191
+ return <ReferenceFilter {...props} multiple />;
192
+ }
@@ -1,44 +1,44 @@
1
- import { Select } from "antd";
2
- import { useMemo } from "react";
3
- import type { BaseSourceProps, ChoiceOption } from "../types";
4
- import { useRegisterFilter } from "../context/FilterContext";
5
-
6
- export type SelectFilterProps = BaseSourceProps & {
7
- choices: ChoiceOption[];
8
- multiple?: boolean;
9
- };
10
-
11
- export function SelectFilter({
12
- source,
13
- label,
14
- choices,
15
- multiple,
16
- }: SelectFilterProps) {
17
- const def = useMemo(
18
- () => ({
19
- key: source,
20
- source,
21
- label,
22
- render: ({
23
- value,
24
- onChange,
25
- }: {
26
- value: unknown;
27
- onChange: (value: unknown) => void;
28
- }) => (
29
- <Select
30
- allowClear
31
- mode={multiple ? "multiple" : undefined}
32
- placeholder={label ?? source}
33
- value={value as string | number | (string | number)[] | undefined}
34
- onChange={onChange}
35
- options={choices}
36
- style={{ minWidth: 160 }}
37
- />
38
- ),
39
- }),
40
- [source, label, choices, multiple],
41
- );
42
- useRegisterFilter(def);
43
- return null;
44
- }
1
+ import { Select } from "antd";
2
+ import { useMemo } from "react";
3
+ import type { BaseSourceProps, ChoiceOption } from "../types";
4
+ import { useRegisterFilter } from "../context/FilterContext";
5
+
6
+ export type SelectFilterProps = BaseSourceProps & {
7
+ choices: ChoiceOption[];
8
+ multiple?: boolean;
9
+ };
10
+
11
+ export function SelectFilter({
12
+ source,
13
+ label,
14
+ choices,
15
+ multiple,
16
+ }: SelectFilterProps) {
17
+ const def = useMemo(
18
+ () => ({
19
+ key: source,
20
+ source,
21
+ label,
22
+ render: ({
23
+ value,
24
+ onChange,
25
+ }: {
26
+ value: unknown;
27
+ onChange: (value: unknown) => void;
28
+ }) => (
29
+ <Select
30
+ allowClear
31
+ mode={multiple ? "multiple" : undefined}
32
+ placeholder={label ?? source}
33
+ value={value as string | number | (string | number)[] | undefined}
34
+ onChange={onChange}
35
+ options={choices}
36
+ style={{ minWidth: 160 }}
37
+ />
38
+ ),
39
+ }),
40
+ [source, label, choices, multiple],
41
+ );
42
+ useRegisterFilter(def);
43
+ return null;
44
+ }
@@ -1,36 +1,36 @@
1
- import { Input } from "antd";
2
- import { useMemo } from "react";
3
- import type { BaseSourceProps } from "../types";
4
- import { useRegisterFilter } from "../context/FilterContext";
5
-
6
- export type TextFilterProps = BaseSourceProps & {
7
- placeholder?: string;
8
- };
9
-
10
- export function TextFilter({ source, label, placeholder }: TextFilterProps) {
11
- const def = useMemo(
12
- () => ({
13
- key: source,
14
- source,
15
- label,
16
- render: ({
17
- value,
18
- onChange,
19
- }: {
20
- value: unknown;
21
- onChange: (value: unknown) => void;
22
- }) => (
23
- <Input
24
- allowClear
25
- placeholder={placeholder ?? label ?? source}
26
- value={(value as string) ?? ""}
27
- onChange={(e) => onChange(e.target.value || undefined)}
28
- style={{ minWidth: 160 }}
29
- />
30
- ),
31
- }),
32
- [source, label, placeholder],
33
- );
34
- useRegisterFilter(def);
35
- return null;
36
- }
1
+ import { Input } from "antd";
2
+ import { useMemo } from "react";
3
+ import type { BaseSourceProps } from "../types";
4
+ import { useRegisterFilter } from "../context/FilterContext";
5
+
6
+ export type TextFilterProps = BaseSourceProps & {
7
+ placeholder?: string;
8
+ };
9
+
10
+ export function TextFilter({ source, label, placeholder }: TextFilterProps) {
11
+ const def = useMemo(
12
+ () => ({
13
+ key: source,
14
+ source,
15
+ label,
16
+ render: ({
17
+ value,
18
+ onChange,
19
+ }: {
20
+ value: unknown;
21
+ onChange: (value: unknown) => void;
22
+ }) => (
23
+ <Input
24
+ allowClear
25
+ placeholder={placeholder ?? label ?? source}
26
+ value={(value as string) ?? ""}
27
+ onChange={(e) => onChange(e.target.value || undefined)}
28
+ style={{ minWidth: 160 }}
29
+ />
30
+ ),
31
+ }),
32
+ [source, label, placeholder],
33
+ );
34
+ useRegisterFilter(def);
35
+ return null;
36
+ }