
The change converts the following files to typescript: * elements/change/gr-change-view/gr-change-view.ts Change-Id: I32a2ca2683757c8922e298b3c2d4336d3eb40dcf
130 lines
3.5 KiB
TypeScript
130 lines
3.5 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-input/iron-input';
|
|
import '../../../styles/shared-styles';
|
|
import '../../shared/gr-button/gr-button';
|
|
import '../../shared/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-included-in-dialog_html';
|
|
import {customElement, property} from '@polymer/decorators';
|
|
import {IncludedInInfo, NumericChangeId} from '../../../types/common';
|
|
import {RestApiService} from '../../../services/services/gr-rest-api/gr-rest-api';
|
|
|
|
export interface GrIncludedInDialog {
|
|
$: {
|
|
restAPI: RestApiService & Element;
|
|
};
|
|
}
|
|
|
|
interface DisplayGroup {
|
|
title: string;
|
|
items: string[];
|
|
}
|
|
|
|
@customElement('gr-included-in-dialog')
|
|
export class GrIncludedInDialog extends GestureEventListeners(
|
|
LegacyElementMixin(PolymerElement)
|
|
) {
|
|
static get template() {
|
|
return htmlTemplate;
|
|
}
|
|
|
|
/**
|
|
* Fired when the user presses the close button.
|
|
*
|
|
* @event close
|
|
*/
|
|
|
|
@property({type: Object, observer: '_resetData'})
|
|
changeNum?: NumericChangeId;
|
|
|
|
@property({type: Object})
|
|
_includedIn?: IncludedInInfo;
|
|
|
|
@property({type: Boolean})
|
|
_loaded = false;
|
|
|
|
@property({type: String})
|
|
_filterText = '';
|
|
|
|
loadData() {
|
|
if (!this.changeNum) {
|
|
return Promise.reject(new Error('missing required property changeNum'));
|
|
}
|
|
this._filterText = '';
|
|
return this.$.restAPI.getChangeIncludedIn(this.changeNum).then(configs => {
|
|
if (!configs) {
|
|
return;
|
|
}
|
|
this._includedIn = configs;
|
|
this._loaded = true;
|
|
});
|
|
}
|
|
|
|
_resetData() {
|
|
this._includedIn = undefined;
|
|
this._loaded = false;
|
|
}
|
|
|
|
_computeGroups(includedIn: IncludedInInfo | undefined, filterText: string) {
|
|
if (!includedIn || filterText === undefined) {
|
|
return [];
|
|
}
|
|
|
|
const filter = (item: string) =>
|
|
!filterText.length ||
|
|
item.toLowerCase().indexOf(filterText.toLowerCase()) !== -1;
|
|
|
|
const groups: DisplayGroup[] = [
|
|
{title: 'Branches', items: includedIn.branches.filter(filter)},
|
|
{title: 'Tags', items: includedIn.tags.filter(filter)},
|
|
];
|
|
if (includedIn.external) {
|
|
for (const externalKey of Object.keys(includedIn.external)) {
|
|
groups.push({
|
|
title: externalKey,
|
|
items: includedIn.external[externalKey].filter(filter),
|
|
});
|
|
}
|
|
}
|
|
return groups.filter(g => g.items.length);
|
|
}
|
|
|
|
_handleCloseTap(e: Event) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
this.dispatchEvent(
|
|
new CustomEvent('close', {
|
|
composed: true,
|
|
bubbles: false,
|
|
})
|
|
);
|
|
}
|
|
|
|
_computeLoadingClass(loaded: boolean) {
|
|
return loaded ? 'loading loaded' : 'loading';
|
|
}
|
|
}
|
|
|
|
declare global {
|
|
interface HTMLElementTagNameMap {
|
|
'gr-included-in-dialog': GrIncludedInDialog;
|
|
}
|
|
}
|