diff --git a/packages/core/src/api/FileAPI.ts b/packages/core/src/api/FileAPI.ts index bbb51dd4..8124e68b 100644 --- a/packages/core/src/api/FileAPI.ts +++ b/packages/core/src/api/FileAPI.ts @@ -3,6 +3,7 @@ import { MDLinkParser } from 'packages/core/src/parsers/MarkdownLinkParser'; import { ErrorLevel, MetaBindParsingError } from 'packages/core/src/utils/errors/MetaBindErrors'; import type { LineNumberContext } from 'packages/core/src/utils/LineNumberExpression'; import type { MB_Comps, MetaBind } from '..'; +import type { ButtonPaneType } from '../config/ButtonConfig'; export abstract class FileAPI { readonly mb: MetaBind; @@ -57,9 +58,9 @@ export abstract class FileAPI { * * @param filePath * @param callingFilePath - * @param newTab + * @param PaneType */ - public abstract open(filePath: string, callingFilePath: string, newTab: boolean): Promise; + public abstract open(filePath: string, callingFilePath: string, PaneType: ButtonPaneType | boolean): Promise; /** * Resolves a file name to a file path. diff --git a/packages/core/src/config/ButtonConfig.ts b/packages/core/src/config/ButtonConfig.ts index 1f847b63..b9c166fd 100644 --- a/packages/core/src/config/ButtonConfig.ts +++ b/packages/core/src/config/ButtonConfig.ts @@ -36,6 +36,12 @@ export enum ButtonActionType { INLINE_JS = 'inlineJS', } +export enum ButtonPaneType { + NewTab = 'tab', + NewSplit = 'split', + NewWindow = 'window', +} + export interface CommandButtonAction { type: ButtonActionType.COMMAND; command: string; @@ -50,7 +56,7 @@ export interface JSButtonAction { export interface OpenButtonAction { type: ButtonActionType.OPEN; link: string; - newTab?: boolean; + panetype?: ButtonPaneType; // "tab" | "split" | "window" } export interface InputButtonAction { @@ -233,6 +239,14 @@ export class ButtonClickContext { openInNewTab(): boolean { return this.type === ButtonClickType.MIDDLE || this.ctrlKey; } + + openInNewWindow(): boolean { + return this.type === ButtonClickType.LEFT && this.ctrlKey && this.altKey && this.shiftKey; + } + + openInNewSplit(): boolean { + return this.type === ButtonClickType.MIDDLE && this.ctrlKey && this.altKey; + } } export enum ButtonClickType { diff --git a/packages/core/src/config/validators/ButtonConfigValidators.ts b/packages/core/src/config/validators/ButtonConfigValidators.ts index 3039f94c..f05758e3 100644 --- a/packages/core/src/config/validators/ButtonConfigValidators.ts +++ b/packages/core/src/config/validators/ButtonConfigValidators.ts @@ -16,7 +16,7 @@ import type { TemplaterCreateNoteButtonAction, UpdateMetadataButtonAction, } from 'packages/core/src/config/ButtonConfig'; -import { ButtonActionType, ButtonStyleType } from 'packages/core/src/config/ButtonConfig'; +import { ButtonActionType, ButtonPaneType, ButtonStyleType } from 'packages/core/src/config/ButtonConfig'; import { oneOf, schemaForType } from 'packages/core/src/utils/ZodUtils'; import { z } from 'zod'; @@ -91,7 +91,7 @@ export const V_OpenButtonAction = schemaForType()( z.object({ type: z.literal(ButtonActionType.OPEN), link: actionFieldString('open', 'link', 'link to open'), - newTab: actionFieldBool('open', 'newTab', '').optional(), + panetype: z.enum([ButtonPaneType.NewTab, ButtonPaneType.NewSplit, ButtonPaneType.NewWindow]).optional(), }), ); diff --git a/packages/core/src/fields/button/actions/OpenButtonActionConfig.ts b/packages/core/src/fields/button/actions/OpenButtonActionConfig.ts index d21322e0..54bf7705 100644 --- a/packages/core/src/fields/button/actions/OpenButtonActionConfig.ts +++ b/packages/core/src/fields/button/actions/OpenButtonActionConfig.ts @@ -1,13 +1,15 @@ import type { MetaBind } from 'packages/core/src'; -import type { - ButtonClickContext, - ButtonConfig, - ButtonContext, - OpenButtonAction, +import { + type ButtonClickContext, + type ButtonConfig, + type ButtonContext, + type OpenButtonAction, + ButtonPaneType, } from 'packages/core/src/config/ButtonConfig'; import { ButtonActionType } from 'packages/core/src/config/ButtonConfig'; import { AbstractButtonActionConfig } from 'packages/core/src/fields/button/AbstractButtonActionConfig'; import { MDLinkParser } from 'packages/core/src/parsers/MarkdownLinkParser'; +import Button from 'packages/core/src/utils/components/Button.svelte'; export class OpenButtonActionConfig extends AbstractButtonActionConfig { constructor(mb: MetaBind) { @@ -21,16 +23,27 @@ export class OpenButtonActionConfig extends AbstractButtonActionConfig { - const newTab = click.openInNewTab() || (action.newTab ?? false); const link = MDLinkParser.interpretAsLink(action.link); if (!link) { throw new Error('Invalid link'); } - link.open(this.mb, filePath, newTab); + + let pane: ButtonPaneType | boolean | undefined = action.panetype; + if (click.openInNewSplit()) { + pane = ButtonPaneType.NewSplit; + } + if (click.openInNewTab()) { + pane = ButtonPaneType.NewTab; + } + if (click.openInNewWindow()) { + pane = ButtonPaneType.NewWindow; + } + + link.open(this.mb, filePath, pane ?? (undefined as unknown as ButtonPaneType)); } create(): Required { - return { type: ButtonActionType.OPEN, link: '', newTab: true }; + return { type: ButtonActionType.OPEN, link: '', panetype: ButtonPaneType.NewTab }; } getActionLabel(): string { diff --git a/packages/core/src/modals/modalContents/buttonBuilder/OpenActionSettings.svelte b/packages/core/src/modals/modalContents/buttonBuilder/OpenActionSettings.svelte index b99690b0..a7de8f59 100644 --- a/packages/core/src/modals/modalContents/buttonBuilder/OpenActionSettings.svelte +++ b/packages/core/src/modals/modalContents/buttonBuilder/OpenActionSettings.svelte @@ -1,6 +1,6 @@