11import TabulatorFull from '../../../src/js/core/TabulatorFull.js' ;
22import Edit from '../../../src/js/modules/Edit/Edit.js' ;
3+ import List from '../../../src/js/modules/Edit/List.js' ;
34import { DateTime } from "luxon" ;
45
56describe ( "Edit module" , ( ) => {
@@ -34,7 +35,38 @@ describe("Edit module", () => {
3435 return newTable ;
3536 } ;
3637
38+ const setupList = async ( {
39+ cellType = "header" ,
40+ cellValue = "Female" ,
41+ editorParams = { values : [ "Male" , "Female" ] } ,
42+ success = jest . fn ( ) ,
43+ cancel = jest . fn ( ) ,
44+ } = { } ) => {
45+ const element = document . createElement ( "div" ) ;
46+ const list = new List (
47+ {
48+ table : { } ,
49+ } ,
50+ {
51+ getType : jest . fn ( ) . mockReturnValue ( cellType ) ,
52+ getValue : jest . fn ( ) . mockReturnValue ( cellValue ) ,
53+ getElement : jest . fn ( ) . mockReturnValue ( element ) ,
54+ } ,
55+ jest . fn ( ) ,
56+ success ,
57+ cancel ,
58+ editorParams
59+ ) ;
60+
61+ list . input . dispatchEvent ( new Event ( "focus" ) ) ;
62+ await new Promise ( resolve => setTimeout ( resolve , 0 ) ) ;
63+
64+ return { list, success, cancel, element} ;
65+ } ;
66+
3767 beforeEach ( async ( ) => {
68+ // jsdom does not implement scrollIntoView, which the list focus uses.
69+ Element . prototype . scrollIntoView = jest . fn ( ) ;
3870 table = await setupTable ( ) ;
3971 } ) ;
4072
@@ -126,6 +158,61 @@ describe("Edit module", () => {
126158 // Should have received the cellEdited event
127159 expect ( cellEditedSpy ) . toHaveBeenCalled ( ) ;
128160 } ) ;
161+
162+ it ( "should apply a focused header list filter item when Enter is pressed" , async ( ) => {
163+ const { list, success} = await setupList ( {
164+ cellValue : "" ,
165+ } ) ;
166+
167+ // Navigate down to "Female" (the second option) and apply it.
168+ list . listEl . dispatchEvent ( new KeyboardEvent ( "keydown" , { key : "ArrowDown" , bubbles : true } ) ) ;
169+ list . listEl . dispatchEvent ( new KeyboardEvent ( "keydown" , { key : "ArrowDown" , bubbles : true } ) ) ;
170+ list . listEl . dispatchEvent ( new KeyboardEvent ( "keydown" , { key : "Enter" , bubbles : true } ) ) ;
171+
172+ expect ( success ) . toHaveBeenCalledWith ( "Female" ) ;
173+ expect ( list . input . value ) . toBe ( "Female" ) ;
174+ } ) ;
175+
176+ it ( "should keep a header list filter selected when Enter is pressed repeatedly" , async ( ) => {
177+ const { list, success} = await setupList ( ) ;
178+
179+ list . listEl . dispatchEvent ( new KeyboardEvent ( "keydown" , { key : "Enter" , bubbles : true } ) ) ;
180+ list . listEl . dispatchEvent ( new KeyboardEvent ( "keydown" , { key : "Enter" , bubbles : true } ) ) ;
181+
182+ expect ( success ) . toHaveBeenCalledTimes ( 2 ) ;
183+ expect ( success ) . toHaveBeenNthCalledWith ( 1 , "Female" ) ;
184+ expect ( success ) . toHaveBeenNthCalledWith ( 2 , "Female" ) ;
185+ } ) ;
186+
187+ it ( "should use currentItems instead of initialValues after the first multiselect parse" , async ( ) => {
188+ const { list} = await setupList ( {
189+ cellType : "cell" ,
190+ cellValue : [ "red" , "blue" ] ,
191+ editorParams : {
192+ multiselect : true ,
193+ values : [ "red" , "green" , "blue" ] ,
194+ } ,
195+ } ) ;
196+
197+ expect ( list . initialValues ) . toBeNull ( ) ;
198+ expect ( list . currentItems . map ( item => item . value ) ) . toEqual ( [ "red" , "blue" ] ) ;
199+
200+ // Deselect "red" by clicking its rendered list item.
201+ list . data . find ( item => item . value === "red" ) . element . dispatchEvent ( new MouseEvent ( "click" , { bubbles : true } ) ) ;
202+
203+ expect ( list . currentItems . map ( item => item . value ) ) . toEqual ( [ "blue" ] ) ;
204+
205+ list . input . dispatchEvent ( new Event ( "focus" ) ) ;
206+ await new Promise ( resolve => setTimeout ( resolve , 0 ) ) ;
207+
208+ const redItem = list . data . find ( item => item . value === "red" ) ;
209+ const blueItem = list . data . find ( item => item . value === "blue" ) ;
210+
211+ expect ( list . initialValues ) . toBeNull ( ) ;
212+ expect ( redItem . selected ) . toBe ( false ) ;
213+ expect ( blueItem . selected ) . toBe ( true ) ;
214+ expect ( list . currentItems ) . toEqual ( [ blueItem ] ) ;
215+ } ) ;
129216
130217 // Regression test for https://github.com/tabulator-tables/tabulator/issues/4421
131218 //
@@ -268,4 +355,4 @@ describe("Edit module - date editors with 'x' (epoch milliseconds) format", () =
268355
269356 expect ( typeof cell . getValue ( ) ) . toBe ( "number" ) ;
270357 } ) ;
271- } ) ;
358+ } ) ;
0 commit comments