/* * Copyright (C) 2026 Fluxer Contributors * * This file is part of Fluxer. * * Fluxer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fluxer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Fluxer. If not, see . */ /** @jsxRuntime automatic */ /** @jsxImportSource hono/jsx */ import type {Archive} from '@fluxer/admin/src/api/Archives'; import {ErrorAlert} from '@fluxer/admin/src/components/ErrorDisplay'; import {Layout} from '@fluxer/admin/src/components/Layout'; import {Badge} from '@fluxer/admin/src/components/ui/Badge'; import {PageHeader} from '@fluxer/admin/src/components/ui/Layout/PageHeader'; import {PageLayout} from '@fluxer/admin/src/components/ui/Layout/PageLayout'; import {VStack} from '@fluxer/admin/src/components/ui/Layout/VStack'; import {Text} from '@fluxer/admin/src/components/ui/Typography'; import type {Session} from '@fluxer/admin/src/types/App'; import type {AdminConfig as Config} from '@fluxer/admin/src/types/Config'; import {formatTimestamp} from '@fluxer/date_utils/src/DateFormatting'; import type {Flash} from '@fluxer/hono/src/Flash'; import type {UserAdminResponse} from '@fluxer/schema/src/domains/admin/AdminUserSchemas'; import {Button} from '@fluxer/ui/src/components/Button'; import {EmptyState} from '@fluxer/ui/src/components/EmptyState'; import {Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow} from '@fluxer/ui/src/components/Table'; import type {FC} from 'hono/jsx'; export interface ArchivesPageProps { config: Config; session: Session; currentAdmin: UserAdminResponse | undefined; flash: Flash | undefined; csrfToken: string; subjectType: string; subjectId: string | undefined; archives: Array; error: string | undefined; assetVersion: string; } function formatTimestampLocal(timestamp: string): string { try { return formatTimestamp(timestamp, 'en-US'); } catch { return timestamp; } } function getStatusLabel(archive: Archive): string { if (archive.failed_at) { return 'Failed'; } if (archive.completed_at) { return 'Completed'; } return 'In Progress'; } const ArchiveTable: FC<{archives: Array; config: Config}> = ({archives, config}) => { return (
{archives.map((archive) => ( {archive.subject_type} {archive.subject_id} Archive ID: {archive.archive_id} {archive.requested_by} {formatTimestampLocal(archive.requested_at)}
{getStatusLabel(archive)} {archive.progress_percent}%
{archive.progress_step && !archive.completed_at && !archive.failed_at && ( {archive.progress_step} )}
{archive.completed_at ? ( ) : ( Not ready )}
))}
); }; const ArchivesEmptyState: FC<{filterHint: string}> = ({filterHint}) => { return ( ); }; export async function ArchivesPage({ config, session, currentAdmin, flash, csrfToken, subjectType, subjectId, archives, error, assetVersion, }: ArchivesPageProps) { const filterHint = subjectId ? ` for ${subjectType} ${subjectId}` : ''; return ( {error ? ( ) : archives.length === 0 ? ( ) : ( )} ); }