blob: 8211644e661d03c1227f9e08c3e64ff87f32e5d9 [file] [log] [blame]
import { HintableObject } from '../../infra-sk/modules/hintable';
import { fromObject } from '../../infra-sk/modules/query';
import { Params } from './rpc_types';
import {
SearchCriteria,
SearchCriteriaToHintableObject,
} from './search-controls-sk/search-controls-sk';
/**
* Takes a URL-encoded search query and returns that query with newlines between each of the
* terms. This returned value should be easier for a human to understand.
* @param queryStr URL-encoded query.
* @return A human readable version of the input.
*/
export function humanReadableQuery(queryStr: string): string {
if (!queryStr) {
return '';
}
return queryStr.split('&').map(decodeURIComponent).join('\n');
}
const imagePrefix = '/img/images';
const diffPrefix = '/img/diffs';
/**
* Returns a link to the PNG image associated with the given digest.
* @param digest {string}
* @return {string}
*/
export function digestImagePath(digest: string): string {
if (!digest) {
return '';
}
return `${imagePrefix}/${digest}.png`;
}
/** Returns a link to the PNG image associated with the diff between the given digests. */
export function digestDiffImagePath(d1: string, d2: string): string {
if (!d1 || !d2) {
return '';
}
// We have a canonical diff order where we sort the two digests alphabetically then join them
// in order.
const order = d1 < d2 ? `${d1}-${d2}` : `${d2}-${d1}`;
return `${diffPrefix}/${order}.png`;
}
/**
* Returns a link to the details page for a given test-digest pair.
* @param grouping Grouping.
* @param digest Digest.
* @param clID CL ID. Optional, omit or use empty string for master branch.
* @param crs Code review system. Optional, omit or use empty string for master branch.
*/
export function detailHref(
grouping: Params,
digest: string,
clID = '',
crs = ''
): string {
const u = `/detail?grouping=${encodeURIComponent(
fromObject(grouping)
)}&digest=${digest}`;
if (clID) {
return `${u}&changelist_id=${clID}&crs=${crs}`;
}
return u;
}
/**
* Returns a link to the diff page for a given pair of digests.
* @param grouping Grouping.
* @param left Left digest.
* @param right Right digest.
* @param clID CL ID. Optional, omit or use empty string for master branch.
* @param crs Code review system. Optional, omit or use empty string for master branch.
* @return {string}
*/
export function diffPageHref(
grouping: Params,
left: string,
right: string,
clID = '',
crs = ''
): string {
if (!left || !right) {
return '';
}
const u =
`/diff?grouping=${encodeURIComponent(fromObject(grouping))}` +
`&left=${left}&right=${right}`;
if (clID) {
return `${u}&changelist_id=${clID}&crs=${crs}`;
}
return u;
}
/**
* Returns a link to the cluster page for the given grouping and search criteria.
*
* Note that this function clears the search criteria's left-hand trace filter before constructing
* the link.
*
* @param grouping Grouping.
* @param searchCriteria Search criteria.
* @param clID CL ID. Optional, omit or use empty string for master branch.
* @param crs Code review system. Optional, omit or use empty string for master branch.
*/
export function clusterPageHref(
grouping: Params,
searchCriteria: Partial<SearchCriteria>,
clID = '',
crs = ''
): string {
const searchCriteriaHintableObject =
SearchCriteriaToHintableObject(searchCriteria);
searchCriteriaHintableObject.left_filter = '';
const u = `${
// eslint-disable-next-line no-useless-concat
'/cluster?' + `grouping=${encodeURIComponent(fromObject(grouping))}&`
}${fromObject(searchCriteriaHintableObject as HintableObject)}`;
if (clID) {
return `${u}&changeListID=${clID}&crs=${crs}`;
}
return u;
}
/**
* Helper to tell gold-scaffold-sk that a task has started and the spinner should be set to active.
*/
export function sendBeginTask(ele: Element) {
ele.dispatchEvent(new CustomEvent('begin-task', { bubbles: true }));
}
/**
* Helper to tell gold-scaffold-sk that a task has finished and the spinner should maybe be stopped.
*/
export function sendEndTask(ele: Element) {
ele.dispatchEvent(new CustomEvent('end-task', { bubbles: true }));
}
/** Detail of the fetch-error event. */
export interface FetchErrorEventDetail {
error: any;
loading: string;
}
/**
* Helper to tell gold-scaffold-sk that a fetch failed. This will pop up on the toast-sk.
* @param ele Element from which to dispatch the 'fetch-error' custom element.
* @param e Error received from promise rejection.
* @param what Description of what was being fetched.
*/
export function sendFetchError(ele: Element, e: any, what: string) {
ele.dispatchEvent(
new CustomEvent<FetchErrorEventDetail>('fetch-error', {
detail: {
error: e,
loading: what,
},
bubbles: true,
})
);
}