* @param WebRequest $request
*
* @return bool
- * @throws HttpError
*/
public function canHandleRequest( $subPage, WebRequest $request ) {
if ( $subPage === '' || $subPage === null ) {
/**
* @return IDatabase
- * @throws MWException
*/
private function getConnection() {
return $this->loadBalancer->getConnectionRef( DB_REPLICA, [ 'watchlist' ] );
headerToColumns.forEach( function ( columns, headerIndex ) {
columns.forEach( function ( columnIndex, i ) {
- var header = $headers[ headerIndex ],
+ var j, sortColumn,
+ header = $headers[ headerIndex ],
$header = $( header );
if ( !isValueInArray( columnIndex, sortList ) ) {
} );
} else {
// Column shall be sorted: Apply designated count and order.
- sortList.forEach( function ( sortColumn ) {
+ for ( j = 0; j < sortList.length; j++ ) {
+ sortColumn = sortList[ j ];
if ( sortColumn[ 0 ] === i ) {
$header.data( {
order: sortColumn[ 1 ],
count: sortColumn[ 1 ] + 1
} );
- return false;
+ break;
}
- } );
+ }
}
} );
/**
* Get the first item with a current conflict
*
- * @return {mw.rcfilters.dm.FilterItem} Conflicted item
+ * @return {mw.rcfilters.dm.FilterItem|undefined} Conflicted item or undefined when not found
*/
FiltersViewModel.prototype.getFirstConflictedItem = function () {
- var conflictedItem;
-
- this.getItems().forEach( function ( filterItem ) {
+ var i, filterItem, items = this.getItems();
+ for ( i = 0; i < items.length; i++ ) {
+ filterItem = items[ i ];
if ( filterItem.isSelected() && filterItem.isConflicted() ) {
- conflictedItem = filterItem;
- return false;
+ return filterItem;
}
- } );
-
- return conflictedItem;
+ }
};
/**
var widget = this;
this.getRequestData().done( function ( data ) {
+ if ( widget.query.isReadOnly() ) {
+ // The request object is always abortable, so just
+ // prevent the results from displaying
+ return;
+ }
// Parent method
mw.widgets.TitleSearchWidget.parent.prototype.onQueryChange.call( widget );
widget.results.addItems( widget.getOptionsFromData( data ) );
return response.query || {};
};
+ /**
+ * Check if the widget is read-only.
+ *
+ * @return {boolean}
+ */
+ mw.widgets.TitleSearchWidget.prototype.isReadOnly = function () {
+ return this.query.isReadOnly();
+ };
+
+ /**
+ * Set the read-only state of the widget.
+ *
+ * @param {boolean} readOnly Make input read-only
+ * @chainable
+ * @return {mw.widgets.TitleSearchWidget} The widget, for chaining
+ */
+ mw.widgets.TitleSearchWidget.prototype.setReadOnly = function ( readOnly ) {
+ this.query.setReadOnly( readOnly );
+ if ( readOnly ) {
+ // Hide results
+ this.results.clearItems();
+ }
+ return this;
+ };
+
}() );