Commit a9a76793 authored by ThinhNC's avatar ThinhNC

feat: add crawl job detail page and corresponding API service

parent d6084364
Pipeline #53120 passed with stage
in 2 minutes and 4 seconds
...@@ -585,11 +585,10 @@ export default function CrawlJobDetailPage({ params }: PageProps) { ...@@ -585,11 +585,10 @@ export default function CrawlJobDetailPage({ params }: PageProps) {
id: "pages", id: "pages",
label: t.jobDetail.pagesTab, label: t.jobDetail.pagesTab,
icon: FileText, icon: FileText,
count: (pagesData?.total && pagesData.total > 0) count:
? pagesData.total pagesData?.total !== undefined && pagesData.total > 0
: isJobRunning && job?.successPages ? pagesData.total
? job.successPages : (job?.successPages ?? 0),
: 0,
}, },
{ id: "diff", label: t.jobDetail.diffTab, icon: Sparkles, count: diffData?.summary?.changeRate ? `${Math.round(diffData.summary.changeRate * 100)}%` : undefined }, { id: "diff", label: t.jobDetail.diffTab, icon: Sparkles, count: diffData?.summary?.changeRate ? `${Math.round(diffData.summary.changeRate * 100)}%` : undefined },
].map((tabItem) => { ].map((tabItem) => {
...@@ -857,7 +856,7 @@ export default function CrawlJobDetailPage({ params }: PageProps) { ...@@ -857,7 +856,7 @@ export default function CrawlJobDetailPage({ params }: PageProps) {
<p className="text-xs text-muted-foreground">{t.jobDetail.pages.subtitle}</p> <p className="text-xs text-muted-foreground">{t.jobDetail.pages.subtitle}</p>
</div> </div>
<Badge variant="secondary" className="rounded-full"> <Badge variant="secondary" className="rounded-full">
{pagesData?.total || 0} {t.jobDetail.pages.pagesExtracted} {pagesData?.total ?? job?.successPages ?? 0} {t.jobDetail.pages.pagesExtracted}
</Badge> </Badge>
</div> </div>
......
...@@ -219,15 +219,39 @@ export const crawlJobService = { ...@@ -219,15 +219,39 @@ export const crawlJobService = {
const response = await apiClient.get< const response = await apiClient.get<
ApiResponse<{ ApiResponse<{
items: CrawlPagePreview[]; items: CrawlPagePreview[];
total: number; total?: number;
page: number; page?: number;
limit: number; limit?: number;
totalPages: number; totalPages?: number;
meta?: {
total?: number;
page?: number;
limit?: number;
totalPages?: number;
};
}> }>
>(`/crawl-jobs/${id}/pages/preview?${params.toString()}`); >(`/crawl-jobs/${id}/pages/preview?${params.toString()}`);
if (response.data?.data) { const raw = response.data?.data;
return response.data.data; if (raw) {
const total =
raw.total ??
raw.meta?.total ??
(Array.isArray(raw.items) ? raw.items.length : 0);
const totalPages =
raw.totalPages ??
raw.meta?.totalPages ??
Math.max(1, Math.ceil(total / limit));
const pageNum = raw.page ?? raw.meta?.page ?? page;
const limitNum = raw.limit ?? raw.meta?.limit ?? limit;
return {
items: raw.items || [],
total,
page: pageNum,
limit: limitNum,
totalPages,
};
} }
throw new Error("Invalid pages preview response"); throw new Error("Invalid pages preview response");
}, },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment