From 29b3bc1086863e127da796796ebd8cc9a6131619 Mon Sep 17 00:00:00 2001 From: Felipe Coutinho Date: Thu, 26 Feb 2026 17:44:02 +0000 Subject: [PATCH] refactor: ordenar tarefas por status e simplificar note dialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tarefas pendentes agora aparecem primeiro, concluídas por último, tanto nos cards quanto nos modais (details e edit). Note dialog mais minimalista: remove labels redundantes, contadores de caracteres, descriptions verbosas. Tarefas com line-through quando concluídas, botão de remover mais sutil. Cards de anotação agora usam grid responsivo (1/2/3 colunas) igual aos cards de cartões, em vez de largura fixa 440px. Co-Authored-By: Claude Opus 4.6 --- components/anotacoes/note-card.tsx | 7 +- components/anotacoes/note-details-dialog.tsx | 5 +- components/anotacoes/note-dialog.tsx | 306 ++++++++----------- components/anotacoes/notes-page.tsx | 2 +- components/anotacoes/types.ts | 5 + 5 files changed, 139 insertions(+), 186 deletions(-) diff --git a/components/anotacoes/note-card.tsx b/components/anotacoes/note-card.tsx index 6c2cbb6..351c00d 100644 --- a/components/anotacoes/note-card.tsx +++ b/components/anotacoes/note-card.tsx @@ -11,7 +11,7 @@ import { import { useMemo } from "react"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardFooter } from "@/components/ui/card"; -import type { Note } from "./types"; +import { type Note, sortTasksByStatus } from "./types"; const DATE_FORMATTER = new Intl.DateTimeFormat("pt-BR", { dateStyle: "medium", @@ -47,6 +47,7 @@ export function NoteCard({ const isTask = note.type === "tarefa"; const tasks = note.tasks || []; + const sortedTasks = useMemo(() => sortTasksByStatus(tasks), [tasks]); const completedCount = tasks.filter((t) => t.completed).length; const totalCount = tasks.length; @@ -82,7 +83,7 @@ export function NoteCard({ ].filter((action) => typeof action.onClick === "function"); return ( - +
@@ -99,7 +100,7 @@ export function NoteCard({ {isTask ? (
- {tasks.slice(0, 5).map((task) => ( + {sortedTasks.slice(0, 5).map((task) => (
sortTasksByStatus(tasks), [tasks]); const completedCount = tasks.filter((t) => t.completed).length; const totalCount = tasks.length; @@ -71,7 +72,7 @@ export function NoteDetailsDialog({ {isTask ? (
- {tasks.map((task) => ( + {sortedTasks.map((task) => ( sortTasksByStatus(formState.tasks || []), + [formState.tasks], + ); + const onlySpaces = normalize(formState.title).length === 0 || (isNote && formState.description.trim().length === 0) || @@ -222,198 +227,139 @@ export function NoteDialog({ {title} - {description} + + {mode === "create" + ? "Criar nova anotação" + : "Editar anotação existente"} +
- {/* Seletor de Tipo - apenas no modo de criação */} {mode === "create" && ( -
- - - updateField("type", value as "nota" | "tarefa") - } - disabled={isPending} - className="flex gap-4" - > -
- - -
-
- - -
-
-
+ + updateField("type", value as "nota" | "tarefa") + } + disabled={isPending} + className="flex gap-4" + > +
+ + +
+
+ + +
+
)} - {/* Título */} -
- - updateField("title", e.target.value)} - placeholder={ - isNote ? "Ex.: Revisar metas do mês" : "Ex.: Tarefas da semana" - } - maxLength={MAX_TITLE} + updateField("title", e.target.value)} + placeholder="Título" + maxLength={MAX_TITLE} + disabled={isPending} + required + /> + + {isNote && ( +