refactor(ui): вынести панель «Детали задачи» (TaskDetailPanel) из монолита окна

Спеца 12.11: интерфейс + Nil + TaskDetailText в internal/ui/task_detail.go,
Fyne-реализация в internal/ui/desktop/task_detail_panel.go. selectTask
делегирует в панель; диалог и «Состояние» — отдельные панели, не трогаем.
This commit is contained in:
ki.sagidullin
2026-08-20 23:43:52 +05:00
parent 6274aad369
commit 4c44956d3e
5 changed files with 145 additions and 20 deletions

View File

@@ -0,0 +1,37 @@
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
}