Title
setNewTask({ ...newTask, title: e.target.value })}
className="w-full mt-1.5 px-3 py-2 bg-slate-800 border border-slate-700 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:border-blue-500"
placeholder="What needs to be done?"
/>
Description
Type
setNewTask({ ...newTask, type: e.target.value as TaskType })}
className="w-full mt-1.5 px-3 py-2 bg-slate-800 border border-slate-700 rounded-lg text-white focus:outline-none focus:border-blue-500"
>
{Object.entries(typeLabels).map(([type, label]) => (
{label}
))}
Priority
setNewTask({ ...newTask, priority: e.target.value as Priority })}
className="w-full mt-1.5 px-3 py-2 bg-slate-800 border border-slate-700 rounded-lg text-white focus:outline-none focus:border-blue-500"
>
Low
Medium
High
Urgent
Status
setNewTask({ ...newTask, status: e.target.value as TaskStatus })}
className="w-full mt-1.5 px-3 py-2 bg-slate-800 border border-slate-700 rounded-lg text-white focus:outline-none focus:border-blue-500"
>
{allStatuses.map((status) => (
{status.replace("-", " ").toUpperCase()}
))}
Sprint (optional)
setNewTask({ ...newTask, sprintId: e.target.value || undefined })}
className="w-full mt-1.5 px-3 py-2 bg-slate-800 border border-slate-700 rounded-lg text-white focus:outline-none focus:border-blue-500"
>
Auto (Current Sprint)
{sprints
.filter((sprint) => sprint.status !== "completed")
.sort((a, b) => parseSprintStart(a.startDate).getTime() - parseSprintStart(b.startDate).getTime())
.map((sprint) => (
{sprint.name} ({formatSprintDisplayDate(sprint.startDate, "start")})
))}
Project
setNewTask({ ...newTask, projectId: e.target.value || undefined })}
className="w-full mt-1.5 px-3 py-2 bg-slate-800 border border-slate-700 rounded-lg text-white focus:outline-none focus:border-blue-500"
>
Auto (Based on Sprint/Current Selection)
{projects
.sort((a, b) => a.name.localeCompare(b.name))
.map((project) => (
{project.color ? `โ ` : ""}{project.name}
))}
Assignee
setNewTaskAssignee(e.target.value)}
className="w-full mt-1.5 px-3 py-2 bg-slate-800 border border-slate-700 rounded-lg text-white focus:outline-none focus:border-blue-500"
>
Unassigned
{assignableUsers.map((user) => (
{user.name}
))}
Labels
{newTask.tags && newTask.tags.length > 0 && (
{newTask.tags.map((label) => (
{label}
setNewTask((prev) => ({ ...prev, tags: removeLabel(prev.tags || [], label) }))
}
className="text-slate-500 hover:text-slate-200"
>
))}
)}
setNewTaskLabelInput(e.target.value)}
onKeyDown={(e) => {
if (e.key === "Enter" || e.key === ",") {
e.preventDefault()
setNewTask((prev) => ({
...prev,
tags: addUniqueLabel(prev.tags || [], newTaskLabelInput),
}))
setNewTaskLabelInput("")
}
}}
className="w-full px-3 py-2 bg-slate-800 border border-slate-700 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:border-blue-500"
placeholder="Type a label and press Enter"
/>
{
setNewTask((prev) => ({ ...prev, tags: addUniqueLabel(prev.tags || [], newTaskLabelInput) }))
setNewTaskLabelInput("")
}}
>
Add
{allLabels.map((label) => (
))}
{allLabels.filter((label) => !(newTask.tags || []).some((tag) => tag.toLowerCase() === label.toLowerCase())).slice(0, 8).length > 0 && (
{allLabels
.filter((label) => !(newTask.tags || []).some((tag) => tag.toLowerCase() === label.toLowerCase()))
.slice(0, 8)
.map((label) => (
setNewTask((prev) => ({ ...prev, tags: addUniqueLabel(prev.tags || [], label) }))}
className="text-xs px-2 py-1 rounded-md border border-slate-700 text-slate-300 hover:border-slate-500"
>
+ {label}
))}
)}