|
1 | | -import React from "react"; |
| 1 | +import React, { useMemo } from "react"; |
2 | 2 |
|
3 | 3 | import { utils } from "@rjsf/core"; |
4 | 4 |
|
@@ -62,42 +62,51 @@ const ArrayFieldDescription = ({ |
62 | 62 | }; |
63 | 63 |
|
64 | 64 | // Used in the two templates |
65 | | -const DefaultArrayItem = (props: any) => { |
| 65 | +const DefaultArrayItem = ({ |
| 66 | + index, readonly, disabled, children, hasToolbar, hasRemove, hasMoveUp, hasMoveDown, onReorderClick, onDropIndexClick |
| 67 | +}: any) => { |
| 68 | + |
| 69 | + const onRemoveClick = useMemo(() => onDropIndexClick(index), [index, onDropIndexClick]); |
| 70 | + |
| 71 | + const onArrowUpClick = useMemo(() => onReorderClick(index, index - 1), [index, onReorderClick]); |
| 72 | + |
| 73 | + const onArrowDownClick = useMemo(() => onReorderClick(index, index + 1), [index, onReorderClick]); |
| 74 | + |
66 | 75 | return ( |
67 | | - <HStack key={props.key} alignItems={"flex-end"} py={1}> |
| 76 | + <HStack alignItems={"flex-end"} py={1}> |
68 | 77 | <Box w="100%"> |
69 | | - {props.children} |
| 78 | + {children} |
70 | 79 | </Box> |
71 | 80 |
|
72 | | - {props.hasToolbar && ( |
| 81 | + {hasToolbar && ( |
73 | 82 | <Box> |
74 | 83 | <ButtonGroup isAttached mb={1}> |
75 | | - {(props.hasMoveUp || props.hasMoveDown) && ( |
| 84 | + {(hasMoveUp || hasMoveDown) && ( |
76 | 85 | <IconButton |
77 | 86 | icon="arrow-up" |
78 | 87 | tabIndex={-1} |
79 | | - disabled={props.disabled || props.readonly || !props.hasMoveUp} |
80 | | - onClick={props.onReorderClick(props.index, props.index - 1)} |
| 88 | + disabled={disabled || readonly || !hasMoveUp} |
| 89 | + onClick={onArrowUpClick} |
81 | 90 | /> |
82 | 91 | )} |
83 | 92 |
|
84 | | - {(props.hasMoveUp || props.hasMoveDown) && ( |
| 93 | + {(hasMoveUp || hasMoveDown) && ( |
85 | 94 | <IconButton |
86 | 95 | icon="arrow-down" |
87 | 96 | tabIndex={-1} |
88 | 97 | disabled={ |
89 | | - props.disabled || props.readonly || !props.hasMoveDown |
| 98 | + disabled || readonly || !hasMoveDown |
90 | 99 | } |
91 | | - onClick={props.onReorderClick(props.index, props.index + 1)} |
| 100 | + onClick={onArrowDownClick} |
92 | 101 | /> |
93 | 102 | )} |
94 | 103 |
|
95 | | - {props.hasRemove && ( |
| 104 | + {hasRemove && ( |
96 | 105 | <IconButton |
97 | 106 | icon="remove" |
98 | 107 | tabIndex={-1} |
99 | | - disabled={props.disabled || props.readonly} |
100 | | - onClick={props.onDropIndexClick(props.index)} |
| 108 | + disabled={disabled || readonly} |
| 109 | + onClick={onRemoveClick} |
101 | 110 | /> |
102 | 111 | )} |
103 | 112 | </ButtonGroup> |
@@ -131,7 +140,10 @@ const DefaultFixedArrayFieldTemplate = (props: ArrayFieldTemplateProps) => ( |
131 | 140 | className="row array-item-list" |
132 | 141 | key={`array-item-list-${props.idSchema.$id}`} |
133 | 142 | > |
134 | | - {props.items && props.items.map(DefaultArrayItem)} |
| 143 | + {props.items && props.items.map((p) => { |
| 144 | + const { key, ...itemProps } = p; |
| 145 | + return <DefaultArrayItem key={key} {...itemProps}></DefaultArrayItem>; |
| 146 | + })} |
135 | 147 | </div> |
136 | 148 |
|
137 | 149 | {props.canAdd && ( |
@@ -168,7 +180,10 @@ const DefaultNormalArrayFieldTemplate = (props: ArrayFieldTemplateProps) => ( |
168 | 180 |
|
169 | 181 | <Grid key={`array-item-list-${props.idSchema.$id}`}> |
170 | 182 | <GridItem> |
171 | | - {props.items.length > 0 && props.items.map(p => DefaultArrayItem(p))} |
| 183 | + {props.items.length > 0 && props.items.map((p) => { |
| 184 | + const { key, ...itemProps } = p; |
| 185 | + return <DefaultArrayItem key={key} {...itemProps}></DefaultArrayItem>; |
| 186 | + })} |
172 | 187 | </GridItem> |
173 | 188 | {props.canAdd && ( |
174 | 189 | <GridItem justifySelf={"flex-end"}> |
|
0 commit comments