diff --git a/services/web/app/views/project/editor.pug b/services/web/app/views/project/editor.pug
index 90d207d3f1..d511884cfb 100644
--- a/services/web/app/views/project/editor.pug
+++ b/services/web/app/views/project/editor.pug
@@ -145,6 +145,7 @@ block append meta
meta(name="ol-showPdfDetach" data-type="boolean" content=showPdfDetach)
meta(name="ol-debugPdfDetach" data-type="boolean" content=debugPdfDetach)
meta(name="ol-showNewPdfPreview" data-type="boolean" content=showNewPdfPreview)
+ meta(name="ol-showNewSourceEditorOption" data-type="boolean" content=showNewSourceEditorOption)
meta(name="ol-enablePdfCaching" data-type="boolean" content=enablePdfCaching)
meta(name="ol-trackPdfDownload" data-type="boolean" content=trackPdfDownload)
meta(name="ol-resetServiceWorker" data-type="boolean" content=resetServiceWorker)
diff --git a/services/web/frontend/js/features/source-editor/components/editor-switch.js b/services/web/frontend/js/features/source-editor/components/editor-switch.js
new file mode 100644
index 0000000000..c2847ab42f
--- /dev/null
+++ b/services/web/frontend/js/features/source-editor/components/editor-switch.js
@@ -0,0 +1,104 @@
+import { memo, useCallback, useMemo } from 'react'
+import useScopeValue from '../../../shared/hooks/use-scope-value'
+import BetaBadge from '../../../shared/components/beta-badge'
+
+function EditorSwitch() {
+ const [newSourceEditor, setNewSourceEditor] = useScopeValue(
+ 'editor.newSourceEditor'
+ )
+ const [richText, setRichText] = useScopeValue('editor.showRichText')
+
+ const handleChange = useCallback(
+ event => {
+ const choice = event.target.value
+
+ switch (choice) {
+ case 'ace':
+ setRichText(false)
+ setNewSourceEditor(false)
+ break
+
+ case 'cm6':
+ setRichText(false)
+ setNewSourceEditor(true)
+ break
+
+ case 'rich-text':
+ setRichText(true)
+ break
+ }
+ },
+ [setRichText, setNewSourceEditor]
+ )
+
+ const tooltip = useMemo(() => {
+ return {
+ id: 'editor-switch-tooltip',
+ placement: 'bottom',
+ className: 'tooltip-wide',
+ text: (
+ <>
+ We are upgrading the source editor. Please test it by selecting
+ "Source (Beta)".
+
+
+ Click to learn more and give feedback
+ >
+ ),
+ }
+ }, [])
+
+ return (
+
+
+
+
+
+ )
+}
+
+export default memo(EditorSwitch)
diff --git a/services/web/frontend/js/features/source-editor/controllers/editor-switch-controller.js b/services/web/frontend/js/features/source-editor/controllers/editor-switch-controller.js
new file mode 100644
index 0000000000..163c45c151
--- /dev/null
+++ b/services/web/frontend/js/features/source-editor/controllers/editor-switch-controller.js
@@ -0,0 +1,6 @@
+import App from '../../../base'
+import { react2angular } from 'react2angular'
+import EditorSwitch from '../components/editor-switch'
+import { rootContext } from '../../../shared/context/root-context'
+
+App.component('editorSwitch', react2angular(rootContext.use(EditorSwitch)))
diff --git a/services/web/frontend/js/ide.js b/services/web/frontend/js/ide.js
index 55c02203d5..6f97b1ea05 100644
--- a/services/web/frontend/js/ide.js
+++ b/services/web/frontend/js/ide.js
@@ -68,6 +68,7 @@ import './shared/context/controllers/root-context-controller'
import './features/editor-navigation-toolbar/controllers/editor-navigation-toolbar-controller'
import './features/pdf-preview/controllers/pdf-preview-controller'
import './features/share-project-modal/controllers/react-share-project-modal-controller'
+import './features/source-editor/controllers/editor-switch-controller'
import getMeta from './utils/meta'
App.controller(
diff --git a/services/web/frontend/js/ide/editor/EditorManager.js b/services/web/frontend/js/ide/editor/EditorManager.js
index 22da1af7cc..a725a34a44 100644
--- a/services/web/frontend/js/ide/editor/EditorManager.js
+++ b/services/web/frontend/js/ide/editor/EditorManager.js
@@ -20,6 +20,7 @@ import './directives/aceEditor'
import './directives/toggleSwitch'
import './controllers/SavingNotificationController'
import './controllers/CompileButton'
+import getMeta from '../../utils/meta'
let EditorManager
export default EditorManager = (function () {
@@ -139,6 +140,11 @@ export default EditorManager = (function () {
}
newSourceEditor() {
+ // only use the new source editor if the option to switch is available
+ if (!getMeta('ol-showNewSourceEditorOption')) {
+ return false
+ }
+
return (
this.localStorage(`editor.source_editor.${this.$scope.project_id}`) ===
'cm6'
diff --git a/services/web/frontend/js/shared/components/beta-badge.js b/services/web/frontend/js/shared/components/beta-badge.js
index 858db3a42a..2c4d8fa580 100644
--- a/services/web/frontend/js/shared/components/beta-badge.js
+++ b/services/web/frontend/js/shared/components/beta-badge.js
@@ -5,7 +5,11 @@ export default function BetaBadge({ tooltip, url = '/beta/participate' }) {
return (
{tooltip.text}}
+ overlay={
+
+ {tooltip.text}
+
+ }
delayHide={100}
>
{
+ return withContextRoot(, {
+ editor: {
+ richText: false,
+ newSourceEditor: false,
+ },
+ })
+}
diff --git a/services/web/frontend/stylesheets/app/editor/toolbar.less b/services/web/frontend/stylesheets/app/editor/toolbar.less
index d9607b23d7..fabc50a34f 100644
--- a/services/web/frontend/stylesheets/app/editor/toolbar.less
+++ b/services/web/frontend/stylesheets/app/editor/toolbar.less
@@ -317,6 +317,36 @@
}
}
+.editor-toggle-switch {
+ display: flex;
+ align-items: center;
+
+ .toggle-switch {
+ margin-left: 5px;
+ border: 1px solid #cdd0d6;
+ }
+
+ .toggle-switch-label span {
+ padding: 1px 6px;
+ background: none;
+ transition: background 0.12s ease-out;
+ border-right: 1px solid #cdd0d6;
+ }
+
+ .toggle-switch-label:first-of-type span {
+ padding-left: 8px;
+ }
+
+ .toggle-switch-label:last-of-type span {
+ padding-right: 8px;
+ border-right: none;
+ }
+
+ .toggle-switch-input:checked + .toggle-switch-label {
+ background: @toggle-switch-highlight-color;
+ }
+}
+
/**************************************
Formatting buttons
***************************************/
diff --git a/services/web/frontend/stylesheets/components/beta-badges.less b/services/web/frontend/stylesheets/components/beta-badges.less
index 329b3b6c54..c223c747fc 100644
--- a/services/web/frontend/stylesheets/components/beta-badges.less
+++ b/services/web/frontend/stylesheets/components/beta-badges.less
@@ -44,3 +44,7 @@
content: 'β';
}
}
+
+.tooltip-wide .tooltip-inner {
+ min-width: 275px;
+}