diff --git a/services/web/app/views/project/editor/header-react.pug b/services/web/app/views/project/editor/header-react.pug
index 1ff99d2d93..480934432a 100644
--- a/services/web/app/views/project/editor/header-react.pug
+++ b/services/web/app/views/project/editor/header-react.pug
@@ -1,6 +1,7 @@
-div(ng-controller="EditorNavigationToolbarController")
-
- editor-navigation-toolbar-root(
- open-doc="openDoc"
- online-users-array="onlineUsersArray"
- )
\ No newline at end of file
+div(ng-controller="ShareController")
+ div(ng-controller="EditorNavigationToolbarController")
+ editor-navigation-toolbar-root(
+ open-doc="openDoc"
+ online-users-array="onlineUsersArray"
+ open-share-project-modal="openShareProjectModal"
+ )
\ No newline at end of file
diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json
index cdf57f3f8a..8767999001 100644
--- a/services/web/frontend/extracted-translations.json
+++ b/services/web/frontend/extracted-translations.json
@@ -109,6 +109,7 @@
"run_syntax_check_now": "",
"send_first_message": "",
"server_error": "",
+ "share": "",
"show_outline": "",
"something_went_wrong_rendering_pdf": "",
"somthing_went_wrong_compiling": "",
diff --git a/services/web/frontend/js/features/chat/context/chat-context.js b/services/web/frontend/js/features/chat/context/chat-context.js
index 1211658077..c5fe86dd38 100644
--- a/services/web/frontend/js/features/chat/context/chat-context.js
+++ b/services/web/frontend/js/features/chat/context/chat-context.js
@@ -113,6 +113,8 @@ ChatProvider.propTypes = {
children: PropTypes.any
}
-export function useChatContext() {
- return useContext(ChatContext)
+export function useChatContext(propTypes) {
+ const data = useContext(ChatContext)
+ PropTypes.checkPropTypes(propTypes, data, 'data', 'ChatContext.Provider')
+ return data
}
diff --git a/services/web/frontend/js/features/editor-navigation-toolbar/components/editor-navigation-toolbar-root.js b/services/web/frontend/js/features/editor-navigation-toolbar/components/editor-navigation-toolbar-root.js
index 0844ee34d1..dd910cefaa 100644
--- a/services/web/frontend/js/features/editor-navigation-toolbar/components/editor-navigation-toolbar-root.js
+++ b/services/web/frontend/js/features/editor-navigation-toolbar/components/editor-navigation-toolbar-root.js
@@ -8,7 +8,10 @@ import { useLayoutContext } from '../../../shared/context/layout-context'
const editorContextPropTypes = {
cobranding: PropTypes.object,
loading: PropTypes.bool,
- isRestrictedTokenMember: PropTypes.bool
+ isRestrictedTokenMember: PropTypes.bool,
+ projectName: PropTypes.string.isRequired,
+ renameProject: PropTypes.func.isRequired,
+ isProjectOwner: PropTypes.bool
}
const layoutContextPropTypes = {
@@ -18,13 +21,28 @@ const layoutContextPropTypes = {
setReviewPanelOpen: PropTypes.func.isRequired,
view: PropTypes.string,
setView: PropTypes.func.isRequired,
- setLeftMenuShown: PropTypes.func.isRequired
+ setLeftMenuShown: PropTypes.func.isRequired,
+ pdfLayout: PropTypes.string.isRequired
}
-function EditorNavigationToolbarRoot({ onlineUsersArray, openDoc }) {
- const { cobranding, loading, isRestrictedTokenMember } = useEditorContext(
- editorContextPropTypes
- )
+const chatContextPropTypes = {
+ resetUnreadMessageCount: PropTypes.func.isRequired,
+ unreadMessageCount: PropTypes.number.isRequired
+}
+
+function EditorNavigationToolbarRoot({
+ onlineUsersArray,
+ openDoc,
+ openShareProjectModal
+}) {
+ const {
+ cobranding,
+ loading,
+ isRestrictedTokenMember,
+ projectName,
+ renameProject,
+ isProjectOwner
+ } = useEditorContext(editorContextPropTypes)
const {
chatIsOpen,
@@ -33,10 +51,13 @@ function EditorNavigationToolbarRoot({ onlineUsersArray, openDoc }) {
setReviewPanelOpen,
view,
setView,
- setLeftMenuShown
+ setLeftMenuShown,
+ pdfLayout
} = useLayoutContext(layoutContextPropTypes)
- const { resetUnreadMessageCount, unreadMessageCount } = useChatContext()
+ const { resetUnreadMessageCount, unreadMessageCount } = useChatContext(
+ chatContextPropTypes
+ )
const toggleChatOpen = useCallback(() => {
if (!chatIsOpen) {
@@ -54,6 +75,14 @@ function EditorNavigationToolbarRoot({ onlineUsersArray, openDoc }) {
setView(view === 'history' ? 'editor' : 'history')
}, [view, setView])
+ const togglePdfView = useCallback(() => {
+ setView(view === 'pdf' ? 'editor' : 'pdf')
+ }, [view, setView])
+
+ const openShareModal = useCallback(() => {
+ openShareProjectModal(isProjectOwner)
+ }, [openShareProjectModal, isProjectOwner])
+
const onShowLeftMenuClick = useCallback(
() => setLeftMenuShown(value => !value),
[setLeftMenuShown]
@@ -82,13 +111,20 @@ function EditorNavigationToolbarRoot({ onlineUsersArray, openDoc }) {
onlineUsers={onlineUsersArray}
goToUser={goToUser}
isRestrictedTokenMember={isRestrictedTokenMember}
+ projectName={projectName}
+ renameProject={renameProject}
+ openShareModal={openShareModal}
+ pdfViewIsOpen={view === 'pdf'}
+ pdfButtonIsVisible={pdfLayout === 'flat'}
+ togglePdfView={togglePdfView}
/>
)
}
EditorNavigationToolbarRoot.propTypes = {
onlineUsersArray: PropTypes.array.isRequired,
- openDoc: PropTypes.func.isRequired
+ openDoc: PropTypes.func.isRequired,
+ openShareProjectModal: PropTypes.func.isRequired
}
export default EditorNavigationToolbarRoot
diff --git a/services/web/frontend/js/features/editor-navigation-toolbar/components/pdf-toggle-button.js b/services/web/frontend/js/features/editor-navigation-toolbar/components/pdf-toggle-button.js
new file mode 100644
index 0000000000..449738b583
--- /dev/null
+++ b/services/web/frontend/js/features/editor-navigation-toolbar/components/pdf-toggle-button.js
@@ -0,0 +1,36 @@
+import React from 'react'
+import PropTypes from 'prop-types'
+import { OverlayTrigger, Tooltip } from 'react-bootstrap'
+import classNames from 'classnames'
+import Icon from '../../../shared/components/icon'
+
+function PdfToggleButton({ onClick, pdfViewIsOpen }) {
+ const classes = classNames(
+ 'btn',
+ 'btn-full-height',
+ 'btn-full-height-no-border',
+ {
+ active: pdfViewIsOpen
+ }
+ )
+
+ return (
+
{t('share')}
+ + ) +} + +ShareProjectButton.propTypes = { + onClick: PropTypes.func.isRequired +} + +export default ShareProjectButton diff --git a/services/web/frontend/js/features/editor-navigation-toolbar/components/toolbar-header.js b/services/web/frontend/js/features/editor-navigation-toolbar/components/toolbar-header.js index f08c7601dc..9c255d8997 100644 --- a/services/web/frontend/js/features/editor-navigation-toolbar/components/toolbar-header.js +++ b/services/web/frontend/js/features/editor-navigation-toolbar/components/toolbar-header.js @@ -5,8 +5,11 @@ import CobrandingLogo from './cobranding-logo' import BackToProjectsButton from './back-to-projects-button' import ChatToggleButton from './chat-toggle-button' import OnlineUsersWidget from './online-users-widget' +import ProjectNameEditableLabel from './project-name-editable-label' import TrackChangesToggleButton from './track-changes-toggle-button' import HistoryToggleButton from './history-toggle-button' +import ShareProjectButton from './share-project-button' +import PdfToggleButton from './pdf-toggle-button' function ToolbarHeader({ cobranding, @@ -20,7 +23,13 @@ function ToolbarHeader({ unreadMessageCount, onlineUsers, goToUser, - isRestrictedTokenMember + isRestrictedTokenMember, + projectName, + renameProject, + openShareModal, + pdfViewIsOpen, + pdfButtonIsVisible, + togglePdfView }) { return (