@@ -20,6 +20,8 @@ import { $isLinkNode, TOGGLE_LINK_COMMAND } from "@lexical/link";
2020import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext" ;
2121import { mergeRegister } from "@lexical/utils" ;
2222import Button from "@oxygen-ui/react/Button" ;
23+ import Checkbox from "@oxygen-ui/react/Checkbox" ;
24+ import FormControlLabel from "@oxygen-ui/react/FormControlLabel" ;
2325import IconButton from "@oxygen-ui/react/IconButton" ;
2426import MenuItem from "@oxygen-ui/react/MenuItem" ;
2527import Select from "@oxygen-ui/react/Select" ;
@@ -162,6 +164,7 @@ const LinkEditor = (): ReactElement => {
162164 const [ isEditMode , setEditMode ] = useState ( false ) ;
163165 const [ lastSelection , setLastSelection ] = useState < BaseSelection | null > ( null ) ;
164166 const [ selectedUrlType , setSelectedUrlType ] = useState < string > ( "CUSTOM" ) ;
167+ const [ openInNewTab , setOpenInNewTab ] = useState < boolean > ( true ) ;
165168
166169 const { t } = useTranslation ( ) ;
167170
@@ -178,14 +181,18 @@ const LinkEditor = (): ReactElement => {
178181
179182 if ( $isLinkNode ( parent ) ) {
180183 const url : string = parent . getURL ( ) ;
184+ const target : string = parent . getTarget ( ) ;
181185
182186 setLinkUrl ( getPlaceholderUrl ( url ) ) ;
183187 setSelectedUrlType ( determineUrlType ( url ) ) ;
188+ setOpenInNewTab ( target === "_blank" ) ;
184189 } else if ( $isLinkNode ( node ) ) {
185190 const url : string = node . getURL ( ) ;
191+ const target : string = node . getTarget ( ) ;
186192
187193 setLinkUrl ( getPlaceholderUrl ( url ) ) ;
188194 setSelectedUrlType ( determineUrlType ( url ) ) ;
195+ setOpenInNewTab ( target === "_blank" ) ;
189196 } else {
190197 setLinkUrl ( "" ) ;
191198 setSelectedUrlType ( "CUSTOM" ) ;
@@ -377,8 +384,14 @@ const LinkEditor = (): ReactElement => {
377384
378385 if ( $isLinkNode ( linkNode ) ) {
379386 // Update the link node with safe attributes.
380- linkNode . setTarget ( "_blank" ) ;
381387 linkNode . setRel ( "noopener noreferrer" ) ;
388+
389+ // Set target based on user preference
390+ if ( openInNewTab ) {
391+ linkNode . setTarget ( "_blank" ) ;
392+ } else {
393+ linkNode . setTarget ( "_self" ) ;
394+ }
382395 }
383396 }
384397 } else {
@@ -391,7 +404,7 @@ const LinkEditor = (): ReactElement => {
391404 HighPriority
392405 )
393406 ) ;
394- } , [ editor , updateLinkEditor , isEditMode ] ) ;
407+ } , [ editor , updateLinkEditor , isEditMode , openInNewTab ] ) ;
395408
396409 /**
397410 * Updates the link editor position.
@@ -465,6 +478,17 @@ const LinkEditor = (): ReactElement => {
465478 }
466479 } }
467480 />
481+ < FormControlLabel
482+ control = { (
483+ < Checkbox
484+ checked = { openInNewTab }
485+ onChange = { ( event : ChangeEvent < HTMLInputElement > ) => {
486+ setOpenInNewTab ( event . target . checked ) ;
487+ } }
488+ />
489+ ) }
490+ label = { t ( "flows:core.elements.richText.linkEditor.openInNewTab" ) }
491+ />
468492 < Button
469493 size = "small"
470494 variant = "outlined"
0 commit comments