feat: TFS Sync
This commit is contained in:
@@ -6,17 +6,32 @@ import { Button } from '@/components/ui/Button';
|
||||
import { Task, TaskPriority, TaskStatus } from '@/lib/types';
|
||||
import { TaskBasicFields } from './task/TaskBasicFields';
|
||||
import { TaskJiraInfo } from './task/TaskJiraInfo';
|
||||
import { TaskTfsInfo } from './task/TaskTfsInfo';
|
||||
import { TaskTagsSection } from './task/TaskTagsSection';
|
||||
|
||||
interface EditTaskFormProps {
|
||||
isOpen: boolean;
|
||||
onClose: () => void;
|
||||
onSubmit: (data: { taskId: string; title?: string; description?: string; status?: TaskStatus; priority?: TaskPriority; tags?: string[]; dueDate?: Date; }) => Promise<void>;
|
||||
onSubmit: (data: {
|
||||
taskId: string;
|
||||
title?: string;
|
||||
description?: string;
|
||||
status?: TaskStatus;
|
||||
priority?: TaskPriority;
|
||||
tags?: string[];
|
||||
dueDate?: Date;
|
||||
}) => Promise<void>;
|
||||
task: Task | null;
|
||||
loading?: boolean;
|
||||
}
|
||||
|
||||
export function EditTaskForm({ isOpen, onClose, onSubmit, task, loading = false }: EditTaskFormProps) {
|
||||
export function EditTaskForm({
|
||||
isOpen,
|
||||
onClose,
|
||||
onSubmit,
|
||||
task,
|
||||
loading = false,
|
||||
}: EditTaskFormProps) {
|
||||
const [formData, setFormData] = useState<{
|
||||
title: string;
|
||||
description: string;
|
||||
@@ -30,7 +45,7 @@ export function EditTaskForm({ isOpen, onClose, onSubmit, task, loading = false
|
||||
status: 'todo' as TaskStatus,
|
||||
priority: 'medium' as TaskPriority,
|
||||
tags: [],
|
||||
dueDate: undefined
|
||||
dueDate: undefined,
|
||||
});
|
||||
|
||||
const [errors, setErrors] = useState<Record<string, string>>({});
|
||||
@@ -44,7 +59,7 @@ export function EditTaskForm({ isOpen, onClose, onSubmit, task, loading = false
|
||||
status: task.status,
|
||||
priority: task.priority,
|
||||
tags: task.tags || [],
|
||||
dueDate: task.dueDate
|
||||
dueDate: task.dueDate,
|
||||
});
|
||||
}
|
||||
}, [task]);
|
||||
@@ -61,7 +76,8 @@ export function EditTaskForm({ isOpen, onClose, onSubmit, task, loading = false
|
||||
}
|
||||
|
||||
if (formData.description && formData.description.length > 1000) {
|
||||
newErrors.description = 'La description ne peut pas dépasser 1000 caractères';
|
||||
newErrors.description =
|
||||
'La description ne peut pas dépasser 1000 caractères';
|
||||
}
|
||||
|
||||
setErrors(newErrors);
|
||||
@@ -70,13 +86,13 @@ export function EditTaskForm({ isOpen, onClose, onSubmit, task, loading = false
|
||||
|
||||
const handleSubmit = async (e: React.FormEvent) => {
|
||||
e.preventDefault();
|
||||
|
||||
|
||||
if (!validateForm() || !task) return;
|
||||
|
||||
try {
|
||||
await onSubmit({
|
||||
taskId: task.id,
|
||||
...formData
|
||||
...formData,
|
||||
});
|
||||
handleClose();
|
||||
} catch (error) {
|
||||
@@ -89,33 +105,50 @@ export function EditTaskForm({ isOpen, onClose, onSubmit, task, loading = false
|
||||
onClose();
|
||||
};
|
||||
|
||||
|
||||
if (!task) return null;
|
||||
|
||||
return (
|
||||
<Modal isOpen={isOpen} onClose={handleClose} title="Modifier la tâche" size="lg">
|
||||
<form onSubmit={handleSubmit} className="space-y-4 max-h-[80vh] overflow-y-auto pr-2">
|
||||
<Modal
|
||||
isOpen={isOpen}
|
||||
onClose={handleClose}
|
||||
title="Modifier la tâche"
|
||||
size="lg"
|
||||
>
|
||||
<form
|
||||
onSubmit={handleSubmit}
|
||||
className="space-y-4 max-h-[80vh] overflow-y-auto pr-2"
|
||||
>
|
||||
<TaskBasicFields
|
||||
title={formData.title}
|
||||
description={formData.description}
|
||||
priority={formData.priority}
|
||||
status={formData.status}
|
||||
dueDate={formData.dueDate}
|
||||
onTitleChange={(title) => setFormData(prev => ({ ...prev, title }))}
|
||||
onDescriptionChange={(description) => setFormData(prev => ({ ...prev, description }))}
|
||||
onPriorityChange={(priority) => setFormData(prev => ({ ...prev, priority }))}
|
||||
onStatusChange={(status) => setFormData(prev => ({ ...prev, status }))}
|
||||
onDueDateChange={(dueDate) => setFormData(prev => ({ ...prev, dueDate }))}
|
||||
onTitleChange={(title) => setFormData((prev) => ({ ...prev, title }))}
|
||||
onDescriptionChange={(description) =>
|
||||
setFormData((prev) => ({ ...prev, description }))
|
||||
}
|
||||
onPriorityChange={(priority) =>
|
||||
setFormData((prev) => ({ ...prev, priority }))
|
||||
}
|
||||
onStatusChange={(status) =>
|
||||
setFormData((prev) => ({ ...prev, status }))
|
||||
}
|
||||
onDueDateChange={(dueDate) =>
|
||||
setFormData((prev) => ({ ...prev, dueDate }))
|
||||
}
|
||||
errors={errors}
|
||||
loading={loading}
|
||||
/>
|
||||
|
||||
<TaskJiraInfo task={task} />
|
||||
|
||||
<TaskTfsInfo task={task} />
|
||||
|
||||
<TaskTagsSection
|
||||
taskId={task.id}
|
||||
tags={formData.tags}
|
||||
onTagsChange={(tags) => setFormData(prev => ({ ...prev, tags }))}
|
||||
onTagsChange={(tags) => setFormData((prev) => ({ ...prev, tags }))}
|
||||
/>
|
||||
|
||||
{/* Actions */}
|
||||
@@ -128,11 +161,7 @@ export function EditTaskForm({ isOpen, onClose, onSubmit, task, loading = false
|
||||
>
|
||||
Annuler
|
||||
</Button>
|
||||
<Button
|
||||
type="submit"
|
||||
variant="primary"
|
||||
disabled={loading}
|
||||
>
|
||||
<Button type="submit" variant="primary" disabled={loading}>
|
||||
{loading ? 'Mise à jour...' : 'Mettre à jour'}
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user