blob: e04bf9d2e644eb2437e81fde7e7916ac122f9240 [file] [log] [blame]
/**
* @license
* Copyright 2020 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {ChangeInfo, RepoName} from '../types/common';
import {encodeURL, getBaseUrl} from './url-util';
import {assertNever} from './common-util';
import {GerritView} from '../services/router/router-model';
import {GroupDetailView, GroupViewState} from '../models/views/group';
import {DashboardViewState} from '../models/views/dashboard';
import {createEditUrl, EditViewState} from '../models/views/edit';
import {createDiffUrl, DiffViewState} from '../models/views/diff';
import {ChangeViewState, createChangeUrl} from '../models/views/change';
export interface DashboardSection {
name: string;
query: string;
suffixForDashboard?: string;
selfOnly?: boolean;
hideIfEmpty?: boolean;
results?: ChangeInfo[];
}
export type GenerateUrlParameters =
| ChangeViewState
| DashboardViewState
| GroupViewState
| EditViewState
| DiffViewState;
export function isChangeViewState(
x: GenerateUrlParameters
): x is ChangeViewState {
return x.view === GerritView.CHANGE;
}
export function isEditViewState(x: GenerateUrlParameters): x is EditViewState {
return x.view === GerritView.EDIT;
}
export function isDiffViewState(x: GenerateUrlParameters): x is DiffViewState {
return x.view === GerritView.DIFF;
}
export function rootUrl() {
return `${getBaseUrl()}/`;
}
export function generateUrl(params: GenerateUrlParameters) {
const base = getBaseUrl();
let url = '';
if (params.view === GerritView.CHANGE) {
url = createChangeUrl(params);
} else if (params.view === GerritView.DASHBOARD) {
url = generateDashboardUrl(params);
} else if (params.view === GerritView.DIFF) {
url = createDiffUrl(params);
} else if (params.view === GerritView.EDIT) {
url = createEditUrl(params);
} else if (params.view === GerritView.GROUP) {
url = generateGroupUrl(params);
} else {
assertNever(params, "Can't generate");
}
return base + url;
}
const REPO_TOKEN_PATTERN = /\${(project|repo)}/g;
function sectionsToEncodedParams(
sections: DashboardSection[],
repoName?: RepoName
) {
return sections.map(section => {
// If there is a repo name provided, make sure to substitute it into the
// ${repo} (or legacy ${project}) query tokens.
const query = repoName
? section.query.replace(REPO_TOKEN_PATTERN, repoName)
: section.query;
return encodeURIComponent(section.name) + '=' + encodeURIComponent(query);
});
}
function generateDashboardUrl(params: DashboardViewState) {
const repoName = params.project || undefined;
if (params.sections) {
// Custom dashboard.
const queryParams = sectionsToEncodedParams(params.sections, repoName);
if (params.title) {
queryParams.push('title=' + encodeURIComponent(params.title));
}
const user = params.user ? params.user : '';
return `/dashboard/${user}?${queryParams.join('&')}`;
} else if (repoName) {
// Project dashboard.
const encodedRepo = encodeURL(repoName, true);
return `/p/${encodedRepo}/+/dashboard/${params.dashboard}`;
} else {
// User dashboard.
return `/dashboard/${params.user || 'self'}`;
}
}
function generateGroupUrl(params: GroupViewState) {
let url = `/admin/groups/${encodeURL(`${params.groupId}`, true)}`;
if (params.detail === GroupDetailView.MEMBERS) {
url += ',members';
} else if (params.detail === GroupDetailView.LOG) {
url += ',audit-log';
}
return url;
}