package ui import ( "strings" "github.com/kamelion/ratatoskr-go/internal/storage" ) // TaskDetailPanel — панель «Детали задачи» (спец 12.11): заголовок, статус, // детали (цель + репозитории) выбранной задачи. // // Данные — снимки-копии из Store (спец 12.5). Обновление — на потоке Fyne; // вызывающий уже внутри fyne.Do. Диалог и «Состояние» — отдельные панели. type TaskDetailPanel interface { // ShowTask рендерит детали из снимка задачи. ShowTask(t storage.Task) // ShowEmpty сбрасывает к placeholder («—» / пусто) при недоступной задаче. ShowEmpty() } // NilTaskDetailPanel — no-op реализация TaskDetailPanel для headless-режима и тестов. type NilTaskDetailPanel struct{} // NewNilTaskDetailPanel создаёт NilTaskDetailPanel. func NewNilTaskDetailPanel() *NilTaskDetailPanel { return &NilTaskDetailPanel{} } func (NilTaskDetailPanel) ShowTask(storage.Task) {} func (NilTaskDetailPanel) ShowEmpty() {} // TaskDetailText — строка деталей задачи (pure-функция, спец 12.11). func TaskDetailText(t storage.Task) string { detail := "Цель: " + t.Goal if len(t.Repos) > 0 { detail += "\nРепозитории: " + strings.Join(t.Repos, ", ") } return detail }