@@ -9,12 +9,18 @@ import {
9
9
useCallback ,
10
10
useMemo ,
11
11
useRef ,
12
+ useState ,
12
13
} from 'react' ;
13
14
import { styled , SxProps } from '@mui/material' ;
14
15
import clsx from 'clsx' ;
15
16
import get from 'lodash/get' ;
16
17
import PropTypes from 'prop-types' ;
17
- import { FormDataConsumer , RaRecord , useRecordContext } from 'ra-core' ;
18
+ import {
19
+ FormDataConsumer ,
20
+ RaRecord ,
21
+ useRecordContext ,
22
+ useTranslate ,
23
+ } from 'ra-core' ;
18
24
import { UseFieldArrayReturn } from 'react-hook-form' ;
19
25
20
26
import { useArrayInput } from './useArrayInput' ;
@@ -30,6 +36,8 @@ import {
30
36
import { AddItemButton as DefaultAddItemButton } from './AddItemButton' ;
31
37
import { RemoveItemButton as DefaultRemoveItemButton } from './RemoveItemButton' ;
32
38
import { ReOrderButtons as DefaultReOrderButtons } from './ReOrderButtons' ;
39
+ import { ClearArrayButton } from './ClearArrayButton' ;
40
+ import { Confirm } from '../../layout' ;
33
41
34
42
export const SimpleFormIterator = ( props : SimpleFormIteratorProps ) => {
35
43
const {
@@ -42,14 +50,17 @@ export const SimpleFormIterator = (props: SimpleFormIteratorProps) => {
42
50
source,
43
51
disabled,
44
52
disableAdd,
53
+ disableClear,
45
54
disableRemove,
46
55
disableReordering,
47
56
inline,
48
57
getItemLabel = false ,
49
58
fullWidth,
50
59
sx,
51
60
} = props ;
52
- const { append, fields, move, remove } = useArrayInput ( props ) ;
61
+ const [ confirmIsOpen , setConfirmIsOpen ] = useState < boolean > ( false ) ;
62
+ const { append, fields, move, remove, replace } = useArrayInput ( props ) ;
63
+ const translate = useTranslate ( ) ;
53
64
const record = useRecordContext ( props ) ;
54
65
const initialDefaultValue = useRef ( { } ) ;
55
66
@@ -120,6 +131,11 @@ export const SimpleFormIterator = (props: SimpleFormIteratorProps) => {
120
131
[ move ]
121
132
) ;
122
133
134
+ const handleArrayClear = useCallback ( ( ) => {
135
+ replace ( [ ] ) ;
136
+ setConfirmIsOpen ( false ) ;
137
+ } , [ replace ] ) ;
138
+
123
139
const records = get ( record , source ) ;
124
140
125
141
const context = useMemo (
@@ -166,19 +182,56 @@ export const SimpleFormIterator = (props: SimpleFormIteratorProps) => {
166
182
</ SimpleFormIteratorItem >
167
183
) ) }
168
184
</ ul >
169
- { ! disabled && ! disableAdd && (
170
- < div className = { SimpleFormIteratorClasses . add } >
171
- { cloneElement ( addButton , {
172
- className : clsx (
173
- 'button-add' ,
174
- `button-add-${ source } `
175
- ) ,
176
- onClick : handleAddButtonClick (
177
- addButton . props . onClick
178
- ) ,
179
- } ) }
180
- </ div >
181
- ) }
185
+ { ! disabled &&
186
+ ! Boolean ( disableAdd && ( disableClear || disableRemove ) ) && (
187
+ < div className = { SimpleFormIteratorClasses . buttons } >
188
+ { ! disableAdd && (
189
+ < div className = { SimpleFormIteratorClasses . add } >
190
+ { cloneElement ( addButton , {
191
+ className : clsx (
192
+ 'button-add' ,
193
+ `button-add-${ source } `
194
+ ) ,
195
+ onClick : handleAddButtonClick (
196
+ addButton . props . onClick
197
+ ) ,
198
+ } ) }
199
+ </ div >
200
+ ) }
201
+ { fields . length > 0 &&
202
+ ! disableClear &&
203
+ ! disableRemove && (
204
+ < div
205
+ className = {
206
+ SimpleFormIteratorClasses . clear
207
+ }
208
+ >
209
+ < Confirm
210
+ isOpen = { confirmIsOpen }
211
+ title = { translate (
212
+ 'ra.action.clear_array_input'
213
+ ) }
214
+ content = { translate (
215
+ 'ra.message.clear_array_input'
216
+ ) }
217
+ onConfirm = { handleArrayClear }
218
+ onClose = { ( ) =>
219
+ setConfirmIsOpen ( false )
220
+ }
221
+ />
222
+ < ClearArrayButton
223
+ className = { clsx (
224
+ 'button-clear' ,
225
+ `button-clear-${ source } `
226
+ ) }
227
+ onClick = { ( ) =>
228
+ setConfirmIsOpen ( true )
229
+ }
230
+ />
231
+ </ div >
232
+ ) }
233
+ </ div >
234
+ ) }
182
235
</ Root >
183
236
</ SimpleFormIteratorContext . Provider >
184
237
) : null ;
@@ -217,6 +270,7 @@ export interface SimpleFormIteratorProps extends Partial<UseFieldArrayReturn> {
217
270
className ?: string ;
218
271
disabled ?: boolean ;
219
272
disableAdd ?: boolean ;
273
+ disableClear ?: boolean ;
220
274
disableRemove ?: boolean | DisableRemoveFunction ;
221
275
disableReordering ?: boolean ;
222
276
fullWidth ?: boolean ;
@@ -281,9 +335,15 @@ const Root = styled('div', {
281
335
visibility : 'visible' ,
282
336
} ,
283
337
} ,
338
+ [ `& .${ SimpleFormIteratorClasses . buttons } ` ] : {
339
+ display : 'flex' ,
340
+ } ,
284
341
[ `& .${ SimpleFormIteratorClasses . add } ` ] : {
285
342
borderBottom : 'none' ,
286
343
} ,
344
+ [ `& .${ SimpleFormIteratorClasses . clear } ` ] : {
345
+ borderBottom : 'none' ,
346
+ } ,
287
347
[ `& .${ SimpleFormIteratorClasses . line } :hover > .${ SimpleFormIteratorClasses . action } ` ] : {
288
348
visibility : 'visible' ,
289
349
} ,
0 commit comments