@@ -17,7 +17,10 @@ import {
17
17
ContextMenu2Container ,
18
18
ContextMenu2TextInputItem ,
19
19
ContextMenu2CheckItem ,
20
+ ContextMenu2ButtonControlsItem ,
21
+ ContextMenu2SeparatorItem ,
20
22
} from "../ContextMenu2" ;
23
+ import Button from "../Button" ;
21
24
import Icon from "../Icon" ;
22
25
import * as styled from "./styled" ;
23
26
@@ -29,6 +32,7 @@ type FilterTagInputProps = {
29
32
onChange : ( values : string [ ] ) => void ;
30
33
onSelectChange : ( index : number ) => void ;
31
34
} ;
35
+
32
36
export const FilterComboBox = ( {
33
37
values,
34
38
options,
@@ -40,10 +44,13 @@ export const FilterComboBox = ({
40
44
const [ userValue , setUserValue ] = useState ( "" ) ;
41
45
const [ userEnteredValue , setUserEnteredValue ] = useState ( "" ) ;
42
46
const [ isComposing , setIsComposing ] = useState ( false ) ;
47
+ const [ tempValues , setTempValues ] = useState < string [ ] > ( values ) ;
48
+ const [ isOpen , setIsOpen ] = useState ( false ) ;
43
49
44
50
// タグリスト部分で、CSS の overflow が発生しているか否か
45
51
const [ isInlineOverflowing , setIsInlineOverflowing ] = useState ( false ) ;
46
52
const inlineFieldEl = useRef < HTMLDivElement > ( null ) ;
53
+
47
54
// inlineFieldEl の大きさを監視して、
48
55
// overflow したら isInlineOverflowing を true にする
49
56
const checkInlineOverflow = useCallback ( ( ) => {
@@ -79,13 +86,13 @@ export const FilterComboBox = ({
79
86
80
87
const handleSelect = useCallback (
81
88
( value : string ) => {
82
- if ( values . includes ( value ) ) {
83
- onChange ( values . filter ( ( v ) => v !== value ) ) ;
89
+ if ( tempValues . includes ( value ) ) {
90
+ setTempValues ( tempValues . filter ( ( v ) => v !== value ) ) ;
84
91
} else {
85
- onChange ( [ ...values , value ] ) ;
92
+ setTempValues ( [ ...tempValues , value ] ) ;
86
93
}
87
94
} ,
88
- [ values , onChange ] ,
95
+ [ tempValues ] ,
89
96
) ;
90
97
91
98
const handleEnter = useCallback ( ( ) => {
@@ -125,15 +132,33 @@ export const FilterComboBox = ({
125
132
126
133
const handleRemove = useCallback (
127
134
( value : string ) => {
128
- onChange ( values . filter ( ( v ) => v !== value ) ) ;
135
+ const newValues = values . filter ( ( v ) => v !== value ) ;
136
+ onChange ( newValues ) ;
129
137
} ,
130
138
[ values , onChange ] ,
131
139
) ;
132
140
133
- const handleOpenChange = useCallback ( ( ) => {
134
- setUserValue ( "" ) ;
135
- setUserEnteredValue ( "" ) ;
136
- } , [ setUserValue , setUserEnteredValue ] ) ;
141
+ const handleOpenChange = useCallback (
142
+ ( open : boolean ) => {
143
+ setIsOpen ( open ) ;
144
+ if ( open ) {
145
+ setTempValues ( values ) ;
146
+ }
147
+ setUserValue ( "" ) ;
148
+ setUserEnteredValue ( "" ) ;
149
+ } ,
150
+ [ values ] ,
151
+ ) ;
152
+
153
+ const handleApply = useCallback ( ( ) => {
154
+ onChange ( tempValues ) ;
155
+ setIsOpen ( false ) ;
156
+ } , [ onChange , tempValues ] ) ;
157
+
158
+ const handleCancel = useCallback ( ( ) => {
159
+ setTempValues ( values ) ;
160
+ setIsOpen ( false ) ;
161
+ } , [ values ] ) ;
137
162
138
163
useEffect ( ( ) => {
139
164
if ( ! window . ResizeObserver ) return ;
@@ -160,6 +185,7 @@ export const FilterComboBox = ({
160
185
< styled . SelectContainer data-overflowing = { isInlineOverflowing } >
161
186
< ContextMenu2Container >
162
187
< ContextMenu2
188
+ open = { isOpen }
163
189
trigger = {
164
190
< styled . Select type = "button" >
165
191
< styled . SelectIcon >
@@ -181,12 +207,22 @@ export const FilterComboBox = ({
181
207
{ filteredOptions . map ( ( option ) => (
182
208
< ContextMenu2CheckItem
183
209
key = { option [ 0 ] }
184
- checked = { values . includes ( option [ 0 ] ) }
210
+ checked = { tempValues . includes ( option [ 0 ] ) }
211
+ closeOnChange = { false }
185
212
onChange = { ( ) => handleSelect ( option [ 0 ] ) }
186
213
>
187
214
{ option [ 0 ] }
188
215
</ ContextMenu2CheckItem >
189
216
) ) }
217
+ < ContextMenu2SeparatorItem />
218
+ < ContextMenu2ButtonControlsItem >
219
+ < Button size = "small" color = "clear" onClick = { handleCancel } >
220
+ キャンセル
221
+ </ Button >
222
+ < Button size = "small" onClick = { handleApply } >
223
+ 適用
224
+ </ Button >
225
+ </ ContextMenu2ButtonControlsItem >
190
226
</ ContextMenu2 >
191
227
</ ContextMenu2Container >
192
228
< styled . TagList ref = { inlineFieldEl } >
0 commit comments