TeaWeb/shared/js/ui/elements/ContextMenu.ts

138 lines
3.9 KiB
TypeScript
Raw Normal View History

2020-09-30 20:28:30 +02:00
import {closeContextMenu, ContextMenuEntry, spawnContextMenu} from "tc-shared/ui/ContextMenu";
import {ClientIcon} from "svg-sprites/client-icons";
import {LogCategory, logError} from "tc-shared/log";
2020-03-30 13:44:18 +02:00
export interface MenuEntry {
callback?: () => void;
type: MenuEntryType;
name: (() => string) | string;
icon_class?: string;
icon_path?: string;
disabled?: boolean;
visible?: boolean;
checkbox_checked?: boolean;
invalidPermission?: boolean;
sub_menu?: MenuEntry[];
}
2020-03-30 13:44:18 +02:00
export enum MenuEntryType {
CLOSE,
ENTRY,
CHECKBOX,
HR,
SUB_MENU
}
Implemented the Material Design and fixed some bugs (#33) * cleaned up some files * Fundamental style update * Redesigned some style * fixed hostbanner popup * Removed old identity stuff * fixed close listener * Fixed changelog date * fixed release chat icons * fixed url * Fixed hostbanner * Uploaded missing images * Improved update handling * Improved script files * Fixed loading error and icon error * fixed Yes/No modal * Fixed loader issues with MS Edge * fixed modal style bug * Fixed control bar overflow for small devices * Improved error handling on identity creation * Logging generate error to terminal * fixed possible php error * fixed some possible loading errors when other files have'nt been already loaded. * removed debug message * Changed emsrcypten flags * Improved codec error handling * removed webassembly as required dependency * Improved and fixed channel tree issues * Improved the sliders * Removed unneeded files * fixed loader versions cache * second slight performance improved (dont animate elements anymore if they are not shown) * Fixed query visibility setting * not showing useless client infos for query clients * Added an auto reconnect system * Added a canceled message and increased reconnect interval * removed implemented todo * fixed repetitive channel names * Reworked the channel tree selected lines * Fixed channel tree names * Fixed name alignment * fixed the native client * added min width to the server select groups to avoid a disappearing effect on shrink * fixed bugged downloaded icons
2019-02-17 16:08:10 +01:00
2020-03-30 13:44:18 +02:00
export class Entry {
static HR() {
return {
callback: () => {},
type: MenuEntryType.HR,
name: "",
icon: ""
};
};
static CLOSE(callback: () => void) {
return {
callback: callback,
type: MenuEntryType.CLOSE,
name: "",
icon: ""
};
}
2020-03-30 13:44:18 +02:00
}
2019-01-20 18:43:14 +01:00
2020-03-30 13:44:18 +02:00
export interface ContextMenuProvider {
despawn_context_menu();
spawn_context_menu(x: number, y: number, ...entries: MenuEntry[]);
2020-03-30 13:44:18 +02:00
initialize();
finalize();
2018-02-27 17:20:49 +01:00
2020-03-30 13:44:18 +02:00
html_format_enabled() : boolean;
}
Implemented the Material Design and fixed some bugs (#33) * cleaned up some files * Fundamental style update * Redesigned some style * fixed hostbanner popup * Removed old identity stuff * fixed close listener * Fixed changelog date * fixed release chat icons * fixed url * Fixed hostbanner * Uploaded missing images * Improved update handling * Improved script files * Fixed loading error and icon error * fixed Yes/No modal * Fixed loader issues with MS Edge * fixed modal style bug * Fixed control bar overflow for small devices * Improved error handling on identity creation * Logging generate error to terminal * fixed possible php error * fixed some possible loading errors when other files have'nt been already loaded. * removed debug message * Changed emsrcypten flags * Improved codec error handling * removed webassembly as required dependency * Improved and fixed channel tree issues * Improved the sliders * Removed unneeded files * fixed loader versions cache * second slight performance improved (dont animate elements anymore if they are not shown) * Fixed query visibility setting * not showing useless client infos for query clients * Added an auto reconnect system * Added a canceled message and increased reconnect interval * removed implemented todo * fixed repetitive channel names * Reworked the channel tree selected lines * Fixed channel tree names * Fixed name alignment * fixed the native client * added min width to the server select groups to avoid a disappearing effect on shrink * fixed bugged downloaded icons
2019-02-17 16:08:10 +01:00
2020-03-30 13:44:18 +02:00
let provider: ContextMenuProvider;
export function spawn_context_menu(x: number, y: number, ...entries: MenuEntry[]) {
if(!provider) {
logError(LogCategory.GENERAL, tr("Failed to spawn context menu! Missing provider!"));
2020-03-30 13:44:18 +02:00
return;
}
2018-02-27 17:20:49 +01:00
2020-03-30 13:44:18 +02:00
provider.spawn_context_menu(x, y, ...entries);
}
2018-02-27 17:20:49 +01:00
2020-03-30 13:44:18 +02:00
export function despawn_context_menu() {
if(!provider)
return;
2020-03-30 13:44:18 +02:00
provider.despawn_context_menu();
2018-04-11 17:56:09 +02:00
}
2018-02-27 17:20:49 +01:00
2020-03-30 13:44:18 +02:00
export function get_provider() : ContextMenuProvider { return provider; }
export function set_provider(_provider: ContextMenuProvider) {
provider = _provider;
provider.initialize();
}
class LegacyBridgeContextMenuProvider implements ContextMenuProvider {
despawn_context_menu() {
closeContextMenu();
}
2018-09-30 21:50:59 +02:00
finalize() { }
initialize() { }
html_format_enabled(): boolean {
return false;
}
private static mapEntry(entry: MenuEntry, closeListener: (() => void)[]) : ContextMenuEntry | undefined {
switch (entry.type) {
case MenuEntryType.CLOSE:
closeListener.push(entry.callback);
break;
case MenuEntryType.CHECKBOX:
return {
type: "checkbox",
checked: entry.checkbox_checked,
label: typeof entry.name === "function" ? entry.name() : entry.name,
click: entry.callback,
enabled: !entry.disabled && !entry.invalidPermission,
visible: entry.visible
};
case MenuEntryType.ENTRY:
case MenuEntryType.SUB_MENU:
return {
type: "normal",
label: typeof entry.name === "function" ? entry.name() : entry.name,
click: entry.callback,
enabled: !entry.disabled && !entry.invalidPermission,
visible: entry.visible,
icon: entry.icon_class as ClientIcon,
subMenu: entry.sub_menu ? entry.sub_menu.map(entry => this.mapEntry(entry, closeListener)).filter(e => !!e) : undefined
};
case MenuEntryType.HR:
return {
type: "separator",
visible: entry.visible
};
default:
return undefined;
2018-02-27 17:20:49 +01:00
}
2018-09-30 21:50:59 +02:00
}
2020-03-30 13:44:18 +02:00
spawn_context_menu(x: number, y: number, ...entries: MenuEntry[]) {
const closeCallbacks = [];
2020-10-31 11:18:56 +01:00
spawnContextMenu({ pageX: x, pageY: y }, entries.map(e => LegacyBridgeContextMenuProvider.mapEntry(e, closeCallbacks)).filter(e => !!e), () => closeCallbacks.filter(e => typeof e === "function").forEach(callback => callback()));
}
}
set_provider(new LegacyBridgeContextMenuProvider());