> ## Documentation Index
> Fetch the complete documentation index at: https://ziva.zeleza.ru/llms.txt
> Use this file to discover all available pages before exploring further.

# MultiSelectTask

> Множественный выбор с предзаполнением и пунктом «Выбрать все»

# MultiSelectTask

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

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

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

multi := ziva.NewMultiSelectTask("Компоненты", features)
```

<img src="https://mintcdn.com/terem/7tfdR1JkDhuUAiXc/images/pic_3.png?fit=max&auto=format&n=7tfdR1JkDhuUAiXc&q=85&s=918fdf279421f245c36981d6fe37018c" alt="Скриншот: задача множественного выбора" width="966" height="499" data-path="images/pic_3.png" />

## Настройки

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

```go theme={null}
multi.WithSelectAll(
    "Выбрать всё",                 // подпись, когда пункт включает все элементы
    "Отключить всё",               // подпись, когда все элементы уже выбраны
    ziva.MenuActionDefaultStyle(), // опциональный стиль; по умолчанию — яркий циан с жирным шрифтом
)
```

Пункт добавляется в начало списка и управляет остальными позициями. Если стиль не передан, используется подсвеченный вариант, чтобы shortcut выделялся на фоне обычных элементов. Для нейтрального оформления можно передать `ziva.MenuItemDefaultStyle()`.

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

```go theme={null}
multi.WithDefaultItems([]string{"api", "cli"})
multi.WithDefaultItems([]int{0, 2})
```

### Viewport

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

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

```go theme={null}
multi.WithItemsDisabled([]string{"legacy"})
```

Полезно, если некоторые компоненты временно недоступны.

### Таймаут

```go theme={null}
multi.WithTimeout(20*time.Second, []string{"web", "docs"})
```

По истечении времени задача завершится указанным набором значений.

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

`WithDependencies` описывает связи между пунктами меню. Для каждого ключа задаётся `MultiSelectDependencyRule` с действиями при выборе (`OnSelect`) и снятии выбора (`OnDeselect`). Доступные действия:

* `Disable` / `Enable` — временно блокируют или возвращают пункт.
* `ForceSelect` — автоматически отмечает связанные пункты (например, обязательные зависимости).
* `ForceClear` — снимает выбор, если условия больше не выполнены.

```go theme={null}
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`.

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

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

## Советы

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

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

* [SingleSelectTask](/ru/components/singleselect-task)
* [InputTask](/ru/components/input-task) — удобно запрашивать дополнительные параметры для выбранных пунктов
