blob: 46c7ad6a33e40ddc98ecd170f5f5771dbe6df704 [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 {RevisionInfo, ChangeInfo, RequestPayload} from '../../../types/common';
import {ShowAlertEventDetail} from '../../../types/events';
import {PluginApi} from '../../../api/plugin';
import {UIActionInfo} from './gr-change-actions-js-api';
import {windowLocationReload} from '../../../utils/dom-util';
import {PopupPluginApi} from '../../../api/popup';
import {GrPopupInterface} from '../../plugins/gr-popup-interface/gr-popup-interface';
import {appContext} from '../../../services/app-context';
interface ButtonCallBacks {
onclick: (event: Event) => boolean;
}
export class GrPluginActionContext {
private popups: PopupPluginApi[] = [];
private readonly reporting = appContext.reportingService;
constructor(
public readonly plugin: PluginApi,
public readonly action: UIActionInfo,
public readonly change: ChangeInfo,
public readonly revision: RevisionInfo
) {}
popup(element: Node) {
this.plugin.popup().then(popApi => {
const popupEl = (popApi as GrPopupInterface)._getElement();
if (!popupEl) {
throw new Error('Popup element not found');
}
popupEl.appendChild(element);
this.popups.push(popApi);
});
}
hide() {
for (const popupApi of this.popups) {
popupApi.close();
}
this.popups.splice(0);
}
refresh() {
windowLocationReload();
}
textfield(): HTMLElement {
return document.createElement('paper-input');
}
br() {
return document.createElement('br');
}
msg(text: string) {
const label = document.createElement('gr-label');
label.appendChild(document.createTextNode(text));
return label;
}
div(...els: Node[]) {
const div = document.createElement('div');
for (const el of els) {
div.appendChild(el);
}
return div;
}
button(label: string, callbacks: ButtonCallBacks | undefined) {
const onClick = callbacks && callbacks.onclick;
const button = document.createElement('gr-button');
button.appendChild(document.createTextNode(label));
if (onClick) {
this.plugin.eventHelper(button).onTap(onClick);
}
return button;
}
checkbox() {
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
return checkbox;
}
label(checkbox: Node, title: string) {
return this.div(checkbox, this.msg(title));
}
prependLabel(title: string, checkbox: Node) {
return this.label(checkbox, title);
}
call(payload: RequestPayload, onSuccess: (result: unknown) => void) {
if (!this.action.method) return;
if (!this.action.__url) {
this.reporting.error(
new Error(`Unable to ${this.action.method} to ${this.action.__key}!`)
);
return;
}
this.plugin
.restApi()
.send(this.action.method, this.action.__url, payload)
.then(onSuccess)
.catch((error: unknown) => {
document.dispatchEvent(
new CustomEvent<ShowAlertEventDetail>('show-alert', {
detail: {
message: `Plugin network error: ${error}`,
},
})
);
});
}
}