Changeset 24cdcc6 in Klonkt


Ignore:
Timestamp:
06/23/2026 02:11:51 PM (3 months ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
8f2f97c
Parents:
3af8fa3
Message:

setup: first-run wizard (language choice + site name) on /auth/register

A fresh install now shows a friendly wizard: choose your language (EN/NL/DE,
immediately set as the site default via default_lang), give your site a name,
and create your admin account. The site gets the klonkt brand colours. Only
shown when there are 0 users; existing installs unchanged. Tested on a fresh
DB (GET+POST).

Co-Authored-By: Claude <noreply@…>

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/routes/auth.js

    r3af8fa3 r24cdcc6  
    1717}
    1818import { mailerConfigured, sendMail } from '../config/mailer.js';
     19import { resolveLang, t } from '../services/i18n.js';
     20import { setSetting } from '../services/SettingsService.js';
    1921
    2022const router = express.Router();
     
    124126  if (!isSetupMode()) return res.redirect('/auth/login' + (next ? '?next=' + encodeURIComponent(next) : ''));
    125127  renderPage(req, res, 'pages/auth-register', {
    126     pageTitle: 'Beheerder aanmaken', bodyClass: 'on-special',
    127     error: null, username: '', email: '', next,
     128    pageTitle: t(resolveLang(req), 'setup.title'), bodyClass: 'on-special',
     129    error: null, username: '', email: '', siteName: '', next,
    128130  });
    129131});
    130132
    131133router.post('/register', registerLimiter, (req, res) => {
    132   const { username, email, password } = req.body;
     134  const { username, email, password, siteName } = req.body;
    133135  const next = safeNext(req.body.next) || '';
    134136  const renderErr = (error) => renderPage(req, res, 'pages/auth-register', {
    135     pageTitle: 'Beheerder aanmaken', bodyClass: 'on-special',
    136     error, username: username || '', email: email || '', next,
     137    pageTitle: t(resolveLang(req), 'setup.title'), bodyClass: 'on-special',
     138    error, username: username || '', email: email || '', siteName: siteName || '', next,
    137139  });
    138140
     
    155157
    156158  // Persoonlijke site auto-aanmaken (single-tenant-ombouw volgt later).
     159  // Setup-wizard: sitenaam + taal komen uit het formulier; taal = de taal waarin
     160  // de bezoeker de wizard invulde (resolveLang) en wordt meteen de site-standaard.
    157161  if (!db.prepare('SELECT 1 FROM sites LIMIT 1').get()) {
    158162    const siteId = uuid();
     163    const lang = resolveLang(req);
     164    const title = (siteName || '').trim().slice(0, 80) || (username + "'s Site");
    159165    db.prepare(`
    160166      INSERT INTO sites (id, slug, title, description, owner_id, palette, accent, language)
    161       VALUES (?, ?, ?, ?, ?, 'sage', '#c2410c', 'nl')
    162     `).run(siteId, username.toLowerCase(), username + "'s Site", 'Welkom', userId);
     167      VALUES (?, ?, ?, ?, ?, 'klonkt', '#e8b04b', ?)
     168    `).run(siteId, username.toLowerCase(), title, '', userId, lang);
    163169    db.prepare(`INSERT INTO site_members (site_id, user_id, role) VALUES (?, ?, 'admin')`).run(siteId, userId);
     170    try { setSetting('default_lang', lang); } catch (e) { /* niet fataal */ }
    164171  }
    165172
  • src/services/i18n.js

    r3af8fa3 r24cdcc6  
    9090    'auth.create_admin': 'Beheerder aanmaken',
    9191    'auth.reg_intro': 'Eerste keer opzetten — maak je beheerdersaccount aan. Dit kan maar één keer.',
     92    'setup.title': 'Stel je Klonkt in',
     93    'setup.intro': 'Welkom! Even je site klaarzetten — dit duurt een minuutje. Kies eerst je taal.',
     94    'setup.lang_label': 'Taal',
     95    'setup.f_sitename': 'Naam van je site',
     96    'setup.sitename_ph': 'bijv. jouw artiestennaam',
     97    'setup.submit': 'Mijn site aanmaken',
    9298    'auth.f_username': 'Gebruikersnaam (3-32 tekens, letters/cijfers/_-)',
    9399    'auth.f_email': 'E-mail',
     
    10741080    'auth.create_admin': 'Create admin',
    10751081    'auth.reg_intro': 'First-time setup — create your admin account. This can only be done once.',
     1082    'setup.title': 'Set up your Klonkt',
     1083    'setup.intro': 'Welcome! Let’s get your site ready — it takes a minute. Pick your language first.',
     1084    'setup.lang_label': 'Language',
     1085    'setup.f_sitename': 'Your site’s name',
     1086    'setup.sitename_ph': 'e.g. your artist name',
     1087    'setup.submit': 'Create my site',
    10761088    'auth.f_username': 'Username (3-32 chars, letters/digits/_-)',
    10771089    'auth.f_email': 'Email',
     
    20542066    'auth.create_admin': 'Administrator anlegen',
    20552067    'auth.reg_intro': 'Ersteinrichtung — lege dein Administrator-Konto an. Das geht nur einmal.',
     2068    'setup.title': 'Richte dein Klonkt ein',
     2069    'setup.intro': 'Willkommen! Lass uns deine Seite einrichten — dauert nur eine Minute. Wähle zuerst deine Sprache.',
     2070    'setup.lang_label': 'Sprache',
     2071    'setup.f_sitename': 'Name deiner Seite',
     2072    'setup.sitename_ph': 'z. B. dein Künstlername',
     2073    'setup.submit': 'Meine Seite erstellen',
    20562074    'auth.f_username': 'Benutzername (3-32 Zeichen, Buchstaben/Ziffern/_-)',
    20572075    'auth.f_email': 'E-Mail',
  • src/views/pages/auth-register.ejs

    r3af8fa3 r24cdcc6  
    11<div class="container auth-page">
    2   <h1><%= t('auth.create_admin') %></h1>
    3   <p class="auth-intro"><%= t('auth.reg_intro') %></p>
     2  <h1><%= t('setup.title') %></h1>
     3  <p class="auth-intro"><%= t('setup.intro') %></p>
     4
     5  <div class="setup-lang" style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:0 0 20px">
     6    <span style="opacity:.7;font-size:.9rem"><%= t('setup.lang_label') %>:</span>
     7    <% (typeof langs !== 'undefined' ? langs : []).forEach(function(L){ %>
     8      <a href="/lang/<%= L.code %>?r=/auth/register"
     9         style="padding:5px 13px;border-radius:8px;text-decoration:none;font-weight:600;font-size:.9rem;border:1px solid <%= L.active ? 'var(--accent)' : 'var(--rule, #2b3140)' %>;color:<%= L.active ? 'var(--accent)' : 'inherit' %>"><%= L.name %></a>
     10    <% }) %>
     11  </div>
     12
    413  <% if (error) { %><div class="alert alert-error"><%= error %></div><% } %>
    514  <form method="post" action="/auth/register" class="auth-form">
     
    817    <% } %>
    918    <label>
     19      <span><%= t('setup.f_sitename') %></span>
     20      <input type="text" name="siteName" value="<%= typeof siteName !== 'undefined' ? siteName : '' %>" required autofocus maxlength="80" placeholder="<%= t('setup.sitename_ph') %>">
     21    </label>
     22    <label>
    1023      <span><%= t('auth.f_username') %></span>
    11       <input type="text" name="username" value="<%= username %>" required autofocus autocomplete="username" pattern="[a-zA-Z0-9_-]{3,32}">
     24      <input type="text" name="username" value="<%= username %>" required autocomplete="username" pattern="[a-zA-Z0-9_-]{3,32}">
    1225    </label>
    1326    <label>
     
    1932      <input type="password" name="password" required minlength="8" autocomplete="new-password">
    2033    </label>
    21     <button type="submit" class="btn btn-primary"><%= t('auth.create_admin') %></button>
     34    <button type="submit" class="btn btn-primary"><%= t('setup.submit') %></button>
    2235  </form>
    2336</div>
Note: See TracChangeset for help on using the changeset viewer.