From c80a8a875e59f29d54f1e5f3d5cd2156fd7dd1cb Mon Sep 17 00:00:00 2001 From: Arthur Belleville Date: Sun, 10 May 2026 23:14:47 +0200 Subject: [PATCH] First pass on tasks frontend --- go-backend/internal/tasks/model.go | 44 + go-backend/internal/web/handlers/auth_test.go | 15 +- .../web/handlers/in_memory_auth_repository.go | 6 +- go-backend/internal/web/handlers/tasks.go | 211 ++- .../internal/web/handlers/tasks_test.go | 349 +++- go-backend/internal/web/views/tasks.templ | 326 ++++ go-backend/internal/web/views/tasks_templ.go | 1505 +++++++++++++++++ go-backend/internal/web/views/tasks_view.go | 763 +++++++-- go-backend/router_test.go | 13 +- go-backend/static/tailwind.css | 602 ++++++- go-backend/tailwind.input.css | 36 +- 11 files changed, 3563 insertions(+), 307 deletions(-) create mode 100644 go-backend/internal/web/views/tasks.templ create mode 100644 go-backend/internal/web/views/tasks_templ.go diff --git a/go-backend/internal/tasks/model.go b/go-backend/internal/tasks/model.go index 97606cb..0e9bbfd 100644 --- a/go-backend/internal/tasks/model.go +++ b/go-backend/internal/tasks/model.go @@ -53,6 +53,7 @@ type CreateInput struct { type UpdateInput struct { ID uuid.UUID OwnerID uuid.UUID + TabloID uuid.UUID Title string Description string Status Status @@ -66,6 +67,29 @@ type ListByTabloInput struct { TabloID uuid.UUID } +type TaskView string + +const ( + TaskViewKanban TaskView = "kanban" + TaskViewList TaskView = "list" + TaskViewRoadmap TaskView = "roadmap" +) + +type TaskRoadmapMode string + +const ( + TaskRoadmapModeWeek TaskRoadmapMode = "week" + TaskRoadmapModeMonth TaskRoadmapMode = "month" +) + +type TaskPageState struct { + View TaskView + RoadmapMode TaskRoadmapMode + TabloIDs []uuid.UUID + AssigneeIDs []uuid.UUID + Statuses []Status +} + func ParseStatus(raw string) (Status, error) { switch Status(strings.TrimSpace(raw)) { case StatusTodo, StatusInProgress, StatusInReview, StatusDone: @@ -74,3 +98,23 @@ func ParseStatus(raw string) (Status, error) { return "", ErrInvalidStatus } } + +func NormalizeTaskView(raw string) TaskView { + switch TaskView(strings.TrimSpace(raw)) { + case TaskViewList: + return TaskViewList + case TaskViewRoadmap: + return TaskViewRoadmap + default: + return TaskViewKanban + } +} + +func NormalizeTaskRoadmapMode(raw string) TaskRoadmapMode { + switch TaskRoadmapMode(strings.TrimSpace(raw)) { + case TaskRoadmapModeMonth: + return TaskRoadmapModeMonth + default: + return TaskRoadmapModeWeek + } +} diff --git a/go-backend/internal/web/handlers/auth_test.go b/go-backend/internal/web/handlers/auth_test.go index 43f5641..4937207 100644 --- a/go-backend/internal/web/handlers/auth_test.go +++ b/go-backend/internal/web/handlers/auth_test.go @@ -150,18 +150,25 @@ func TestTasksPageSidebarShowsRealTablos(t *testing.T) { } body := rec.Body.String() + projectSection := body + if index := strings.Index(body, `id="sidebar-projects-section"`); index >= 0 { + projectSection = body[index:] + if end := strings.Index(projectSection, `