From c4c28007d2ff7831d484e42672d96e868c544b3d Mon Sep 17 00:00:00 2001 From: Davinder Singh Date: Tue, 14 Feb 2023 10:20:52 +0000 Subject: [PATCH] Merge pull request #11653 from overleaf/ds-documentation-btn-on-editor Adding documentation button on the editor GitOrigin-RevId: e03fd7b931eb0fe7273e6e9d0185c81c384df916 --- .../src/Features/Project/ProjectController.js | 15 ++++ .../views/project/editor/file-tree-react.pug | 72 ++++++++++--------- .../app/views/project/editor/left-menu.pug | 7 +- .../components/documentation-button.tsx | 70 ++++++++++++++++++ .../documentation-button-controller.js | 9 +++ services/web/frontend/js/ide.js | 1 + .../stylesheets/app/editor/file-tree.less | 4 ++ .../stylesheets/app/editor/outline.less | 22 ++++++ 8 files changed, 165 insertions(+), 35 deletions(-) create mode 100644 services/web/frontend/js/features/outline/components/documentation-button.tsx create mode 100644 services/web/frontend/js/features/outline/controllers/documentation-button-controller.js diff --git a/services/web/app/src/Features/Project/ProjectController.js b/services/web/app/src/Features/Project/ProjectController.js index e472f8c7ed..ddecf48c81 100644 --- a/services/web/app/src/Features/Project/ProjectController.js +++ b/services/web/app/src/Features/Project/ProjectController.js @@ -1051,6 +1051,21 @@ const ProjectController = { } ) }, + editorDocumentationButton(cb) { + SplitTestHandler.getAssignment( + req, + res, + 'documentation-on-editor', + (error, assignment) => { + // do not fail editor load if assignment fails + if (error) { + cb(null, { variant: 'default' }) + } else { + cb(null, assignment) + } + } + ) + }, richTextAssignment(cb) { SplitTestHandler.getAssignment( req, diff --git a/services/web/app/views/project/editor/file-tree-react.pug b/services/web/app/views/project/editor/file-tree-react.pug index 5838ab541d..9ec480fbbc 100644 --- a/services/web/app/views/project/editor/file-tree-react.pug +++ b/services/web/app/views/project/editor/file-tree-react.pug @@ -1,38 +1,42 @@ -aside.editor-sidebar.full-size( - ng-show="ui.view != 'history'" - vertical-resizable-panes="outline-resizer" - vertical-resizable-panes-toggled-externally-on="outline-toggled" - vertical-resizable-panes-default-size="350" - vertical-resizable-panes-min-size="32" - vertical-resizable-panes-max-size="'75%'" - vertical-resizable-panes-resize-on="left-pane-resize-all" -) +aside.editor-sidebar.full-size - .file-tree( - ng-controller="ReactFileTreeController" - vertical-resizable-top + .resizable-side-bar( + ng-show="ui.view != 'history'" + vertical-resizable-panes="outline-resizer" + vertical-resizable-panes-toggled-externally-on="outline-toggled" + vertical-resizable-panes-default-size="350" + vertical-resizable-panes-min-size="32" + vertical-resizable-panes-max-size="'75%'" + vertical-resizable-panes-resize-on="left-pane-resize-all" ) - file-tree-root( - on-select="onSelect" - on-init="onInit" - is-connected="isConnected" - ref-providers="refProviders" - reindex-references="reindexReferences" - set-ref-provider-enabled="setRefProviderEnabled" - set-started-free-trial="setStartedFreeTrial" - ) - .outline-container( - vertical-resizable-bottom - ng-controller="OutlineController" - ) - outline-pane( - is-tex-file="isTexFile" - outline="outline" - project-id="project_id" - jump-to-line="jumpToLine" - on-toggle="onToggle" - event-tracking="eventTracking" - highlighted-line="highlightedLine" - show="show" + .file-tree( + ng-controller="ReactFileTreeController" + vertical-resizable-top ) + file-tree-root( + on-select="onSelect" + on-init="onInit" + is-connected="isConnected" + ref-providers="refProviders" + reindex-references="reindexReferences" + set-ref-provider-enabled="setRefProviderEnabled" + set-started-free-trial="setStartedFreeTrial" + ) + + .outline-container( + vertical-resizable-bottom + ng-controller="OutlineController" + ) + outline-pane( + is-tex-file="isTexFile" + outline="outline" + project-id="project_id" + jump-to-line="jumpToLine" + on-toggle="onToggle" + event-tracking="eventTracking" + highlighted-line="highlightedLine" + show="show" + ) + + documentation-button \ No newline at end of file diff --git a/services/web/app/views/project/editor/left-menu.pug b/services/web/app/views/project/editor/left-menu.pug index 8fd5c501ce..26fd8e1b97 100644 --- a/services/web/app/views/project/editor/left-menu.pug +++ b/services/web/app/views/project/editor/left-menu.pug @@ -238,7 +238,12 @@ aside#left-menu.full-size( ) if showSupport li - a(href='/learn', target="_blank") + a( + href='/learn', target="_blank" + event-tracking="left-menu-documentation-click " + event-tracking-mb="true" + event-tracking-trigger="click" + ) i.fa.fa-book.fa-fw |    #{translate('documentation')} li diff --git a/services/web/frontend/js/features/outline/components/documentation-button.tsx b/services/web/frontend/js/features/outline/components/documentation-button.tsx new file mode 100644 index 0000000000..13c3f844cf --- /dev/null +++ b/services/web/frontend/js/features/outline/components/documentation-button.tsx @@ -0,0 +1,70 @@ +import { useState } from 'react' +import Icon from '../../../shared/components/icon' +import { useSplitTestContext } from '../../../shared/context/split-test-context' +import { sendMB } from '../../../infrastructure/event-tracking' +import PropTypes from 'prop-types' +import { Button } from 'react-bootstrap' + +function DocumentationButton() { + const { splitTestVariants } = useSplitTestContext({ + splitTestVariants: PropTypes.object, + }) + const documentationButtonVariant = + splitTestVariants['documentation-on-editor'] + + let documentationButtonText = '' + + if (documentationButtonVariant === 'latex-help') + documentationButtonText = 'LaTeX help' + else if (documentationButtonVariant === 'documentation') + documentationButtonText = 'Documentation' + else if (documentationButtonVariant === 'help-guides') + documentationButtonText = 'Help guides' + const [showDocumentationButton, setShowDocumentationButton] = useState( + !(documentationButtonVariant === 'default') + ) + + function handleCloseClick() { + sendMB('file-tree-documentation-dismiss ') + + setShowDocumentationButton(false) + } + + function handleDocumentationLinkClick() { + sendMB('file-tree-documentation-click') + } + return ( +
+ {showDocumentationButton ? ( +
+
+ + +

{documentationButtonText}

+
+ +
+
+ ) : null} +
+ ) +} + +export default DocumentationButton diff --git a/services/web/frontend/js/features/outline/controllers/documentation-button-controller.js b/services/web/frontend/js/features/outline/controllers/documentation-button-controller.js new file mode 100644 index 0000000000..da391281bd --- /dev/null +++ b/services/web/frontend/js/features/outline/controllers/documentation-button-controller.js @@ -0,0 +1,9 @@ +import { react2angular } from 'react2angular' +import DocumentationButton from '../components/documentation-button' +import { rootContext } from '../../../../../frontend/js/shared/context/root-context' +import App from '../../../../../frontend/js/base' + +App.component( + 'documentationButton', + react2angular(rootContext.use(DocumentationButton), []) +) diff --git a/services/web/frontend/js/ide.js b/services/web/frontend/js/ide.js index 7dc9a4f798..45d6a1c194 100644 --- a/services/web/frontend/js/ide.js +++ b/services/web/frontend/js/ide.js @@ -66,6 +66,7 @@ import './features/share-project-modal/controllers/react-share-project-modal-con import './features/source-editor/controllers/editor-switch-controller' import './features/source-editor/controllers/cm6-switch-away-survey-controller' import './features/source-editor/controllers/grammarly-warning-controller' +import './features/outline/controllers/documentation-button-controller' import { cleanupServiceWorker } from './utils/service-worker-cleanup' import { reportCM6Perf } from './infrastructure/cm6-performance' import { reportAcePerf } from './ide/editor/ace-performance' diff --git a/services/web/frontend/stylesheets/app/editor/file-tree.less b/services/web/frontend/stylesheets/app/editor/file-tree.less index d6d928634e..b40cac76c5 100644 --- a/services/web/frontend/stylesheets/app/editor/file-tree.less +++ b/services/web/frontend/stylesheets/app/editor/file-tree.less @@ -14,6 +14,10 @@ background-color: @file-tree-bg; } +.resizable-side-bar { + flex-grow: 1; +} + .file-tree { display: flex !important; // To work around jQuery layout's inline styles flex-direction: column; diff --git a/services/web/frontend/stylesheets/app/editor/outline.less b/services/web/frontend/stylesheets/app/editor/outline.less index 7ed7ba0912..60f7520e73 100644 --- a/services/web/frontend/stylesheets/app/editor/outline.less +++ b/services/web/frontend/stylesheets/app/editor/outline.less @@ -15,6 +15,20 @@ opacity: 0.5; } +.documentation-btn.outline-header-expand-collapse-btn { + justify-content: space-between; + padding-right: 0; +} + +.documentation-btn .btn { + padding-right: 0; +} + +.documentation-link { + display: flex; + margin-left: 0.5em; +} + .outline-header { .toolbar-small-mixin; .toolbar-alt-mixin; @@ -23,6 +37,14 @@ border-bottom: 1px solid @toolbar-border-color; border-top: 1px solid @toolbar-border-color; } +.outline-footer { + .toolbar-small-mixin; + .toolbar-alt-mixin; + display: flex; + flex-shrink: 0; + border-bottom: 1px solid @toolbar-border-color; + border-top: 1px solid @toolbar-border-color; +} .outline-header-expand-collapse-btn { display: flex;