diff --git a/frontend/src/app/dashboard/page.tsx b/frontend/src/app/dashboard/page.tsx index 1094612..5413790 100644 --- a/frontend/src/app/dashboard/page.tsx +++ b/frontend/src/app/dashboard/page.tsx @@ -19,6 +19,7 @@ import { DashboardSidebar } from "@/components/organisms/DashboardSidebar"; import { DashboardShell } from "@/components/templates/DashboardShell"; import { SignedOutPanel } from "@/components/auth/SignedOutPanel"; import { ForgejoIssueMetricCards } from "@/components/git/ForgejoIssueMetricCards"; +import { CreateForgejoIssueDialog } from "@/components/git/CreateForgejoIssueDialog"; import { ForgejoHeatmap } from "@/components/git/ForgejoHeatmap"; import { DashboardMetricCard, @@ -440,6 +441,7 @@ export default function DashboardPage() { const [selectedForgejoRepositoryId, setSelectedForgejoRepositoryId] = useState(ALL_FORGEJO_REPOSITORIES); const [isRefreshingForgejoSync, setIsRefreshingForgejoSync] = useState(false); + const [createForgejoIssueOpen, setCreateForgejoIssueOpen] = useState(false); const boardsQuery = useListBoardsApiV1BoardsGet< listBoardsApiV1BoardsGetResponse, @@ -1325,10 +1327,30 @@ export default function DashboardPage() { selectedRepositoryId={selectedForgejoRepositoryId} onSelectedRepositoryChange={setSelectedForgejoRepositoryId} onRefreshLastSync={handleRefreshForgejoLastSync} + onCreateIssue={() => setCreateForgejoIssueOpen(true)} isRefreshingLastSync={isRefreshingForgejoSync} isLoading={forgejoIssueMetricsLoading} error={forgejoIssueMetricsError} /> + { + setCreateForgejoIssueOpen(false); + void Promise.all([ + forgejoRepositoriesQuery.refetch(), + forgejoMetricsQuery.refetch(), + forgejoHeatmapQuery.refetch(), + forgejoLastPushQuery.refetch(), + ]); + }} + />
diff --git a/frontend/src/components/git/CreateForgejoIssueDialog.tsx b/frontend/src/components/git/CreateForgejoIssueDialog.tsx index 7b81a00..4ee3669 100644 --- a/frontend/src/components/git/CreateForgejoIssueDialog.tsx +++ b/frontend/src/components/git/CreateForgejoIssueDialog.tsx @@ -1,6 +1,6 @@ "use client"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { Dialog, @@ -43,6 +43,12 @@ export function CreateForgejoIssueDialog({ const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); + useEffect(() => { + if (open && !isSubmitting) { + setRepositoryId(defaultRepositoryId ?? repositories[0]?.id ?? ""); + } + }, [defaultRepositoryId, isSubmitting, open, repositories]); + const reset = () => { setTitle(""); setBody(ISSUE_TEMPLATE); diff --git a/frontend/src/components/git/ForgejoIssueMetricCards.tsx b/frontend/src/components/git/ForgejoIssueMetricCards.tsx index 85705f3..f990a3b 100644 --- a/frontend/src/components/git/ForgejoIssueMetricCards.tsx +++ b/frontend/src/components/git/ForgejoIssueMetricCards.tsx @@ -8,6 +8,7 @@ import { ArrowUpRight, CheckCircle2, Clock3, + PlusCircle, RefreshCw, ShieldAlert, ShieldCheck, @@ -30,6 +31,7 @@ type ForgejoIssueMetricCardsProps = { selectedRepositoryId: string; onSelectedRepositoryChange: (repositoryId: string) => void; onRefreshLastSync: () => void; + onCreateIssue: () => void; isRefreshingLastSync?: boolean; isLoading?: boolean; error?: string | null; @@ -309,6 +311,7 @@ export function ForgejoIssueMetricCards({ selectedRepositoryId, onSelectedRepositoryChange, onRefreshLastSync, + onCreateIssue, isRefreshingLastSync = false, isLoading = false, error, @@ -412,17 +415,15 @@ export function ForgejoIssueMetricCards({ ))} - - Open issues - - + Create issue + +