diff --git a/services/web/frontend/js/features/ide-react/context/permissions-context.tsx b/services/web/frontend/js/features/ide-react/context/permissions-context.tsx index 21d9374e6b..5398d54e8d 100644 --- a/services/web/frontend/js/features/ide-react/context/permissions-context.tsx +++ b/services/web/frontend/js/features/ide-react/context/permissions-context.tsx @@ -18,6 +18,8 @@ const permissionsMap: DeepReadonly> = { readOnly: { read: true, comment: true, + resolveOwnComments: false, + resolveAllComments: false, trackedWrite: false, write: false, admin: false, @@ -26,6 +28,8 @@ const permissionsMap: DeepReadonly> = { review: { read: true, comment: true, + resolveOwnComments: true, + resolveAllComments: false, trackedWrite: true, write: false, admin: false, @@ -34,6 +38,8 @@ const permissionsMap: DeepReadonly> = { readAndWrite: { read: true, comment: true, + resolveOwnComments: true, + resolveAllComments: true, trackedWrite: true, write: true, admin: false, @@ -42,6 +48,8 @@ const permissionsMap: DeepReadonly> = { owner: { read: true, comment: true, + resolveOwnComments: true, + resolveAllComments: true, trackedWrite: true, write: true, admin: true, diff --git a/services/web/frontend/js/features/ide-react/types/permissions.ts b/services/web/frontend/js/features/ide-react/types/permissions.ts index d666967054..7038b89094 100644 --- a/services/web/frontend/js/features/ide-react/types/permissions.ts +++ b/services/web/frontend/js/features/ide-react/types/permissions.ts @@ -1,6 +1,8 @@ export type Permissions = { read: boolean comment: boolean + resolveOwnComments: boolean + resolveAllComments: boolean trackedWrite: boolean write: boolean admin: boolean diff --git a/services/web/frontend/js/features/review-panel-new/components/review-panel-comment.tsx b/services/web/frontend/js/features/review-panel-new/components/review-panel-comment.tsx index 6585d00ee9..dd6366f091 100644 --- a/services/web/frontend/js/features/review-panel-new/components/review-panel-comment.tsx +++ b/services/web/frontend/js/features/review-panel-new/components/review-panel-comment.tsx @@ -77,10 +77,10 @@ export const ReviewPanelComment = memo<{ async (commentId: CommentId) => { setProcessing(true) try { - if (permissions.write) { + if (permissions.resolveAllComments) { // Owners and editors can delete any message await deleteMessage(comment.op.t, commentId) - } else { + } else if (permissions.resolveOwnComments) { // Reviewers can only delete their own messages await deleteOwnMessage(comment.op.t, commentId) } @@ -100,7 +100,8 @@ export const ReviewPanelComment = memo<{ deleteOwnMessage, showGenericMessageModal, t, - permissions.write, + permissions.resolveOwnComments, + permissions.resolveAllComments, ] ) diff --git a/services/web/frontend/js/features/review-panel-new/components/review-panel-message.tsx b/services/web/frontend/js/features/review-panel-new/components/review-panel-message.tsx index 028b2afd38..f0251314ae 100644 --- a/services/web/frontend/js/features/review-panel-new/components/review-panel-message.tsx +++ b/services/web/frontend/js/features/review-panel-new/components/review-panel-message.tsx @@ -37,12 +37,14 @@ export const ReviewPanelMessage: FC<{ const [deleting, setDeleting] = useState(false) const [content, setContent] = useState(message.content) const user = useUserContext() - const { write, trackedWrite } = usePermissionsContext() + const permissions = usePermissionsContext() const isCommentAuthor = user.id === message.user.id const canEdit = isCommentAuthor - const canResolve = write || (trackedWrite && isCommentAuthor) - const canDelete = write || (trackedWrite && isCommentAuthor) + const canResolve = + permissions.resolveAllComments || + (permissions.resolveOwnComments && isCommentAuthor) + const canDelete = canResolve const handleEditOption = useCallback(() => setEditing(true), []) const showDeleteModal = useCallback(() => setDeleting(true), []) diff --git a/services/web/frontend/js/features/review-panel-new/components/review-panel-resolved-thread.tsx b/services/web/frontend/js/features/review-panel-new/components/review-panel-resolved-thread.tsx index 937cabc59d..d949d79d61 100644 --- a/services/web/frontend/js/features/review-panel-new/components/review-panel-resolved-thread.tsx +++ b/services/web/frontend/js/features/review-panel-new/components/review-panel-resolved-thread.tsx @@ -10,6 +10,8 @@ import { Change, CommentOperation } from '../../../../../types/change' import classNames from 'classnames' import { debugConsole } from '@/utils/debugging' import { useModalsContext } from '@/features/ide-react/context/modals-context' +import { usePermissionsContext } from '@/features/ide-react/context/permissions-context' +import { useUserContext } from '@/shared/context/user-context' export const ReviewPanelResolvedThread: FC<{ id: ThreadId @@ -20,6 +22,12 @@ export const ReviewPanelResolvedThread: FC<{ const { reopenThread, deleteThread } = useThreadsActionsContext() const [processing, setProcessing] = useState(false) const { showGenericMessageModal } = useModalsContext() + const permissions = usePermissionsContext() + const user = useUserContext() + const isCommentAuthor = user.id === comment.metadata?.user_id + const canDelete = + permissions.resolveAllComments || + (permissions.resolveOwnComments && isCommentAuthor) const handleReopenThread = useCallback(async () => { setProcessing(true) @@ -81,16 +89,21 @@ export const ReviewPanelResolvedThread: FC<{ - - - - + {canDelete && ( + + + + )}
diff --git a/services/web/test/frontend/features/source-editor/components/codemirror-editor-visual-readonly.spec.tsx b/services/web/test/frontend/features/source-editor/components/codemirror-editor-visual-readonly.spec.tsx index ee60041e7d..c5798093b2 100644 --- a/services/web/test/frontend/features/source-editor/components/codemirror-editor-visual-readonly.spec.tsx +++ b/services/web/test/frontend/features/source-editor/components/codemirror-editor-visual-readonly.spec.tsx @@ -28,6 +28,8 @@ const PermissionsProvider: FC = ({ children }) => ( value={{ read: true, comment: true, + resolveOwnComments: false, + resolveAllComments: false, trackedWrite: false, write: false, admin: false,