From e65a36fcbac3c232d0e15bce946469456f61ce6a Mon Sep 17 00:00:00 2001 From: ilkin-overleaf <100852799+ilkin-overleaf@users.noreply.github.com> Date: Wed, 12 Jul 2023 16:52:29 +0300 Subject: [PATCH] Merge pull request #13767 from overleaf/ii-review-panel-migration-in-editor-widgets [web] Create in editor widgets GitOrigin-RevId: 53dfb9935ee59bbdedc353aad5e5b19f389a513c --- .../src/Features/Project/ProjectController.js | 1 + .../web/app/views/project/editor/meta.pug | 1 + .../review-panel/add-comment-button.tsx | 5 + .../review-panel/current-file-container.tsx | 5 +- .../editor-widgets/editor-widgets.tsx | 110 ++++++++++++++++++ .../editor-widgets/toggle-widget.tsx | 25 ++++ .../entries/add-comment-entry.tsx | 28 ++--- .../components/review-panel/review-panel.tsx | 2 + .../hooks/use-angular-review-panel-state.ts | 12 +- .../review-panel/types/review-panel-state.ts | 12 +- .../stylesheets/app/editor/review-panel.less | 17 +++ .../review-panel/review-panel.spec.tsx | 14 +++ 12 files changed, 211 insertions(+), 21 deletions(-) create mode 100644 services/web/frontend/js/features/source-editor/components/review-panel/add-comment-button.tsx create mode 100644 services/web/frontend/js/features/source-editor/components/review-panel/editor-widgets/editor-widgets.tsx create mode 100644 services/web/frontend/js/features/source-editor/components/review-panel/editor-widgets/toggle-widget.tsx diff --git a/services/web/app/src/Features/Project/ProjectController.js b/services/web/app/src/Features/Project/ProjectController.js index 0d47a4d659..7856efee06 100644 --- a/services/web/app/src/Features/Project/ProjectController.js +++ b/services/web/app/src/Features/Project/ProjectController.js @@ -953,6 +953,7 @@ const ProjectController = { historyViewReact: historyViewAssignment.variant === 'react', isReviewPanelReact: reviewPanelAssignment.variant === 'react', showPersonalAccessToken, + hasTrackChangesFeature: Features.hasFeature('track-changes'), }) timer.done() } diff --git a/services/web/app/views/project/editor/meta.pug b/services/web/app/views/project/editor/meta.pug index 1a98582f1b..9c4b1b9fd1 100644 --- a/services/web/app/views/project/editor/meta.pug +++ b/services/web/app/views/project/editor/meta.pug @@ -41,6 +41,7 @@ meta(name="ol-showCM6SwitchAwaySurvey", data-type="boolean" content=showCM6Switc meta(name="ol-richTextVariant" content=richTextVariant) meta(name="ol-showPersonalAccessToken", data-type="boolean" content=showPersonalAccessToken) meta(name="ol-isReviewPanelReact", data-type="boolean" content=isReviewPanelReact) +meta(name="ol-hasTrackChangesFeature", data-type="boolean" content=hasTrackChangesFeature) if (richTextVariant === 'cm6') meta(name="ol-mathJax3Path" content=mathJax3Path) diff --git a/services/web/frontend/js/features/source-editor/components/review-panel/add-comment-button.tsx b/services/web/frontend/js/features/source-editor/components/review-panel/add-comment-button.tsx new file mode 100644 index 0000000000..5dca2c7eae --- /dev/null +++ b/services/web/frontend/js/features/source-editor/components/review-panel/add-comment-button.tsx @@ -0,0 +1,5 @@ +function AddCommentButton(props: React.ComponentPropsWithoutRef<'button'>) { + return + ) +} + +export default ToggleWidget diff --git a/services/web/frontend/js/features/source-editor/components/review-panel/entries/add-comment-entry.tsx b/services/web/frontend/js/features/source-editor/components/review-panel/entries/add-comment-entry.tsx index 570858aaaf..0e0033038c 100644 --- a/services/web/frontend/js/features/source-editor/components/review-panel/entries/add-comment-entry.tsx +++ b/services/web/frontend/js/features/source-editor/components/review-panel/entries/add-comment-entry.tsx @@ -4,8 +4,12 @@ import EntryContainer from './entry-container' import EntryCallout from './entry-callout' import EntryActions from './entry-actions' import AutoExpandingTextArea from '../../../../../shared/components/auto-expanding-text-area' +import AddCommentButton from '../add-comment-button' import Icon from '../../../../../shared/components/icon' -import { useReviewPanelValueContext } from '../../../context/review-panel/review-panel-context' +import { + useReviewPanelUpdaterFnsContext, + useReviewPanelValueContext, +} from '../../../context/review-panel/review-panel-context' import classnames from 'classnames' import { ReviewPanelAddCommentEntry } from '../../../../../../../types/review-panel/entry' @@ -15,24 +19,25 @@ type AddCommentEntryProps = { function AddCommentEntry({ entry }: AddCommentEntryProps) { const { t } = useTranslation() - const { submitNewComment, handleLayoutChange } = useReviewPanelValueContext() + const { isAddingComment, submitNewComment, handleLayoutChange } = + useReviewPanelValueContext() + const { setIsAddingComment } = useReviewPanelUpdaterFnsContext() const [content, setContent] = useState('') - const [isAdding, setIsAdding] = useState(false) const handleStartNewComment = () => { - setIsAdding(true) + setIsAddingComment(true) handleLayoutChange() } const handleSubmitNewComment = () => { submitNewComment(content) - setIsAdding(false) + setIsAddingComment(false) setContent('') } const handleCancelNewComment = () => { - setIsAdding(false) + setIsAddingComment(false) setContent('') handleLayoutChange() } @@ -61,14 +66,14 @@ function AddCommentEntry({ entry }: AddCommentEntryProps) {
- {isAdding ? ( + {isAddingComment ? ( <>
) : ( - + )}
diff --git a/services/web/frontend/js/features/source-editor/components/review-panel/review-panel.tsx b/services/web/frontend/js/features/source-editor/components/review-panel/review-panel.tsx index 6ede53330c..b0994897a7 100644 --- a/services/web/frontend/js/features/source-editor/components/review-panel/review-panel.tsx +++ b/services/web/frontend/js/features/source-editor/components/review-panel/review-panel.tsx @@ -1,4 +1,5 @@ import ReactDOM from 'react-dom' +import EditorWidgets from './editor-widgets/editor-widgets' import CurrentFileContainer from './current-file-container' import OverviewContainer from './overview-container' import { useCodeMirrorViewContext } from '../codemirror-editor' @@ -17,6 +18,7 @@ function ReviewPanelView({ parentDomNode }: ReviewPanelViewProps) { return ReactDOM.createPortal( <> + {isCurrentFileView(subView) ? ( ) : ( diff --git a/services/web/frontend/js/features/source-editor/context/review-panel/hooks/use-angular-review-panel-state.ts b/services/web/frontend/js/features/source-editor/context/review-panel/hooks/use-angular-review-panel-state.ts index a7414f9b61..d294787a62 100644 --- a/services/web/frontend/js/features/source-editor/context/review-panel/hooks/use-angular-review-panel-state.ts +++ b/services/web/frontend/js/features/source-editor/context/review-panel/hooks/use-angular-review-panel-state.ts @@ -127,6 +127,7 @@ function useAngularReviewPanelState(): ReviewPanelState { ) const [entryHover, setEntryHover] = useState(false) + const [isAddingComment, setIsAddingComment] = useState(false) const values = useMemo( () => ({ @@ -136,6 +137,7 @@ function useAngularReviewPanelState(): ReviewPanelState { docs, entries, entryHover, + isAddingComment, gotoEntry, handleLayoutChange, loadingThreads, @@ -176,6 +178,7 @@ function useAngularReviewPanelState(): ReviewPanelState { docs, entries, entryHover, + isAddingComment, gotoEntry, handleLayoutChange, loadingThreads, @@ -217,8 +220,15 @@ function useAngularReviewPanelState(): ReviewPanelState { setEntryHover, setCollapsed, setShouldCollapse, + setIsAddingComment, }), - [handleSetSubview, setCollapsed, setEntryHover, setShouldCollapse] + [ + handleSetSubview, + setCollapsed, + setEntryHover, + setShouldCollapse, + setIsAddingComment, + ] ) return { values, updaterFns } diff --git a/services/web/frontend/js/features/source-editor/context/review-panel/types/review-panel-state.ts b/services/web/frontend/js/features/source-editor/context/review-panel/types/review-panel-state.ts index 4bd1698538..d1bbeb5185 100644 --- a/services/web/frontend/js/features/source-editor/context/review-panel/types/review-panel-state.ts +++ b/services/web/frontend/js/features/source-editor/context/review-panel/types/review-panel-state.ts @@ -13,6 +13,7 @@ import { MainDocument, } from '../../../../../../../types/project-settings' +/* eslint-disable no-use-before-define */ export interface ReviewPanelState { values: { collapsed: Record @@ -21,6 +22,7 @@ export interface ReviewPanelState { docs: MainDocument[] | undefined entries: ReviewPanelEntries entryHover: boolean + isAddingComment: boolean gotoEntry: (docId: DocId, entryOffset: number) => void handleLayoutChange: () => void loadingThreads: boolean @@ -66,15 +68,17 @@ export interface ReviewPanelState { } updaterFns: { handleSetSubview: (subView: SubView) => void - setEntryHover: React.Dispatch> - setCollapsed: React.Dispatch< - React.SetStateAction + setEntryHover: React.Dispatch>> + setIsAddingComment: React.Dispatch< + React.SetStateAction> > + setCollapsed: React.Dispatch>> setShouldCollapse: React.Dispatch< - React.SetStateAction + React.SetStateAction> > } } +/* eslint-enable no-use-before-define */ // Getter for values export type Value = diff --git a/services/web/frontend/stylesheets/app/editor/review-panel.less b/services/web/frontend/stylesheets/app/editor/review-panel.less index 1d35ac982a..df62d5cb00 100644 --- a/services/web/frontend/stylesheets/app/editor/review-panel.less +++ b/services/web/frontend/stylesheets/app/editor/review-panel.less @@ -1304,3 +1304,20 @@ button when (@is-overleaf-light = true) { } } } + +.react-rp-in-editor-widgets { + position: sticky; + font-family: @font-family-sans-serif; + + .rp-in-editor-widgets-inner { + position: absolute; + top: 0; + right: 0; + display: flex; + flex-direction: column; + } + + .rp-track-changes-indicator { + border: 0; + } +} diff --git a/services/web/test/frontend/features/review-panel/review-panel.spec.tsx b/services/web/test/frontend/features/review-panel/review-panel.spec.tsx index 273c25be18..7196716d7d 100644 --- a/services/web/test/frontend/features/review-panel/review-panel.spec.tsx +++ b/services/web/test/frontend/features/review-panel/review-panel.spec.tsx @@ -250,4 +250,18 @@ describe('', function () { // eslint-disable-next-line mocha/no-skipped-tests it.skip('renders comments', function () {}) }) + + describe('in editor widgets', function () { + // eslint-disable-next-line mocha/no-skipped-tests + it.skip('toggle review panel', function () {}) + + // eslint-disable-next-line mocha/no-skipped-tests + it.skip('accepts all changes', function () {}) + + // eslint-disable-next-line mocha/no-skipped-tests + it.skip('rejects all changes', function () {}) + + // eslint-disable-next-line mocha/no-skipped-tests + it.skip('add comment', function () {}) + }) })