{t('admin.title', 'Admin')}
{dashboardError}
{:else if !dashboard}{t('common.loading', 'Loading…')}
{:else}{t('admin.storage', 'Storage')}
{formatBytes(dashboard.total_used_bytes)} / {formatBytes(dashboard.total_quota_bytes)} ({dashboard.storage_usage_percent.toFixed(1)}%)
{t('admin.registration', 'Registration')}
{#if !dashboard.registration_enabled}
{t('admin.oidc', 'OIDC / SSO')}
{#if !oidc}{t('common.loading', 'Loading…')}
{:else} {/if}{t('admin.storage_tab', 'Storage')}
{#if !storage}{t('common.loading', 'Loading…')}
{:else}- {t('admin.storage_current', 'Current backend')}
- {storage.current_backend ?? '—'}
- {t('admin.storage_blobs', 'Blobs')}
- {storage.total_blobs ?? '—'}
- {t('admin.storage_size', 'Stored')}
- {storage.total_bytes_stored != null ? formatBytes(storage.total_bytes_stored) : '—'}
- {t('admin.storage_dedup', 'Dedup ratio')}
- {storage.dedup_ratio != null ? `${storage.dedup_ratio.toFixed(2)}x` : '—'}
{t('admin.migration', 'Storage migration')}
{#if !migration}{t('common.loading', 'Loading…')}
{:else}{t('admin.status', 'Status')}: {migration.status}
{#if migration.total_blobs > 0}{migration.migrated_blobs} / {migration.total_blobs} ({migrationPct}%) · {formatBytes(migration.migrated_bytes)} {#if migration.throughput_bytes_per_sec && migration.status === 'running'} · {formatBytes(Math.round(migration.throughput_bytes_per_sec))}/s {/if} {#if migrationEtaMin != null} · {t('admin.mig_eta', { min: migrationEtaMin }, `~${migrationEtaMin} min remaining`)} {/if}
{/if} {#if migration.failed_blobs && migration.failed_blobs.length > 0}{t( 'admin.mig_failed', { n: migration.failed_blobs.length }, `${migration.failed_blobs.length} failed blobs` )}
{migration.failed_blobs.join('\n')}
{t( 'admin.mig_verify_summary', { checked: verifyResult.sample_checked, total: verifyResult.pg_blob_count }, '{{checked}} blobs checked, {{total}} total in database' )}
{:else}{[ verifyResult.missing_in_target.length ? t( 'admin.mig_verify_missing', { n: verifyResult.missing_in_target.length }, '{{n}} missing' ) : '', verifyResult.size_mismatches.length ? t( 'admin.mig_verify_mismatch', { n: verifyResult.size_mismatches.length }, '{{n}} size mismatches' ) : '' ] .filter(Boolean) .join(', ')}
{/if}{t('admin.smtp_status', 'SMTP status')}
{#if !smtp}{t('common.loading', 'Loading…')}
{:else}- {t('admin.smtp_enabled', 'Enabled')}
- {smtp.enabled ? t('common.yes', 'Yes') : t('common.no', 'No')}
- {t('admin.smtp_host', 'Host')}
- {smtp.host || '—'}
- {t('admin.smtp_port', 'Port')}
- {smtp.port || '—'}
- TLS
- {smtp.tls || '—'}
- {t('admin.smtp_from', 'From')}
- {smtp.from || '—'}
- {t('admin.smtp_user_state', 'Auth')}
- {smtp.user_state || '—'}
{t('admin.smtp_test', 'Send test email')}
{t('admin.smtp_sent', 'Test email sent.')}
{t('admin.smtp_server_code', 'Server replied')}:
{smtpResult.code ?? ''} {smtpResult.message ?? ''}
{t('admin.smtp_fail', 'Send failed.')}
{smtpResult.error || smtpResult.message || t('common.error', 'unknown error')}
{usersError}
{:else}| {t('admin.user', 'User')} | {t('admin.role', 'Role')} | {t('admin.auth', 'Auth')} | {t('admin.status', 'Status')} | {t('admin.quota', 'Storage usage')} | {t('admin.last_login', 'Last login')} | |
|---|---|---|---|---|---|---|
|
{u.username || u.email}
{#if isSelf(u)}
{t('admin.you_badge', 'you')}
{/if}
{u.email}
|
{#if u.role === 'admin'} |
{#if isOidcUser(u)}
|
{u.active ? t('admin.active', 'Active') : t('admin.inactive', 'Inactive')} |
{formatBytes(u.storage_used_bytes)} / {u.storage_quota_bytes > 0
? formatBytes(u.storage_quota_bytes)
: '∞'}
|
{timeAgo(u.last_login_at)} | {#if !isOidcUser(u)} {/if} |
{t('admin.plugins_disabled', 'The plugin subsystem is disabled.')}
{:else if pluginsError}{pluginsError}
{:else} {#if installMsg}{installMsg.text}
{/if} {#if plugins.length === 0}{t('admin.no_plugins', 'No plugins installed.')}
{:else}| {t('admin.plugin', 'Plugin')} | {t('admin.plugins_col_id', 'ID')} | {t('admin.version', 'Version')} | {t('admin.plugins_col_events', 'Events')} | {t('admin.status', 'Status')} | |
|---|---|---|---|---|---|
|
{p.name}
{#if p.description}{p.description}{/if}
|
{p.id} |
{p.version ?? '—'} | {#if p.subscriptions && p.subscriptions.length > 0} {p.subscriptions.length} {:else} — {/if} | {p.enabled ? t('admin.enabled', 'Enabled') : t('admin.disabled', 'Disabled')} |