blob: 8aef3c0092b040fa5b043e57eea1ef50d3ea8c6f [file] [log] [blame]
/**
* @license
* Copyright (C) 2017 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 '../../../styles/shared-styles';
import '../../diff/gr-diff-mode-selector/gr-diff-mode-selector';
import '../../diff/gr-patch-range-select/gr-patch-range-select';
import '../../edit/gr-edit-controls/gr-edit-controls';
import '../../shared/gr-select/gr-select';
import '../../shared/gr-button/gr-button';
import '../../shared/gr-icons/gr-icons';
import '../gr-commit-info/gr-commit-info';
import {PolymerElement} from '@polymer/polymer/polymer-element';
import {htmlTemplate} from './gr-file-list-header_html';
import {FilesExpandedState} from '../gr-file-list-constants';
import {GerritNav} from '../../core/gr-navigation/gr-navigation';
import {computeLatestPatchNum, PatchSet} from '../../../utils/patch-set-util';
import {property, customElement} from '@polymer/decorators';
import {
AccountInfo,
ChangeInfo,
PatchSetNum,
CommitInfo,
ServerInfo,
RevisionInfo,
NumericChangeId,
BasePatchSetNum,
} from '../../../types/common';
import {DiffPreferencesInfo} from '../../../types/diff';
import {ChangeComments} from '../../diff/gr-comment-api/gr-comment-api';
import {GrDiffModeSelector} from '../../diff/gr-diff-mode-selector/gr-diff-mode-selector';
import {DiffViewMode} from '../../../constants/constants';
import {GrButton} from '../../shared/gr-button/gr-button';
import {fireEvent} from '../../../utils/event-util';
import {
KeyboardShortcutMixin,
Shortcut,
ShortcutSection,
} from '../../../mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin';
import {appContext} from '../../../services/app-context';
declare global {
interface HTMLElementTagNameMap {
'gr-file-list-header': GrFileListHeader;
}
}
export interface GrFileListHeader {
$: {
modeSelect: GrDiffModeSelector;
expandBtn: GrButton;
collapseBtn: GrButton;
};
}
// This avoids JSC_DYNAMIC_EXTENDS_WITHOUT_JSDOC closure compiler error.
const base = KeyboardShortcutMixin(PolymerElement);
@customElement('gr-file-list-header')
export class GrFileListHeader extends base {
static get template() {
return htmlTemplate;
}
/**
* @event expand-diffs
*/
/**
* @event collapse-diffs
*/
/**
* @event open-diff-prefs
*/
/**
* @event open-download-dialog
*/
@property({type: Object})
account: AccountInfo | undefined;
@property({type: Array})
allPatchSets?: PatchSet[];
@property({type: Object})
change: ChangeInfo | undefined;
@property({type: String})
changeNum?: NumericChangeId;
@property({type: String})
changeUrl?: string;
@property({type: Object})
changeComments?: ChangeComments;
@property({type: Object})
commitInfo?: CommitInfo;
@property({type: Boolean})
editMode?: boolean;
@property({type: Boolean})
loggedIn: boolean | undefined;
@property({type: Object})
serverConfig?: ServerInfo;
@property({type: Number})
shownFileCount?: number;
@property({type: Object})
diffPrefs?: DiffPreferencesInfo;
@property({type: Boolean})
diffPrefsDisabled?: boolean;
@property({type: String, notify: true})
diffViewMode?: DiffViewMode;
@property({type: String})
patchNum?: PatchSetNum;
@property({type: String})
basePatchNum?: BasePatchSetNum;
@property({type: String})
filesExpanded?: FilesExpandedState;
// Caps the number of files that can be shown and have the 'show diffs' /
// 'hide diffs' buttons still be functional.
@property({type: Number})
readonly _maxFilesForBulkActions = 225;
@property({type: Object})
revisionInfo?: RevisionInfo;
private readonly shortcuts = appContext.shortcutsService;
setDiffViewMode(mode: DiffViewMode) {
this.$.modeSelect.setMode(mode);
}
_expandAllDiffs() {
fireEvent(this, 'expand-diffs');
}
_collapseAllDiffs() {
fireEvent(this, 'collapse-diffs');
}
_computeExpandedClass(filesExpanded: FilesExpandedState) {
const classes = [];
if (filesExpanded === FilesExpandedState.ALL) {
classes.push('openFile');
classes.push('allExpanded');
} else if (filesExpanded === FilesExpandedState.SOME) {
classes.push('openFile');
classes.push('someExpanded');
}
return classes.join(' ');
}
_computePrefsButtonHidden(
prefs: DiffPreferencesInfo,
diffPrefsDisabled: boolean
) {
return diffPrefsDisabled || !prefs;
}
_fileListActionsVisible(
shownFileCount: number,
maxFilesForBulkActions: number
) {
return shownFileCount <= maxFilesForBulkActions;
}
_handlePatchChange(e: CustomEvent) {
const {basePatchNum, patchNum} = e.detail;
if (
(basePatchNum === this.basePatchNum && patchNum === this.patchNum) ||
!this.change
) {
return;
}
GerritNav.navigateToChange(this.change, patchNum, basePatchNum);
}
_handlePrefsTap(e: Event) {
e.preventDefault();
fireEvent(this, 'open-diff-prefs');
}
_handleDownloadTap(e: Event) {
e.preventDefault();
e.stopPropagation();
this.dispatchEvent(
new CustomEvent('open-download-dialog', {bubbles: false})
);
}
_computeEditModeClass(editMode?: boolean) {
return editMode ? 'editMode' : '';
}
_computePatchInfoClass(patchNum?: PatchSetNum, allPatchSets?: PatchSet[]) {
const latestNum = computeLatestPatchNum(allPatchSets);
if (patchNum === latestNum) {
return '';
}
return 'patchInfoOldPatchSet';
}
createTitle(shortcutName: Shortcut, section: ShortcutSection) {
return this.shortcuts.createTitle(shortcutName, section);
}
}