From 0f41e389b3c7de693fb229550695a682b750d71e Mon Sep 17 00:00:00 2001 From: Benjamin Kroeger Date: Mon, 8 Apr 2024 13:21:10 +0200 Subject: [PATCH] extension/link: adds 'whenNotEditable' as option for openOnClick (#3312) * checks whenNotEditable condition in clickHandler * passes whenNotEditable option from to helper * adds docs for whenNotEditable * adds to ClickHandlerOptions type --- docs/api/marks/link.md | 8 ++++++++ packages/extension-link/src/helpers/clickHandler.ts | 6 +++++- packages/extension-link/src/link.ts | 3 ++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/api/marks/link.md b/docs/api/marks/link.md index 8f550351fee..ad05353a765 100644 --- a/docs/api/marks/link.md +++ b/docs/api/marks/link.md @@ -65,6 +65,14 @@ Link.configure({ }) ``` +If set to `'whenNotEditable'`, links will be opened on click only when editor is not editable. + +```js +Link.configure({ + openOnClick: 'whenNotEditable', +}) +``` + ### linkOnPaste Adds a link to the current selection if the pasted content only contains an url. diff --git a/packages/extension-link/src/helpers/clickHandler.ts b/packages/extension-link/src/helpers/clickHandler.ts index b2c4ce5fb76..321c1d7bc55 100644 --- a/packages/extension-link/src/helpers/clickHandler.ts +++ b/packages/extension-link/src/helpers/clickHandler.ts @@ -3,7 +3,8 @@ import { MarkType } from '@tiptap/pm/model' import { Plugin, PluginKey } from '@tiptap/pm/state' type ClickHandlerOptions = { - type: MarkType + type: MarkType, + whenNotEditable: boolean, } export function clickHandler(options: ClickHandlerOptions): Plugin { @@ -11,6 +12,9 @@ export function clickHandler(options: ClickHandlerOptions): Plugin { key: new PluginKey('handleClickLink'), props: { handleClick: (view, pos, event) => { + if (options.whenNotEditable && view.editable) { + return false + } if (event.button !== 0) { return false } diff --git a/packages/extension-link/src/link.ts b/packages/extension-link/src/link.ts index 6c0e5077ab6..8ef67ed97a4 100644 --- a/packages/extension-link/src/link.ts +++ b/packages/extension-link/src/link.ts @@ -27,7 +27,7 @@ export interface LinkOptions { /** * If enabled, links will be opened on click. */ - openOnClick: boolean + openOnClick: boolean | 'whenNotEditable' /** * Adds a link to the current selection if the pasted content only contains an url. */ @@ -207,6 +207,7 @@ export const Link = Mark.create({ plugins.push( clickHandler({ type: this.type, + whenNotEditable: this.options.openOnClick === 'whenNotEditable', }), ) }