
Update the query for the "Recently closed" dashboard section to exclude WIP changes and changes ignored by the viewing user. We need integration with a Gerrit server and a search index to properly test these queries, so I've added tests for these queries to AbstractQueryChangesTest.java. This ensures that every search index implementation maintains expected behavior (and that we defined the queries correctly). Bug: Issue 7205 Change-Id: I388f69f83678b79d32d48a6e8267327a3ebf599e
168 lines
5.0 KiB
JavaScript
168 lines
5.0 KiB
JavaScript
// Copyright (C) 2016 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
(function() {
|
|
'use strict';
|
|
|
|
// NOTE: These queries are tested in Java. Any changes made to definitions
|
|
// here require corresponding changes to:
|
|
// gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
|
|
const DEFAULT_SECTIONS = [
|
|
{
|
|
// WIP open changes owned by viewing user. This section is omitted when
|
|
// viewing other users, so we don't need to filter anything out.
|
|
name: 'Work in progress',
|
|
query: 'is:open owner:${user} is:wip',
|
|
selfOnly: true,
|
|
},
|
|
{
|
|
// Non-WIP open changes owned by viewed user. Filter out changes ignored
|
|
// by the viewing user.
|
|
name: 'Outgoing reviews',
|
|
query: 'is:open owner:${user} -is:wip -is:ignored',
|
|
},
|
|
{
|
|
// Non-WIP open changes not owned by the viewed user, that the viewed user
|
|
// is associated with (as either a reviewer or the assignee). Changes
|
|
// ignored by the viewing user are filtered out.
|
|
name: 'Incoming reviews',
|
|
query: 'is:open -owner:${user} -is:wip -is:ignored ' +
|
|
'(reviewer:${user} OR assignee:${user})',
|
|
},
|
|
{
|
|
name: 'Recently closed',
|
|
// Closed changes where viewed user is owner, reviewer, or assignee.
|
|
// Changes ignored by the viewing user are filtered out, and so are WIP
|
|
// changes not owned by the viewing user (the one instance of
|
|
// 'owner:self' is intentional and implements this logic).
|
|
query: 'is:closed -is:ignored (-is:wip OR owner:self) ' +
|
|
'(owner:${user} OR reviewer:${user} OR assignee:${user})',
|
|
suffixForDashboard: '-age:4w limit:10',
|
|
},
|
|
];
|
|
|
|
Polymer({
|
|
is: 'gr-dashboard-view',
|
|
|
|
/**
|
|
* Fired when the title of the page should change.
|
|
*
|
|
* @event title-change
|
|
*/
|
|
|
|
properties: {
|
|
account: {
|
|
type: Object,
|
|
value() { return {}; },
|
|
},
|
|
/** @type {{ selectedChangeIndex: number }} */
|
|
viewState: Object,
|
|
|
|
/** @type {{ user: string }} */
|
|
params: {
|
|
type: Object,
|
|
},
|
|
|
|
_results: Array,
|
|
_sectionMetadata: {
|
|
type: Array,
|
|
value() { return DEFAULT_SECTIONS; },
|
|
},
|
|
|
|
/**
|
|
* For showing a "loading..." string during ajax requests.
|
|
*/
|
|
_loading: {
|
|
type: Boolean,
|
|
value: true,
|
|
},
|
|
},
|
|
|
|
observers: [
|
|
'_paramsChanged(params.*)',
|
|
],
|
|
|
|
behaviors: [
|
|
Gerrit.RESTClientBehavior,
|
|
],
|
|
|
|
get options() {
|
|
return this.listChangesOptionsToHex(
|
|
this.ListChangesOption.LABELS,
|
|
this.ListChangesOption.DETAILED_ACCOUNTS,
|
|
this.ListChangesOption.REVIEWED
|
|
);
|
|
},
|
|
|
|
_computeTitle(user) {
|
|
if (user === 'self') {
|
|
return 'My Reviews';
|
|
}
|
|
return 'Dashboard for ' + user;
|
|
},
|
|
|
|
_paramsChanged(paramsChangeRecord) {
|
|
const params = paramsChangeRecord.base;
|
|
|
|
if (!params.user && !params.sections) {
|
|
return;
|
|
}
|
|
|
|
const user = params.user || 'self';
|
|
const sections = (params.sections || DEFAULT_SECTIONS).filter(
|
|
section => (user === 'self' || !section.selfOnly));
|
|
const title = params.title || this._computeTitle(user);
|
|
|
|
// NOTE: This method may be called before attachment. Fire title-change
|
|
// in an async so that attachment to the DOM can take place first.
|
|
this.async(() => this.fire('title-change', {title}));
|
|
|
|
// Return if params indicate no longer in view.
|
|
if (!user && sections === DEFAULT_SECTIONS) {
|
|
return;
|
|
}
|
|
|
|
this._loading = true;
|
|
const queries =
|
|
sections.map(
|
|
section => this._dashboardQueryForSection(section, user));
|
|
this.$.restAPI.getChanges(null, queries, null, this.options)
|
|
.then(results => {
|
|
this._results = sections.map((section, i) => {
|
|
return {
|
|
sectionName: section.name,
|
|
query: queries[i],
|
|
results: results[i],
|
|
};
|
|
});
|
|
this._loading = false;
|
|
}).catch(err => {
|
|
this._loading = false;
|
|
console.warn(err.message);
|
|
});
|
|
},
|
|
|
|
_dashboardQueryForSection(section, user) {
|
|
const query =
|
|
section.suffixForDashboard ?
|
|
section.query + ' ' + section.suffixForDashboard :
|
|
section.query;
|
|
return query.replace(/\$\{user\}/g, user);
|
|
},
|
|
|
|
_computeUserHeaderClass(userParam) {
|
|
return userParam === 'self' ? 'hide' : '';
|
|
},
|
|
});
|
|
})();
|