Three fixes from using the admin panel and the site:
- The invite link was an anchor, but an invite is something to send, not to
follow — clicking it opened the join form in the admin's own browser. It
is now the URL beside a Kopioi button. The handler reads the text out of
the sibling element rather than interpolating the URL into JS, so there is
nothing to escape, and where the clipboard API is missing (it needs a
secure context, which the documented SSH tunnel to localhost provides) it
selects the text instead of leaving a button that does nothing.
- "Ilmoita ongelmasta" framed the feedback form as a bug tracker when it is
meant to take ideas and general feedback too. The footer now asks
"Ongelmia? Ideoita? Palautetta?", and the page it leads to answers all
three: the ingress covers ideas explicitly and the placeholder suggests a
feature rather than a fault.
- "Kuuntele YouTubessa" opens in a new tab. Leaving the page mid-review
would lose whatever is already typed into the review form.
Step 6. The surfaces around the review loop.
- Nine leaderboards, ordered and limited in SQL, each with a deterministic
tie-break so a tied board doesn't reshuffle between reloads. Min 3 reviews
to qualify, for reviewer boards too
- Profiles show counts and history-wide averages and the member's songs,
never a list of their reviews — per-song opinion stays gated
- Avatars: 5MB in, 256px JPEG out, ffmpeg's re-encode being the validation.
No upload still means initials, and avatars are public
- Changing your own password requires the current one and drops your other
sessions
- Palaute: free text plus the page you were on, carried in a footer link, and
the user agent from the header. Reporters see their own; the admin resolves
them with a timestamp rather than a status enum
- Admin gained the song list with delete, the reports page, and an open-report
count on the dashboard
Two theme fixes the screenshots caught: leaderboard ranks need a CSS counter
because display:grid suppresses list markers, and count-based boards were
printing 3.0 where they mean 3.