Simplify client downloads and add bulk selection

This commit is contained in:
2026-10-04 17:56:45 +03:00
parent 416fae33a2
commit fe4c716aa8
3 changed files with 261 additions and 109 deletions

View File

@@ -20,20 +20,12 @@ interface AlbumOption {
assetCount: number;
}
type Download = AdminProofSession['download'];
const STATE_LABEL: Record<AdminProofSession['state'], string> = {
open: 'Open',
submitted: 'Submitted',
expired: 'Expired',
};
const DOWNLOAD_LABEL: Record<Download, string> = {
none: 'No downloads',
selection: 'Selection as ZIP',
album: 'Whole album as ZIP',
};
function formatDate(iso: string | null): string {
if (!iso) return '—';
const date = iso.length === 10 ? new Date(`${iso}T12:00:00`) : new Date(iso);
@@ -54,7 +46,7 @@ function CreateForm({ onCreated }: { onCreated: () => void }) {
const [albumId, setAlbumId] = useState('');
const [alias, setAlias] = useState('');
const [expiresOn, setExpiresOn] = useState('');
const [download, setDownload] = useState<Download>('none');
const [downloadsAllowed, setDownloadsAllowed] = useState(false);
const [limit, setLimit] = useState('');
const [busy, setBusy] = useState(false);
const [error, setError] = useState<string | null>(null);
@@ -80,15 +72,15 @@ function CreateForm({ onCreated }: { onCreated: () => void }) {
alias: alias.trim() || null,
albumId,
expiresOn: expiresOn || null,
download,
downloadLimit: download !== 'none' && limit ? Number(limit) : null,
download: downloadsAllowed ? 'selection' : 'none',
downloadLimit: downloadsAllowed && limit ? Number(limit) : null,
}),
});
setClientName('');
setAlias('');
setAlbumId('');
setExpiresOn('');
setDownload('none');
setDownloadsAllowed(false);
setLimit('');
onCreated();
} catch (err) {
@@ -159,21 +151,21 @@ function CreateForm({ onCreated }: { onCreated: () => void }) {
onChange={(e) => setExpiresOn(e.target.value)}
/>
</div>
<div className="admin-field">
<label htmlFor="proof-download">Downloads</label>
<select
id="proof-download"
value={download}
onChange={(e) => setDownload(e.target.value as Download)}
>
{(Object.keys(DOWNLOAD_LABEL) as Download[]).map((key) => (
<option key={key} value={key}>
{DOWNLOAD_LABEL[key]}
</option>
))}
</select>
</div>
{download !== 'none' && (
<div className="admin-field">
<label htmlFor="proof-download">Downloads</label>
<select
id="proof-download"
value={downloadsAllowed ? 'allowed' : 'none'}
onChange={(e) =>
setDownloadsAllowed(e.target.value === 'allowed')
}
>
<option value="none">No downloads</option>
<option value="allowed">Downloads allowed</option>
</select>
</div>
{downloadsAllowed && (
<div className="admin-field">
<label htmlFor="proof-limit">Download limit (optional)</label>
<input
@@ -277,11 +269,13 @@ function SessionCard({
};
const downloadsText =
session.download === 'none'
? DOWNLOAD_LABEL.none
: `${DOWNLOAD_LABEL[session.download]} · ${session.downloadsUsed}${
session.downloadLimit !== null ? ` / ${session.downloadLimit}` : ''
} used`;
session.download === 'none'
? 'Downloads disabled'
: `Downloads allowed · ${session.downloadsUsed}${
session.downloadLimit !== null
? ` / ${session.downloadLimit}`
: ''
} used`;
return (
<div className={`analytics-panel proofing-card proofing-card--${session.state}`}>