Task attempt f0c071f3-47ae-453e-b230-276ddf8ac3e6 - Final changes
This commit is contained in:
@@ -34,6 +34,7 @@ interface TaskFormDialogProps {
|
||||
task?: Task | null // Optional for create mode
|
||||
projectId?: string // For file search functionality
|
||||
onCreateTask?: (title: string, description: string) => Promise<void>
|
||||
onCreateAndStartTask?: (title: string, description: string) => Promise<void>
|
||||
onUpdateTask?: (title: string, description: string, status: TaskStatus) => Promise<void>
|
||||
}
|
||||
|
||||
@@ -43,12 +44,14 @@ export function TaskFormDialog({
|
||||
task,
|
||||
projectId,
|
||||
onCreateTask,
|
||||
onCreateAndStartTask,
|
||||
onUpdateTask
|
||||
}: TaskFormDialogProps) {
|
||||
const [title, setTitle] = useState('')
|
||||
const [description, setDescription] = useState('')
|
||||
const [status, setStatus] = useState<TaskStatus>('todo')
|
||||
const [isSubmitting, setIsSubmitting] = useState(false)
|
||||
const [isSubmittingAndStart, setIsSubmittingAndStart] = useState(false)
|
||||
|
||||
const isEditMode = Boolean(task)
|
||||
|
||||
@@ -90,6 +93,26 @@ export function TaskFormDialog({
|
||||
}
|
||||
}
|
||||
|
||||
const handleCreateAndStart = async () => {
|
||||
if (!title.trim()) return
|
||||
|
||||
setIsSubmittingAndStart(true)
|
||||
try {
|
||||
if (!isEditMode && onCreateAndStartTask) {
|
||||
await onCreateAndStartTask(title, description)
|
||||
}
|
||||
|
||||
// Reset form on successful creation
|
||||
setTitle('')
|
||||
setDescription('')
|
||||
setStatus('todo')
|
||||
|
||||
onOpenChange(false)
|
||||
} finally {
|
||||
setIsSubmittingAndStart(false)
|
||||
}
|
||||
}
|
||||
|
||||
const handleCancel = () => {
|
||||
// Reset form state when canceling
|
||||
if (task) {
|
||||
@@ -118,7 +141,7 @@ export function TaskFormDialog({
|
||||
value={title}
|
||||
onChange={(e) => setTitle(e.target.value)}
|
||||
placeholder="Enter task title"
|
||||
disabled={isSubmitting}
|
||||
disabled={isSubmitting || isSubmittingAndStart}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -129,7 +152,7 @@ export function TaskFormDialog({
|
||||
onChange={setDescription}
|
||||
placeholder="Enter task description (optional). Type @ to search files."
|
||||
rows={3}
|
||||
disabled={isSubmitting}
|
||||
disabled={isSubmitting || isSubmittingAndStart}
|
||||
projectId={projectId}
|
||||
/>
|
||||
</div>
|
||||
@@ -140,7 +163,7 @@ export function TaskFormDialog({
|
||||
<Select
|
||||
value={status}
|
||||
onValueChange={(value) => setStatus(value as TaskStatus)}
|
||||
disabled={isSubmitting}
|
||||
disabled={isSubmitting || isSubmittingAndStart}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue />
|
||||
@@ -160,19 +183,36 @@ export function TaskFormDialog({
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={handleCancel}
|
||||
disabled={isSubmitting}
|
||||
disabled={isSubmitting || isSubmittingAndStart}
|
||||
>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button
|
||||
onClick={handleSubmit}
|
||||
disabled={isSubmitting || !title.trim()}
|
||||
>
|
||||
{isSubmitting
|
||||
? (isEditMode ? 'Updating...' : 'Creating...')
|
||||
: (isEditMode ? 'Update Task' : 'Create Task')
|
||||
}
|
||||
</Button>
|
||||
{isEditMode ? (
|
||||
<Button
|
||||
onClick={handleSubmit}
|
||||
disabled={isSubmitting || !title.trim()}
|
||||
>
|
||||
{isSubmitting ? 'Updating...' : 'Update Task'}
|
||||
</Button>
|
||||
) : (
|
||||
<>
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={handleSubmit}
|
||||
disabled={isSubmitting || isSubmittingAndStart || !title.trim()}
|
||||
>
|
||||
{isSubmitting ? 'Creating...' : 'Create Task'}
|
||||
</Button>
|
||||
{onCreateAndStartTask && (
|
||||
<Button
|
||||
onClick={handleCreateAndStart}
|
||||
disabled={isSubmitting || isSubmittingAndStart || !title.trim()}
|
||||
>
|
||||
{isSubmittingAndStart ? 'Creating & Starting...' : 'Create & Start'}
|
||||
</Button>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</DialogContent>
|
||||
|
||||
@@ -137,6 +137,27 @@ export function ProjectTasks() {
|
||||
}
|
||||
};
|
||||
|
||||
const handleCreateAndStartTask = async (title: string, description: string) => {
|
||||
try {
|
||||
const response = await makeRequest(`/api/projects/${projectId}/tasks/create-and-start`, {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
project_id: projectId,
|
||||
title,
|
||||
description: description || null,
|
||||
}),
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
await fetchTasks();
|
||||
} else {
|
||||
setError("Failed to create and start task");
|
||||
}
|
||||
} catch (err) {
|
||||
setError("Failed to create and start task");
|
||||
}
|
||||
};
|
||||
|
||||
const handleUpdateTask = async (
|
||||
title: string,
|
||||
description: string,
|
||||
@@ -292,6 +313,7 @@ export function ProjectTasks() {
|
||||
task={editingTask}
|
||||
projectId={projectId}
|
||||
onCreateTask={handleCreateTask}
|
||||
onCreateAndStartTask={handleCreateAndStartTask}
|
||||
onUpdateTask={handleUpdateTask}
|
||||
/>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user