Перейти к основному содержанию

MultiSelectTask

MultiSelectTask позволяет отметить сразу несколько пунктов. Подходит для выбора компонентов установки, фич, ролей и других списков, где безопасно выбрать несколько значений.

Базовый пример

features := []string{
    "api::REST API",
    "web::Веб-интерфейс",
    "cli::CLI утилита",
    "docs::Документация",
}

multi := ziva.NewMultiSelectTask("Компоненты", features)
Скриншот: задача множественного выбора

Настройки

Пункт «Выбрать все»

multi.WithSelectAll("Установить всё")
Пункт добавляется в начало списка и управляет остальными позициями.

Значения по умолчанию

multi.WithDefaultItems([]string{"api", "cli"})
multi.WithDefaultItems([]int{0, 2})

Viewport

multi.WithViewport(6, true) // 6 отображаемых элементов и счётчик

Отключение элементов

multi.WithItemsDisabled([]string{"legacy"})
Полезно, если некоторые компоненты временно недоступны.

Таймаут

multi.WithTimeout(20*time.Second, []string{"web", "docs"})
По истечении времени задача завершится указанным набором значений.

Зависимости между пунктами

WithDependencies описывает связи между пунктами меню. Для каждого ключа задаётся MultiSelectDependencyRule с действиями при выборе (OnSelect) и снятии выбора (OnDeselect). Доступные действия:
  • Disable / Enable — временно блокируют или возвращают пункт.
  • ForceSelect — автоматически отмечает связанные пункты (например, обязательные зависимости).
  • ForceClear — снимает выбор, если условия больше не выполнены.
diagnostics := []ziva.Item{
    {Key: "logging", Name: "Логирование"},
    {Key: "debug", Name: "Отладка"},
    {Key: "tracing", Name: "Трассировка"},
    {Key: "metrics", Name: "Метрики"},
}

rules := map[string]ziva.MultiSelectDependencyRule{
    "logging": {
        OnSelect: ziva.MultiSelectDependencyActions{
            Enable: []string{"debug"},
        },
        OnDeselect: ziva.MultiSelectDependencyActions{
            Disable:    []string{"debug"},
            ForceClear: []string{"debug", "tracing"},
        },
    },
    "debug": {
        OnSelect: ziva.MultiSelectDependencyActions{
            ForceSelect: []string{"logging"},
        },
    },
    "tracing": {
        OnSelect: ziva.MultiSelectDependencyActions{
            ForceSelect: []string{"logging"},
        },
    },
}

multi := ziva.NewMultiSelectTask("Диагностика", diagnostics).
    WithDependencies(rules).
    WithDefaultItems([]string{"logging", "metrics"})

Пустой выбор как отдельный сценарий

По умолчанию MultiSelectTask позволяет завершить задачу без выбора — удобно для опциональных блоков. Если нужно требовать хотя бы один пункт, вызовите WithRequireSelection(true): при нажатии Enter без выбора пользователь увидит подсказку NeedSelectAtLeastOne.

Получение результата

selected := multi.GetSelected() // []string с выбранными значениями

Советы

  • Используйте WithSelectAll, если большинство пользователей выбирают все элементы.
  • Храните идентификаторы в самих строках (id::подсказка), чтобы легко сопоставлять выбор с конфигурацией.
  • Если нужно ограничить максимальное количество пунктов, добавьте проверку после queue.Run() и попросите пользователя повторить выбор.
  • Комбинируйте MultiSelectTask с FuncTask, чтобы после выбора сразу выполнять сопутствующие операции (например, устанавливать выбранные модули).

Связанные материалы

  • SingleSelectTask
  • InputTask — удобно запрашивать дополнительные параметры для выбранных пунктов
I