Skip to content

UI: унификация выпадающих списков на MenuAnchor (QueryaDropdown) #87

Description

@ZhuchkaTriplesix

Описание проблемы

В текущей реализации интерфейса на базе shadcn_flutter выпадающие окна и селекты используют классический механизм Overlay. Это приводит к ряду критических проблем:

  • Краши: возникают фатальные ошибки InheritedNotifier crash при перестроении интерфейса.
  • Потеря фокуса: меню не всегда корректно закрываются при клике вне их области (например, в редактор кода).
  • Ограничения окна: выпадающие списки обрезаются границами кастомного окна bitsdojo_window, если находятся у нижнего края.

Цель

Создать единый, кроссплатформенный и кастомный UI для выпадающих списков, который избавит проект от крашей дерева состояний. Архитектура должна базироваться на встроенном во Flutter виджете MenuAnchor, который работает независимо от слоёв Overlay.

Архитектурные требования

Требование Детали
Локация Новый базовый виджет-обёртка QueryaDropdown в lib/shared/widgets/
Основа Под капотом виджет должен строго возвращать MenuAnchor
Стилизация Дизайн через токены shadcn_flutter: цвета фона, радиусы, границы menuChildren — через Theme.of(context)
Позиционирование alignmentOffset для отступа 4–8 px под кнопкой вызова
Состояние MenuController для программного закрытия меню сразу после выбора пункта

План реализации

Шаг 1: Создание ядра QueryaDropdown

  • Разработать класс QueryaDropdown в lib/shared/widgets/.
  • Параметры: список элементов меню, контроллер, коллбэки на выбор элемента.
  • Обернуть пункты меню в контейнеры, стилизованные под текущую тему (чистый тёмный UI).

Шаг 2: Навигация и фокус

  • Меню автоматически закрывается при клике в пустую область или другие текстовые поля.
  • Навигация «из коробки»: стрелки вверх/вниз, Enter, Escape.

Шаг 3: Интеграция в рабочие области

Фаза A — экран выбора типа БД (New Database Connection в lib/features/connections/).

Фаза B — постепенная замена селектов в панелях драйверов (lib/features/postgresql/, mysql/ и др.).

Ожидаемый результат

После выполнения задачи все дропдауны в приложении выглядят идентично и плавно на Windows, macOS и Linux. MenuAnchor гарантирует стабильность при клике вне области и при перестроении сложных слоёв.

Примечание: списки ограничены границами окна приложения; при нехватке места внизу — открытие вверх или скролл.

Acceptance criteria

  • QueryaDropdown в lib/shared/widgets/, основан на MenuAnchor + MenuController
  • Стилизация через токены shadcn_flutter / Theme.of(context)
  • alignmentOffset настроен (4–8 px)
  • Клавиатурная навигация и закрытие по клику вне меню работают
  • Фаза A: замена дропдаунов на экране New Database Connection
  • Фаза B: замена селектов в панелях драйверов (можно отдельными PR)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions