blob: 3a86700766c5d3b8ca6e1722488238b0f1920050 [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 {
GrChangeActions,
ActionType,
ActionPriority,
} from '../../../services/services/gr-rest-api/gr-rest-api';
import {JsApiService} from './gr-js-api-types';
import {TargetElement} from '../../plugins/gr-plugin-types';
interface Plugin {
getPluginName(): string;
}
export class GrChangeActionsInterface {
private _el?: GrChangeActions;
// TODO(TS): define correct types when gr-change-actions is converted to ts
RevisionActions?: Record<string, string>;
ChangeActions?: Record<string, string>;
ActionType?: Record<string, string>;
constructor(public plugin: Plugin, el?: GrChangeActions) {
this.setEl(el);
}
/**
* Set gr-change-actions element to a GrChangeActionsInterface instance.
*/
private setEl(el?: GrChangeActions) {
if (!el) {
console.warn('changeActions() is not ready');
return;
}
this._el = el;
this.RevisionActions = el.RevisionActions;
this.ChangeActions = el.ChangeActions;
this.ActionType = el.ActionType;
}
/**
* Ensure GrChangeActionsInterface instance has access to gr-change-actions
* element and retrieve if the interface was created before element.
*/
private ensureEl(): GrChangeActions {
if (!this._el) {
const sharedApiElement = (document.createElement(
'gr-js-api-interface'
) as unknown) as JsApiService;
this.setEl(
(sharedApiElement.getElement(
TargetElement.CHANGE_ACTIONS
) as unknown) as GrChangeActions
);
}
return this._el!;
}
addPrimaryActionKey(key: string) {
const el = this.ensureEl();
if (el.primaryActionKeys.includes(key)) {
return;
}
el.push('primaryActionKeys', key);
}
removePrimaryActionKey(key: string) {
const el = this.ensureEl();
el.primaryActionKeys = el.primaryActionKeys.filter(k => k !== key);
}
hideQuickApproveAction() {
this.ensureEl().hideQuickApproveAction();
}
setActionOverflow(type: ActionType, key: string, overflow: boolean) {
// TODO(TS): remove return, unclear why it was written
return this.ensureEl().setActionOverflow(type, key, overflow);
}
setActionPriority(type: ActionType, key: string, priority: ActionPriority) {
// TODO(TS): remove return, unclear why it was written
return this.ensureEl().setActionPriority(type, key, priority);
}
setActionHidden(type: ActionType, key: string, hidden: boolean) {
// TODO(TS): remove return, unclear why it was written
return this.ensureEl().setActionHidden(type, key, hidden);
}
add(type: ActionType, label: string): string {
return this.ensureEl().addActionButton(type, label);
}
remove(key: string) {
// TODO(TS): remove return, unclear why it was written
return this.ensureEl().removeActionButton(key);
}
addTapListener(key: string, handler: EventListenerOrEventListenerObject) {
this.ensureEl().addEventListener(key + '-tap', handler);
}
removeTapListener(key: string, handler: EventListenerOrEventListenerObject) {
this.ensureEl().removeEventListener(key + '-tap', handler);
}
setLabel(key: string, text: string) {
this.ensureEl().setActionButtonProp(key, 'label', text);
}
setTitle(key: string, text: string) {
this.ensureEl().setActionButtonProp(key, 'title', text);
}
setEnabled(key: string, enabled: string) {
this.ensureEl().setActionButtonProp(key, 'enabled', enabled);
}
setIcon(key: string, icon: string) {
this.ensureEl().setActionButtonProp(key, 'icon', icon);
}
getActionDetails(action: string) {
const el = this.ensureEl();
return (
el.getActionDetails(action) ||
el.getActionDetails(this.plugin.getPluginName() + '~' + action)
);
}
}