Simplify client downloads and add bulk selection
This commit is contained in:
@@ -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}`}>
|
||||
|
||||
Reference in New Issue
Block a user