diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json index 44633faea4..945d3a1f70 100644 --- a/services/web/frontend/extracted-translations.json +++ b/services/web/frontend/extracted-translations.json @@ -267,6 +267,7 @@ "comment": "", "comment_only": "", "comment_only_upgrade_for_track_changes": "", + "comment_only_upgrade_to_enable_track_changes": "", "common": "", "common_causes_of_compile_timeouts_include": "", "commons_plan_tooltip": "", diff --git a/services/web/frontend/js/features/share-project-modal/components/add-collaborators.jsx b/services/web/frontend/js/features/share-project-modal/components/add-collaborators.jsx index aa5948cb6f..904946775b 100644 --- a/services/web/frontend/js/features/share-project-modal/components/add-collaborators.jsx +++ b/services/web/frontend/js/features/share-project-modal/components/add-collaborators.jsx @@ -194,7 +194,7 @@ export default function AddCollaborators({ readOnly }) { itemToKey={item => item.key} itemToString={item => item.label} itemToSubtitle={item => item.description || ''} - itemToDisabled={item => readOnly && item.key === 'readAndWrite'} + itemToDisabled={item => readOnly && item.key !== 'readOnly'} selected={privilegeOptions.find( option => option.key === privileges )} diff --git a/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx b/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx index 433d16d9c7..5b7ac58fd7 100644 --- a/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx +++ b/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx @@ -1,6 +1,6 @@ import { useState, useEffect, useMemo } from 'react' import PropTypes from 'prop-types' -import { useTranslation } from 'react-i18next' +import { Trans, useTranslation } from 'react-i18next' import { useShareProjectContext } from './share-project-modal' import TransferOwnershipModal from './transfer-ownership-modal' import { removeMemberFromProject, updateMember } from '../utils/api' @@ -17,6 +17,7 @@ import MaterialIcon from '@/shared/components/material-icon' import getMeta from '@/utils/meta' import { useUserContext } from '@/shared/context/user-context' import { isSplitTestEnabled } from '@/utils/splitTestUtils' +import { upgradePlan } from '@/main/account-upgrade' type PermissionsOption = PermissionsLevel | 'removeAccess' | 'downgraded' @@ -25,6 +26,7 @@ type EditMemberProps = { hasExceededCollaboratorLimit: boolean hasBeenDowngraded: boolean canAddCollaborators: boolean + isReviewerOnFreeProject?: boolean } type Privilege = { @@ -37,6 +39,7 @@ export default function EditMember({ hasExceededCollaboratorLimit, hasBeenDowngraded, canAddCollaborators, + isReviewerOnFreeProject, }: EditMemberProps) { const [privileges, setPrivileges] = useState( member.privileges @@ -144,7 +147,7 @@ export default function EditMember({ }} > - +
)} + {isReviewerOnFreeProject && ( +
+ upgradePlan('track-changes')} + />, + ]} + /> +
+ )}
- + {confirmRemoval && ( setPrivileges(member.privileges)} diff --git a/services/web/frontend/js/features/share-project-modal/components/share-modal-body.tsx b/services/web/frontend/js/features/share-project-modal/components/share-modal-body.tsx index 500834d30d..886e877f55 100644 --- a/services/web/frontend/js/features/share-project-modal/components/share-modal-body.tsx +++ b/services/web/frontend/js/features/share-project-modal/components/share-modal-body.tsx @@ -117,6 +117,9 @@ export default function ShareModalBody() { member.pendingEditor || member.pendingReviewer )} canAddCollaborators={canAddCollaborators} + isReviewerOnFreeProject={ + member.privileges === 'review' && !features.trackChanges + } /> ) : ( diff --git a/services/web/locales/en.json b/services/web/locales/en.json index 20074a55ed..d0bd81af5a 100644 --- a/services/web/locales/en.json +++ b/services/web/locales/en.json @@ -348,6 +348,7 @@ "comment": "Comment", "comment_only": "Comment only", "comment_only_upgrade_for_track_changes": "Comment only. Upgrade for track changes.", + "comment_only_upgrade_to_enable_track_changes": "Comment only. <0>Upgrade to enable track changes.", "common": "Common", "common_causes_of_compile_timeouts_include": "Common causes of compile timeouts include", "commons_plan_tooltip": "You’re on the __plan__ plan because of your affiliation with __institution__. Click to find out how to make the most of your Overleaf premium features.", diff --git a/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx b/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx index 9e02710275..cee1bca5ab 100644 --- a/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx +++ b/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx @@ -700,7 +700,7 @@ describe('', function () { const viewerOption = screen.getByText('Viewer').closest('button') expect(editorOption.classList.contains('disabled')).to.be.true - expect(reviewerOption.classList.contains('disabled')).to.be.false + expect(reviewerOption.classList.contains('disabled')).to.be.true expect(viewerOption.classList.contains('disabled')).to.be.false screen.getByText( @@ -737,7 +737,7 @@ describe('', function () { const viewerOption = screen.getByText('Viewer').closest('button') expect(editorOption.classList.contains('disabled')).to.be.true - expect(reviewerOption.classList.contains('disabled')).to.be.false + expect(reviewerOption.classList.contains('disabled')).to.be.true expect(viewerOption.classList.contains('disabled')).to.be.false screen.getByText(