From 6ccbefc3f88c4a9530a2235b69c0d2738ce9aa05 Mon Sep 17 00:00:00 2001 From: ilkin-overleaf <100852799+ilkin-overleaf@users.noreply.github.com> Date: Mon, 27 Apr 2026 13:47:13 +0300 Subject: [PATCH] Merge pull request #32941 from overleaf/ii-share-modal-manage-access [web] Share modal redesign: invited people screen GitOrigin-RevId: bf7f83dccc245e41eca8087fc27c1b411f025b0d --- .../web/frontend/extracted-translations.json | 4 + ...alSymbolsRoundedUnfilledPartialSlice.woff2 | Bin 9952 -> 10440 bytes .../material-symbols/unfilled-symbols.mjs | 4 + .../components/edit-member.tsx | 221 +++++++++++++++++- .../share-project-modal/components/invite.tsx | 77 +++++- .../components/invited-people.tsx | 60 ++++- .../components/owner-info.tsx | 15 +- .../components/share-modal-body.tsx | 8 +- .../components/share-project-modal.tsx | 1 + .../components/view-member.tsx | 18 +- services/web/locales/en.json | 4 + 11 files changed, 393 insertions(+), 19 deletions(-) diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json index 457c09d5fc..a4c8b151fe 100644 --- a/services/web/frontend/extracted-translations.json +++ b/services/web/frontend/extracted-translations.json @@ -965,7 +965,10 @@ "invite_more_members": "", "invite_not_accepted": "", "invite_resend_limit_hit": "", + "invite_resent": "", + "invite_revoked": "", "invite_users": "", + "invited_people": "", "invited_to_group": "", "invited_to_group_have_individual_subcription": "", "inviting": "", @@ -1576,6 +1579,7 @@ "resend": "", "resend_confirmation_code": "", "resend_group_invite": "", + "resend_invite": "", "resend_link_sso": "", "resend_managed_user_invite": "", "resending_confirmation_code": "", diff --git a/services/web/frontend/fonts/material-symbols/MaterialSymbolsRoundedUnfilledPartialSlice.woff2 b/services/web/frontend/fonts/material-symbols/MaterialSymbolsRoundedUnfilledPartialSlice.woff2 index ae0890e9ebf192023cff6b0a08e658067a3bf5b7..5ca6ba1da4ecf206da7345eedc48355058b6230d 100644 GIT binary patch literal 10440 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

A82 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 diff --git a/services/web/frontend/fonts/material-symbols/unfilled-symbols.mjs b/services/web/frontend/fonts/material-symbols/unfilled-symbols.mjs index e503509ee9..2ea68a635b 100644 --- a/services/web/frontend/fonts/material-symbols/unfilled-symbols.mjs +++ b/services/web/frontend/fonts/material-symbols/unfilled-symbols.mjs @@ -45,6 +45,7 @@ export default /** @type {const} */ ([ 'lightbulb_2', 'lock', 'lock_open', + 'mail', 'mode_comment', 'more_vert', 'neurology', @@ -52,6 +53,8 @@ export default /** @type {const} */ ([ 'notifications', 'open_in_new', 'password', + 'person', + 'person_edit', 'picture_as_pdf', 'push_pin', 'rate_review', @@ -75,6 +78,7 @@ export default /** @type {const} */ ([ 'upload', 'visibility', 'visibility_off', + 'warning', 'web_asset', 'whatshot', 'wifi_off', 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 586e7384ad..07fb6ed6ad 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 @@ -15,6 +15,15 @@ import OLCol from '@/shared/components/ol/ol-col' import MaterialIcon from '@/shared/components/material-icon' import { useUserContext } from '@/shared/context/user-context' import { upgradePlan } from '@/main/account-upgrade' +import ShareProjectModalRow from '@/features/share-project-modal/components/share-project-modal-row' +import { + Dropdown, + DropdownMenu, + DropdownToggle, +} from '@/shared/components/dropdown/dropdown-menu' +import OLDropdownMenuItem from '@/shared/components/ol/ol-dropdown-menu-item' +import { useFeatureFlag } from '@/shared/context/split-test-context' +import classnames from 'classnames' type PermissionsOption = PermissionsLevel | 'removeAccess' | 'downgraded' @@ -38,6 +47,7 @@ export default function EditMember({ canAddCollaborators, isReviewerOnFreeProject, }: EditMemberProps) { + const isSharingUpdatesEnabled = useFeatureFlag('sharing-updates') const [privileges, setPrivileges] = useState( member.privileges ) @@ -51,8 +61,8 @@ export default function EditMember({ setPrivileges(member.privileges) }, [member.privileges]) - const { monitorRequest } = useShareProjectContext() - const { projectId, project, updateProject } = useProjectContext() + const { monitorRequest, setSuccessActionMessage } = useShareProjectContext() + const { projectId, project, updateProject, features } = useProjectContext() const { members, invites } = project || {} const user = useUserContext() @@ -113,10 +123,14 @@ export default function EditMember({ ).then(() => { updateProject({ members: - members?.map(item => - item._id === member._id ? { ...item, newPrivileges } : item + members?.map( + (item): ProjectMember => + item._id === member._id + ? { ...item, privileges: newPrivileges } + : item ) || [], }) + setSuccessActionMessage(t('access_updated')) }) } } @@ -136,7 +150,195 @@ export default function EditMember({ const confirmRemoval = privileges !== member.privileges && privilegeChangePending - return ( + const getDropdownLabel = () => { + if (hasBeenDowngraded) { + return t('select_access_level') + } + switch (privileges) { + case 'owner': + return t('make_owner') + case 'readAndWrite': + return t('editor') + case 'review': + return t('reviewer') + case 'readOnly': + return t('viewer') + case 'removeAccess': + return t('remove_access') + case 'downgraded': + return t('select_access_level') + default: + return t('remove_access') + } + } + + const getPrivilegeSubtitle = (privilege: PermissionsOption) => { + if (!['readAndWrite', 'review'].includes(privilege)) { + return + } + + if ( + (hasBeenDowngraded && !confirmRemoval) || + (!canAddCollaborators && !['readAndWrite', 'review'].includes(privileges)) + ) { + return t('limited_to_n_collaborators_per_project', { + count: features.collaborators, + }) + } + } + + const isPrivilegeDisabled = (privilege: PermissionsOption) => { + return ( + !canAddCollaborators && + ['readAndWrite', 'review'].includes(privilege) && + ((hasBeenDowngraded && !confirmRemoval) || + !['readAndWrite', 'review'].includes(privileges)) + ) + } + + return isSharingUpdatesEnabled ? ( + +

+ +
+ {member.email} + {member.pendingEditor && ( +
{t('view_only_downgraded')}
+ )} + {member.pendingReviewer && ( +
+ {t('view_only_reviewer_downgraded')} +
+ )} + {shouldWarnMember() && ( +
+ {t('will_lose_edit_access_on_date', { + date: linkSharingEnforcementDate, + })} +
+ )} + {isReviewerOnFreeProject && ( +
+ upgradePlan('track-changes')} + />, + ]} + /> +
+ )} +
+
+
+ { + if (eventKey) { + handlePrivilegeChange(eventKey) + } + }} + > +
+ {hasBeenDowngraded && !confirmRemoval && ( + + )} + + {getDropdownLabel()} + + +
+ + } + active={privileges === 'owner'} + trailingIcon={privileges === 'owner' ? 'check' : undefined} + > + {t('make_owner')} + + } + active={privileges === 'readAndWrite'} + trailingIcon={privileges === 'readAndWrite' ? 'check' : undefined} + disabled={isPrivilegeDisabled('readAndWrite')} + description={getPrivilegeSubtitle('readAndWrite')} + > + {t('editor')} + + {features.trackChangesVisible && ( + } + active={privileges === 'review'} + trailingIcon={privileges === 'review' ? 'check' : undefined} + disabled={isPrivilegeDisabled('review')} + description={getPrivilegeSubtitle('review')} + > + {t('reviewer')} + + )} + } + active={privileges === 'readOnly'} + trailingIcon={privileges === 'readOnly' ? 'check' : undefined} + > + {t('viewer')} + + } + active={privileges === 'removeAccess'} + trailingIcon={privileges === 'removeAccess' ? 'check' : undefined} + > + {t('remove_access')} + + +
+ {confirmRemoval && ( +
{ + e.preventDefault() + if (privilegeChangePending) { + commitPrivilegeChange(privileges) + } + }} + > + setPrivileges(member.privileges)} + /> + + )} +
+ + ) : (
{ @@ -322,12 +524,17 @@ type ChangePrivilegesActionsProps = { function ChangePrivilegesActions({ handleReset, }: ChangePrivilegesActionsProps) { + const isSharingUpdatesEnabled = useFeatureFlag('sharing-updates') const { t } = useTranslation() return ( -
+
+
+ +
{invite.email}
+ + {t('pending_invite')} + +
+ {isProjectOwner ? ( + {}}> + + + + + + + + + + ) : ( +
+
+ +
+
+ )} + + ) : (
{invite.email}
@@ -45,8 +87,10 @@ export default function Invite({ } function ResendInvite({ invite }: { invite: ProjectMember }) { + const isSharingUpdatesEnabled = useFeatureFlag('sharing-updates') const { t } = useTranslation() - const { monitorRequest, setError, inFlight } = useShareProjectContext() + const { monitorRequest, setError, inFlight, setSuccessActionMessage } = + useShareProjectContext() const { projectId } = useProjectContext() // const buttonRef = useRef(null) @@ -54,6 +98,7 @@ function ResendInvite({ invite }: { invite: ProjectMember }) { const handleClick = useCallback( () => monitorRequest(() => resendInvite(projectId, invite)) + .then(() => setSuccessActionMessage(t('invite_resent'))) .catch(error => { if (error?.response?.status === 404) { setError('invite_expired') @@ -71,10 +116,19 @@ function ResendInvite({ invite }: { invite: ProjectMember }) { ;(document.activeElement as HTMLElement).blur() } }), - [invite, monitorRequest, projectId, setError] + [invite, monitorRequest, projectId, setError, setSuccessActionMessage, t] ) - return ( + return isSharingUpdatesEnabled ? ( + } + onClick={handleClick} + disabled={inFlight} + > + {t('resend_invite')} + + ) : ( } + variant="danger" + onClick={handleClick} + > + {t('revoke_invite')} + + ) : ( +

{t('invited_people')}

+ + {sortedMembers.map(member => + isProjectOwner ? ( + + ) : ( + + ) + )} + + {(invites || []).map(invite => ( + + ))} + + ) } export default InvitedPeople diff --git a/services/web/frontend/js/features/share-project-modal/components/owner-info.tsx b/services/web/frontend/js/features/share-project-modal/components/owner-info.tsx index d074ab669d..ec20c1083a 100644 --- a/services/web/frontend/js/features/share-project-modal/components/owner-info.tsx +++ b/services/web/frontend/js/features/share-project-modal/components/owner-info.tsx @@ -2,13 +2,26 @@ import { useProjectContext } from '@/shared/context/project-context' import { useTranslation } from 'react-i18next' import OLRow from '@/shared/components/ol/ol-row' import OLCol from '@/shared/components/ol/ol-col' +import ShareProjectModalRow from '@/features/share-project-modal/components/share-project-modal-row' import MaterialIcon from '@/shared/components/material-icon' +import { useFeatureFlag } from '@/shared/context/split-test-context' export default function OwnerInfo() { + const isSharingUpdatesEnabled = useFeatureFlag('sharing-updates') const { t } = useTranslation() const { project } = useProjectContext() - return ( + return isSharingUpdatesEnabled ? ( + +
+ +
{project?.owner.email}
+
+
+
{t('owner')}
+
+
+ ) : (
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 9a70aa1f22..bccf27b191 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 @@ -134,7 +134,13 @@ export default function ShareModalBody({ /> )} {isInvitedPeopleScreen || !isProjectOwner ? ( - + ) : ( any) => { setError(undefined) + setSuccessActionMessage(undefined) setInFlight(true) const promise = request() diff --git a/services/web/frontend/js/features/share-project-modal/components/view-member.tsx b/services/web/frontend/js/features/share-project-modal/components/view-member.tsx index 8e8bcee012..77e6cb40fa 100644 --- a/services/web/frontend/js/features/share-project-modal/components/view-member.tsx +++ b/services/web/frontend/js/features/share-project-modal/components/view-member.tsx @@ -1,11 +1,27 @@ import MemberPrivileges from './member-privileges' import OLRow from '@/shared/components/ol/ol-row' import OLCol from '@/shared/components/ol/ol-col' +import ShareProjectModalRow from '@/features/share-project-modal/components/share-project-modal-row' import MaterialIcon from '@/shared/components/material-icon' import { ProjectMember } from '@/shared/context/types/project-metadata' +import { useFeatureFlag } from '@/shared/context/split-test-context' export default function ViewMember({ member }: { member: ProjectMember }) { - return ( + const isSharingUpdatesEnabled = useFeatureFlag('sharing-updates') + + return isSharingUpdatesEnabled ? ( + +
+ +
{member.email}
+
+
+
+ +
+
+
+ ) : (
diff --git a/services/web/locales/en.json b/services/web/locales/en.json index f03b253775..ec8285af7e 100644 --- a/services/web/locales/en.json +++ b/services/web/locales/en.json @@ -1261,7 +1261,10 @@ "invite_not_valid": "This is not a valid project invite", "invite_not_valid_description": "The invite may have expired. Please contact the project owner", "invite_resend_limit_hit": "The invite resend limit hit", + "invite_resent": "Invite resent.", + "invite_revoked": "Invite revoked.", "invite_users": "Invite users", + "invited_people": "Invited people", "invited_to_group": "<0>__inviterName__ has invited you to join a group subscription on __appName__", "invited_to_group_have_individual_subcription": "__inviterName__ has invited you to join a group __appName__ subscription. If you join this group, you may not need your individual subscription. Would you like to cancel it?", "invited_to_group_login": "To accept this invitation you need to log in as __emailAddress__.", @@ -2094,6 +2097,7 @@ "resend": "Resend", "resend_confirmation_code": "Resend confirmation code", "resend_group_invite": "Resend group invite", + "resend_invite": "Resend invite", "resend_link_sso": "Resend SSO invite", "resend_managed_user_invite": "Resend managed user invite", "resending_confirmation_code": "Resending confirmation code",