setEntryHover(true)}
- onMouseLeave={() => setEntryHover(false)}
- onClick={handleEntryClick}
>
diff --git a/services/web/frontend/js/features/source-editor/components/review-panel/entries/entry-container.tsx b/services/web/frontend/js/features/source-editor/components/review-panel/entries/entry-container.tsx
index 8c51136143..0d5b801d76 100644
--- a/services/web/frontend/js/features/source-editor/components/review-panel/entries/entry-container.tsx
+++ b/services/web/frontend/js/features/source-editor/components/review-panel/entries/entry-container.tsx
@@ -1,9 +1,7 @@
-type EntryContainerProps = {
- children: React.ReactNode
-}
+import classnames from 'classnames'
-function EntryContainer({ children }: EntryContainerProps) {
- return
{children}
+function EntryContainer({ className, ...rest }: React.ComponentProps<'div'>) {
+ return
}
export default EntryContainer
diff --git a/services/web/frontend/js/features/source-editor/components/review-panel/overview-file.tsx b/services/web/frontend/js/features/source-editor/components/review-panel/overview-file.tsx
index 1349c931d3..08533f09ad 100644
--- a/services/web/frontend/js/features/source-editor/components/review-panel/overview-file.tsx
+++ b/services/web/frontend/js/features/source-editor/components/review-panel/overview-file.tsx
@@ -19,7 +19,7 @@ type OverviewFileProps = {
}
function OverviewFile({ docId, docPath }: OverviewFileProps) {
- const { entries, collapsed, commentThreads, permissions } =
+ const { entries, collapsed, commentThreads, permissions, users } =
useReviewPanelValueContext()
const { setCollapsed } = useReviewPanelUpdaterFnsContext()
@@ -77,7 +77,15 @@ function OverviewFile({ docId, docPath }: OverviewFileProps) {
{objectEntries.map(([id, entry]) => {
if (entry.type === 'insert' || entry.type === 'delete') {
- return
+ return (
+
+ )
}
if (entry.type === 'aggregate-change') {
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 afb46ac797..82566600dd 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
@@ -33,6 +33,7 @@ function useAngularReviewPanelState(): ReviewPanelState {
const [permissions] =
useScopeValue>('permissions')
+ const [users] = useScopeValue>('users', true)
const [resolvedComments] = useScopeValue<
ReviewPanel.Value<'resolvedComments'>
>('reviewPanel.resolvedComments', true)
@@ -90,6 +91,10 @@ function useAngularReviewPanelState(): ReviewPanelState {
const [refreshResolvedCommentsDropdown] = useScopeValue<
ReviewPanel.Value<'refreshResolvedCommentsDropdown'>
>('refreshResolvedCommentsDropdown')
+ const [acceptChanges] =
+ useScopeValue>('acceptChanges')
+ const [rejectChanges] =
+ useScopeValue>('rejectChanges')
const handleSetSubview = useCallback(
(subView: SubView) => {
@@ -126,6 +131,7 @@ function useAngularReviewPanelState(): ReviewPanelState {
handleLayoutChange,
loadingThreads,
permissions,
+ users,
resolveComment,
resolvedComments,
saveEdit,
@@ -147,6 +153,8 @@ function useAngularReviewPanelState(): ReviewPanelState {
unresolveComment,
deleteThread,
refreshResolvedCommentsDropdown,
+ acceptChanges,
+ rejectChanges,
}),
[
collapsed,
@@ -159,6 +167,7 @@ function useAngularReviewPanelState(): ReviewPanelState {
handleLayoutChange,
loadingThreads,
permissions,
+ users,
resolveComment,
resolvedComments,
saveEdit,
@@ -180,6 +189,8 @@ function useAngularReviewPanelState(): ReviewPanelState {
unresolveComment,
deleteThread,
refreshResolvedCommentsDropdown,
+ acceptChanges,
+ rejectChanges,
]
)
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 d62e4e0152..d022ef625e 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
@@ -3,6 +3,7 @@ import {
ReviewPanelCommentThreads,
ReviewPanelEntries,
ReviewPanelPermissions,
+ ReviewPanelUsers,
SubView,
ThreadId,
} from '../../../../../../../types/review-panel/review-panel'
@@ -24,6 +25,7 @@ export interface ReviewPanelState {
handleLayoutChange: () => void
loadingThreads: boolean
permissions: ReviewPanelPermissions
+ users: ReviewPanelUsers
resolveComment: (docId: DocId, entryId: ThreadId) => void
resolvedComments: ReviewPanelEntries
saveEdit: (
@@ -55,6 +57,8 @@ export interface ReviewPanelState {
unresolveComment: (threadId: ThreadId) => void
deleteThread: (_entryId: unknown, docId: DocId, threadId: ThreadId) => void
refreshResolvedCommentsDropdown: () => Promise
+ acceptChanges: (entryIds: unknown) => void
+ rejectChanges: (entryIds: unknown) => void
}
updaterFns: {
handleSetSubview: (subView: SubView) => void
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 767c0055e2..1c822086bc 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
@@ -193,6 +193,20 @@ describe('', function () {
it.skip('resolves comment', function () {})
})
+ describe('change entries', function () {
+ // eslint-disable-next-line mocha/no-skipped-tests
+ it.skip('renders inserted entries', function () {})
+
+ // eslint-disable-next-line mocha/no-skipped-tests
+ it.skip('renders deleted entries', function () {})
+
+ // eslint-disable-next-line mocha/no-skipped-tests
+ it.skip('accepts change', function () {})
+
+ // eslint-disable-next-line mocha/no-skipped-tests
+ it.skip('rejects change', function () {})
+ })
+
describe('overview mode', function () {
// eslint-disable-next-line mocha/no-skipped-tests
it.skip('shows list of files changed', function () {})
diff --git a/services/web/types/review-panel/entry.ts b/services/web/types/review-panel/entry.ts
index 055604c80b..2f2a5fb45a 100644
--- a/services/web/types/review-panel/entry.ts
+++ b/services/web/types/review-panel/entry.ts
@@ -1,4 +1,4 @@
-import { ThreadId } from './review-panel'
+import { ThreadId, UserId } from './review-panel'
interface ReviewPanelEntryScreenPos {
y: number
@@ -14,19 +14,35 @@ interface ReviewPanelBaseEntry {
export interface ReviewPanelCommentEntry extends ReviewPanelBaseEntry {
type: 'comment'
content: string
- entry_ids: string[]
+ entry_ids: ThreadId[]
focused: boolean
screenPos: ReviewPanelEntryScreenPos
thread_id: ThreadId
replyContent?: string // angular specific
}
-interface ReviewPanelInsertEntry extends ReviewPanelBaseEntry {
+export interface ReviewPanelInsertEntry extends ReviewPanelBaseEntry {
type: 'insert'
+ content: string
+ entry_ids: ThreadId[]
+ metadata: {
+ ts: Date
+ user_id: UserId
+ }
+ screenPos: ReviewPanelEntryScreenPos
+ focused?: boolean
}
-interface ReviewPanelDeleteEntry extends ReviewPanelBaseEntry {
+export interface ReviewPanelDeleteEntry extends ReviewPanelBaseEntry {
type: 'delete'
+ content: string
+ entry_ids: ThreadId[]
+ metadata: {
+ ts: Date
+ user_id: UserId
+ }
+ screenPos: ReviewPanelEntryScreenPos
+ focused?: boolean
}
interface ReviewPanelAggregateChangeEntry extends ReviewPanelBaseEntry {
diff --git a/services/web/types/review-panel/review-panel.ts b/services/web/types/review-panel/review-panel.ts
index 0a14870bfa..c03b48ae0c 100644
--- a/services/web/types/review-panel/review-panel.ts
+++ b/services/web/types/review-panel/review-panel.ts
@@ -27,6 +27,7 @@ export interface ReviewPanelUser {
isSelf: boolean
name: string
}
+export type ReviewPanelUsers = Record
export type CommentId = Brand