Спеца 12.11: интерфейс + Nil + TaskDetailText в internal/ui/task_detail.go, Fyne-реализация в internal/ui/desktop/task_detail_panel.go. selectTask делегирует в панель; диалог и «Состояние» — отдельные панели, не трогаем.
37 lines
1.5 KiB
Go
37 lines
1.5 KiB
Go
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
|
||
} |