@@ -41,8 +41,8 @@ interface Props {
41
41
42
42
export default function MultiSelectBox ( props : Props ) {
43
43
const { columns, loading, items, onChange, value } = props ;
44
- const [ selectedRowKeys , setSelectedRowKeys ] = useState < React . Key [ ] > (
45
- value || [ ] ,
44
+ const [ selectedRowKeys , setSelectedRowKeys ] = useState < Set < string > > (
45
+ new Set ( value ) ,
46
46
) ;
47
47
const [ searchValue , setSearchValue ] = useState < string > ( '' ) ;
48
48
const formItemContext =
@@ -59,9 +59,15 @@ export default function MultiSelectBox(props: Props) {
59
59
: items ;
60
60
} , [ items , searchValue ] ) ;
61
61
62
- const onSelect = ( rowKeys : React . Key [ ] ) => {
63
- setSelectedRowKeys ( rowKeys ) ;
64
- onChange && onChange ( rowKeys as string [ ] ) ;
62
+ const onSelect = ( rowKey : string ) => {
63
+ const newSelectedRowKey = new Set ( selectedRowKeys ) ;
64
+ if ( newSelectedRowKey . has ( rowKey ) ) {
65
+ newSelectedRowKey . delete ( rowKey ) ;
66
+ } else {
67
+ newSelectedRowKey . add ( rowKey ) ;
68
+ }
69
+ setSelectedRowKeys ( newSelectedRowKey ) ;
70
+ onChange && onChange ( Array . from ( newSelectedRowKey ) ) ;
65
71
} ;
66
72
67
73
const onSearchChange = ( event ) => {
@@ -71,9 +77,9 @@ export default function MultiSelectBox(props: Props) {
71
77
} ;
72
78
73
79
const total =
74
- selectedRowKeys . length === 0
80
+ selectedRowKeys . size === 0
75
81
? items . length
76
- : `${ selectedRowKeys . length } /${ items . length } ` ;
82
+ : `${ selectedRowKeys . size } /${ items . length } ` ;
77
83
78
84
return (
79
85
< StyledBox
@@ -91,8 +97,24 @@ export default function MultiSelectBox(props: Props) {
91
97
< Table
92
98
rowSelection = { {
93
99
type : 'checkbox' ,
94
- selectedRowKeys,
95
- onChange : onSelect ,
100
+ selectedRowKeys : Array . from ( selectedRowKeys ) ,
101
+ onSelect : ( record ) => onSelect ( record [ 'value' ] ) ,
102
+ onChange ( keys ) {
103
+ // if more than 1 rows selected and there is only one possibility, if user selects all rows.
104
+ if ( keys . length !== 1 ) {
105
+ if ( keys . length === 0 ) {
106
+ setSelectedRowKeys ( new Set ( ) ) ;
107
+ onChange && onChange ( [ ] ) ;
108
+ return ;
109
+ }
110
+ const newSelectedRowKeys = [
111
+ ...selectedRowKeys ,
112
+ ...( keys as string [ ] ) ,
113
+ ] ;
114
+ setSelectedRowKeys ( new Set ( newSelectedRowKeys ) ) ;
115
+ onChange && onChange ( newSelectedRowKeys ) ;
116
+ }
117
+ } ,
96
118
} }
97
119
rowKey = { ( record ) => record . value }
98
120
columns = { columns }
0 commit comments