Skip to content

feat(healthcheck): support opt-in non-modal drawers - #4449

Closed
astandrik wants to merge 14 commits into
mainfrom
fix/healthcheck-non-modal-4440
Closed

astandrik wants to merge 14 commits into
mainfrom
fix/healthcheck-non-modal-4440

Conversation

@astandrik

@astandrik astandrik commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Исправление #4440: Healthcheck и панель ИИ-помощника можно открывать в любом порядке, сохраняя доступ к обеим панелям с клавиатуры и через скринридер.

Что изменилось

  • Добавлен немодальный режим Healthcheck. В нём закрытие одной панели не скрывает другую от средств доступности.
  • После Close/Escape фокус возвращается на кнопку открытия, в том числе после переключения на другую БД, кластер или Bridge pile. Фокус в другом поле не перехватывается.
  • Escape сначала закрывает верхний popup, затем Drawer. Это исправление работает и в обычном модальном режиме; popup соседней панели тоже имеет приоритет.

Как включить

До рендера приложения:

configureUIFactory({healthcheck: {disableModal: true}});

По умолчанию Healthcheck остаётся модальным. Соседняя ИИ-панель тоже должна поддерживать немодальный режим. Настройки затемнения и закрытия по клику снаружи не меняются.

Что ещё вошло в PR

  • Обновление UIKit с 7.31.1 до 7.48.0: новый API Drawer, изменения Alert и требования к ThemeProvider для отдельно рендеримых компонентов. Подробнее — в README.
  • Исправления нестабильных E2E-тестов: метрики Info, Running Queries, обновление Nodes и клавиатурная навигация. Они выделены в отдельные коммиты.

Проверки

Локально прошли 100 accessibility-сценариев, 10 проверок production-сборки и 2400 unit-тестов; typecheck, lint и сборки — тоже. Совместная работа с настоящими компонентами ИИ-панели проверена на локальном стенде с моками backend/SSE: 24 сценария. Это проверка сохранённого wrapper-кандидата, а не развёрнутого приложения.

В CI коммита 625e138 все 100 accessibility-сценариев прошли с первой попытки. Полный прогон пока красный: Safari-тест цветов VDisk popup в shard 5/8 упал по таймауту. Причина ещё не установлена.

CI Results

Test Status: ❌ FAILED

📊 Full Report

Total Passed Failed Flaky Skipped
1446 1442 1 3 0
Test Changes Summary ✨52 🗑️39

✨ New Tests (52)

  1. both opening orders: Healthcheck first (sidebar/healthcheckAccessibility.test.ts)
  2. Healthcheck first: Close Healthcheck and reopen (sidebar/healthcheckAccessibility.test.ts)
  3. Healthcheck first: Escape Healthcheck and reopen (sidebar/healthcheckAccessibility.test.ts)
  4. Healthcheck first: Close companion and reopen (sidebar/healthcheckAccessibility.test.ts)
  5. Healthcheck first: Escape companion and reopen (sidebar/healthcheckAccessibility.test.ts)
  6. both opening orders: companion first (sidebar/healthcheckAccessibility.test.ts)
  7. companion first: Close Healthcheck and reopen (sidebar/healthcheckAccessibility.test.ts)
  8. companion first: Escape Healthcheck and reopen (sidebar/healthcheckAccessibility.test.ts)
  9. companion first: Close companion and reopen (sidebar/healthcheckAccessibility.test.ts)
  10. companion first: Escape companion and reopen (sidebar/healthcheckAccessibility.test.ts)
  11. Tab and Shift+Tab reach both panels and the page without dismissing them (sidebar/healthcheckAccessibility.test.ts)
  12. Cancel and Escape dismiss the nested dialog before Healthcheck (sidebar/healthcheckAccessibility.test.ts)
  13. default configuration preserves modal behavior (sidebar/healthcheckAccessibility.test.ts)
  14. modal configuration preserves modal behavior (sidebar/healthcheckAccessibility.test.ts)
  15. compact pointer returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  16. compact pointer returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  17. compact keyboard returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  18. compact keyboard returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  19. Review issues pointer returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  20. Review issues pointer returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  21. Review issues keyboard returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  22. Review issues keyboard returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  23. cluster pointer returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  24. cluster pointer returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  25. cluster keyboard returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  26. cluster keyboard returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  27. databases pointer returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  28. databases pointer returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  29. databases keyboard returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  30. databases keyboard returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  31. clusters pointer returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  32. clusters pointer returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  33. clusters keyboard returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  34. clusters keyboard returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  35. bridge pointer returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  36. bridge pointer returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  37. bridge keyboard returns focus after Close (sidebar/healthcheckAccessibility.test.ts)
  38. bridge keyboard returns focus after Escape (sidebar/healthcheckAccessibility.test.ts)
  39. databases returns focus to the second opener after Close (sidebar/healthcheckAccessibility.test.ts)
  40. databases returns focus to the second opener after Escape (sidebar/healthcheckAccessibility.test.ts)
  41. clusters returns focus to the second opener after Close (sidebar/healthcheckAccessibility.test.ts)
  42. clusters returns focus to the second opener after Escape (sidebar/healthcheckAccessibility.test.ts)
  43. modal menu: dismiss popup before drawer (sidebar/healthcheckAccessibility.test.ts)
  44. modal select: dismiss popup before drawer (sidebar/healthcheckAccessibility.test.ts)
  45. modal popover: dismiss popup before drawer (sidebar/healthcheckAccessibility.test.ts)
  46. non-modal menu: dismiss popup before drawer (sidebar/healthcheckAccessibility.test.ts)
  47. non-modal select: dismiss popup before drawer (sidebar/healthcheckAccessibility.test.ts)
  48. non-modal popover: dismiss popup before drawer (sidebar/healthcheckAccessibility.test.ts)
  49. Close restores the second pile opener (sidebar/healthcheckAccessibility.test.ts)
  50. Escape restores the second pile opener (sidebar/healthcheckAccessibility.test.ts)
  51. Info tab shows unavailable resource utilization (tenant/diagnostics/tabs/info.test.ts)
  52. Running query cleanup completes after a failed assertion (tenant/diagnostics/tabs/queries.test.ts)

🗑️ Deleted Tests (39)

  1. filters by availability and keeps the selector available during search (clusters/unavailable.test.ts)
  2. does not activate or change the selected row from an unavailable label (clusters/unavailable.test.ts)
  3. combines availability with the version filter (clusters/unavailable.test.ts)
  4. handles available clusters (clusters/unavailable.test.ts)
  5. handles only unavailable clusters (clusters/unavailable.test.ts)
  6. handles empty list (clusters/unavailable.test.ts)
  7. keeps a selected unavailable filter accessible after the last unavailable cluster disappears (clusters/unavailable.test.ts)
  8. closes eviction confirmation when refreshed data removes its source row (storage/diskVirtualization.test.ts)
  9. opens a VDisk popup without an identity for parent coordination (storage/diskVirtualization.test.ts)
  10. keeps the active VDisk card after briefly crossing another disk (storage/vdiskColoring.test.ts)
  11. keeps the active VDisk eviction dialog after briefly crossing another disk (storage/vdiskColoring.test.ts)
  12. VDisk eviction preserves its error and explicit force retry (storage/vdiskEvict.test.ts)
  13. VDisk eviction confirmation closes when its page unmounts without submitting (storage/vdiskEvict.test.ts)
  14. VDisk eviction from page refreshes data after dismissal without closing a new dialog (storage/vdiskEvict.test.ts)
  15. VDisk eviction from popup refreshes data after dismissal without closing a new dialog (storage/vdiskEvict.test.ts)
  16. PDisk popup return during hover exit (storage/vdiskPage.test.ts)
  17. PDisk popup return during Escape exit (storage/vdiskPage.test.ts)
  18. VDisk popup return during hover exit (storage/vdiskPage.test.ts)
  19. VDisk popup return during Escape exit (storage/vdiskPage.test.ts)
  20. keeps PDisk popup pinned after contextmenu until focus leaves (storage/vdiskPage.test.ts)
  21. keeps VDisk popup pinned after contextmenu until focus leaves (storage/vdiskPage.test.ts)
  22. releases PDisk contextmenu pin on input click without a popup blur (storage/vdiskPage.test.ts)
  23. releases PDisk contextmenu pin on background click without a popup blur (storage/vdiskPage.test.ts)
  24. releases VDisk contextmenu pin on input click without a popup blur (storage/vdiskPage.test.ts)
  25. releases VDisk contextmenu pin on background click without a popup blur (storage/vdiskPage.test.ts)
  26. resumes VDisk popup hover after closing eviction dialog with pointer on outside (storage/vdiskPage.test.ts)
  27. resumes VDisk popup hover after closing eviction dialog with pointer on popup (storage/vdiskPage.test.ts)
  28. resumes VDisk popup hover after closing eviction dialog with pointer on anchor (storage/vdiskPage.test.ts)
  29. opens a persistent eviction dialog from a card that is already closing (storage/vdiskPage.test.ts)
  30. healthcheck access: navigation v2=false, role=database (tenant/healthcheckPermissions.test.ts)
  31. healthcheck access: navigation v2=false, role=viewer (tenant/healthcheckPermissions.test.ts)
  32. healthcheck access: navigation v2=false, role=monitoring (tenant/healthcheckPermissions.test.ts)
  33. healthcheck access: navigation v2=false, role=administrator (tenant/healthcheckPermissions.test.ts)
  34. healthcheck access: navigation v2=false, role=legacy backend without permission flags (tenant/healthcheckPermissions.test.ts)
  35. healthcheck access: navigation v2=true, role=database (tenant/healthcheckPermissions.test.ts)
  36. healthcheck access: navigation v2=true, role=viewer (tenant/healthcheckPermissions.test.ts)
  37. healthcheck access: navigation v2=true, role=monitoring (tenant/healthcheckPermissions.test.ts)
  38. healthcheck access: navigation v2=true, role=administrator (tenant/healthcheckPermissions.test.ts)
  39. healthcheck access: navigation v2=true, role=legacy backend without permission flags (tenant/healthcheckPermissions.test.ts)

Bundle Size: 🔺

Current: 65.31 MB | Main: 65.22 MB
Diff: +0.09 MB (0.14%)

⚠️ Bundle size increased. Please review.

ℹ️ 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.

@astandrik
astandrik marked this pull request as ready for review October 2, 2026 14:06
Copilot AI balanced review requested due to automatic review settings October 2, 2026 14:06
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review 🔄 Running since 2026-10-22T12:06:33.153311Z 625e138 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot review overview

🟢 Approval recommended

The opt-in behavior preserves existing defaults and is supported by focused unit and cross-browser regression coverage.

Review effort: Balanced
Findings: None

What changed in this PR

Adds opt-in non-modal Healthcheck drawers to satisfy #4440 while preserving existing modal behavior.

Changes:

  • Adds healthcheck.disableModal with scoped Escape and focus restoration.
  • Improves drawer naming, portal click handling, and accessibility coverage.
  • Upgrades Gravity UIKit to 7.48.0 and updates affected tests.
File Description
src/​components/​Drawer/​Drawer.tsx Implements non-modal drawer behavior and naming.
src/​components/​Drawer/​Drawer.scss Styles the event boundary wrapper.
src/​components/​Drawer/​__test__/​DrawerAccessibility.test.tsx Tests focus restoration and adjacent panels.
src/​components/​Search/​__test__/​Search.test.tsx Adds required UIKit theme context.
src/​containers/​Tenant/​Healthcheck/​components/​HealthcheckDrawer.tsx Applies the Healthcheck configuration.
src/​containers/​Tenant/​Healthcheck/​components/​__test__/​HealthcheckDrawerExtension.test.tsx Tests modal configuration propagation.
src/​index.tsx Loads the E2E drawer fixture.
src/​types/​window.d.ts Types the E2E fixture mode.
src/​uiFactory/​types.ts Exposes the consumer setting.
tests/​fixtures/​healthcheckDrawer.tsx Provides paired-panel test scenarios.
tests/​suites/​sidebar/​drawerBehavior.test.ts Adds real veil-dismissal regressions.
tests/​suites/​sidebar/​healthcheckAccessibility.test.ts Covers accessibility and focus behavior.
tests/​suites/​tenant/​queryEditor/​models/​SettingsDialog.ts Resolves error popovers through ARIA links.
tests/​suites/​tenant/​queryEditor/​querySettings.test.ts Verifies timeout validation messages.
tests/​utils/​clickDrawerVeil.ts Adds hit-tested veil clicking.
package.json Upgrades Gravity UIKit.
package-lock.json Locks UIKit 7.48.0.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread tests/suites/sidebar/healthcheckAccessibility.test.ts
@greptile-apps

greptile-apps Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerTREX TREX

No flows tested, and faced 1 obstacle.

Obstacles faced

  • The tester reports “Root already exists”; reset the agent runtime so it can launch.

To reduce obstacles, configure your TREX environment.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8b4a5499bd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/containers/Tenant/Healthcheck/components/HealthcheckDrawer.tsx

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 239b8bf411

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/components/Drawer/Drawer.tsx Outdated
Keep click capture inside the panel while retaining the keyboard boundary. Cover veil clicks, URL cleanup and nested dialog dismissal. Refs #4440
Resolve validation popovers through aria-controls and refresh four reviewed Linux ErrorDisplay snapshots. Refs #4440
Reuse the Healthcheck fixture and keep focus restoration checks alongside
the browser interaction matrix. Check reload once per opening order and
make the external-close test detect focus stealing.
Focus cluster, database-list, cluster-list and Bridge openers before
opening a non-modal Healthcheck drawer. Preserve modal behavior.

Add real-page accessibility coverage for all four entry points, including
pointer and keyboard activation with Close and Escape.
@astandrik
astandrik force-pushed the fix/healthcheck-non-modal-4440 branch from 239b8bf to aacc4f8 Compare October 16, 2026 07:20
Wait for the initial list and a fresh request before checking the running
query. Keep a cancellable response stream open until the UI assertion,
then cancel it and independently verify that the query is inactive.

Preserve existing timeouts and both assertion and cleanup errors.

@Raubzeug Raubzeug left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks for the thorough a11y work and test coverage! A few comments inline, mostly about Escape and focus return in the new non-modal mode.

General: the PR also includes sizable rewrites of tests/suites/tenant/diagnostics/tabs/queries.test.ts, info.test.ts, nodes/nodes.test.ts and paginatedTable/keyboardNavigation.test.ts (flakiness fixes) that aren't related to the non-modal Healthcheck feature. AGENTS.md asks for no unrelated changes. Could these go into a separate PR to keep this one easier to review and revert?

Comment thread src/components/Drawer/Drawer.tsx
Comment thread src/components/Drawer/Drawer.tsx
Comment thread src/components/Drawer/Drawer.tsx
Comment thread src/components/Drawer/Drawer.tsx
Comment thread package.json
Comment thread src/index.tsx Outdated

@Raubzeug Raubzeug left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks for the quick fixes: Escape with nested popups and focus return on retarget look good now (replied in those threads).

A few new comments on the latest commits are inline. Still open from the previous round, with no changes or replies yet: the document.body heuristic, the duplicated focus() in openers, documenting the UIKit bump for consumers, the src/index.tsx E2E override pattern, and the unrelated E2E test rewrites.

Comment thread src/components/Drawer/Drawer.tsx
Comment thread src/components/Drawer/Drawer.tsx
Comment thread src/containers/Cluster/ClusterDrawerHealthcheck.tsx
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.

3 participants