Quellcode durchsuchen

Adapt review panel header with new reviewer role (#22291)

* Adapt review panel header with new reviewer role

* Remove duplicate css property

* Update position-items

GitOrigin-RevId: a2e8dac0c1d90e6d5b3f13769909cddd69b5db14
David vor 1 Jahr
Ursprung
Commit
97cdc290c3

+ 13 - 7
services/web/frontend/js/features/review-panel-new/components/review-panel-header.tsx

@@ -6,6 +6,7 @@ import MaterialIcon from '@/shared/components/material-icon'
 import { useLayoutContext } from '@/shared/context/layout-context'
 import { useLayoutContext } from '@/shared/context/layout-context'
 import SplitTestBadge from '@/shared/components/split-test-badge'
 import SplitTestBadge from '@/shared/components/split-test-badge'
 import { useTranslation } from 'react-i18next'
 import { useTranslation } from 'react-i18next'
+import { useFeatureFlag } from '@/shared/context/split-test-context'
 
 
 const ReviewPanelHeader: FC = () => {
 const ReviewPanelHeader: FC = () => {
   const [trackChangesMenuExpanded, setTrackChangesMenuExpanded] =
   const [trackChangesMenuExpanded, setTrackChangesMenuExpanded] =
@@ -13,6 +14,8 @@ const ReviewPanelHeader: FC = () => {
   const { setReviewPanelOpen } = useLayoutContext()
   const { setReviewPanelOpen } = useLayoutContext()
   const { t } = useTranslation()
   const { t } = useTranslation()
 
 
+  const enableReviewerRole = useFeatureFlag('reviewer-role')
+
   return (
   return (
     <div className="review-panel-header">
     <div className="review-panel-header">
       <div className="review-panel-heading">
       <div className="review-panel-heading">
@@ -25,6 +28,7 @@ const ReviewPanelHeader: FC = () => {
             />
             />
           </span>
           </span>
         </div>
         </div>
+        {enableReviewerRole && <ReviewPanelResolvedThreadsButton />}
         <button
         <button
           type="button"
           type="button"
           className="btn review-panel-close-button"
           className="btn review-panel-close-button"
@@ -33,13 +37,15 @@ const ReviewPanelHeader: FC = () => {
           <MaterialIcon type="close" />
           <MaterialIcon type="close" />
         </button>
         </button>
       </div>
       </div>
-      <div className="review-panel-tools">
-        <ReviewPanelResolvedThreadsButton />
-        <ReviewPanelTrackChangesMenuButton
-          menuExpanded={trackChangesMenuExpanded}
-          setMenuExpanded={setTrackChangesMenuExpanded}
-        />
-      </div>
+      {!enableReviewerRole && (
+        <div className="review-panel-tools">
+          <ReviewPanelResolvedThreadsButton />
+          <ReviewPanelTrackChangesMenuButton
+            menuExpanded={trackChangesMenuExpanded}
+            setMenuExpanded={setTrackChangesMenuExpanded}
+          />
+        </div>
+      )}
 
 
       {trackChangesMenuExpanded && <ReviewPanelTrackChangesMenu />}
       {trackChangesMenuExpanded && <ReviewPanelTrackChangesMenu />}
     </div>
     </div>

+ 8 - 1
services/web/frontend/js/features/review-panel-new/components/review-panel-resolved-threads-button.tsx

@@ -7,12 +7,15 @@ import { ReviewPanelResolvedThreadsMenu } from './review-panel-resolved-threads-
 import { useTranslation } from 'react-i18next'
 import { useTranslation } from 'react-i18next'
 import BootstrapVersionSwitcher from '@/features/ui/components/bootstrap-5/bootstrap-version-switcher'
 import BootstrapVersionSwitcher from '@/features/ui/components/bootstrap-5/bootstrap-version-switcher'
 import MaterialIcon from '@/shared/components/material-icon'
 import MaterialIcon from '@/shared/components/material-icon'
+import { useFeatureFlag } from '@/shared/context/split-test-context'
 
 
 export const ReviewPanelResolvedThreadsButton: FC = () => {
 export const ReviewPanelResolvedThreadsButton: FC = () => {
   const [expanded, setExpanded] = useState(false)
   const [expanded, setExpanded] = useState(false)
   const buttonRef = useRef<HTMLButtonElement>(null)
   const buttonRef = useRef<HTMLButtonElement>(null)
   const { t } = useTranslation()
   const { t } = useTranslation()
 
 
+  const enableReviewerRole = useFeatureFlag('reviewer-role')
+
   return (
   return (
     <>
     <>
       <OLTooltip
       <OLTooltip
@@ -21,7 +24,11 @@ export const ReviewPanelResolvedThreadsButton: FC = () => {
         description={t('resolved_comments')}
         description={t('resolved_comments')}
       >
       >
         <button
         <button
-          className="resolved-comments-toggle"
+          className={
+            enableReviewerRole
+              ? 'review-panel-resolved-comments-toggle-reviewer-role'
+              : 'review-panel-resolved-comments-toggle'
+          }
           ref={buttonRef}
           ref={buttonRef}
           onClick={() => setExpanded(true)}
           onClick={() => setExpanded(true)}
         >
         >

+ 6 - 1
services/web/frontend/js/features/review-panel-new/hooks/use-review-panel-styles.ts

@@ -1,9 +1,14 @@
 import { CSSProperties, useCallback, useEffect, useState } from 'react'
 import { CSSProperties, useCallback, useEffect, useState } from 'react'
 import { useCodeMirrorViewContext } from '@/features/source-editor/components/codemirror-context'
 import { useCodeMirrorViewContext } from '@/features/source-editor/components/codemirror-context'
+import { useFeatureFlag } from '@/shared/context/split-test-context'
 
 
 export const useReviewPanelStyles = (mini: boolean) => {
 export const useReviewPanelStyles = (mini: boolean) => {
   const view = useCodeMirrorViewContext()
   const view = useCodeMirrorViewContext()
-  const [styles, setStyles] = useState<CSSProperties>()
+  const enableReviewerRole = useFeatureFlag('reviewer-role')
+
+  const [styles, setStyles] = useState<CSSProperties>({
+    '--review-panel-header-height': enableReviewerRole ? '36px' : '69px',
+  } as CSSProperties)
 
 
   const updateScrollDomVariables = useCallback((element: HTMLDivElement) => {
   const updateScrollDomVariables = useCallback((element: HTMLDivElement) => {
     const { top, bottom } = element.getBoundingClientRect()
     const { top, bottom } = element.getBoundingClientRect()

+ 2 - 1
services/web/frontend/js/features/review-panel-new/utils/position-items.ts

@@ -1,6 +1,7 @@
+import { isSplitTestEnabled } from '@/utils/splitTestUtils'
 import { debounce } from 'lodash'
 import { debounce } from 'lodash'
 
 
-const COLLAPSED_HEADER_HEIGHT = 75
+const COLLAPSED_HEADER_HEIGHT = isSplitTestEnabled('reviewer-role') ? 42 : 75
 const OFFSET_FOR_ENTRIES_ABOVE = 70
 const OFFSET_FOR_ENTRIES_ABOVE = 70
 const GAP_BETWEEN_ENTRIES = 4
 const GAP_BETWEEN_ENTRIES = 4
 
 

+ 40 - 8
services/web/frontend/stylesheets/app/editor/review-panel-new.less

@@ -1,6 +1,4 @@
 .review-panel-new {
 .review-panel-new {
-  @review-panel-header-height: 69px;
-
   &.review-panel-container {
   &.review-panel-container {
     height: 100%;
     height: 100%;
     flex-shrink: 0;
     flex-shrink: 0;
@@ -149,7 +147,7 @@
     position: sticky;
     position: sticky;
     top: 0;
     top: 0;
     width: var(--review-panel-width);
     width: var(--review-panel-width);
-    height: @review-panel-header-height;
+    height: var(--review-panel-header-height);
     display: flex;
     display: flex;
     flex-direction: column;
     flex-direction: column;
     justify-content: center;
     justify-content: center;
@@ -163,7 +161,7 @@
   .rp-tc-state {
   .rp-tc-state {
     background-color: white;
     background-color: white;
     max-height: calc(
     max-height: calc(
-      100vh - var(--review-panel-top) - @review-panel-header-height
+      100vh - var(--review-panel-top) - var(--review-panel-header-height)
     );
     );
     overflow-y: auto;
     overflow-y: auto;
   }
   }
@@ -178,10 +176,40 @@
     flex-basis: 32px;
     flex-basis: 32px;
   }
   }
 
 
-  .resolved-comments-toggle {
+  .review-panel-resolved-comments-toggle {
+    background-color: @gray-lightest;
+    font-size: 14px;
+    color: lighten(@rp-type-blue, 25%);
+    border: solid 1px @rp-border-grey;
+    border-radius: 3px;
+    padding: 0 4px;
+    height: 22px;
+    width: 22px;
+    line-height: 1.4;
     display: flex;
     display: flex;
     align-items: center;
     align-items: center;
     justify-content: center;
     justify-content: center;
+
+    &:hover,
+    &:focus {
+      text-decoration: none;
+      color: @rp-type-blue;
+    }
+  }
+
+  .review-panel-resolved-comments-toggle-reviewer-role {
+    display: flex;
+    align-items: center;
+    border: none;
+    background-color: transparent;
+    color: @content-primary;
+    padding: 2px;
+    border-radius: 100%;
+
+    &:hover,
+    &:focus {
+      background-color: @neutral-20;
+    }
   }
   }
 
 
   .track-changes-indicator-circle {
   .track-changes-indicator-circle {
@@ -207,15 +235,17 @@
 
 
   .review-panel-heading {
   .review-panel-heading {
     display: flex;
     display: flex;
-    justify-content: space-between;
     align-items: center;
     align-items: center;
     padding: 6px 4px;
     padding: 6px 4px;
+    gap: 2px;
 
 
     .review-panel-label {
     .review-panel-label {
       font-family: Lato, sans-serif;
       font-family: Lato, sans-serif;
       font-size: @font-size-02;
       font-size: @font-size-02;
       font-weight: bold;
       font-weight: bold;
       margin: 0;
       margin: 0;
+      flex: 1;
+      text-align: start;
     }
     }
 
 
     .review-panel-split-test-badge {
     .review-panel-split-test-badge {
@@ -447,7 +477,7 @@
   .review-panel-overview {
   .review-panel-overview {
     padding: 4px;
     padding: 4px;
     position: absolute;
     position: absolute;
-    top: @review-panel-header-height;
+    top: var(--review-panel-header-height);
     bottom: 59px;
     bottom: 59px;
     width: 100%;
     width: 100%;
     overflow: auto;
     overflow: auto;
@@ -563,7 +593,9 @@
     }
     }
 
 
     &.upwards {
     &.upwards {
-      top: calc(var(--review-panel-top) + @review-panel-header-height + 16px);
+      top: calc(
+        var(--review-panel-top) + var(--review-panel-header-height) + 16px
+      );
     }
     }
   }
   }
 
 

+ 42 - 8
services/web/frontend/stylesheets/bootstrap-5/pages/editor/review-panel-new.scss

@@ -1,6 +1,6 @@
-.review-panel-new {
-  $review-panel-header-height: 69px;
+@use 'sass:color';
 
 
+.review-panel-new {
   &.review-panel-container {
   &.review-panel-container {
     height: 100%;
     height: 100%;
     flex-shrink: 0;
     flex-shrink: 0;
@@ -158,7 +158,7 @@
     position: sticky;
     position: sticky;
     top: 0;
     top: 0;
     width: var(--review-panel-width);
     width: var(--review-panel-width);
-    height: $review-panel-header-height;
+    height: var(--review-panel-header-height);
     display: flex;
     display: flex;
     flex-direction: column;
     flex-direction: column;
     justify-content: center;
     justify-content: center;
@@ -172,7 +172,7 @@
   .rp-tc-state {
   .rp-tc-state {
     background-color: var(--white);
     background-color: var(--white);
     max-height: calc(
     max-height: calc(
-      100vh - var(--review-panel-top) - $review-panel-header-height
+      100vh - var(--review-panel-top) - var(--review-panel-header-height)
     );
     );
     overflow-y: auto;
     overflow-y: auto;
   }
   }
@@ -187,10 +187,40 @@
     flex-basis: 32px;
     flex-basis: 32px;
   }
   }
 
 
-  .resolved-comments-toggle {
+  .review-panel-resolved-comments-toggle {
+    background-color: var(--bg-light-secondary);
+    font-size: var(--font-size-02);
+    color: color.adjust($rp-type-blue, $lightness: 25%);
+    border: solid 1px var(--rp-border-grey);
+    border-radius: var(--border-radius-base);
+    padding: 0;
+    height: 22px;
+    width: 22px;
+    line-height: 1.4;
     display: flex;
     display: flex;
     align-items: center;
     align-items: center;
     justify-content: center;
     justify-content: center;
+
+    &:hover,
+    &:focus {
+      text-decoration: none;
+      color: $rp-type-blue;
+    }
+  }
+
+  .review-panel-resolved-comments-toggle-reviewer-role {
+    display: flex;
+    align-items: center;
+    border: none;
+    background-color: transparent;
+    color: var(--content-primary);
+    padding: var(--spacing-01);
+    border-radius: 100%;
+
+    &:hover,
+    &:focus {
+      background-color: var(--neutral-20);
+    }
   }
   }
 
 
   .track-changes-indicator-circle {
   .track-changes-indicator-circle {
@@ -216,14 +246,16 @@
 
 
   .review-panel-heading {
   .review-panel-heading {
     display: flex;
     display: flex;
-    justify-content: space-between;
     align-items: center;
     align-items: center;
     padding: var(--spacing-03) var(--spacing-02);
     padding: var(--spacing-03) var(--spacing-02);
+    gap: 2px;
 
 
     .review-panel-label {
     .review-panel-label {
       font-size: var(--font-size-02);
       font-size: var(--font-size-02);
       font-weight: bold;
       font-weight: bold;
       margin: 0;
       margin: 0;
+      flex: 1;
+      text-align: start;
     }
     }
 
 
     .review-panel-split-test-badge {
     .review-panel-split-test-badge {
@@ -452,7 +484,7 @@
   .review-panel-overview {
   .review-panel-overview {
     padding: var(--spacing-02);
     padding: var(--spacing-02);
     position: absolute;
     position: absolute;
-    top: $review-panel-header-height;
+    top: var(--review-panel-header-height);
     bottom: 59px;
     bottom: 59px;
     width: 100%;
     width: 100%;
     overflow: auto;
     overflow: auto;
@@ -568,7 +600,9 @@
     }
     }
 
 
     &.upwards {
     &.upwards {
-      top: calc(var(--review-panel-top) + $review-panel-header-height + 16px);
+      top: calc(
+        var(--review-panel-top) + var(--review-panel-header-height) + 16px
+      );
     }
     }
   }
   }