blob: 28b7a50ac272f242364d569fc89994412933b191 [file] [log] [blame]
/**
* @license
* Copyright (C) 2016 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 {dedupingMixin} from '@polymer/polymer/lib/utils/mixin';
import {PolymerElement} from '@polymer/polymer';
import {Constructor} from '../../utils/common-util';
import {property} from '@polymer/decorators';
import {ServerInfo} from '../../types/common';
/**
* @polymer
* @mixinFunction
*/
export const ChangeTableMixin = dedupingMixin(
<T extends Constructor<PolymerElement>>(
superClass: T
): T & Constructor<ChangeTableMixinInterface> => {
/**
* @polymer
* @mixinClass
*/
class Mixin extends superClass {
@property({type: Array})
readonly columnNames: string[] = [
'Subject',
'Status',
'Owner',
'Assignee',
'Reviewers',
'Comments',
'Repo',
'Branch',
'Updated',
'Size',
];
isColumnHidden(columnToCheck?: string, columnsToDisplay?: string[]) {
if (!columnsToDisplay || !columnToCheck) {
return false;
}
return !columnsToDisplay.includes(columnToCheck);
}
/**
* Is the column disabled by a server config or experiment? For example the
* assignee feature might be disabled and thus the corresponding column is
* also disabled.
*
*/
isColumnEnabled(
column: string,
config: ServerInfo,
experiments: string[]
) {
if (!config || !config.change) return true;
if (column === 'Assignee') return !!config.change.enable_assignee;
if (column === 'Comments')
return experiments.includes('comments-column');
if (column === 'Reviewers') return !!config.change.enable_attention_set;
return true;
}
/**
* @return enabled columns, see isColumnEnabled().
*/
getEnabledColumns(
columns: string[],
config: ServerInfo,
experiments: string[]
) {
return columns.filter(col =>
this.isColumnEnabled(col, config, experiments)
);
}
/**
* The Project column was renamed to Repo, but some users may have
* preferences that use its old name. If that column is found, rename it
* before use.
*
* @return If the column was renamed, returns a new array
* with the corrected name. Otherwise, it returns the original param.
*/
renameProjectToRepoColumn(columns: string[]) {
const projectIndex = columns.indexOf('Project');
if (projectIndex === -1) {
return columns;
}
const newColumns = [...columns];
newColumns[projectIndex] = 'Repo';
return newColumns;
}
}
return Mixin;
}
);
export interface ChangeTableMixinInterface {
readonly columnNames: string[];
isColumnHidden(columnToCheck?: string, columnsToDisplay?: string[]): boolean;
isColumnEnabled(
column: string,
config: ServerInfo,
experiments: string[]
): boolean;
getEnabledColumns(
columns: string[],
config: ServerInfo,
experiments: string[]
): string[];
renameProjectToRepoColumn(columns: string[]): string[];
}