mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-09-30 00:51:30 +08:00
chore(client/ts): port abstract_button, command_button, onclick_button
This commit is contained in:
parent
6905e1536e
commit
f3a18a9942
@ -6,7 +6,7 @@ import Component from "../components/component.js";
|
|||||||
const keyboardActionRepo: Record<string, Action> = {};
|
const keyboardActionRepo: Record<string, Action> = {};
|
||||||
|
|
||||||
// TODO: Deduplicate with server.
|
// TODO: Deduplicate with server.
|
||||||
interface Action {
|
export interface Action {
|
||||||
actionName: CommandNames;
|
actionName: CommandNames;
|
||||||
effectiveShortcuts: string[];
|
effectiveShortcuts: string[];
|
||||||
scope: string;
|
scope: string;
|
||||||
|
@ -5,36 +5,25 @@ const TPL = `<button class="button-widget bx"
|
|||||||
title=""></button>`;
|
title=""></button>`;
|
||||||
|
|
||||||
type TitlePlacement = "top" | "bottom" | "left" | "right";
|
type TitlePlacement = "top" | "bottom" | "left" | "right";
|
||||||
type StringOrCallback = (() => string);
|
type StringOrCallback = string | (() => string);
|
||||||
type ContextMenuHandler = (e: JQuery.ContextMenuEvent<any, any, any, any> | null) => void;
|
type ContextMenuHandler = (e: JQuery.ContextMenuEvent<any, any, any, any> | null) => void;
|
||||||
|
|
||||||
interface Settings {
|
export interface AbstractButtonWidgetSettings {
|
||||||
titlePlacement: TitlePlacement;
|
titlePlacement: TitlePlacement;
|
||||||
title: string | StringOrCallback | null;
|
title: StringOrCallback | null;
|
||||||
icon: string | StringOrCallback | null;
|
icon: StringOrCallback | null;
|
||||||
onContextMenu: ContextMenuHandler | null;
|
onContextMenu: ContextMenuHandler | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class AbstractButtonWidget extends NoteContextAwareWidget {
|
export default class AbstractButtonWidget<SettingsT extends AbstractButtonWidgetSettings> extends NoteContextAwareWidget {
|
||||||
|
|
||||||
private settings: Settings;
|
protected settings!: SettingsT;
|
||||||
private tooltip!: bootstrap.Tooltip;
|
protected tooltip!: bootstrap.Tooltip;
|
||||||
|
|
||||||
isEnabled() {
|
isEnabled() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
|
|
||||||
this.settings = {
|
|
||||||
titlePlacement: 'right',
|
|
||||||
title: null,
|
|
||||||
icon: null,
|
|
||||||
onContextMenu: null
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
doRender() {
|
doRender() {
|
||||||
this.$widget = $(TPL);
|
this.$widget = $(TPL);
|
||||||
// Fix once bootstrap is available as non-UMD
|
// Fix once bootstrap is available as non-UMD
|
||||||
|
@ -1,11 +1,32 @@
|
|||||||
import keyboardActionsService from "../../services/keyboard_actions.js";
|
import { CommandNames } from "../../components/app_context.js";
|
||||||
import AbstractButtonWidget from "./abstract_button.js";
|
import keyboardActionsService, { Action } from "../../services/keyboard_actions.js";
|
||||||
|
import AbstractButtonWidget, { AbstractButtonWidgetSettings } from "./abstract_button.js";
|
||||||
|
|
||||||
let actions;
|
let actions: Action[];
|
||||||
|
|
||||||
keyboardActionsService.getActions().then(as => actions = as);
|
keyboardActionsService.getActions().then(as => actions = as);
|
||||||
|
|
||||||
export default class CommandButtonWidget extends AbstractButtonWidget {
|
// TODO: Is this actually used?
|
||||||
|
export type ClickHandler = (widget: CommandButtonWidget, e: JQuery.ClickEvent<any, any, any, any>) => void;
|
||||||
|
type CommandOrCallback = (CommandNames | (() => CommandNames));
|
||||||
|
|
||||||
|
interface CommandButtonWidgetSettings extends AbstractButtonWidgetSettings {
|
||||||
|
command?: CommandOrCallback;
|
||||||
|
onClick?: ClickHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class CommandButtonWidget extends AbstractButtonWidget<CommandButtonWidgetSettings> {
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.settings = {
|
||||||
|
titlePlacement: 'right',
|
||||||
|
title: null,
|
||||||
|
icon: null,
|
||||||
|
onContextMenu: null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
doRender() {
|
doRender() {
|
||||||
super.doRender();
|
super.doRender();
|
||||||
|
|
||||||
@ -13,7 +34,9 @@ export default class CommandButtonWidget extends AbstractButtonWidget {
|
|||||||
this.$widget.on("click", () => {
|
this.$widget.on("click", () => {
|
||||||
this.tooltip.hide();
|
this.tooltip.hide();
|
||||||
|
|
||||||
|
if (this._command) {
|
||||||
this.triggerCommand(this._command);
|
this.triggerCommand(this._command);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
console.warn(`Button widget '${this.componentId}' has no defined command`, this.settings);
|
console.warn(`Button widget '${this.componentId}' has no defined command`, this.settings);
|
||||||
@ -32,16 +55,12 @@ export default class CommandButtonWidget extends AbstractButtonWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onClick(handler) {
|
onClick(handler: ClickHandler) {
|
||||||
this.settings.onClick = handler;
|
this.settings.onClick = handler;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
command(command: CommandOrCallback) {
|
||||||
* @param {function|string} command
|
|
||||||
* @returns {this}
|
|
||||||
*/
|
|
||||||
command(command) {
|
|
||||||
this.settings.command = command;
|
this.settings.command = command;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
@ -1,36 +0,0 @@
|
|||||||
import AbstractButtonWidget from "./abstract_button.js";
|
|
||||||
import { t } from "../../services/i18n.js";
|
|
||||||
|
|
||||||
export default class OnClickButtonWidget extends AbstractButtonWidget {
|
|
||||||
doRender() {
|
|
||||||
super.doRender();
|
|
||||||
|
|
||||||
if (this.settings.onClick) {
|
|
||||||
this.$widget.on("click", e => {
|
|
||||||
this.$widget.tooltip("hide");
|
|
||||||
|
|
||||||
this.settings.onClick(this, e);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
console.warn(t("onclick_button.no_click_handler", { componentId: this.componentId }), this.settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.settings.onAuxClick) {
|
|
||||||
this.$widget.on("auxclick", e => {
|
|
||||||
this.$widget.tooltip("hide");
|
|
||||||
|
|
||||||
this.settings.onAuxClick(this, e);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onClick(handler) {
|
|
||||||
this.settings.onClick = handler;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
onAuxClick(handler) {
|
|
||||||
this.settings.onAuxClick = handler;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
59
src/public/app/widgets/buttons/onclick_button.ts
Normal file
59
src/public/app/widgets/buttons/onclick_button.ts
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import AbstractButtonWidget, { AbstractButtonWidgetSettings, type AuxClickHandler, type ClickHandler } from "./abstract_button.js";
|
||||||
|
import { t } from "../../services/i18n.js";
|
||||||
|
|
||||||
|
export type ClickHandler = (widget: OnClickButtonWidget, e: JQuery.ClickEvent<any, any, any, any>) => void;
|
||||||
|
export type AuxClickHandler = (widget: OnClickButtonWidget, e: JQuery.TriggeredEvent<any, any, any, any>) => void;
|
||||||
|
|
||||||
|
interface OnClickButtonWidgetSettings extends AbstractButtonWidgetSettings {
|
||||||
|
onClick?: ClickHandler;
|
||||||
|
onAuxClick?: AuxClickHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class OnClickButtonWidget extends AbstractButtonWidget<OnClickButtonWidgetSettings> {
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.settings = {
|
||||||
|
titlePlacement: 'right',
|
||||||
|
title: null,
|
||||||
|
icon: null,
|
||||||
|
onContextMenu: null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
doRender() {
|
||||||
|
super.doRender();
|
||||||
|
|
||||||
|
if (this.settings.onClick) {
|
||||||
|
this.$widget.on("click", e => {
|
||||||
|
this.$widget.tooltip("hide");
|
||||||
|
|
||||||
|
if (this.settings.onClick) {
|
||||||
|
this.settings.onClick(this, e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.warn(t("onclick_button.no_click_handler", { componentId: this.componentId }), this.settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.settings.onAuxClick) {
|
||||||
|
this.$widget.on("auxclick", e => {
|
||||||
|
this.$widget.tooltip("hide");
|
||||||
|
|
||||||
|
if (this.settings.onAuxClick) {
|
||||||
|
this.settings.onAuxClick(this, e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onClick(handler: ClickHandler) {
|
||||||
|
this.settings.onClick = handler;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
onAuxClick(handler: AuxClickHandler) {
|
||||||
|
this.settings.onAuxClick = handler;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
import BasicWidget from "./basic_widget.js";
|
import BasicWidget from "./basic_widget.js";
|
||||||
|
import AbstractButtonWidget from "./buttons/abstract_button.js";
|
||||||
import NoteContextAwareWidget from "./note_context_aware_widget.js";
|
import NoteContextAwareWidget from "./note_context_aware_widget.js";
|
||||||
|
|
||||||
const WIDGET_TPL = `
|
const WIDGET_TPL = `
|
||||||
@ -26,7 +27,7 @@ class RightPanelWidget extends NoteContextAwareWidget {
|
|||||||
/** Title to show in the panel. */
|
/** Title to show in the panel. */
|
||||||
get widgetTitle() { return "Untitled widget"; }
|
get widgetTitle() { return "Untitled widget"; }
|
||||||
|
|
||||||
get widgetButtons() { return []; }
|
get widgetButtons(): AbstractButtonWidget<any>[] { return []; }
|
||||||
|
|
||||||
get help() { return {}; }
|
get help() { return {}; }
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user