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 ( +
+ + +
+ Editor mode. + + + + + + + + + +
+
+ ) +} + +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; +}