@@ -27,6 +27,28 @@ describe('table > thead events', () => {
2727 expect ( wrapper . emitted ( 'head-clicked' ) ) . toBeUndefined ( )
2828 } )
2929
30+ it ( 'should not emit head-contextmenu event when a head cell is clicked and no head-contextmenu listener' , async ( ) => {
31+ const wrapper = mount ( BTable , {
32+ propsData : {
33+ fields : testFields ,
34+ items : testItems
35+ } ,
36+ listeners : { }
37+ } )
38+ expect ( wrapper ) . toBeDefined ( )
39+ const $rows = wrapper . findAll ( 'thead > tr' )
40+ expect ( $rows . length ) . toBe ( 1 )
41+ const $ths = wrapper . findAll ( 'thead > tr > th' )
42+ expect ( $ths . length ) . toBe ( testFields . length )
43+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
44+ await $ths . at ( 0 ) . trigger ( 'contextmenu' )
45+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
46+ await $ths . at ( 1 ) . trigger ( 'contextmenu' )
47+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
48+ await $ths . at ( 2 ) . trigger ( 'contextmenu' )
49+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
50+ } )
51+
3052 it ( 'should emit head-clicked event when a head cell is clicked' , async ( ) => {
3153 const wrapper = mount ( BTable , {
3254 propsData : {
@@ -62,6 +84,41 @@ describe('table > thead events', () => {
6284 wrapper . destroy ( )
6385 } )
6486
87+ it ( 'should emit head-contextmenu event when a head cell is context clicked' , async ( ) => {
88+ const wrapper = mount ( BTable , {
89+ propsData : {
90+ fields : testFields ,
91+ items : testItems
92+ } ,
93+ listeners : {
94+ // Head-contextmenu will only be emitted if there is a registered listener
95+ 'head-contextmenu' : ( ) => { }
96+ }
97+ } )
98+ expect ( wrapper ) . toBeDefined ( )
99+ const $rows = wrapper . findAll ( 'thead > tr' )
100+ expect ( $rows . length ) . toBe ( 1 )
101+ const $ths = wrapper . findAll ( 'thead > tr > th' )
102+ expect ( $ths . length ) . toBe ( testFields . length )
103+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
104+ await $ths . at ( 0 ) . trigger ( 'contextmenu' )
105+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeDefined ( )
106+ expect ( wrapper . emitted ( 'head-contextmenu' ) . length ) . toBe ( 1 )
107+ expect ( wrapper . emitted ( 'head-contextmenu' ) [ 0 ] [ 0 ] ) . toEqual ( testFields [ 0 ] . key ) // Field key
108+ expect ( wrapper . emitted ( 'head-contextmenu' ) [ 0 ] [ 1 ] ) . toEqual ( testFields [ 0 ] ) // Field definition
109+ expect ( wrapper . emitted ( 'head-contextmenu' ) [ 0 ] [ 2 ] ) . toBeInstanceOf ( MouseEvent ) // Event
110+ expect ( wrapper . emitted ( 'head-contextmenu' ) [ 0 ] [ 3 ] ) . toBe ( false ) // Is footer
111+
112+ await $ths . at ( 2 ) . trigger ( 'contextmenu' )
113+ expect ( wrapper . emitted ( 'head-contextmenu' ) . length ) . toBe ( 2 )
114+ expect ( wrapper . emitted ( 'head-contextmenu' ) [ 1 ] [ 0 ] ) . toEqual ( testFields [ 2 ] . key ) // Field key
115+ expect ( wrapper . emitted ( 'head-contextmenu' ) [ 1 ] [ 1 ] ) . toEqual ( testFields [ 2 ] ) // Field definition
116+ expect ( wrapper . emitted ( 'head-contextmenu' ) [ 1 ] [ 2 ] ) . toBeInstanceOf ( MouseEvent ) // Event
117+ expect ( wrapper . emitted ( 'head-contextmenu' ) [ 1 ] [ 3 ] ) . toBe ( false ) // Is footer
118+
119+ wrapper . destroy ( )
120+ } )
121+
65122 it ( 'should not emit head-clicked event when prop busy is set' , async ( ) => {
66123 const wrapper = mount ( BTable , {
67124 propsData : {
@@ -84,6 +141,28 @@ describe('table > thead events', () => {
84141 wrapper . destroy ( )
85142 } )
86143
144+ it ( 'should not emit head-contextmenu event when prop busy is set' , async ( ) => {
145+ const wrapper = mount ( BTable , {
146+ propsData : {
147+ fields : testFields ,
148+ items : testItems ,
149+ busy : true
150+ } ,
151+ listeners : {
152+ // Head-contextmenu will only be emitted if there is a registered listener
153+ 'head-contextmenu' : ( ) => { }
154+ }
155+ } )
156+ expect ( wrapper ) . toBeDefined ( )
157+ const $ths = wrapper . findAll ( 'thead > tr > th' )
158+ expect ( $ths . length ) . toBe ( testFields . length )
159+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
160+ await $ths . at ( 0 ) . trigger ( 'contextmenu' )
161+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
162+
163+ wrapper . destroy ( )
164+ } )
165+
87166 it ( 'should not emit head-clicked event when vm.localBusy is true' , async ( ) => {
88167 const wrapper = mount ( BTable , {
89168 propsData : {
@@ -108,6 +187,28 @@ describe('table > thead events', () => {
108187 wrapper . destroy ( )
109188 } )
110189
190+ it ( 'should not emit head-contextmenu event when vm.localBusy is true' , async ( ) => {
191+ const wrapper = mount ( BTable , {
192+ propsData : {
193+ fields : testFields ,
194+ items : testItems
195+ } ,
196+ listeners : {
197+ // Head-contextmenu will only be emitted if there is a registered listener
198+ 'head-contextmenu' : ( ) => { }
199+ }
200+ } )
201+ await wrapper . setData ( { localBusy : true } )
202+ expect ( wrapper ) . toBeDefined ( )
203+ const $ths = wrapper . findAll ( 'thead > tr > th' )
204+ expect ( $ths . length ) . toBe ( testFields . length )
205+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
206+ await $ths . at ( 0 ) . trigger ( 'contextmenu' )
207+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
208+
209+ wrapper . destroy ( )
210+ } )
211+
111212 it ( 'should not emit head-clicked event when clicking on a button or other interactive element' , async ( ) => {
112213 const wrapper = mount ( BTable , {
113214 propsData : {
@@ -147,4 +248,44 @@ describe('table > thead events', () => {
147248
148249 wrapper . destroy ( )
149250 } )
251+
252+ it ( 'should not emit head-contextmenu event when clicking on a button or other interactive element' , async ( ) => {
253+ const wrapper = mount ( BTable , {
254+ propsData : {
255+ fields : testFields ,
256+ items : testItems
257+ } ,
258+ listeners : {
259+ // Head-contextmenu will only be emitted if there is a registered listener
260+ 'head-contextmenu' : ( ) => { }
261+ } ,
262+ slots : {
263+ // In Vue 2.6x, slots get translated into scopedSlots
264+ 'head(a)' : '<button id="a">button</button>' ,
265+ 'head(b)' : '<input id="b">' ,
266+ 'head(c)' : '<a href="#" id="c">link</a>'
267+ }
268+ } )
269+ expect ( wrapper ) . toBeDefined ( )
270+ const $ths = wrapper . findAll ( 'thead > tr > th' )
271+ expect ( $ths . length ) . toBe ( testFields . length )
272+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
273+
274+ const $btn = wrapper . find ( 'button[id="a"]' )
275+ expect ( $btn . exists ( ) ) . toBe ( true )
276+ await $btn . trigger ( 'contextmenu' )
277+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
278+
279+ const $input = wrapper . find ( 'input[id="b"]' )
280+ expect ( $input . exists ( ) ) . toBe ( true )
281+ await $input . trigger ( 'contextmenu' )
282+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
283+
284+ const $link = wrapper . find ( 'a[id="c"]' )
285+ expect ( $link . exists ( ) ) . toBe ( true )
286+ await $link . trigger ( 'contextmenu' )
287+ expect ( wrapper . emitted ( 'head-contextmenu' ) ) . toBeUndefined ( )
288+
289+ wrapper . destroy ( )
290+ } )
150291} )
0 commit comments