From efb75c2f262eeae261e87680d4b21524170b545f Mon Sep 17 00:00:00 2001 From: Oliver Bryan <04oliverbryan@gmail.com> Date: Tue, 6 Jan 2026 23:01:50 +0000 Subject: [PATCH] create issue with assignee --- packages/backend/src/routes/issue/create.ts | 4 +++- packages/frontend/src/Index.tsx | 1 + packages/frontend/src/components/create-issue.tsx | 14 ++++++++++++++ packages/frontend/src/lib/server/issue/create.ts | 3 +++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/routes/issue/create.ts b/packages/backend/src/routes/issue/create.ts index cdee789..3c90182 100644 --- a/packages/backend/src/routes/issue/create.ts +++ b/packages/backend/src/routes/issue/create.ts @@ -23,8 +23,10 @@ export default async function issueCreate(req: AuthedRequest) { const title = url.searchParams.get("title") || "Untitled Issue"; const description = url.searchParams.get("description") || ""; + const assigneeIdParam = url.searchParams.get("assigneeId"); + const assigneeId = assigneeIdParam ? Number(assigneeIdParam) : undefined; - const issue = await createIssue(project.id, title, description, req.userId); + const issue = await createIssue(project.id, title, description, req.userId, assigneeId); return Response.json(issue); } diff --git a/packages/frontend/src/Index.tsx b/packages/frontend/src/Index.tsx index d532cc2..fd1fcb7 100644 --- a/packages/frontend/src/Index.tsx +++ b/packages/frontend/src/Index.tsx @@ -243,6 +243,7 @@ function Index() { {selectedOrganisation && selectedProject && ( { if (!selectedProject) return; await refetchIssues(); diff --git a/packages/frontend/src/components/create-issue.tsx b/packages/frontend/src/components/create-issue.tsx index 6b3cd94..43edeac 100644 --- a/packages/frontend/src/components/create-issue.tsx +++ b/packages/frontend/src/components/create-issue.tsx @@ -1,3 +1,4 @@ +import type { UserRecord } from "@issue/shared"; import { type FormEvent, useState } from "react"; import { Button } from "@/components/ui/button"; import { @@ -10,15 +11,18 @@ import { } from "@/components/ui/dialog"; import { Field } from "@/components/ui/field"; import { Label } from "@/components/ui/label"; +import { UserSelect } from "@/components/user-select"; import { issue } from "@/lib/server"; import { cn } from "@/lib/utils"; export function CreateIssue({ projectId, + members, trigger, completeAction, }: { projectId?: number; + members?: UserRecord[]; trigger?: React.ReactNode; completeAction?: (issueId: number) => void | Promise; }) { @@ -27,6 +31,7 @@ export function CreateIssue({ const [open, setOpen] = useState(false); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); + const [assigneeId, setAssigneeId] = useState("unassigned"); const [submitAttempted, setSubmitAttempted] = useState(false); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); @@ -34,6 +39,7 @@ export function CreateIssue({ const reset = () => { setTitle(""); setDescription(""); + setAssigneeId("unassigned"); setSubmitAttempted(false); setSubmitting(false); setError(null); @@ -72,6 +78,7 @@ export function CreateIssue({ projectId, title, description, + assigneeId: assigneeId === "unassigned" ? null : Number(assigneeId), onSuccess: async (data) => { setOpen(false); reset(); @@ -129,6 +136,13 @@ export function CreateIssue({ placeholder="Optional details" /> + {members && members.length > 0 && ( +
+ + +
+ )} +
{error ? ( diff --git a/packages/frontend/src/lib/server/issue/create.ts b/packages/frontend/src/lib/server/issue/create.ts index de3ebe4..0d86732 100644 --- a/packages/frontend/src/lib/server/issue/create.ts +++ b/packages/frontend/src/lib/server/issue/create.ts @@ -5,17 +5,20 @@ export async function create({ projectId, title, description, + assigneeId, onSuccess, onError, }: { projectId: number; title: string; description: string; + assigneeId?: number | null; } & ServerQueryInput) { const url = new URL(`${getServerURL()}/issue/create`); url.searchParams.set("projectId", `${projectId}`); url.searchParams.set("title", title.trim()); if (description.trim() !== "") url.searchParams.set("description", description.trim()); + if (assigneeId != null) url.searchParams.set("assigneeId", `${assigneeId}`); const res = await fetch(url.toString(), { headers: getAuthHeaders(),