From b9a409687c9964b79c14c93fad7f8f73b7fb601b Mon Sep 17 00:00:00 2001 From: pedr Date: Mon, 31 Mar 2025 15:58:12 -0300 Subject: [PATCH 1/8] modyfing to add codemirror5 incompatible --- .../WarningBanner/WarningBanner.tsx | 58 +++++++++++-------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx index 1a810f2afc..71fddd1245 100644 --- a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx +++ b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx @@ -14,6 +14,7 @@ interface Props { richTextBannerDismissed: boolean; pluginCompatibilityBannerDismissedFor: string[]; plugins: PluginStates; + isLegacyEditor: boolean; } const onRichTextDismissLinkClick = () => { @@ -24,15 +25,7 @@ const onRichTextReadMoreLinkClick = () => { void bridge().openExternal('https://joplinapp.org/help/apps/rich_text_editor'); }; -const onSwitchToLegacyEditor = () => { - Setting.setValue('editor.legacyMarkdown', true); -}; - -const onDismissLegacyEditorPrompt = () => { - Setting.setValue('editor.pluginCompatibilityBannerDismissedFor', [...PluginService.instance().pluginIds]); -}; - -const incompatiblePluginIds = [ +const codeMirror6IncompatiblePluginIds = [ // cSpell:disable 'com.septemberhx.Joplin.Enhancement', 'ylc395.noteLinkSystem', @@ -42,6 +35,12 @@ const incompatiblePluginIds = [ // cSpell:enable ]; +const codeMirror5IncompatiblePluginIds = [ + // cSpell:disable + 'nz.magnusso.zotero-link', + // cSpell:enable +]; + const WarningBanner: React.FC = props => { const wysiwygBanner = ( = props => { ); - const incompatiblePluginNames = useMemo(() => { - if (props.bodyEditor !== 'CodeMirror6') { - return []; - } + const onSwitchEditor = () => { + Setting.setValue('editor.legacyMarkdown', !props.isLegacyEditor); + }; + const onDismissLegacyEditorPrompt = () => { + const pluginIds = [...props.pluginCompatibilityBannerDismissedFor, ...incompatiblePluginIds]; + Setting.setValue('editor.pluginCompatibilityBannerDismissedFor', pluginIds); + }; + + const incompatiblePluginIds = useMemo(() => { const runningPluginIds = Object.keys(props.plugins); return runningPluginIds.map((id): string|string[] => { - if (props.pluginCompatibilityBannerDismissedFor?.includes(id)) { - return []; + if (props.pluginCompatibilityBannerDismissedFor.includes(id)) return []; + + if (props.bodyEditor === 'CodeMirror6') { + if (codeMirror6IncompatiblePluginIds.includes(id)) return id; + else return []; + } else { + if (codeMirror5IncompatiblePluginIds.includes(id)) return id; + else return []; } - if (incompatiblePluginIds.includes(id)) { - return PluginService.instance().pluginById(id).manifest.name; - } else { - return []; - } }).flat(); }, [props.bodyEditor, props.plugins, props.pluginCompatibilityBannerDismissedFor]); + const incompatiblePluginNames = useMemo(() => { + if (!incompatiblePluginIds || !incompatiblePluginIds.length) return []; + + return incompatiblePluginIds.map(id => PluginService.instance().pluginById(id).manifest.name); + }, [incompatiblePluginIds]); + const markdownPluginBanner = ( 0} > @@ -97,7 +108,8 @@ const WarningBanner: React.FC = props => { export default connect((state: AppState) => { return { richTextBannerDismissed: state.settings.richTextBannerDismissed, - pluginCompatibilityBannerDismissedFor: state.settings['editor.pluginCompatibilityBannerDismissedFor'], + pluginCompatibilityBannerDismissedFor: state.settings['editor.pluginCompatibilityBannerDismissedFor'] ?? [], plugins: state.pluginService.plugins, + isLegacyEditor: state.settings['editor.legacyMarkdown'], }; })(WarningBanner); From 67271024ad79d77965280b40fb7170fb430ed1cb Mon Sep 17 00:00:00 2001 From: pedr Date: Mon, 31 Mar 2025 15:59:04 -0300 Subject: [PATCH 2/8] don't show warning on wrong editor --- .../app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx index 71fddd1245..c041c3c504 100644 --- a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx +++ b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx @@ -90,7 +90,7 @@ const WarningBanner: React.FC = props => { acceptMessage={props.isLegacyEditor ? _('Switch to the new editor') : _('Switch to the legacy editor')} onAccept={onSwitchEditor} onDismiss={onDismissLegacyEditorPrompt} - visible={incompatiblePluginNames.length > 0} + visible={incompatiblePluginNames.length > 0 && props.bodyEditor !== 'TinyMCE'} > {_('The following plugins may not support the current markdown editor:')}
    From bff493a18ed64334a3f55aa13b0ccac2110faa69 Mon Sep 17 00:00:00 2001 From: pedr Date: Mon, 31 Mar 2025 16:04:26 -0300 Subject: [PATCH 3/8] renaming function --- .../gui/NoteEditor/WarningBanner/WarningBanner.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx index c041c3c504..6a575ccb3b 100644 --- a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx +++ b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx @@ -57,7 +57,7 @@ const WarningBanner: React.FC = props => { Setting.setValue('editor.legacyMarkdown', !props.isLegacyEditor); }; - const onDismissLegacyEditorPrompt = () => { + const onDismissEditorPrompt = () => { const pluginIds = [...props.pluginCompatibilityBannerDismissedFor, ...incompatiblePluginIds]; Setting.setValue('editor.pluginCompatibilityBannerDismissedFor', pluginIds); }; @@ -89,7 +89,7 @@ const WarningBanner: React.FC = props => { 0 && props.bodyEditor !== 'TinyMCE'} > {_('The following plugins may not support the current markdown editor:')} From 14391f666e83a8f5f89abed63b44a61a0ce957d2 Mon Sep 17 00:00:00 2001 From: pedr Date: Wed, 2 Apr 2025 10:36:57 -0300 Subject: [PATCH 4/8] Revert "renaming function" This reverts commit bff493a18ed64334a3f55aa13b0ccac2110faa69. --- .../gui/NoteEditor/WarningBanner/WarningBanner.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx index 6a575ccb3b..c041c3c504 100644 --- a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx +++ b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx @@ -57,7 +57,7 @@ const WarningBanner: React.FC = props => { Setting.setValue('editor.legacyMarkdown', !props.isLegacyEditor); }; - const onDismissEditorPrompt = () => { + const onDismissLegacyEditorPrompt = () => { const pluginIds = [...props.pluginCompatibilityBannerDismissedFor, ...incompatiblePluginIds]; Setting.setValue('editor.pluginCompatibilityBannerDismissedFor', pluginIds); }; @@ -89,7 +89,7 @@ const WarningBanner: React.FC = props => { 0 && props.bodyEditor !== 'TinyMCE'} > {_('The following plugins may not support the current markdown editor:')} From 685a614c3a12c03862a29bdeb9c471ab378c866c Mon Sep 17 00:00:00 2001 From: pedr Date: Wed, 2 Apr 2025 10:37:04 -0300 Subject: [PATCH 5/8] Revert "don't show warning on wrong editor" This reverts commit 67271024ad79d77965280b40fb7170fb430ed1cb. --- .../app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx index c041c3c504..71fddd1245 100644 --- a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx +++ b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx @@ -90,7 +90,7 @@ const WarningBanner: React.FC = props => { acceptMessage={props.isLegacyEditor ? _('Switch to the new editor') : _('Switch to the legacy editor')} onAccept={onSwitchEditor} onDismiss={onDismissLegacyEditorPrompt} - visible={incompatiblePluginNames.length > 0 && props.bodyEditor !== 'TinyMCE'} + visible={incompatiblePluginNames.length > 0} > {_('The following plugins may not support the current markdown editor:')}
      From 584ed8d1dc2460bcb14669bcdae079ca61d453cf Mon Sep 17 00:00:00 2001 From: pedr Date: Wed, 2 Apr 2025 10:37:12 -0300 Subject: [PATCH 6/8] Revert "modyfing to add codemirror5 incompatible" This reverts commit b9a409687c9964b79c14c93fad7f8f73b7fb601b. --- .../WarningBanner/WarningBanner.tsx | 58 ++++++++----------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx index 71fddd1245..1a810f2afc 100644 --- a/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx +++ b/packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx @@ -14,7 +14,6 @@ interface Props { richTextBannerDismissed: boolean; pluginCompatibilityBannerDismissedFor: string[]; plugins: PluginStates; - isLegacyEditor: boolean; } const onRichTextDismissLinkClick = () => { @@ -25,7 +24,15 @@ const onRichTextReadMoreLinkClick = () => { void bridge().openExternal('https://joplinapp.org/help/apps/rich_text_editor'); }; -const codeMirror6IncompatiblePluginIds = [ +const onSwitchToLegacyEditor = () => { + Setting.setValue('editor.legacyMarkdown', true); +}; + +const onDismissLegacyEditorPrompt = () => { + Setting.setValue('editor.pluginCompatibilityBannerDismissedFor', [...PluginService.instance().pluginIds]); +}; + +const incompatiblePluginIds = [ // cSpell:disable 'com.septemberhx.Joplin.Enhancement', 'ylc395.noteLinkSystem', @@ -35,12 +42,6 @@ const codeMirror6IncompatiblePluginIds = [ // cSpell:enable ]; -const codeMirror5IncompatiblePluginIds = [ - // cSpell:disable - 'nz.magnusso.zotero-link', - // cSpell:enable -]; - const WarningBanner: React.FC = props => { const wysiwygBanner = ( = props => { ); - const onSwitchEditor = () => { - Setting.setValue('editor.legacyMarkdown', !props.isLegacyEditor); - }; + const incompatiblePluginNames = useMemo(() => { + if (props.bodyEditor !== 'CodeMirror6') { + return []; + } - const onDismissLegacyEditorPrompt = () => { - const pluginIds = [...props.pluginCompatibilityBannerDismissedFor, ...incompatiblePluginIds]; - Setting.setValue('editor.pluginCompatibilityBannerDismissedFor', pluginIds); - }; - - const incompatiblePluginIds = useMemo(() => { const runningPluginIds = Object.keys(props.plugins); return runningPluginIds.map((id): string|string[] => { - if (props.pluginCompatibilityBannerDismissedFor.includes(id)) return []; - - if (props.bodyEditor === 'CodeMirror6') { - if (codeMirror6IncompatiblePluginIds.includes(id)) return id; - else return []; - } else { - if (codeMirror5IncompatiblePluginIds.includes(id)) return id; - else return []; + if (props.pluginCompatibilityBannerDismissedFor?.includes(id)) { + return []; } + if (incompatiblePluginIds.includes(id)) { + return PluginService.instance().pluginById(id).manifest.name; + } else { + return []; + } }).flat(); }, [props.bodyEditor, props.plugins, props.pluginCompatibilityBannerDismissedFor]); - const incompatiblePluginNames = useMemo(() => { - if (!incompatiblePluginIds || !incompatiblePluginIds.length) return []; - - return incompatiblePluginIds.map(id => PluginService.instance().pluginById(id).manifest.name); - }, [incompatiblePluginIds]); - const markdownPluginBanner = ( 0} > @@ -108,8 +97,7 @@ const WarningBanner: React.FC = props => { export default connect((state: AppState) => { return { richTextBannerDismissed: state.settings.richTextBannerDismissed, - pluginCompatibilityBannerDismissedFor: state.settings['editor.pluginCompatibilityBannerDismissedFor'] ?? [], + pluginCompatibilityBannerDismissedFor: state.settings['editor.pluginCompatibilityBannerDismissedFor'], plugins: state.pluginService.plugins, - isLegacyEditor: state.settings['editor.legacyMarkdown'], }; })(WarningBanner); From 652833363ff88277c866129a4bbf44e4011e21da Mon Sep 17 00:00:00 2001 From: pedr Date: Wed, 2 Apr 2025 11:33:32 -0300 Subject: [PATCH 7/8] changing message to errorboundary --- packages/app-desktop/gui/ErrorBoundary.tsx | 18 ++++++++++++++++++ .../NoteEditor/WarningBanner/BannerContent.tsx | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/app-desktop/gui/ErrorBoundary.tsx b/packages/app-desktop/gui/ErrorBoundary.tsx index b7df358e1f..80d02a8526 100644 --- a/packages/app-desktop/gui/ErrorBoundary.tsx +++ b/packages/app-desktop/gui/ErrorBoundary.tsx @@ -3,6 +3,8 @@ import versionInfo, { PackageInfo } from '@joplin/lib/versionInfo'; import PluginService, { Plugins } from '@joplin/lib/services/plugins/PluginService'; import Setting from '@joplin/lib/models/Setting'; import restart from '../services/restart'; +import BannerContent from './NoteEditor/WarningBanner/BannerContent'; +import { _ } from '@joplin/lib/locale'; const packageInfo: PackageInfo = require('../packageInfo.js'); const ipcRenderer = require('electron').ipcRenderer; @@ -30,6 +32,19 @@ interface Props { children: any; } +interface BannerProps { + isVisible: boolean; +} + +const SwitchToNewEditorBanner = (props: BannerProps) => Setting.setValue('editor.legacyMarkdown', false)} + visible={props.isVisible} +> + {_('The legacy Markdown editor might be incompatbile with a number of plugins. We recommend using the new editor.')} +
      +
      ; + export default class ErrorBoundary extends React.Component { public state: State = { error: null, errorInfo: null, pluginInfos: [], plugins: {} }; @@ -130,8 +145,11 @@ export default class ErrorBoundary extends React.Component { } } + const isLegacyEditorError = !!this.state.error.stack.includes('CodeMirror/v5'); + return (
      +

      Error

      {this.renderMessage()}

      To report the error, please copy the *entire content* of this page and post it on Joplin forum or GitHub.

      diff --git a/packages/app-desktop/gui/NoteEditor/WarningBanner/BannerContent.tsx b/packages/app-desktop/gui/NoteEditor/WarningBanner/BannerContent.tsx index cc57f604e5..60cbdea05e 100644 --- a/packages/app-desktop/gui/NoteEditor/WarningBanner/BannerContent.tsx +++ b/packages/app-desktop/gui/NoteEditor/WarningBanner/BannerContent.tsx @@ -5,7 +5,7 @@ interface Props { children: React.ReactNode; acceptMessage: string; onAccept: ()=> void; - onDismiss: ()=> void; + onDismiss?: ()=> void; visible: boolean; } @@ -17,7 +17,7 @@ const BannerContent: React.FC = props => { return
      {props.children}   [ {props.acceptMessage} ] -   [ {_('Dismiss')} ] +   { props.onDismiss ? [ {_('Dismiss')} ] : null }
      ; }; From 81175d9b29fb103acc0dda3dfdd372ee1f9a6cca Mon Sep 17 00:00:00 2001 From: pedr Date: Mon, 7 Apr 2025 13:02:54 -0300 Subject: [PATCH 8/8] fix grammar --- packages/app-desktop/gui/ErrorBoundary.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app-desktop/gui/ErrorBoundary.tsx b/packages/app-desktop/gui/ErrorBoundary.tsx index 80d02a8526..ebd5fbde8e 100644 --- a/packages/app-desktop/gui/ErrorBoundary.tsx +++ b/packages/app-desktop/gui/ErrorBoundary.tsx @@ -41,7 +41,7 @@ const SwitchToNewEditorBanner = (props: BannerProps) => Setting.setValue('editor.legacyMarkdown', false)} visible={props.isVisible} > - {_('The legacy Markdown editor might be incompatbile with a number of plugins. We recommend using the new editor.')} + {_('The legacy Markdown editor might be incompatible with a number of plugins. We recommend using the new editor.')}
      ;