blob: 01eada8f0c2367e965857a8c27d2d35bb380490b [file] [log] [blame]
/**
* @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 '../gr-rest-api-interface/gr-rest-api-interface';
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 {RestApiService} from '../../../services/services/gr-rest-api/gr-rest-api';
const SUGGESTIONS_LIMIT = 15;
const REF_PREFIX = 'refs/heads/';
export interface GrRepoBranchPicker {
$: {
repoInput: GrLabeledAutocomplete;
branchInput: GrLabeledAutocomplete;
restAPI: RestApiService & Element;
};
}
@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;
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.$.restAPI
.getRepoBranches(input, this.repo, SUGGESTIONS_LIMIT)
.then(res => this._branchResponseToSuggestions(res));
}
_getRepoSuggestions(input: string) {
return this.$.restAPI
.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;
}
}