/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This Source Code Form is "Incompatible With Secondary Licenses", as
* defined by the Mozilla Public License, v. 2.0. */
/**
* Reference or define the Bugzilla app namespace.
* @namespace
*/
var Bugzilla = Bugzilla || {}; // eslint-disable-line no-var
/**
* Show the current user's most-used components on the New Bug page.
*/
Bugzilla.NewBugFrequentComp = class NewBugFrequentComp {
/**
* Initialize a new NewBugFrequentComp instance.
*/
constructor() {
this.$container = document.querySelector('#frequent-components');
if (this.$container && BUGZILLA.user.login) {
this.init();
}
}
/**
* Initialize the UI.
*/
async init() {
this.$results = this.$container.querySelector('.results');
this.$message = this.$results.appendChild(document.createElement('p'));
this.$message.textContent = 'Loading...';
this.$results.setAttribute('aria-busy', 'true');
this.$container.hidden = false;
try {
const results = await this.fetch();
this.$message.remove();
this.$results.insertAdjacentHTML('beforeend',
`
`
);
} catch (error) {
this.$message.textContent = error.message || 'Your frequent components could not be retrieved.';
}
this.$results.removeAttribute('aria-busy');
}
/**
* Retrieve frequently used components.
* @param {Number} [max=10] Maximum number of results.
* @returns {Promise} Results or error.
*/
async fetch(max = 10) {
const params = new URLSearchParams({
email1: BUGZILLA.user.login,
emailreporter1: '1',
emailtype1: 'exact',
chfield: '[Bug creation]',
chfieldfrom: '-1y',
chfieldto: 'Now',
include_fields: 'product,component',
});
return new Promise((resolve, reject) => {
bugzilla_ajax({
url: `/rest/bug?${params.toString()}`
}, response => {
if (!response.bugs) {
reject(new Error('Your frequent components could not be retrieved.'));
return;
}
if (!response.bugs.length) {
reject(new Error(('Your frequent components could not be found.')));
return;
}
const results = [];
for (const { product, component } of response.bugs) {
const index = results.findIndex(result => product === result.product && component === result.component);
if (index > -1) {
results[index].count++;
} else {
results.push({ product, component, count: 1 });
}
}
// Sort in descending order
results.sort((a, b) => (a.count < b.count ? 1 : a.count > b.count ? -1 : 0));
resolve(results.slice(0, max));
}, () => {
reject(new Error('Your frequent components could not be retrieved.'));
});
});
}
};
window.addEventListener('DOMContentLoaded', () => new Bugzilla.NewBugFrequentComp(), { once: true });