blob: 410da215e844f90ac811940ddca787e094dbdc97 [file] [log] [blame]
/**
* @license
* Copyright (C) 2020 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 {GrAttributeHelper} from './gr-attribute-helper/gr-attribute-helper';
import {GrPluginRestApi} from '../shared/gr-js-api-interface/gr-plugin-rest-api';
import {GrEventHelper} from './gr-event-helper/gr-event-helper';
import {GrPopupInterface} from './gr-popup-interface/gr-popup-interface';
import {ConfigInfo} from '../../types/common';
interface GerritElementExtensions {
content?: HTMLElement & {hidden?: boolean};
change?: unknown;
revision?: unknown;
token?: string;
repoName?: string;
config?: ConfigInfo;
}
export type HookCallback = (el: HTMLElement & GerritElementExtensions) => void;
export interface HookApi {
onAttached(callback: HookCallback): HookApi;
onDetached(callback: HookCallback): HookApi;
getAllAttached(): HTMLElement[];
getLastAttached(): Promise<HTMLElement>;
getModuleName(): string;
handleInstanceDetached(instance: HTMLElement): void;
handleInstanceAttached(instance: HTMLElement): void;
}
export enum TargetElement {
CHANGE_ACTIONS = 'changeactions',
REPLY_DIALOG = 'replydialog',
}
// Note: for new events, naming convention should be: `a-b`
export enum EventType {
HISTORY = 'history',
LABEL_CHANGE = 'labelchange',
SHOW_CHANGE = 'showchange',
SUBMIT_CHANGE = 'submitchange',
SHOW_REVISION_ACTIONS = 'show-revision-actions',
COMMIT_MSG_EDIT = 'commitmsgedit',
COMMENT = 'comment',
REVERT = 'revert',
REVERT_SUBMISSION = 'revert_submission',
POST_REVERT = 'postrevert',
ANNOTATE_DIFF = 'annotatediff',
ADMIN_MENU_LINKS = 'admin-menu-links',
HIGHLIGHTJS_LOADED = 'highlightjs-loaded',
}
export interface RegisterOptions {
slot?: string;
replace: unknown;
}
export interface PanelInfo {
body: Element;
p: {[key: string]: any};
onUnload: () => void;
}
export interface SettingsInfo {
body: Element;
token?: string;
onUnload: () => void;
setTitle: () => void;
setWindowTitle: () => void;
show: () => void;
}
export interface PluginApi {
_url?: URL;
popup(): Promise<GrPopupInterface>;
popup(moduleName: string): Promise<GrPopupInterface>;
popup(moduleName?: string): Promise<GrPopupInterface | null>;
hook(endpointName: string, opt_options?: RegisterOptions): HookApi;
getPluginName(): string;
on(eventName: string, target: any): void;
attributeHelper(element: Element): GrAttributeHelper;
restApi(): GrPluginRestApi;
eventHelper(element: Node): GrEventHelper;
registerDynamicCustomComponent(
endpointName: string,
moduleName?: string,
options?: RegisterOptions
): HookApi;
}