diff --git a/src/app/(protected)/settings/_components/task-templates/task-template-detail-form.tsx b/src/app/(protected)/settings/_components/task-templates/task-template-detail-form.tsx
index 889be812..301195ed 100644
--- a/src/app/(protected)/settings/_components/task-templates/task-template-detail-form.tsx
+++ b/src/app/(protected)/settings/_components/task-templates/task-template-detail-form.tsx
@@ -1,7 +1,10 @@
import type { UseFormReturn } from "react-hook-form";
import { Box, Button, Paper, Stack, TextField, Typography } from "@mui/material";
import { TASK_TEMPLATE_COPY } from "@/domain/settings/task-templates/constants/task-template-constants";
-import type { TaskTemplateFormValues } from "@/domain/settings/task-templates/types/task-template";
+import type {
+ SelectedTaskTemplateId,
+ TaskTemplateFormValues,
+} from "@/domain/settings/task-templates/types/task-template";
import { TaskTemplateItemsField } from "./task-template-items-field";
function getSubmitLabel(isSaving: boolean, isNew: boolean): string {
@@ -14,6 +17,7 @@ interface TaskTemplateDetailFormProps {
isNew: boolean;
isSelected: boolean;
isSaving: boolean;
+ selectedId: SelectedTaskTemplateId;
onDelete: () => void;
onSubmit: () => void;
}
@@ -23,6 +27,7 @@ export function TaskTemplateDetailForm({
isNew,
isSelected,
isSaving,
+ selectedId,
onDelete,
onSubmit,
}: TaskTemplateDetailFormProps) {
@@ -69,7 +74,7 @@ export function TaskTemplateDetailForm({
/>
-
+
{!isNew && (
diff --git a/src/app/(protected)/settings/task-templates.tsx b/src/app/(protected)/settings/task-templates.tsx
index f368d828..bbc98752 100644
--- a/src/app/(protected)/settings/task-templates.tsx
+++ b/src/app/(protected)/settings/task-templates.tsx
@@ -53,6 +53,7 @@ export default function TaskTemplatesPage() {
isNew={isNew}
isSelected={selectedId !== null}
isSaving={isSaving}
+ selectedId={selectedId}
onDelete={requestDelete}
onSubmit={submitForm}
/>
diff --git a/src/test/app/(protected)/settings/task-templates.test.tsx b/src/test/app/(protected)/settings/task-templates.test.tsx
index 785185c8..eb57b26e 100644
--- a/src/test/app/(protected)/settings/task-templates.test.tsx
+++ b/src/test/app/(protected)/settings/task-templates.test.tsx
@@ -16,6 +16,14 @@ const existingTemplate: TaskTemplate = {
],
};
+const secondTemplate: TaskTemplate = {
+ id: "9",
+ name: "Plumbing Inspection",
+ description: "Basic checklist",
+ isActive: true,
+ items: [{ itemText: "Check for leaks", sortOrder: 0 }],
+};
+
afterEach(() => {
vi.restoreAllMocks();
});
@@ -88,6 +96,38 @@ describe("TaskTemplatesPage", () => {
]);
});
+ it("clears the unsaved add-item draft when switching to a different template", async () => {
+ renderPage([existingTemplate, secondTemplate]);
+ fireEvent.click(await screen.findByText("HVAC Inspection"));
+ await screen.findByText("Checklist Items (2)");
+
+ fireEvent.change(screen.getByPlaceholderText("Add checklist item..."), {
+ target: { value: "Check filter" },
+ });
+ expect(screen.getByPlaceholderText("Add checklist item...")).toHaveValue("Check filter");
+
+ fireEvent.click(screen.getByText("Plumbing Inspection"));
+
+ await screen.findByText("Checklist Items (1)");
+ expect(screen.getByPlaceholderText("Add checklist item...")).toHaveValue("");
+ });
+
+ it("clears the unsaved add-item draft when starting a new template", async () => {
+ renderPage();
+ fireEvent.click(await screen.findByText("HVAC Inspection"));
+ await screen.findByText("Checklist Items (2)");
+
+ fireEvent.change(screen.getByPlaceholderText("Add checklist item..."), {
+ target: { value: "Check filter" },
+ });
+ expect(screen.getByPlaceholderText("Add checklist item...")).toHaveValue("Check filter");
+
+ fireEvent.click(screen.getByRole("button", { name: "+ New Template" }));
+
+ await screen.findByText("Checklist Items (0)");
+ expect(screen.getByPlaceholderText("Add checklist item...")).toHaveValue("");
+ });
+
it("moves an item up and down without changing the item count", async () => {
renderPage();
fireEvent.click(await screen.findByText("HVAC Inspection"));