
After change 290410, we have converted gr-rest-api into a service and no longer require this import. Change-Id: I7990253fc5c25bab8d9d28ee594754a2eb78947d
151 lines
4.2 KiB
TypeScript
151 lines
4.2 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright (C) 2018 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.
|
|
*/
|
|
import '@polymer/iron-icon/iron-icon';
|
|
import '../../../styles/shared-styles';
|
|
import '../gr-icons/gr-icons';
|
|
import '../gr-labeled-autocomplete/gr-labeled-autocomplete';
|
|
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners';
|
|
import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin';
|
|
import {PolymerElement} from '@polymer/polymer/polymer-element';
|
|
import {htmlTemplate} from './gr-repo-branch-picker_html';
|
|
import {singleDecodeURL} from '../../../utils/url-util';
|
|
import {customElement, property} from '@polymer/decorators';
|
|
import {AutocompleteQuery} from '../gr-autocomplete/gr-autocomplete';
|
|
import {
|
|
BranchName,
|
|
RepoName,
|
|
ProjectInfoWithName,
|
|
BranchInfo,
|
|
} from '../../../types/common';
|
|
import {GrLabeledAutocomplete} from '../gr-labeled-autocomplete/gr-labeled-autocomplete';
|
|
import {appContext} from '../../../services/app-context';
|
|
|
|
const SUGGESTIONS_LIMIT = 15;
|
|
const REF_PREFIX = 'refs/heads/';
|
|
|
|
export interface GrRepoBranchPicker {
|
|
$: {
|
|
repoInput: GrLabeledAutocomplete;
|
|
branchInput: GrLabeledAutocomplete;
|
|
};
|
|
}
|
|
@customElement('gr-repo-branch-picker')
|
|
export class GrRepoBranchPicker extends GestureEventListeners(
|
|
LegacyElementMixin(PolymerElement)
|
|
) {
|
|
static get template() {
|
|
return htmlTemplate;
|
|
}
|
|
|
|
@property({type: String, notify: true, observer: '_repoChanged'})
|
|
repo?: RepoName;
|
|
|
|
@property({type: String, notify: true})
|
|
branch?: BranchName;
|
|
|
|
@property({type: Boolean})
|
|
_branchDisabled?: boolean;
|
|
|
|
@property({type: Object})
|
|
_query?: AutocompleteQuery;
|
|
|
|
@property({type: Object})
|
|
_repoQuery?: AutocompleteQuery;
|
|
|
|
private readonly restApiService = appContext.restApiService;
|
|
|
|
constructor() {
|
|
super();
|
|
this._query = input => this._getRepoBranchesSuggestions(input);
|
|
this._repoQuery = input => this._getRepoSuggestions(input);
|
|
}
|
|
|
|
/** @override */
|
|
attached() {
|
|
super.attached();
|
|
if (this.repo) {
|
|
this.$.repoInput.setText(this.repo);
|
|
}
|
|
}
|
|
|
|
/** @override */
|
|
ready() {
|
|
super.ready();
|
|
this._branchDisabled = !this.repo;
|
|
}
|
|
|
|
_getRepoBranchesSuggestions(input: string) {
|
|
if (!this.repo) {
|
|
return Promise.resolve([]);
|
|
}
|
|
if (input.startsWith(REF_PREFIX)) {
|
|
input = input.substring(REF_PREFIX.length);
|
|
}
|
|
return this.restApiService
|
|
.getRepoBranches(input, this.repo, SUGGESTIONS_LIMIT)
|
|
.then(res => this._branchResponseToSuggestions(res));
|
|
}
|
|
|
|
_getRepoSuggestions(input: string) {
|
|
return this.restApiService
|
|
.getRepos(input, SUGGESTIONS_LIMIT)
|
|
.then(res => this._repoResponseToSuggestions(res));
|
|
}
|
|
|
|
_repoResponseToSuggestions(res: ProjectInfoWithName[] | undefined) {
|
|
if (!res) return [];
|
|
return res.map(repo => {
|
|
return {
|
|
name: repo.name,
|
|
value: singleDecodeURL(repo.id),
|
|
};
|
|
});
|
|
}
|
|
|
|
_branchResponseToSuggestions(res: BranchInfo[] | undefined) {
|
|
if (!res) return [];
|
|
return res.map(branchInfo => {
|
|
let branch;
|
|
if (branchInfo.ref.startsWith(REF_PREFIX)) {
|
|
branch = branchInfo.ref.substring(REF_PREFIX.length);
|
|
} else {
|
|
branch = branchInfo.ref;
|
|
}
|
|
return {name: branch, value: branch};
|
|
});
|
|
}
|
|
|
|
_repoCommitted(e: CustomEvent<{value: string}>) {
|
|
this.repo = e.detail.value as RepoName;
|
|
}
|
|
|
|
_branchCommitted(e: CustomEvent<{value: string}>) {
|
|
this.branch = e.detail.value as BranchName;
|
|
}
|
|
|
|
_repoChanged() {
|
|
this.$.branchInput.clear();
|
|
this._branchDisabled = !this.repo;
|
|
}
|
|
}
|
|
|
|
declare global {
|
|
interface HTMLElementTagNameMap {
|
|
'gr-repo-branch-picker': GrRepoBranchPicker;
|
|
}
|
|
}
|