RCFilters: Load default saved query if it exists
Bug: T166908 Change-Id: Ic3931bc0d67b340db11ed100aad836e8d867fa56
This commit is contained in:
parent
1bb9a223d2
commit
d25a944635
2 changed files with 85 additions and 23 deletions
|
|
@ -540,6 +540,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
|
|||
public function execute( $subpage ) {
|
||||
$this->rcSubpage = $subpage;
|
||||
|
||||
$this->considerActionsForDefaultSavedQuery();
|
||||
|
||||
$rows = $this->getRows();
|
||||
$opts = $this->getOptions();
|
||||
if ( $rows === false ) {
|
||||
|
|
@ -591,6 +593,77 @@ abstract class ChangesListSpecialPage extends SpecialPage {
|
|||
$this->includeRcFiltersApp();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether or not the page should load defaults, and if so, whether
|
||||
* a default saved query is relevant to be redirected to. If it is relevant,
|
||||
* redirect properly with all necessary query parameters.
|
||||
*/
|
||||
protected function considerActionsForDefaultSavedQuery() {
|
||||
if ( !$this->isStructuredFilterUiEnabled() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$knownParams = call_user_func_array(
|
||||
[ $this->getRequest(), 'getValues' ],
|
||||
array_keys( $this->getOptions()->getAllValues() )
|
||||
);
|
||||
|
||||
// HACK: Temporarily until we can properly define "sticky" filters and parameters,
|
||||
// we need to exclude several parameters we know should not be counted towards preventing
|
||||
// the loading of defaults.
|
||||
$excludedParams = [ 'limit' => '', 'days' => '', 'enhanced' => '', 'from' => '' ];
|
||||
$knownParams = array_diff_key( $knownParams, $excludedParams );
|
||||
|
||||
if (
|
||||
// If there are NO known parameters in the URL request
|
||||
// (that are not excluded) then we need to check into loading
|
||||
// the default saved query
|
||||
count( $knownParams ) === 0
|
||||
) {
|
||||
// Get the saved queries data and parse it
|
||||
$savedQueries = FormatJson::decode(
|
||||
$this->getUser()->getOption( static::$savedQueriesPreferenceName ),
|
||||
true
|
||||
);
|
||||
|
||||
if ( $savedQueries && isset( $savedQueries[ 'default' ] ) ) {
|
||||
// Only load queries that are 'version' 2, since those
|
||||
// have parameter representation
|
||||
if ( $savedQueries[ 'version' ] === '2' ) {
|
||||
$savedQueryDefaultID = $savedQueries[ 'default' ];
|
||||
$defaultQuery = $savedQueries[ 'queries' ][ $savedQueryDefaultID ][ 'data' ];
|
||||
|
||||
// Build the entire parameter list
|
||||
$query = array_merge(
|
||||
$defaultQuery[ 'params' ],
|
||||
$defaultQuery[ 'highlights' ],
|
||||
[
|
||||
'urlversion' => '2',
|
||||
]
|
||||
);
|
||||
// Add to the query any parameters that we may have ignored before
|
||||
// but are still valid and requested in the URL
|
||||
$query = array_merge( $this->getRequest()->getValues(), $query );
|
||||
unset( $query[ 'title' ] );
|
||||
$this->getOutput()->redirect( $this->getPageTitle()->getCanonicalURL( $query ) );
|
||||
} else {
|
||||
// There's a default, but the version is not 2, and the server can't
|
||||
// actually recognize the query itself. This happens if it is before
|
||||
// the conversion, so we need to tell the UI to reload saved query as
|
||||
// it does the conversion to version 2
|
||||
$this->getOutput()->addJsConfigVars(
|
||||
'wgStructuredChangeFiltersDefaultSavedQueryExists',
|
||||
true
|
||||
);
|
||||
|
||||
// Add the class that tells the frontend it is still loading
|
||||
// another query
|
||||
$this->getOutput()->addBodyClasses( 'mw-rcfilters-ui-loading' );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Include the modules and configuration for the RCFilters app.
|
||||
* Conditional on the user having the feature enabled.
|
||||
|
|
@ -632,25 +705,15 @@ abstract class ChangesListSpecialPage extends SpecialPage {
|
|||
]
|
||||
);
|
||||
|
||||
$out->addJsConfigVars(
|
||||
'wgStructuredChangeFiltersSavedQueriesPreferenceName',
|
||||
static::$savedQueriesPreferenceName
|
||||
);
|
||||
|
||||
$out->addJsConfigVars(
|
||||
'StructuredChangeFiltersLiveUpdatePollingRate',
|
||||
$this->getConfig()->get( 'StructuredChangeFiltersLiveUpdatePollingRate' )
|
||||
);
|
||||
|
||||
if ( static::$savedQueriesPreferenceName ) {
|
||||
$savedQueries = FormatJson::decode(
|
||||
$this->getUser()->getOption( static::$savedQueriesPreferenceName )
|
||||
);
|
||||
if ( $savedQueries && isset( $savedQueries->default ) ) {
|
||||
// If there is a default saved query, show a loading spinner,
|
||||
// since the frontend is going to reload the results
|
||||
$out->addBodyClasses( 'mw-rcfilters-ui-loading' );
|
||||
}
|
||||
$out->addJsConfigVars(
|
||||
'wgStructuredChangeFiltersSavedQueriesPreferenceName',
|
||||
static::$savedQueriesPreferenceName
|
||||
);
|
||||
}
|
||||
} else {
|
||||
$out->addBodyClasses( 'mw-rcfilters-disabled' );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@
|
|||
mw.rcfilters.Controller.prototype.initialize = function ( filterStructure, namespaceStructure, tagList ) {
|
||||
var parsedSavedQueries,
|
||||
displayConfig = mw.config.get( 'StructuredChangeFiltersDisplayConfig' ),
|
||||
defaultSavedQueryExists = mw.config.get( 'wgStructuredChangeFiltersDefaultSavedQueryExists' ),
|
||||
controller = this,
|
||||
views = {},
|
||||
items = [],
|
||||
|
|
@ -231,14 +232,12 @@
|
|||
// Defaults should only be applied on load (if necessary)
|
||||
// or on request
|
||||
this.initializing = true;
|
||||
if (
|
||||
!mw.user.isAnon() && this.savedQueriesModel.getDefault() &&
|
||||
!this.uriProcessor.doesQueryContainRecognizedParams( uri.query )
|
||||
) {
|
||||
// We have defaults from a saved query.
|
||||
// We will load them straight-forward (as if
|
||||
// they were clicked in the menu) so we trigger
|
||||
// a full ajax request and change of URL
|
||||
|
||||
if ( defaultSavedQueryExists ) {
|
||||
// This came from the server, meaning that we have a default
|
||||
// saved query, but the server could not load it, probably because
|
||||
// it was pre-conversion to the new format.
|
||||
// We need to load this query again
|
||||
this.applySavedQuery( this.savedQueriesModel.getDefault() );
|
||||
} else {
|
||||
// There are either recognized parameters in the URL
|
||||
|
|
|
|||
Loading…
Reference in a new issue