@@ -3,6 +3,8 @@ import {NamePath} from 'antd/lib/form/interface';
33
44import { DeleteOutlined } from '@ant-design/icons' ;
55
6+ import _ from 'lodash' ;
7+
68import * as S from './styled' ;
79
810interface IProps {
@@ -19,18 +21,36 @@ const FormList: React.FC<IProps> = props => {
1921
2022 return (
2123 < Form . Item label = { label } required = { Boolean ( requiredMessage ) } >
22- < Form . List name = { name } initialValue = { initialValue } >
23- { ( fields , { add, remove} ) => (
24+ < Form . List
25+ name = { name }
26+ initialValue = { initialValue }
27+ rules = { [
28+ {
29+ validator ( arg , value : string [ ] ) {
30+ if ( _ . uniq ( value ) . length === value . length ) {
31+ return Promise . resolve ( ) ;
32+ }
33+ return Promise . reject ( Error ( 'Duplicated items' ) ) ;
34+ } ,
35+ } ,
36+ ] }
37+ >
38+ { ( fields , { add, remove} , { errors} ) => (
2439 < >
2540 { fields . map ( field => (
2641 < S . Space key = { field . key } align = "baseline" >
27- < Form . Item { ...field } rules = { [ { required : true , whitespace : true , message : requiredMessage } ] } >
42+ < Form . Item
43+ { ...field }
44+ validateTrigger = { [ 'onChange' , 'onBlur' ] }
45+ rules = { [ { required : true , whitespace : true , message : requiredMessage } ] }
46+ >
2847 < S . Input placeholder = { placeholder } />
2948 </ Form . Item >
3049
3150 < DeleteOutlined onClick = { ( ) => remove ( field . name ) } />
3251 </ S . Space >
3352 ) ) }
53+ < Form . ErrorList errors = { errors } />
3454 < S . ButtonContainer >
3555 < Form . Item >
3656 < Button type = "default" onClick = { ( ) => add ( '' , 0 ) } >
0 commit comments