Skip to content

fix(VDisk): display donor and vdisk popups separately#3444

Merged
artemmufazalov merged 2 commits intomainfrom
fix-vdisks-popups
Feb 6, 2026
Merged

fix(VDisk): display donor and vdisk popups separately#3444
artemmufazalov merged 2 commits intomainfrom
fix-vdisks-popups

Conversation

@artemmufazalov
Copy link
Member

@artemmufazalov artemmufazalov commented Feb 6, 2026

Part of #3403 and #3430

Now popups are displayed separately as before. I am not sure it is a final fix - I do not know why it was done this way, but it should help for now

Stand (data is from solomon cluster, it may be not 100% correct within VLA stand): https://nda.ya.ru/t/5_UZlaDo7Tm5BV

Greptile Overview

Greptile Summary

  • Adjusts VDisk hover popup behavior by expanding allowed popup placements and tweaking stack hover offsets/background styling.
  • Updates VDisk CSS to use design-token border radius and ensure content has a background.
  • Changes VDiskWithDonorsStack to stop forcing showPopup based on highlighted state, aiming to separate donor/vdisk popups.
  • Main functional concern: highlighted state no longer drives popup visibility, so donor/vdisk popups may not stay open when expected.

Confidence Score: 3/5

  • Moderate risk: UI behavior changes around hover popups could regress highlighted/stacked interactions.
  • CSS tokenization looks safe, but the logic change removing externally-controlled showPopup while still computing highlight state likely breaks intended synchronized popup behavior in VDiskWithDonorsStack; popup placement broadening may also affect usability across the app.
  • src/components/VDisk/VDiskWithDonorsStack.tsx, src/components/VDisk/VDisk.tsx

Important Files Changed

Filename Overview
src/components/Stack/Stack.scss Tweaks stack hover Y-offset and removes per-layer background; likely affects visual separation of stacked disks.
src/components/VDisk/VDisk.scss Switches border radius to theme variable and adds background on content; aligns disk interactive area styling with design tokens.
src/components/VDisk/VDisk.tsx Expands HoverPopup placement options; changes popup positioning behavior for VDisk hover cards.
src/components/VDisk/VDiskWithDonorsStack.tsx Stops forcing showPopup for all stacked VDisks, relying on HoverPopup internal state; may break intended synchronized hover behavior across donors.

Sequence Diagram

sequenceDiagram
  participant U as User
  participant V as VDisk
  participant HP as HoverPopup
  participant P as Popup
  participant VP as VDiskPopup

  U->>V: Hover
  V->>HP: Render props
  HP->>HP: Debounce open
  HP->>P: Open popup
  P->>VP: Render content

  Note over HP: showPopup forces open
  Note over V,HP: donors stack removed showPopup
Loading

CI Results

Test Status: ✅ PASSED

📊 Full Report

Total Passed Failed Flaky Skipped
0 0 0 0 0
Test Changes Summary 🗑️192

🗑️ Deleted Tests (192)

  1. off: no Pile Name column and no group-by option (bridge/bridge.test.ts)
  2. on: shows Pile Name column (bridge/bridge.test.ts)
  3. on: shows Pile Name (bridge/bridge.test.ts)
  4. off: hides Pile Name (bridge/bridge.test.ts)
  5. on: shows Pile Name and group-by option (bridge/bridge.test.ts)
  6. off: hides Pile Name and group-by option (bridge/bridge.test.ts)
  7. off: does not show Bridge piles section (bridge/bridge.test.ts)
  8. on: shows Bridge piles section with data (bridge/bridge.test.ts)
  9. Test internalViewer header link (internalViewer/internalViewer.test.ts)
  10. Memory viewer is visible and has correct status (memoryViewer/memoryViewer.test.ts)
  11. Memory viewer shows correct base metrics (memoryViewer/memoryViewer.test.ts)
  12. Memory viewer popup shows on hover with all metrics (memoryViewer/memoryViewer.test.ts)
  13. Nodes page is OK (nodes/nodes.test.ts)
  14. Nodes page has nodes table (nodes/nodes.test.ts)
  15. Table loads and displays data (nodes/nodes.test.ts)
  16. Search by hostname filters the table (nodes/nodes.test.ts)
  17. Table groups displayed correctly if group by option is selected (nodes/nodes.test.ts)
  18. Node count is displayed correctly (nodes/nodes.test.ts)
  19. Uptime values are displayed in correct format (nodes/nodes.test.ts)
  20. Refresh button updates the table data (nodes/nodes.test.ts)
  21. Row data can be retrieved correctly (nodes/nodes.test.ts)
  22. Column values can be retrieved correctly (nodes/nodes.test.ts)
  23. Table displays empty data message when no entities (nodes/nodes.test.ts)
  24. Autorefresh updates data when initially empty data (nodes/nodes.test.ts)
  25. Threads tab is hidden when node has no thread data (nodes/nodes.test.ts)
  26. Threads tab is visible when node has thread data (nodes/nodes.test.ts)
  27. Threads tab is hidden when node has empty thread array (nodes/nodes.test.ts)
  28. loads data in chunks when scrolling (paginatedTable/paginatedTable.test.ts)
  29. loads data when scrolling to middle of table (paginatedTable/paginatedTable.test.ts)
  30. displays empty state when no data is present (paginatedTable/paginatedTable.test.ts)
  31. handles 10 pages of data correctly (paginatedTable/paginatedTable.test.ts)
  32. handles 100 pages of data correctly (paginatedTable/paginatedTable.test.ts)
  33. Sidebar is visible and loads correctly (sidebar/sidebar.test.ts)
  34. Logo button is visible and clickable (sidebar/sidebar.test.ts)
  35. Settings button is visible and clickable (sidebar/sidebar.test.ts)
  36. Settings button click opens drawer with correct sections (sidebar/sidebar.test.ts)
  37. Information button is visible and clickable (sidebar/sidebar.test.ts)
  38. Information popup contains documentation and keyboard shortcuts (sidebar/sidebar.test.ts)
  39. Clicking hotkeys button in information popup opens hotkeys panel with title (sidebar/sidebar.test.ts)
  40. Account button is visible and clickable (sidebar/sidebar.test.ts)
  41. Pressing Ctrl+K in editor page opens hotkeys panel (sidebar/sidebar.test.ts)
  42. Sidebar can be collapsed and expanded (sidebar/sidebar.test.ts)
  43. Footer items are visible (sidebar/sidebar.test.ts)
  44. Can toggle experiments in settings (sidebar/sidebar.test.ts)
  45. Storage page is OK (storage/storage.test.ts)
  46. Storage page has groups table (storage/storage.test.ts)
  47. Storage page has nodes table (storage/storage.test.ts)
  48. Table loads and displays data (storage/storage.test.ts)
  49. Search by pool name filters the table (storage/storage.test.ts)
  50. Radio button selection changes displayed data (storage/storage.test.ts)
  51. Groups count is displayed correctly (storage/storage.test.ts)
  52. Row data can be retrieved correctly (storage/storage.test.ts)
  53. Column values can be retrieved correctly (storage/storage.test.ts)
  54. Clicking on Group ID header sorts the table (storage/storage.test.ts)
  55. Access tab shows owner card (tenant/diagnostics/tabs/access.test.ts)
  56. Can change owner on access tab (tenant/diagnostics/tabs/access.test.ts)
  57. Owner card is visible after navigating to access tab (tenant/diagnostics/tabs/access.test.ts)
  58. Grant Access button opens grant access drawer (tenant/diagnostics/tabs/access.test.ts)
  59. Can grant full access to a new subject (tenant/diagnostics/tabs/access.test.ts)
  60. Effective rights display changes when switching ACL syntax (tenant/diagnostics/tabs/access.test.ts)
  61. Info tab shows main page elements (tenant/diagnostics/tabs/info.test.ts)
  62. Info tab shows resource utilization (tenant/diagnostics/tabs/info.test.ts)
  63. Info tab shows healthcheck status when there are issues (tenant/diagnostics/tabs/info.test.ts)
  64. Info tab hides healthcheck status when status is GOOD with no issues (tenant/diagnostics/tabs/info.test.ts)
  65. Info tab shows healthcheck status when status is GOOD but has issues (tenant/diagnostics/tabs/info.test.ts)
  66. Nodes tab shows nodes table with memory viewer (tenant/diagnostics/tabs/nodes.test.ts)
  67. loads initial page of operations on tab click (tenant/diagnostics/tabs/operations.test.ts)
  68. loads more operations on scroll (tenant/diagnostics/tabs/operations.test.ts)
  69. shows empty state when no operations (tenant/diagnostics/tabs/operations.test.ts)
  70. shows access denied when operations request returns 403 (tenant/diagnostics/tabs/operations.test.ts)
  71. shows error state when operations request returns network error (tenant/diagnostics/tabs/operations.test.ts)
  72. handles malformed response without operations array (tenant/diagnostics/tabs/operations.test.ts)
  73. stops pagination when receiving malformed response after valid data (tenant/diagnostics/tabs/operations.test.ts)
  74. loads all operations when scrolling to the bottom multiple times (tenant/diagnostics/tabs/operations.test.ts)
  75. No runnning queries in Queries if no queries are running (tenant/diagnostics/tabs/queries.test.ts)
  76. Running query is shown if query is running (tenant/diagnostics/tabs/queries.test.ts)
  77. Query tab defaults to Top mode (tenant/diagnostics/tabs/queries.test.ts)
  78. Query Top tab shows expected column headers (tenant/diagnostics/tabs/queries.test.ts)
  79. Query tab first row has values for all columns in Top mode (tenant/diagnostics/tabs/queries.test.ts)
  80. Query tab can switch between Top and Running modes (tenant/diagnostics/tabs/queries.test.ts)
  81. Query tab allows changing between Per hour and Per minute views (tenant/diagnostics/tabs/queries.test.ts)
  82. Top Query rows components have consistent height across different query lengths (tenant/diagnostics/tabs/queries.test.ts)
  83. Scroll to row, get shareable link, navigate to URL and verify row is scrolled into view (tenant/diagnostics/tabs/queries.test.ts)
  84. Primary keys header is visible in Schema tab (tenant/diagnostics/tabs/schema.test.ts)
  85. Storage tab shows Groups and Nodes views (tenant/diagnostics/tabs/storage.test.ts)
  86. TopShards tab defaults to Immediate mode (tenant/diagnostics/tabs/topShards.test.ts)
  87. TopShards immediate tab shows all expected column headers (tenant/diagnostics/tabs/topShards.test.ts)
  88. TopShards history tab shows all expected column headers (tenant/diagnostics/tabs/topShards.test.ts)
  89. TopShards tab first row has values for all columns in Immediate mode (tenant/diagnostics/tabs/topShards.test.ts)
  90. TopShards tab first row has values for all columns in History mode (tenant/diagnostics/tabs/topShards.test.ts)
  91. TopShards tab can switch back to Immediate mode from Historical mode (tenant/diagnostics/tabs/topShards.test.ts)
  92. Tenant diagnostics page is visible (tenant/initialLoad.test.ts)
  93. Tenant diagnostics page is visible when describe returns no data (tenant/initialLoad.test.ts)
  94. Tenant page shows error message when describe returns 401 (tenant/initialLoad.test.ts)
  95. Tenant page shows error message when describe returns 403 (tenant/initialLoad.test.ts)
  96. Plan to SVG dropdown shows options and opens plan in new tab (tenant/queryEditor/planToSvg.test.ts)
  97. Plan to SVG download option triggers file download (tenant/queryEditor/planToSvg.test.ts)
  98. Plan to SVG handles API errors correctly (tenant/queryEditor/planToSvg.test.ts)
  99. Statistics setting becomes disabled when execution plan experiment is enabled (tenant/queryEditor/planToSvg.test.ts)
  100. Statistics mode changes when toggling execution plan experiment (tenant/queryEditor/planToSvg.test.ts)
  101. Statistics setting shows tooltip when disabled by execution plan experiment (tenant/queryEditor/planToSvg.test.ts)
  102. Run button executes YQL script (tenant/queryEditor/queryEditor.test.ts)
  103. Run button executes Scan (tenant/queryEditor/queryEditor.test.ts)
  104. Explain button executes YQL script explanation (tenant/queryEditor/queryEditor.test.ts)
  105. Explain button executes Scan explanation (tenant/queryEditor/queryEditor.test.ts)
  106. Error is displayed for invalid query for run (tenant/queryEditor/queryEditor.test.ts)
  107. Error is displayed for invalid query for explain (tenant/queryEditor/queryEditor.test.ts)
  108. Run and Explain buttons are disabled when query is empty (tenant/queryEditor/queryEditor.test.ts)
  109. Stop button and elapsed time label appear when query is running (tenant/queryEditor/queryEditor.test.ts)
  110. Query streaming finishes in reasonable time (tenant/queryEditor/queryEditor.test.ts)
  111. Query execution is terminated when stop button is clicked (tenant/queryEditor/queryEditor.test.ts)
  112. Streaming query shows some results and banner when stop button is clicked (tenant/queryEditor/queryEditor.test.ts)
  113. Stop button is not visible for quick queries (tenant/queryEditor/queryEditor.test.ts)
  114. Stop button works for Execute mode (tenant/queryEditor/queryEditor.test.ts)
  115. Stop button works for Explain mode (tenant/queryEditor/queryEditor.test.ts)
  116. Changing tab inside results pane doesnt change results view (tenant/queryEditor/queryEditor.test.ts)
  117. Changing tab inside editor doesnt change results view (tenant/queryEditor/queryEditor.test.ts)
  118. Changing tab to diagnostics doesnt change results view (tenant/queryEditor/queryEditor.test.ts)
  119. Result head value is 1 for 1 row result (tenant/queryEditor/queryEditor.test.ts)
  120. No result head value for no result (tenant/queryEditor/queryEditor.test.ts)
  121. Truncated head value is 1 for 1 row truncated result (tenant/queryEditor/queryEditor.test.ts)
  122. Truncated results for multiple tabs (tenant/queryEditor/queryEditor.test.ts)
  123. Query execution status changes correctly (tenant/queryEditor/queryEditor.test.ts)
  124. Running selected query via keyboard shortcut executes only selected part (tenant/queryEditor/queryEditor.test.ts)
  125. Running selected query via context menu executes only selected part (tenant/queryEditor/queryEditor.test.ts)
  126. Results controls collapse and expand functionality (tenant/queryEditor/queryEditor.test.ts)
  127. Copy result button copies to clipboard (tenant/queryEditor/queryEditor.test.ts)
  128. Stats tab shows no stats message when STATISTICS_MODES.none (tenant/queryEditor/queryEditor.test.ts)
  129. Stats tab shows JSON viewer when STATISTICS_MODES.basic (tenant/queryEditor/queryEditor.test.ts)
  130. Settings dialog opens on Gear click and closes on Cancel (tenant/queryEditor/querySettings.test.ts)
  131. Settings dialog saves changes and updates Gear button (tenant/queryEditor/querySettings.test.ts)
  132. Banner appears after executing script with changed settings (tenant/queryEditor/querySettings.test.ts)
  133. Banner not appears for running query (tenant/queryEditor/querySettings.test.ts)
  134. Gear button shows number of changed settings (tenant/queryEditor/querySettings.test.ts)
  135. Banner does not appear when executing script with default settings (tenant/queryEditor/querySettings.test.ts)
  136. Shows error for limit rows > 100000 (tenant/queryEditor/querySettings.test.ts)
  137. Shows error for negative limit rows (tenant/queryEditor/querySettings.test.ts)
  138. Persists valid limit rows value (tenant/queryEditor/querySettings.test.ts)
  139. Allows empty limit rows value (tenant/queryEditor/querySettings.test.ts)
  140. Timeout input is invisible by default (tenant/queryEditor/querySettings.test.ts)
  141. Clicking timeout switch makes timeout input visible (tenant/queryEditor/querySettings.test.ts)
  142. Timeout switch is checked, disabled, and has hint when non-query mode is selected (tenant/queryEditor/querySettings.test.ts)
  143. When Query Streaming is off, timeout has label and input is visible by default (tenant/queryEditor/querySettings.test.ts)
  144. Resource pool dropdown is populated from system view (tenant/queryEditor/querySettings.test.ts)
  145. Resource pool selection is persisted between dialog opens (tenant/queryEditor/querySettings.test.ts)
  146. Selected resource pool is sent in API requests and no override omits parameter (tenant/queryEditor/querySettings.test.ts)
  147. No query status when no query was executed (tenant/queryEditor/queryStatus.test.ts)
  148. Running query status for running query (tenant/queryEditor/queryStatus.test.ts)
  149. Completed query status for completed query (tenant/queryEditor/queryStatus.test.ts)
  150. Failed query status for failed query (tenant/queryEditor/queryStatus.test.ts)
  151. Update table template should not run successfully (tenant/queryEditor/queryTemplates.test.ts)
  152. Create row table template should handle both success and failure cases (tenant/queryEditor/queryTemplates.test.ts)
  153. Unsaved changes modal appears when switching between templates if query was edited (tenant/queryEditor/queryTemplates.test.ts)
  154. Cancel button in unsaved changes modal preserves editor content (tenant/queryEditor/queryTemplates.test.ts)
  155. Dont save button in unsaved changes modal allows to change text (tenant/queryEditor/queryTemplates.test.ts)
  156. Save query flow saves query and shows it in Saved tab (tenant/queryEditor/queryTemplates.test.ts)
  157. New SQL dropdown menu works correctly (tenant/queryEditor/queryTemplates.test.ts)
  158. Template selection shows unsaved changes warning when editor has content (tenant/queryEditor/queryTemplates.test.ts)
  159. Switching between templates does not trigger unsaved changes modal (tenant/queryEditor/queryTemplates.test.ts)
  160. Selecting a template and then opening history query does not trigger unsaved changes modal (tenant/queryEditor/queryTemplates.test.ts)
  161. New query appears in history after execution (tenant/queryHistory/queryHistory.test.ts)
  162. Multiple queries appear in correct order in history (tenant/queryHistory/queryHistory.test.ts)
  163. Query executed with keybinding is saved in history (tenant/queryHistory/queryHistory.test.ts)
  164. Can run query from history (tenant/queryHistory/queryHistory.test.ts)
  165. Can search in query history (tenant/queryHistory/queryHistory.test.ts)
  166. No unsaved changes modal when running a query and selecting from history (tenant/queryHistory/queryHistory.test.ts)
  167. No unsaved changes modal when running a query that is identical to last in history (tenant/queryHistory/queryHistory.test.ts)
  168. Unsaved changes modal appears when modifying a query and selecting from history (tenant/queryHistory/queryHistory.test.ts)
  169. No unsaved changes modal when selecting from history after saving a query (tenant/queryHistory/queryHistory.test.ts)
  170. View list of saved queries (tenant/savedQueries/savedQueries.test.ts)
  171. Open saved query in the Editor (tenant/savedQueries/savedQueries.test.ts)
  172. Save a query from the Editor (tenant/savedQueries/savedQueries.test.ts)
  173. No unsaved changes modal when opening another query after saving (tenant/savedQueries/savedQueries.test.ts)
  174. Unsaved changes modal appears when selecting a saved query after modifications (tenant/savedQueries/savedQueries.test.ts)
  175. No unsaved changes modal when switching from saved query to another query (tenant/savedQueries/savedQueries.test.ts)
  176. Open Preview icon appears on hover for "dv_slots" tree item (tenant/summary/objectSummary.test.ts)
  177. On Open Preview icon click table with results appear (tenant/summary/objectSummary.test.ts)
  178. Preview table is still present after settings dialog was opened (tenant/summary/objectSummary.test.ts)
  179. Primary keys header is visible in Schema tab (tenant/summary/objectSummary.test.ts)
  180. Actions dropdown menu opens and contains expected items (tenant/summary/objectSummary.test.ts)
  181. Can click menu items in actions dropdown (tenant/summary/objectSummary.test.ts)
  182. Select and Upsert actions show loading state (tenant/summary/objectSummary.test.ts)
  183. Monaco editor shows column list after select query loading completes (tenant/summary/objectSummary.test.ts)
  184. Monaco editor shows column list after upsert query loading completes (tenant/summary/objectSummary.test.ts)
  185. Different tables show different column lists in Monaco editor (tenant/summary/objectSummary.test.ts)
  186. Copy path copies correct path to clipboard (tenant/summary/objectSummary.test.ts)
  187. Create directory in local node (tenant/summary/objectSummary.test.ts)
  188. Refresh button updates tree view after creating table (tenant/summary/objectSummary.test.ts)
  189. Info panel collapse and expand functionality (tenant/summary/objectSummary.test.ts)
  190. Summary collapse and expand functionality (tenant/summary/objectSummary.test.ts)
  191. Tenants page is OK (tenants/tenants.test.ts)
  192. Tenants page has tenants table (tenants/tenants.test.ts)

Bundle Size: ✅

Current: 62.87 MB | Main: 62.87 MB
Diff: +0.22 KB (0.00%)

✅ Bundle size unchanged.

ℹ️ CI Information
  • Test recordings for failed tests are available in the full report.
  • Bundle size is measured for the entire 'dist' directory.
  • 📊 indicates links to detailed reports.
  • 🔺 indicates increase, 🔽 decrease, and ✅ no change in bundle size.

position: relative;

&__layer {
background: var(--g-color-base-background);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prevent black angles around VDisk

Image

--ydb-stack-offset-y: 4px;
--ydb-stack-offset-x-hover: 4px;
--ydb-stack-offset-y-hover: 6px;
--ydb-stack-offset-y-hover: 8px;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Increase offset a little, so it's easier to point at needed disk

Before:

Image

After:

Image


border-radius: 4px; // to match interactive area with disk shape
border-radius: var(--g-border-radius-m); // to match interactive area with disk shape
background: var(--g-color-base-background);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added here background that was set for Stack previously

delayClose={delayClose}
delayOpen={delayOpen}
// Allow all placement options, component should choose first available
placement={['top', 'bottom', 'left', 'right']}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prevent popup from displaying only at top or bottom - it causes additional scroll when popup is too big


const commonVDiskProps: Partial<VDiskProps> = {
withIcon,
showPopup: isHighlighted,
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prevent donor and vdisk popups displaying at the same time

@artemmufazalov artemmufazalov marked this pull request as ready for review February 6, 2026 12:28
Copilot AI review requested due to automatic review settings February 6, 2026 12:28
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Feb 6, 2026

Additional Comments (2)

src/components/VDisk/VDiskWithDonorsStack.tsx
Highlighted state no longer opens

isHighlighted is still computed and passed to VDisk as highlighted, but after removing showPopup: isHighlighted the highlight state will no longer actually force the popup open (HoverPopup only uses showPopup for external control). This makes highlightedVDisk/setHighlightedVDisk ineffective for keeping a specific vdisk+donors popup visible (e.g., when moving between stacked layers), so the “separate popups” behavior may regress to “no externally-controlled popup” in the highlighted case.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/components/VDisk/VDiskWithDonorsStack.tsx
Line: 44:49

Comment:
**Highlighted state no longer opens**

`isHighlighted` is still computed and passed to `VDisk` as `highlighted`, but after removing `showPopup: isHighlighted` the highlight state will no longer actually force the popup open (HoverPopup only uses `showPopup` for external control). This makes `highlightedVDisk/setHighlightedVDisk` ineffective for keeping a specific vdisk+donors popup visible (e.g., when moving between stacked layers), so the “separate popups” behavior may regress to “no externally-controlled popup” in the highlighted case.

How can I resolve this? If you propose a fix, please make it concise.

src/components/VDisk/VDisk.tsx
Non-deterministic popup placement

Changing placement from the HoverPopup default (['top', 'bottom']) to ['top', 'bottom', 'left', 'right'] means the popup may now choose left/right in tight layouts, which can overlap adjacent stacked disks and make it harder to move the cursor into the popup (especially in the Stack hover interaction). If the goal is to avoid donors/vdisk popups colliding, this is a behavioral change that should be constrained to the specific stacked case (or use an explicit placement order that matches the layout otherwise non-stacked VDisk popups will start flipping laterally.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/components/VDisk/VDisk.tsx
Line: 49:59

Comment:
**Non-deterministic popup placement**

Changing `placement` from the HoverPopup default (`['top', 'bottom']`) to `['top', 'bottom', 'left', 'right']` means the popup may now choose left/right in tight layouts, which can overlap adjacent stacked disks and make it harder to move the cursor into the popup (especially in the Stack hover interaction). If the goal is to avoid donors/vdisk popups colliding, this is a behavioral change that should be constrained to the specific stacked case (or use an explicit placement order that matches the layout otherwise non-stacked VDisk popups will start flipping laterally.

How can I resolve this? If you propose a fix, please make it concise.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes issues where VDisk and donor tooltips were shown simultaneously (#3403) and where clicking on VDisks with donors was difficult (#3430). The fix removes the forced popup visibility that was causing all VDisks in a stack to display their tooltips at once, allowing each VDisk to manage its own popup state independently while maintaining visual highlighting coordination.

Changes:

  • Removed forced popup display (showPopup: isHighlighted) from stacked VDisks, allowing independent tooltip management
  • Added flexible tooltip placement options to better handle space constraints in stacked layouts
  • Improved styling with CSS variables and adjusted hover offsets for better user interaction

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
src/components/VDisk/VDiskWithDonorsStack.tsx Removed showPopup: isHighlighted from common props to allow independent popup management per VDisk
src/components/VDisk/VDisk.tsx Added flexible placement options for tooltips to better handle stacked disk scenarios
src/components/VDisk/VDisk.scss Replaced hardcoded border-radius with CSS variable and added background color to content element
src/components/Stack/Stack.scss Increased hover offset and removed background from stack layer (moved to VDisk content)

@artemmufazalov artemmufazalov added this pull request to the merge queue Feb 6, 2026
Merged via the queue into main with commit 41d6c0a Feb 6, 2026
14 of 15 checks passed
@artemmufazalov artemmufazalov deleted the fix-vdisks-popups branch February 6, 2026 12:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants