55 * This Source Code Form is "Incompatible With Secondary Licenses", as
66 * defined by the Mozilla Public License, v. 2.0. */
77
8- var Dom = YAHOO . util . Dom ;
9- var Event = YAHOO . util . Event ;
10-
118var REVIEW = {
129 widget : false ,
1310 target : false ,
1411 fields : [ ] ,
1512 use_error_for : false ,
1613 ispatch_override : false ,
1714 description_override : false ,
15+ ignore_patch_event : true ,
1816
1917 init_review_flag : function ( fid , flag_name ) {
2018 var idx = this . fields . push ( { 'fid' : fid , 'flag_name' : flag_name , 'component' : '' } ) - 1 ;
21- this . flag_change ( false , idx ) ;
22- Event . addListener ( fid , 'change' , this . flag_change , idx ) ;
19+ this . flag_change ( { data : idx } ) ;
20+ $ ( '#' + fid ) . on ( 'change' , null , idx , this . flag_change ) ;
2321 } ,
2422
2523 init_mandatory : function ( ) {
2624 var form = this . find_form ( ) ;
2725 if ( ! form ) return ;
28- Event . addListener ( form , 'submit' , this . check_mandatory ) ;
26+ $ ( form ) . on ( 'submit' , this . check_mandatory ) ;
2927 for ( var i = 0 ; i < this . fields . length ; i ++ ) {
3028 var field = this . fields [ i ] ;
3129 // existing reviews that have empty requestee shouldn't force a
3230 // reviewer to be selected
33- field . old_empty_review = Dom . get ( field . fid ) . value == '?'
34- && Dom . get ( field . flag_name ) . value == '' ;
31+ field . old_empty_review = $ ( '#' + field . fid ) . val ( ) == '?'
32+ && $ ( '#' + field . flag_name ) . val ( ) == '' ;
3533 if ( ! field . old_empty_review )
36- Dom . addClass ( field . flag_name , 'required' ) ;
34+ $ ( '#' + field . flag_name ) . addClass ( 'required' ) ;
3735 }
3836 } ,
3937
4038 init_enter_bug : function ( ) {
41- Event . addListener ( ' component', 'change' , REVIEW . component_change ) ;
39+ $ ( '# component') . on ( 'change' , REVIEW . component_change ) ;
4240 BUGZILLA . string [ 'reviewer_required' ] = 'A reviewer is required.' ;
4341 this . use_error_for = true ;
4442 this . init_create_attachment ( ) ;
4543 } ,
4644
4745 init_create_attachment : function ( ) {
48- Event . addListener ( ' data', 'change' , REVIEW . attachment_change ) ;
49- Event . addListener ( ' description', 'change' , REVIEW . description_change ) ;
50- Event . addListener ( ' ispatch', 'change' , REVIEW . ispatch_change ) ;
46+ $ ( '# data') . on ( 'change' , REVIEW . attachment_change ) ;
47+ $ ( '# description') . on ( 'change' , REVIEW . description_change ) ;
48+ $ ( '# ispatch') . on ( 'change' , REVIEW . ispatch_change ) ;
5149 } ,
5250
5351 component_change : function ( ) {
5452 for ( var i = 0 ; i < REVIEW . fields . length ; i ++ ) {
55- REVIEW . flag_change ( false , i ) ;
53+ REVIEW . flag_change ( { data : i } ) ;
5654 }
5755 } ,
5856
5957 attachment_change : function ( ) {
60- var filename = Dom . get ( ' data') . value . split ( '/' ) . pop ( ) . split ( '\\' ) . pop ( ) ;
61- var description = Dom . get ( ' description') ;
62- if ( description . value == '' || ! REVIEW . description_override ) {
63- description . value = filename ;
58+ var filename = $ ( '# data') . val ( ) . split ( '/' ) . pop ( ) . split ( '\\' ) . pop ( ) ;
59+ var description = $ ( '# description') . first ( ) ;
60+ if ( description . val ( ) == '' || ! REVIEW . description_override ) {
61+ description . val ( filename ) ;
6462 }
6563 if ( ! REVIEW . ispatch_override ) {
66- Dom . get ( ' ispatch') . checked =
67- REVIEW . endsWith ( filename , '.diff' ) || REVIEW . endsWith ( filename , '.patch' ) ;
64+ $ ( '# ispatch') . prop ( ' checked' ,
65+ REVIEW . endsWith ( filename , '.diff' ) || REVIEW . endsWith ( filename , '.patch' ) ) ;
6866 }
6967 setContentTypeDisabledState ( this . form ) ;
7068 description . select ( ) ;
@@ -76,76 +74,86 @@ var REVIEW = {
7674 } ,
7775
7876 ispatch_change : function ( ) {
77+ // the attachment template triggers this change event onload
78+ // as we only want to set ispatch_override when the user clicks on the
79+ // checkbox, we ignore this first event
80+ if ( REVIEW . ignore_patch_event ) {
81+ REVIEW . ignore_patch_event = false ;
82+ return ;
83+ }
7984 REVIEW . ispatch_override = true ;
8085 } ,
8186
82- flag_change : function ( e , field_idx ) {
83- var field = REVIEW . fields [ field_idx ] ;
84- var suggestions_span = Dom . get ( field . fid + '_suggestions' ) ;
87+ flag_change : function ( e ) {
88+ var field = REVIEW . fields [ e . data ] ;
89+ var suggestions_span = $ ( '#' + field . fid + '_suggestions' ) ;
8590
8691 // for requests only
87- if ( Dom . get ( field . fid ) . value != '?' ) {
88- Dom . addClass ( suggestions_span , 'bz_default_hidden' ) ;
92+ if ( $ ( '#' + field . fid ) . val ( ) != '?' ) {
93+ suggestions_span . hide ( ) ;
8994 return ;
9095 }
9196
9297 // find selected component
93- var component = static_component || Dom . get ( ' component') . value ;
98+ var component = static_component || $ ( '# component') . val ( ) ;
9499 if ( ! component ) {
95- Dom . addClass ( suggestions_span , 'bz_default_hidden' ) ;
100+ suggestions_span . hide ( ) ;
96101 return ;
97102 }
98103
99- // init menu and events
100- if ( ! field . menu ) {
101- field . menu = new YAHOO . widget . Menu ( field . fid + '_menu' ) ;
102- field . menu . render ( document . body ) ;
103- field . menu . subscribe ( 'click' , REVIEW . suggestion_click ) ;
104- Event . addListener ( field . fid + '_suggestions_link' , 'click' , REVIEW . suggestions_click , field_idx )
105- }
106-
107- // build review list
104+ // add the menu
108105 if ( field . component != component ) {
109- field . menu . clearContent ( ) ;
106+ var items = [ ] ;
110107 for ( var i = 0 , il = review_suggestions . _mentors . length ; i < il ; i ++ ) {
111- REVIEW . add_menu_item ( field_idx , review_suggestions . _mentors [ i ] , true ) ;
108+ REVIEW . add_menu_item ( items , review_suggestions . _mentors [ i ] , true ) ;
112109 }
113110 if ( review_suggestions [ component ] && review_suggestions [ component ] . length ) {
114- REVIEW . add_menu_items ( field_idx , review_suggestions [ component ] ) ;
115- } else if ( review_suggestions . _product ) {
116- REVIEW . add_menu_items ( field_idx , review_suggestions . _product ) ;
111+ REVIEW . add_menu_items ( items , review_suggestions [ component ] ) ;
112+ }
113+ else if ( review_suggestions . _product ) {
114+ REVIEW . add_menu_items ( items , review_suggestions . _product ) ;
115+ }
116+ if ( items . length ) {
117+ suggestions_span . show ( ) ;
118+ $ . contextMenu ( 'destroy' , '#' + field . fid + '_suggestions' ) ;
119+ $ . contextMenu ( {
120+ selector : '#' + field . fid + '_suggestions' ,
121+ trigger : 'left' ,
122+ events : {
123+ show : function ( ) {
124+ REVIEW . target = $ ( '#' + field . flag_name ) ;
125+ }
126+ } ,
127+ items : items
128+ } ) ;
129+ }
130+ else {
131+ suggestions_span . hide ( ) ;
117132 }
118- field . menu . render ( ) ;
119- field . component = component ;
120- }
121-
122- // show (or hide) the menu
123- if ( field . menu . getItem ( 0 ) ) {
124- Dom . removeClass ( suggestions_span , 'bz_default_hidden' ) ;
125- } else {
126- Dom . addClass ( suggestions_span , 'bz_default_hidden' ) ;
127133 }
128134 } ,
129135
130- add_menu_item : function ( field_idx , user , is_mentor ) {
131- var menu = REVIEW . fields [ field_idx ] . menu ;
132- var items = menu . getItems ( ) ;
136+ add_menu_item : function ( items , user , is_mentor ) {
133137 for ( var i = 0 , il = items . length ; i < il ; i ++ ) {
134- if ( items [ i ] . cfg . config . url . value == '#' + user . login ) {
138+ if ( items [ i ] . login == user . login )
135139 return ;
136- }
137140 }
141+
138142 var queue = '' ;
139143 if ( user . review_count == 0 ) {
140144 queue = 'empty queue' ;
141145 } else {
142146 queue = user . review_count + ' review' + ( user . review_count == 1 ? '' : 's' ) + ' in queue' ;
143147 }
144- var item = menu . addItem (
145- { text : user . identity + ' (' + queue + ')' , url : '#' + user . login }
146- ) ;
147- if ( is_mentor )
148- item . cfg . setProperty ( 'classname' , 'mentor' ) ;
148+
149+ items . push ( {
150+ name : user . identity + ' (' + queue + ')' ,
151+ login : user . login ,
152+ className : ( is_mentor ? 'mentor' : '' ) ,
153+ callback : function ( ) {
154+ REVIEW . target . val ( user . login ) ;
155+ }
156+ } ) ;
149157 } ,
150158
151159 add_menu_items : function ( field_idx , users ) {
@@ -158,39 +166,24 @@ var REVIEW = {
158166 }
159167 } ,
160168
161- suggestions_click : function ( e , field_idx ) {
162- var field = REVIEW . fields [ field_idx ] ;
163- field . menu . cfg . setProperty ( 'xy' , Event . getXY ( e ) ) ;
164- field . menu . show ( ) ;
165- Event . stopEvent ( e ) ;
166- REVIEW . target = field . flag_name ;
167- } ,
168-
169- suggestion_click : function ( type , args ) {
170- if ( args [ 1 ] ) {
171- Dom . get ( REVIEW . target ) . value = decodeURIComponent ( args [ 1 ] . cfg . getProperty ( 'url' ) ) . substr ( 1 ) ;
172- }
173- Event . stopEvent ( args [ 0 ] ) ;
174- } ,
175-
176169 check_mandatory : function ( e ) {
177- if ( Dom . get ( ' data') && ! Dom . get ( ' data') . value
178- && Dom . get ( ' attach_text') && ! Dom . get ( ' attach_text') . value )
170+ if ( $ ( '# data') . length && ! $ ( '# data') . val ( )
171+ && $ ( '# attach_text') . length && ! $ ( '# attach_text') . val ( ) )
179172 {
180173 return ;
181174 }
182175 for ( var i = 0 ; i < REVIEW . fields . length ; i ++ ) {
183176 var field = REVIEW . fields [ i ] ;
184177 if ( ! field . old_empty_review
185- && Dom . get ( field . fid ) . value == '?'
186- && Dom . get ( field . flag_name ) . value == '' )
178+ && $ ( '#' + field . fid ) . val ( ) == '?'
179+ && $ ( '#' + field . flag_name ) . val ( ) == '' )
187180 {
188181 if ( REVIEW . use_error_for ) {
189- _errorFor ( Dom . get ( REVIEW . fields [ i ] . flag_name ) , 'reviewer' ) ;
182+ _errorFor ( $ ( '#' + REVIEW . fields [ i ] . flag_name ) [ 0 ] , 'reviewer' ) ;
190183 } else {
191184 alert ( 'You must provide a reviewer for review requests.' ) ;
192185 }
193- Event . stopEvent ( e ) ;
186+ e . preventDefault ( ) ;
194187 }
195188 }
196189 } ,
0 commit comments