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:
@@ -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>
|
||||
|
||||
@@ -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 ? (
|
||||
<>
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user