3 * Quick links menu option widget
5 * @extends OO.ui.Widget
6 * @mixins OO.ui.mixin.LabelElement
7 * @mixins OO.ui.mixin.IconElement
10 * @param {mw.rcfilters.dm.SavedQueryItemModel} model View model
11 * @param {Object} [config] Configuration object
12 * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
14 mw
.rcfilters
.ui
.SavedLinksListItemWidget
= function MwRcfiltersUiSavedLinksListWidget( model
, config
) {
15 config
= config
|| {};
20 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.parent
.call( this, $.extend( {
21 data
: this.model
.getID()
25 OO
.ui
.mixin
.LabelElement
.call( this, $.extend( {
26 label
: this.model
.getLabel()
28 OO
.ui
.mixin
.IconElement
.call( this, $.extend( {
33 this.$overlay
= config
.$overlay
|| this.$element
;
35 this.popupButton
= new OO
.ui
.ButtonWidget( {
36 classes
: [ 'mw-rcfilters-ui-savedLinksListItemWidget-button' ],
40 this.menu
= new OO
.ui
.FloatingMenuSelectWidget( {
41 classes
: [ 'mw-rcfilters-ui-savedLinksListItemWidget-menu' ],
42 widget
: this.popupButton
,
44 horizontalPosition
: 'end',
45 $container
: this.popupButton
.$element
,
47 new OO
.ui
.MenuOptionWidget( {
50 label
: mw
.msg( 'rcfilters-savedqueries-rename' )
52 new OO
.ui
.MenuOptionWidget( {
55 label
: mw
.msg( 'rcfilters-savedqueries-remove' )
57 new OO
.ui
.MenuOptionWidget( {
60 label
: mw
.msg( 'rcfilters-savedqueries-setdefault' )
65 this.editInput
= new OO
.ui
.TextInputWidget( {
66 classes
: [ 'mw-rcfilters-ui-savedLinksListItemWidget-input' ]
68 this.saveButton
= new OO
.ui
.ButtonWidget( {
70 flags
: [ 'primary', 'progressive' ]
72 this.toggleEdit( false );
75 this.model
.connect( this, { update
: 'onModelUpdate' } );
76 this.popupButton
.connect( this, { click
: 'onPopupButtonClick' } );
77 this.menu
.connect( this, {
78 choose
: 'onMenuChoose'
80 this.saveButton
.connect( this, { click
: 'onSaveButtonClick' } );
81 this.editInput
.connect( this, { enter
: 'onEditInputEnter' } );
82 this.editInput
.$input
.on( {
83 blur
: this.onInputBlur
.bind( this ),
84 keyup
: this.onInputKeyup
.bind( this )
86 this.$element
.on( { click
: this.onClick
.bind( this ) } );
87 this.$label
.on( { click
: this.onClick
.bind( this ) } );
88 // Prevent propagation on mousedown for the save button
89 // so the menu doesn't close
90 this.saveButton
.$element
.on( { mousedown: function () { return false; } } );
93 this.toggleDefault( !!this.model
.isDefault() );
94 this.$overlay
.append( this.menu
.$element
);
96 .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget' )
97 .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-query-' + this.model
.getID() )
100 .addClass( 'mw-rcfilters-ui-table' )
103 .addClass( 'mw-rcfilters-ui-row' )
106 .addClass( 'mw-rcfilters-ui-cell' )
107 .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-icon' )
108 .append( this.$icon
),
110 .addClass( 'mw-rcfilters-ui-cell' )
111 .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-content' )
114 .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-label' ),
115 this.editInput
.$element
,
116 this.saveButton
.$element
118 this.popupButton
.$element
119 .addClass( 'mw-rcfilters-ui-cell' )
126 OO
.inheritClass( mw
.rcfilters
.ui
.SavedLinksListItemWidget
, OO
.ui
.Widget
);
127 OO
.mixinClass( mw
.rcfilters
.ui
.SavedLinksListItemWidget
, OO
.ui
.mixin
.LabelElement
);
128 OO
.mixinClass( mw
.rcfilters
.ui
.SavedLinksListItemWidget
, OO
.ui
.mixin
.IconElement
);
135 * The delete option was selected for this item
140 * @param {boolean} default Item is default
142 * The 'make default' option was selected for this item
147 * @param {string} newLabel New label for the query
149 * The label has been edited
155 * Respond to model update event
157 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.prototype.onModelUpdate = function () {
158 this.setLabel( this.model
.getLabel() );
159 this.toggleDefault( this.model
.isDefault() );
163 * Respond to click on the element or label
167 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.prototype.onClick = function () {
168 if ( !this.editing
) {
169 this.emit( 'click' );
173 * Respond to popup button click event
175 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.prototype.onPopupButtonClick = function () {
180 * Respond to menu choose event
182 * @param {OO.ui.MenuOptionWidget} item Chosen item
186 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.prototype.onMenuChoose = function ( item
) {
187 var action
= item
.getData();
189 if ( action
=== 'edit' ) {
190 this.toggleEdit( true );
191 } else if ( action
=== 'delete' ) {
192 this.emit( 'delete' );
193 } else if ( action
=== 'default' ) {
194 this.emit( 'default', !this.default );
197 this.menu
.selectItem( null );
199 this.menu
.toggle( false );
203 * Respond to save button click
205 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.prototype.onSaveButtonClick = function () {
206 this.emit( 'edit', this.editInput
.getValue() );
207 this.toggleEdit( false );
211 * Respond to input enter event
213 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.prototype.onEditInputEnter = function () {
214 this.emit( 'edit', this.editInput
.getValue() );
215 this.toggleEdit( false );
219 * Respond to input keyup event, this is the way to intercept 'escape' key
221 * @param {jQuery.Event} e Event data
222 * @returns {boolean} false
224 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.prototype.onInputKeyup = function ( e
) {
225 if ( e
.which
=== OO
.ui
.Keys
.ESCAPE
) {
226 // Return the input to the original label
227 this.editInput
.setValue( this.getLabel() );
228 this.toggleEdit( false );
234 * Respond to blur event on the input
236 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.prototype.onInputBlur = function () {
237 this.emit( 'edit', this.editInput
.getValue() );
238 this.toggleEdit( false );
242 * Toggle edit mode on this widget
244 * @param {boolean} isEdit Widget is in edit mode
246 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.prototype.toggleEdit = function ( isEdit
) {
247 isEdit
= isEdit
=== undefined ? !this.editing
: isEdit
;
249 if ( this.editing
!== isEdit
) {
250 this.$element
.toggleClass( 'mw-rcfilters-ui-savedLinksListItemWidget-edit', isEdit
);
251 this.editInput
.setValue( this.getLabel() );
253 this.editInput
.toggle( isEdit
);
254 this.$label
.toggleClass( 'oo-ui-element-hidden', isEdit
);
255 this.popupButton
.toggle( !isEdit
);
256 this.saveButton
.toggle( isEdit
);
259 this.editInput
.$input
.focus();
261 this.editing
= isEdit
;
266 * Toggle default this widget
268 * @param {boolean} isDefault This item is default
270 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.prototype.toggleDefault = function ( isDefault
) {
271 isDefault
= isDefault
=== undefined ? !this.default : isDefault
;
273 if ( this.default !== isDefault
) {
274 this.default = isDefault
;
275 this.setIcon( this.default ? 'pushPin' : '' );
276 this.menu
.getItemFromData( 'default' ).setLabel(
278 mw
.msg( 'rcfilters-savedqueries-unsetdefault' ) :
279 mw
.msg( 'rcfilters-savedqueries-setdefault' )
287 * @returns {string} Query identifier
289 mw
.rcfilters
.ui
.SavedLinksListItemWidget
.prototype.getID = function () {
290 return this.model
.getID();