Changeset 6e0249f in Klonkt
- Timestamp:
- 06/14/2026 03:21:25 PM (3 months ago)
- Branches:
- main
- Children:
- 4c5169f
- Parents:
- 743bb81
- Location:
- src
- Files:
-
- 4 edited
-
routes/admin-settings.js (modified) (4 diffs)
-
routes/hub.js (modified) (2 diffs)
-
views/pages/admin-settings.ejs (modified) (2 diffs)
-
views/pages/hub-home.ejs (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/admin-settings.js
r743bb81 r6e0249f 1 1 /** 2 * Admin: globale instellingen — nu de tenancy-modus (Solo/Hub). 2 * Admin: globale instellingen. 3 * - tenancy-modus (Solo/Hub) 4 * - hub-branding (naam/tagline/intro van de generieke hub-hoofdpagina) 3 5 * 4 * GET /admin/settings -> toon huidige modus + uitleg5 * POST /admin/settings -> sla modusop (god-only)6 * GET /admin/settings -> toon huidige instellingen 7 * POST /admin/settings -> sla op (god-only) 6 8 * 7 * Schakelen is niet-destructief: Solo verbergt alleen de multi-site-onderdelen8 * en routeert naar de primaire site; er wordt niets verwijderd.9 * De hub-pagina is generiek (van geen enkele user); deze branding leeft in 10 * globale settings, niet in een site. 9 11 */ 10 12 … … 12 14 import { renderPage } from '../middleware/render.js'; 13 15 import { requireGod } from '../middleware/auth.js'; 14 import { getTenancy, setTenancy } from '../services/SettingsService.js';16 import { getTenancy, setTenancy, getSetting, setSetting } from '../services/SettingsService.js'; 15 17 16 18 const router = express.Router(); … … 21 23 bodyClass: 'on-admin', 22 24 tenancy: getTenancy(), 25 hubTitle: getSetting('hub_title') || '', 26 hubTagline: getSetting('hub_tagline') || '', 27 hubIntro: getSetting('hub_intro') || '', 23 28 success: req.query.success || null, 24 29 }); … … 26 31 27 32 router.post('/', requireGod, (req, res) => { 28 setTenancy(req.body.tenancy === 'hub' ? 'hub' : 'solo'); 29 res.redirect('/admin/settings?success=' + encodeURIComponent('Modus opgeslagen')); 33 if (typeof req.body.tenancy !== 'undefined') { 34 setTenancy(req.body.tenancy === 'hub' ? 'hub' : 'solo'); 35 } 36 if (typeof req.body.hub_title !== 'undefined') { 37 setSetting('hub_title', (req.body.hub_title || '').toString().slice(0, 80).trim()); 38 } 39 if (typeof req.body.hub_tagline !== 'undefined') { 40 setSetting('hub_tagline', (req.body.hub_tagline || '').toString().slice(0, 120).trim()); 41 } 42 if (typeof req.body.hub_intro !== 'undefined') { 43 setSetting('hub_intro', (req.body.hub_intro || '').toString().slice(0, 400).trim()); 44 } 45 res.redirect('/admin/settings?success=' + encodeURIComponent('Opgeslagen')); 30 46 }); 31 47 -
src/routes/hub.js
r743bb81 r6e0249f 10 10 import db from '../config/database.js'; 11 11 import { renderPage } from '../middleware/render.js'; 12 import { getTenancy } from '../services/SettingsService.js';12 import { getTenancy, getSetting } from '../services/SettingsService.js'; 13 13 14 14 const router = express.Router(); … … 35 35 `).all(); 36 36 37 // De PrutFolio's (sites) voor de gebruikers-lijst. 38 const sites = db.prepare(` 39 SELECT s.slug, s.title, s.profile_photo, 40 u.username AS owner_username, 37 // ALLE PrutFolio's (elke user, incl. de admin z'n eigen site) voor de roster. 38 const artists = db.prepare(` 39 SELECT s.slug, s.title, s.tagline, s.profile_photo, 41 40 (SELECT COUNT(*) FROM posts WHERE site_id = s.id AND status = 'published') AS post_count 42 41 FROM sites s 43 LEFT JOIN users u ON u.id = s.owner_id44 42 ORDER BY s.created_at ASC 45 43 `).all(); 46 44 47 // De primaire/oudste site geldt als de bedrijfssite (label). De roster toont 48 // alleen de artiesten (alle overige sites), niet de bedrijfssite zelf. 49 const company = res.locals.site || null; 50 const artists = company ? sites.filter((s) => s.slug !== company.slug) : sites; 45 // De hub-pagina is GENERIEK (van geen enkele user) — branding komt uit globale 46 // instellingen die de admin in Beheer beheert, niet uit een site. 47 const hub = { 48 title: getSetting('hub_title') || 'Overzicht', 49 tagline: getSetting('hub_tagline') || '', 50 intro: getSetting('hub_intro') || '', 51 }; 51 52 52 53 renderPage(req, res, 'pages/hub-home', { 53 pageTitle: company ? company.title : 'Overzicht',54 socialDescr: (company && (company.description || company.tagline))|| '',54 pageTitle: hub.title, 55 socialDescr: hub.intro || hub.tagline || '', 55 56 bodyClass: 'on-home on-hub', 56 company,57 hub, 57 58 artists, 58 59 posts, -
src/views/pages/admin-settings.ejs
r743bb81 r6e0249f 30 30 </form> 31 31 </section> 32 33 <% if (tenancy === 'hub') { %> 34 <section class="set-card" style="margin-top:1rem"> 35 <h2>Hub-hoofdpagina</h2> 36 <p class="set-help"> 37 De openbare hub-pagina (<code>/</code>) is generiek — van geen enkele gebruiker. 38 Hier stel je de naam en intro in. Jouw eigen PrutFolio blijft los bestaan onder <code>/user/</code>. 39 </p> 40 <form method="post" action="/admin/settings" class="set-form"> 41 <label class="set-field"> 42 <span>Naam</span> 43 <input type="text" name="hub_title" maxlength="80" value="<%= hubTitle %>" placeholder="bijv. Studio Noord"> 44 </label> 45 <label class="set-field"> 46 <span>Tagline</span> 47 <input type="text" name="hub_tagline" maxlength="120" value="<%= hubTagline %>" placeholder="bijv. Onafhankelijk muzieklabel"> 48 </label> 49 <label class="set-field"> 50 <span>Intro</span> 51 <textarea name="hub_intro" maxlength="400" rows="3" placeholder="Korte introtekst onder de titel."><%= hubIntro %></textarea> 52 </label> 53 <button type="submit" class="btn btn-primary">Opslaan</button> 54 </form> 55 </section> 56 <% } %> 32 57 </div> 33 58 … … 48 73 .set-opt code { background: var(--paper-2); padding: 0.05rem 0.35rem; border-radius: 3px; font-size: 0.85em; } 49 74 .set-form .btn { align-self: flex-start; } 75 .set-field { display: flex; flex-direction: column; gap: 0.3rem; } 76 .set-field > span { font-size: 0.8rem; font-weight: 600; color: var(--ink-soft, var(--ink-muted)); } 77 .set-field input, .set-field textarea { 78 width: 100%; box-sizing: border-box; padding: 0.55rem 0.7rem; 79 border: 1px solid var(--rule); border-radius: 6px; background: var(--paper); color: var(--ink); 80 font: inherit; font-size: 0.95rem; 81 } 82 .set-field textarea { resize: vertical; } 83 .set-field input:focus, .set-field textarea:focus { outline: 2px solid var(--accent); outline-offset: -1px; border-color: var(--accent); } 50 84 .alert { padding: 0.75rem 1rem; border-radius: 6px; margin-bottom: 1rem; } 51 85 .alert-success { background: #d1fae5; color: #065f46; border: 1px solid #a7f3d0; } -
src/views/pages/hub-home.ejs
r743bb81 r6e0249f 4 4 <header class="hub-hero"> 5 5 <div class="hub-hero-inner container"> 6 <h1 class="hub-hero-title"><%= company ? company.title : 'Overzicht'%></h1>7 <% if ( company && company.tagline) { %>8 <p class="hub-hero-tag"><%= company.tagline %></p>6 <h1 class="hub-hero-title"><%= hub.title %></h1> 7 <% if (hub.tagline) { %> 8 <p class="hub-hero-tag"><%= hub.tagline %></p> 9 9 <% } %> 10 <% if ( company && (company.profile_bio || company.description)) { %>11 <p class="hub-hero-desc"><%= company.profile_bio || company.description%></p>10 <% if (hub.intro) { %> 11 <p class="hub-hero-desc"><%= hub.intro %></p> 12 12 <% } %> 13 13 </div>
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)