feat(KB-150): remove title input fields from task creation modals

- Remove title input from NewTaskModal component
- Remove title input from PlanningModeModal SummaryView
- Update NewTaskModal tests to remove title field references
- Clean up unused title-related form state and handlers
This commit is contained in:
gsxdsm
2026-03-30 08:30:12 -07:00
parent 0e61a45d72
commit f7091c9a40
3 changed files with 8 additions and 44 deletions

View File

@@ -287,7 +287,6 @@ function ModelCombobox({
}
export function NewTaskModal({ isOpen, onClose, tasks, onCreateTask, addToast, onPlanningMode }: NewTaskModalProps) {
const [title, setTitle] = useState("");
const [description, setDescription] = useState("");
const [dependencies, setDependencies] = useState<string[]>([]);
const [showDepDropdown, setShowDepDropdown] = useState(false);
@@ -319,7 +318,6 @@ export function NewTaskModal({ isOpen, onClose, tasks, onCreateTask, addToast, o
// Track dirty state
useEffect(() => {
const isDirty =
title.trim() !== "" ||
description.trim() !== "" ||
dependencies.length > 0 ||
pendingImages.length > 0 ||
@@ -327,7 +325,7 @@ export function NewTaskModal({ isOpen, onClose, tasks, onCreateTask, addToast, o
validatorModel !== "" ||
enablePlanningMode;
setHasDirtyState(isDirty);
}, [title, description, dependencies, pendingImages, executorModel, validatorModel, enablePlanningMode]);
}, [description, dependencies, pendingImages, executorModel, validatorModel, enablePlanningMode]);
// Close dropdown when clicking outside
useEffect(() => {
@@ -402,7 +400,7 @@ export function NewTaskModal({ isOpen, onClose, tasks, onCreateTask, addToast, o
pendingImages.forEach((img) => URL.revokeObjectURL(img.previewUrl));
setPendingImages([]);
// Reset form
setTitle("");
setPendingImages([]);
setDescription("");
setDependencies([]);
setExecutorModel("");
@@ -425,7 +423,6 @@ export function NewTaskModal({ isOpen, onClose, tasks, onCreateTask, addToast, o
// Clear form state
setPendingImages([]);
setTitle("");
setDescription("");
setDependencies([]);
setExecutorModel("");
@@ -445,7 +442,7 @@ export function NewTaskModal({ isOpen, onClose, tasks, onCreateTask, addToast, o
try {
// Create the base task
const task = await onCreateTask({
title: title.trim() || undefined,
title: undefined,
description: trimmedDesc,
column: "triage",
dependencies: dependencies.length ? dependencies : undefined,
@@ -491,7 +488,6 @@ export function NewTaskModal({ isOpen, onClose, tasks, onCreateTask, addToast, o
// Clean up
pendingImages.forEach((img) => URL.revokeObjectURL(img.previewUrl));
setPendingImages([]);
setTitle("");
setDescription("");
setDependencies([]);
setExecutorModel("");
@@ -505,7 +501,7 @@ export function NewTaskModal({ isOpen, onClose, tasks, onCreateTask, addToast, o
} finally {
setIsSubmitting(false);
}
}, [description, title, dependencies, pendingImages, executorModel, validatorModel, enablePlanningMode, isSubmitting, onCreateTask, addToast, onClose, onPlanningMode]);
}, [description, dependencies, pendingImages, executorModel, validatorModel, enablePlanningMode, isSubmitting, onCreateTask, addToast, onClose, onPlanningMode]);
// Handle keyboard shortcuts
const handleKeyDown = useCallback((e: React.KeyboardEvent) => {
@@ -560,21 +556,6 @@ export function NewTaskModal({ isOpen, onClose, tasks, onCreateTask, addToast, o
</div>
<div className="modal-body">
{/* Title field */}
<div className="form-group">
<label htmlFor="new-task-title">
Title <span className="optional">(optional)</span>
</label>
<input
id="new-task-title"
type="text"
value={title}
onChange={(e) => setTitle(e.target.value)}
placeholder="Brief title for the task"
disabled={isSubmitting}
/>
</div>
{/* Description field */}
<div className="form-group">
<label htmlFor="new-task-description">Description</label>

View File

@@ -562,16 +562,6 @@ function SummaryView({
</div>
<div className="planning-summary-form">
<div className="form-group">
<label htmlFor="summary-title">Title</label>
<input
id="summary-title"
type="text"
value={summary.title}
onChange={(e) => onSummaryChange({ ...summary, title: e.target.value })}
/>
</div>
<div className="form-group">
<label>
Description
@@ -653,7 +643,7 @@ function SummaryView({
<button
className="btn btn-primary"
onClick={onCreateTask}
disabled={isLoading || !summary.title.trim()}
disabled={isLoading}
>
{isLoading ? (
<>

View File

@@ -56,7 +56,6 @@ describe("NewTaskModal", () => {
renderNewTaskModal();
expect(screen.getByText("New Task")).toBeTruthy();
expect(screen.getByLabelText(/Title/i)).toBeTruthy();
expect(screen.getByLabelText(/Description/i)).toBeTruthy();
expect(screen.getByRole("button", { name: "Add dependencies" })).toBeTruthy();
expect(screen.getByText(/Model Configuration/i)).toBeTruthy();
@@ -66,13 +65,11 @@ describe("NewTaskModal", () => {
expect(screen.getByRole("button", { name: "Cancel" })).toBeTruthy();
});
it("creates task with all provided data on submit", async () => {
it("creates task with description on submit", async () => {
const { props } = renderNewTaskModal();
const titleInput = screen.getByLabelText(/Title/i);
const descTextarea = screen.getByLabelText(/Description/i);
fireEvent.change(titleInput, { target: { value: "My Task Title" } });
fireEvent.change(descTextarea, { target: { value: "My task description" } });
fireEvent.click(screen.getByRole("button", { name: "Create Task" }));
@@ -80,7 +77,7 @@ describe("NewTaskModal", () => {
await waitFor(() => {
expect(props.onCreateTask).toHaveBeenCalledWith(
expect.objectContaining({
title: "My Task Title",
title: undefined,
description: "My task description",
column: "triage",
}),
@@ -245,7 +242,7 @@ describe("NewTaskModal", () => {
expect(props.onClose).toHaveBeenCalled();
});
it("creates task without title when title is empty", async () => {
it("creates task with title undefined by default", async () => {
const { props } = renderNewTaskModal();
const descTextarea = screen.getByLabelText(/Description/i);
@@ -268,11 +265,9 @@ describe("NewTaskModal", () => {
const onPlanningMode = vi.fn();
const { props } = renderNewTaskModal({ onPlanningMode });
const titleInput = screen.getByLabelText(/Title/i);
const descTextarea = screen.getByLabelText(/Description/i);
const checkbox = screen.getByLabelText(/Enable planning mode/i);
fireEvent.change(titleInput, { target: { value: "My Task" } });
fireEvent.change(descTextarea, { target: { value: "Build a login system" } });
fireEvent.click(checkbox);
@@ -347,11 +342,9 @@ describe("NewTaskModal", () => {
const onPlanningMode = vi.fn();
renderNewTaskModal({ onPlanningMode });
const titleInput = screen.getByLabelText(/Title/i);
const descTextarea = screen.getByLabelText(/Description/i);
const checkbox = screen.getByLabelText(/Enable planning mode/i);
fireEvent.change(titleInput, { target: { value: "My Task" } });
fireEvent.change(descTextarea, { target: { value: "Build a login system" } });
fireEvent.click(checkbox);