From be46cfdffa54712d110771e90f78309e6d53b343 Mon Sep 17 00:00:00 2001 From: ARUNAVO RAY Date: Sun, 1 Mar 2026 07:55:27 +0530 Subject: [PATCH] feat: add target organization to Add Repository dialog (#202) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add target organization field to Add Repository dialog Allow users to specify a destination Gitea organization when adding a single repository, instead of relying solely on the default mirror strategy. The field is optional — when left empty, the existing strategy logic applies as before. Closes #200 Co-Authored-By: Claude Opus 4.6 * docs: add screenshot of target organization field in Add Repository dialog Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: Claude Opus 4.6 --- docs/images/add-repo-target-org.png | Bin 0 -> 22650 bytes .../repositories/AddRepositoryDialog.tsx | 32 +++++++++++++++++- src/components/repositories/Repository.tsx | 3 ++ src/pages/api/sync/repository.ts | 4 +-- src/types/Repository.ts | 1 + 5 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 docs/images/add-repo-target-org.png diff --git a/docs/images/add-repo-target-org.png b/docs/images/add-repo-target-org.png new file mode 100644 index 0000000000000000000000000000000000000000..e9802555692ef444da7e61a8263896b3293b122c GIT binary patch literal 22650 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 Promise; } @@ -32,6 +34,7 @@ export default function AddRepositoryDialog({ }: AddRepositoryDialogProps) { const [repo, setRepo] = useState(""); const [owner, setOwner] = useState(""); + const [destinationOrg, setDestinationOrg] = useState(""); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(""); @@ -40,6 +43,7 @@ export default function AddRepositoryDialog({ setError(""); setRepo(""); setOwner(""); + setDestinationOrg(""); } }, [isDialogOpen]); @@ -54,11 +58,16 @@ export default function AddRepositoryDialog({ try { setIsLoading(true); - await onAddRepository({ repo, owner }); + await onAddRepository({ + repo, + owner, + destinationOrg: destinationOrg.trim() || undefined, + }); setError(""); setRepo(""); setOwner(""); + setDestinationOrg(""); setIsDialogOpen(false); } catch (err: any) { setError(err?.message || "Failed to add repository."); @@ -124,6 +133,27 @@ export default function AddRepositoryDialog({ /> +
+ + setDestinationOrg(e.target.value)} + className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring" + placeholder="Gitea org or user (uses default strategy if empty)" + autoComplete="off" + /> +
+ {error &&

{error}

} diff --git a/src/components/repositories/Repository.tsx b/src/components/repositories/Repository.tsx index f10e2c7..1e09b6a 100644 --- a/src/components/repositories/Repository.tsx +++ b/src/components/repositories/Repository.tsx @@ -698,10 +698,12 @@ export default function Repository() { repo, owner, force = false, + destinationOrg, }: { repo: string; owner: string; force?: boolean; + destinationOrg?: string; }) => { if (!user || !user.id) { return; @@ -736,6 +738,7 @@ export default function Repository() { repo: trimmedRepo, owner: trimmedOwner, force, + ...(destinationOrg ? { destinationOrg } : {}), }; const response = await apiRequest( diff --git a/src/pages/api/sync/repository.ts b/src/pages/api/sync/repository.ts index 1192405..0cc7f10 100644 --- a/src/pages/api/sync/repository.ts +++ b/src/pages/api/sync/repository.ts @@ -20,7 +20,7 @@ export const POST: APIRoute = async ({ request, locals }) => { const userId = authResult.userId; const body: AddRepositoriesApiRequest = await request.json(); - const { owner, repo, force = false } = body; + const { owner, repo, force = false, destinationOrg } = body; if (!owner || !repo) { return new Response( @@ -122,7 +122,7 @@ export const POST: APIRoute = async ({ request, locals }) => { lastMirrored: existingRepo?.lastMirrored ?? null, errorMessage: existingRepo?.errorMessage ?? null, mirroredLocation: existingRepo?.mirroredLocation ?? "", - destinationOrg: existingRepo?.destinationOrg ?? null, + destinationOrg: destinationOrg?.trim() || existingRepo?.destinationOrg || null, updatedAt: repoData.updated_at ? new Date(repoData.updated_at) : new Date(), diff --git a/src/types/Repository.ts b/src/types/Repository.ts index fd9a712..30cc169 100644 --- a/src/types/Repository.ts +++ b/src/types/Repository.ts @@ -83,6 +83,7 @@ export interface AddRepositoriesApiRequest { repo: string; owner: string; force?: boolean; + destinationOrg?: string; } export interface AddRepositoriesApiResponse {