Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions frontend/js/activity.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Moved state.taskEventSource to state
// Moved state.taskStreamRetries to state
import { state } from './state.js';
import { CAT_LABELS, EL, EVENT, SVG_WARN, _errHtml, _errMsg, _fmtAbs, _fmtRel, act, btnBusy, btnDone, emptyHtml, esc, escAttr, pulseHeldBy, setBadge, setPulse, toast } from './ui.js';
import { CAT_LABELS, EL, EVENT, SVG_WARN, _errHtml, _errMsg, _fmtAbs, _fmtRel, act, btnBusy, btnDone, emptyHtml, esc, escAttr, loc, pulseHeldBy, setBadge, setPulse, toast } from './ui.js';
import { _swrInvalidate, _swrRun, api, sessionEnded } from './api.js';

// One task stream per tab. The guard used to sit BEFORE the ticket fetch, so
Expand Down Expand Up @@ -164,7 +164,7 @@ function _taskRowHtml(t) {
const live = t.status === 'running' || t.status === 'pending';
const meta = [
t.elapsed_s > 0 ? fmtTime(Math.round(t.elapsed_s)) : '',
t.processed && t.total ? `${t.processed.toLocaleString()} / ${t.total.toLocaleString()}` : '',
t.processed && t.total ? `${t.processed.toLocaleString(loc())} / ${t.total.toLocaleString(loc())}` : '',
t.rate > 0 ? `${t.rate.toFixed(1)}/s` : '',
t.eta_s ? `<span class="t-amber">ETA ${fmtTime(t.eta_s)}</span>` : '',
].filter(Boolean).join(' · ');
Expand Down Expand Up @@ -226,7 +226,7 @@ function _enrichRowHtml(t) {
const rate = t.rate > 0 ? ` · ${t.rate.toFixed(1)}/s` : '';
const current = t.logs && t.logs.length ? t.logs[t.logs.length - 1].msg : '';
return `<div class="mb-8" data-enrich-cat="${escAttr(t.category)}">
<div class="row fs-12 js-count-line"><span class="b">${esc(CAT_LABELS[cat] || cat)}</span><span class="t3 row-end">${(t.processed || 0).toLocaleString()} / ${(t.total || 0).toLocaleString()}${rate}${eta}</span></div>
<div class="row fs-12 js-count-line"><span class="b">${esc(CAT_LABELS[cat] || cat)}</span><span class="t3 row-end">${(t.processed || 0).toLocaleString(loc())} / ${(t.total || 0).toLocaleString(loc())}${rate}${eta}</span></div>
<div class="mt-4 progress-bar"><div class="progress-fill" data-style="width:${pct}%"></div></div>
<div class="ellipsis fs-10 t3 mono mt-4 js-current"${current ? '' : ' hidden'} title="${escAttr(current)}">${esc(current)}</div>
</div>`;
Expand Down
4 changes: 2 additions & 2 deletions frontend/js/arr.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
//
// Tab definitions per arr — adjust here when new tabs land.
import { api } from './api.js';
import { EL, _errHtml, _errMsg, _fmtRel, _posterImg, act, actOn, btnBusy, btnDone, emptyHtml, esc, escAttr, openModal, proxyImg, setStatus, toast } from './ui.js';
import { EL, _errHtml, _errMsg, _fmtRel, _posterImg, act, actOn, btnBusy, btnDone, emptyHtml, esc, escAttr, loc, openModal, proxyImg, setStatus, toast } from './ui.js';
import { state } from './state.js';
import { showView, tabToHash } from './nav.js';
const ARR_TABS = {
Expand Down Expand Up @@ -278,7 +278,7 @@ export function openLibraryItem(svc, tabId, idx) {
item.year,
_sizeStr(item.size_on_disk),
item.album_count ? `${item.album_count} album${item.album_count === 1 ? '' : 's'}` : '',
item.added ? `added ${new Date(item.added).toLocaleDateString()}` : '',
item.added ? `added ${new Date(item.added).toLocaleDateString(loc())}` : '',
item.status,
].filter(Boolean).map(f => esc(String(f))).join(' · ');
openModal({
Expand Down
3 changes: 2 additions & 1 deletion frontend/js/auth.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// ── AUTH ──────────────────────────────────────────────────────────────────────
import { api } from './api.js';
import { _errMsg, btnDone, toast } from './ui.js';
import { _errMsg, btnDone, setLocale, toast } from './ui.js';
import { state } from './state.js';
import { loadUnreadMessages } from './notifications.js';
import { showOnboarding } from './setup.js';
Expand Down Expand Up @@ -125,6 +125,7 @@ function syncTimezone(u) {

export function setUser(u) {
state.currentUser = u;
setLocale(u.locale);
syncTimezone(u);
document.getElementById('user-name').textContent = u.username || 'User';
document.getElementById('user-avatar').textContent = (u.username||'?')[0].toUpperCase();
Expand Down
8 changes: 4 additions & 4 deletions frontend/js/curation.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// ── Protections (judge auto-saves AND chat-intent grants, both liftable) ─────
import { api } from './api.js';
import { EL, SVG_CHECK, _errHtml, _errMsg, act, btnBusy, btnDone, confirmDialog, emptyHtml, esc, escAttr, toast } from './ui.js';
import { EL, SVG_CHECK, _errHtml, _errMsg, act, btnBusy, btnDone, confirmDialog, emptyHtml, esc, escAttr, loc, toast } from './ui.js';
import { startTaskStream, stopTaskStream } from './activity.js';
export async function loadJudgeProtections() {
const el = document.getElementById('protections-content');
Expand All @@ -19,7 +19,7 @@ export async function loadJudgeProtections() {
: (p.verdict === 'KEEP_WITH_FLAG'
? '<span class="badge amber badge-sm">Keep · downscale</span>'
: '<span class="badge muted badge-sm">Protected</span>');
const when = p.created_at ? new Date(p.created_at).toLocaleDateString() : '';
const when = p.created_at ? new Date(p.created_at).toLocaleDateString(loc()) : '';
return `<div class="panel-item">
<div class="panel-item-head">
<div class="panel-item-title">${esc(p.title || '—')} ${badge}
Expand Down Expand Up @@ -96,7 +96,7 @@ export async function loadPrinciples() {
: (p.novelty ? ` <span class="badge muted">${esc(p.novelty)}</span>` : '');
const reinf = (p.times_reinforced || 0) > 0 ? ` <span class="fs-11 t3">×${p.times_reinforced} reinforced</span>` : '';
const meta = [p.basis, p.category].filter(Boolean).map(esc).join(' · ');
const when = p.created_at ? new Date(p.created_at).toLocaleDateString() : '';
const when = p.created_at ? new Date(p.created_at).toLocaleDateString(loc()) : '';
const actions = p.status === 'merged'
? ''
: p.status === 'active'
Expand Down Expand Up @@ -251,7 +251,7 @@ export async function loadDownscale() {
const tech = p.tech
? `<span class="badge muted">${esc(p.tech.resolution || '?')} ${esc(p.tech.codec || '')} · ${p.tech.size_gb} GB${p.tech.mb_per_min ? ` · ${p.tech.mb_per_min} MB/min` : ''}</span>`
: '<span class="badge muted">no tech profile</span>';
const when = p.created_at ? new Date(p.created_at).toLocaleDateString() : '';
const when = p.created_at ? new Date(p.created_at).toLocaleDateString(loc()) : '';
return `<div class="panel-item">
<div class="panel-item-head">
<div class="panel-item-title">${esc(p.title || '—')} ${tech}
Expand Down
6 changes: 3 additions & 3 deletions frontend/js/history.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Sync and recompute are called from the History toolbar (status goes into
// the stats block) and from Settings → Maintenance (status goes into that
// section's own line, statusId) — never into another view's element.
import { CAT_LABELS, EL, _errHtml, _errMsg, act, countTo, esc, setStatus, toast } from './ui.js';
import { CAT_LABELS, EL, _errHtml, _errMsg, act, countTo, esc, loc, setStatus, toast } from './ui.js';
import { _swrInvalidate, _swrRun, api } from './api.js';
import { loadEnrichStatus } from './kb.js';
export async function recomputeTaste(statusId = null) {
Expand Down Expand Up @@ -56,7 +56,7 @@ export function _renderHistoryStats(s) {
<div class="stat-row">
<div class="stat-box"><div class="num" data-count>${esc(shown)}</div><div class="lbl">Entries synced</div></div>
<div class="stat-box">
<div class="num ${coverageOk ? 't-amber' : 't-danger'}">${tv.watch_count?.toLocaleString()||0}</div>
<div class="num ${coverageOk ? 't-amber' : 't-danger'}">${tv.watch_count?.toLocaleString(loc())||0}</div>
<div class="lbl">In taste profile ${coverageOk?'':'<span class="t-amber">— outdated</span>'}</div>
</div>
<div class="stat-box"><div class="fs-16 num">${tv.computed?'Ready':'Pending'}</div><div class="lbl">Profile status</div></div>
Expand Down Expand Up @@ -124,7 +124,7 @@ export function showTasteTabData(byType, summary, type) {
${cb.dropped?`<span><strong class="t-danger">${cb.dropped}</strong> <span class="fs-12 t2">dropped &lt;40%</span></span>`:''}
${cb.nearly_done?`<span><strong class="t-info">${cb.nearly_done}</strong> <span class="fs-12 t2">&gt;80% done</span></span>`:''}
</div>`
: `<div class="mb-12"><span class="fs-22 fw-700 t-amber">${d.watch_count?.toLocaleString()||0}</span><span class="fs-12 t2 ml-6">items</span></div>`;
: `<div class="mb-12"><span class="fs-22 fw-700 t-amber">${d.watch_count?.toLocaleString(loc())||0}</span><span class="fs-12 t2 ml-6">items</span></div>`;
document.getElementById('taste-content').innerHTML=`
<div class="mb-16 card">
${compRow}
Expand Down
Loading
Loading