fix(checklist): corrige acentuação e adiciona modal de exclusão

- Corrige acentuações: Opções, Não, Descrição, Obrigatório, máx
- Adiciona modal de confirmação para exclusão de itens do checklist
- Remove uso de confirm() nativo

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
rever-tecnologia 2025-12-15 16:35:58 -03:00
parent f1833be1ea
commit 10078c7aa7
6 changed files with 82 additions and 27 deletions

View file

@ -13,6 +13,7 @@ import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { Checkbox } from "@/components/ui/checkbox"
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"
import { Input } from "@/components/ui/input"
import { Progress } from "@/components/ui/progress"
import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"
@ -98,6 +99,8 @@ export function TicketChecklistCard({
const [applyingTemplate, setApplyingTemplate] = useState(false)
const [completingAll, setCompletingAll] = useState(false)
const [onlyPending, setOnlyPending] = useState(false)
const [deleteTarget, setDeleteTarget] = useState<TicketChecklistItem | null>(null)
const [deleting, setDeleting] = useState(false)
const handleAdd = async () => {
if (!actorId || !canEdit || isResolved) return
@ -470,21 +473,7 @@ export function TicketChecklistCard({
size="icon"
className="h-9 w-9 text-slate-500 hover:bg-red-50 hover:text-red-700"
title="Remover"
onClick={async () => {
if (!actorId) return
const ok = confirm("Remover este item do checklist?")
if (!ok) return
try {
await removeChecklistItem({
ticketId: ticket.id as Id<"tickets">,
actorId,
itemId: item.id,
})
toast.success("Item removido.")
} catch (error) {
toast.error(error instanceof Error ? error.message : "Falha ao remover item.")
}
}}
onClick={() => setDeleteTarget(item)}
>
<Trash2 className="size-4" />
</Button>
@ -525,6 +514,46 @@ export function TicketChecklistCard({
</div>
) : null}
</CardContent>
<Dialog open={Boolean(deleteTarget)} onOpenChange={(open) => !open && setDeleteTarget(null)}>
<DialogContent className="max-w-md">
<DialogHeader>
<DialogTitle>Remover item do checklist</DialogTitle>
<DialogDescription>
Tem certeza que deseja remover o item <strong>&quot;{deleteTarget?.text}&quot;</strong> do checklist?
</DialogDescription>
</DialogHeader>
<DialogFooter className="gap-3">
<Button type="button" variant="outline" onClick={() => setDeleteTarget(null)} disabled={deleting}>
Cancelar
</Button>
<Button
type="button"
variant="destructive"
disabled={deleting}
onClick={async () => {
if (!actorId || !deleteTarget) return
setDeleting(true)
try {
await removeChecklistItem({
ticketId: ticket.id as Id<"tickets">,
actorId,
itemId: deleteTarget.id,
})
toast.success("Item removido.")
setDeleteTarget(null)
} catch (error) {
toast.error(error instanceof Error ? error.message : "Falha ao remover item.")
} finally {
setDeleting(false)
}
}}
>
{deleting ? "Removendo..." : "Remover"}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
</Card>
)
}