import { useState } from "react"; import ArrowDownwardIcon from "@mui/icons-material/ArrowDownward"; import ArrowUpwardIcon from "@mui/icons-material/ArrowUpward"; import DeleteOutlineIcon from "@mui/icons-material/DeleteOutlined"; import { Alert, Box, Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, List, ListItemButton, ListItemText, Paper, Stack, TextField, Typography, } from "@mui/material"; import { SettingsNav } from "@/components/common/settings-nav"; import { mapTaskTemplateToFormValues } from "@/domain/settings/task-templates/mappers/task-template-mapper"; import type { TaskTemplate, TaskTemplateFormValues, } from "@/domain/settings/task-templates/types/task-template"; import { useCreateTaskTemplate, useDeleteTaskTemplate, useUpdateTaskTemplate, } from "@/domain/settings/task-templates/use-cases/use-task-template-mutations"; import { useTaskTemplates } from "@/domain/settings/task-templates/use-cases/use-task-templates"; const emptyForm: TaskTemplateFormValues = { name: "", description: "", items: [] }; export default function TaskTemplatesPage() { const { data: templates = [], isLoading, error } = useTaskTemplates(); const createTemplate = useCreateTaskTemplate(); const updateTemplate = useUpdateTaskTemplate(); const deleteTemplate = useDeleteTaskTemplate(); const [selectedId, setSelectedId] = useState(null); const [form, setForm] = useState(emptyForm); const [newItemText, setNewItemText] = useState(""); const [confirmDelete, setConfirmDelete] = useState(false); const isNew = selectedId === "new"; const isSaving = createTemplate.isPending || updateTemplate.isPending; const handleSelect = (template: TaskTemplate) => { setSelectedId(template.id); setForm(mapTaskTemplateToFormValues(template)); setNewItemText(""); }; const handleNew = () => { setSelectedId("new"); setForm(emptyForm); setNewItemText(""); }; const handleAddItem = () => { if (!newItemText.trim()) return; setForm((prev) => ({ ...prev, items: [...prev.items, { text: newItemText.trim(), sortOrder: prev.items.length }], })); setNewItemText(""); }; const handleRemoveItem = (index: number) => { setForm((prev) => ({ ...prev, items: prev.items.filter((_, i) => i !== index).map((item, i) => ({ ...item, sortOrder: i })), })); }; const handleMoveItem = (index: number, direction: -1 | 1) => { setForm((prev) => { const items = [...prev.items]; const target = index + direction; if (target < 0 || target >= items.length) return prev; [items[index], items[target]] = [items[target], items[index]]; return { ...prev, items: items.map((item, i) => ({ ...item, sortOrder: i })) }; }); }; const handleSave = () => { if (!form.name.trim()) return; if (isNew) { createTemplate.mutate(form, { onSuccess: (result) => setSelectedId(result.id), }); return; } if (selectedId && selectedId !== "new") { updateTemplate.mutate({ id: selectedId, values: form }); } }; const handleDelete = () => { if (!selectedId || selectedId === "new") return; deleteTemplate.mutate(selectedId, { onSuccess: () => { setSelectedId(null); setForm(emptyForm); setConfirmDelete(false); }, }); }; return ( Task List Templates Create reusable checklists for work order dispatches {Boolean(error) && ( {error instanceof Error ? error.message : "Failed to load templates"} )} {isLoading ? ( ) : ( {templates.map((template) => ( handleSelect(template)} > ))} )} {!selectedId ? ( Select a template or create a new one ) : ( setForm((f) => ({ ...f, name: e.target.value }))} placeholder="e.g., HVAC Inspection" /> setForm((f) => ({ ...f, description: e.target.value }))} /> Checklist Items ({form.items.length}) {form.items.map((item, index) => ( {index + 1} {item.text} handleMoveItem(index, -1)} > handleMoveItem(index, 1)} > handleRemoveItem(index)}> ))} setNewItemText(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") { e.preventDefault(); handleAddItem(); } }} placeholder="Add checklist item..." /> {!isNew && ( )} )} setConfirmDelete(false)}> Delete Template Are you sure you want to delete "{form.name}"? ); }