Changeset 68b27a4 in Klonkt


Ignore:
Timestamp:
06/20/2026 07:28:43 AM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
0fcc09c
Parents:
d7b5a6c
Message:

feat(agenda): Agenda opt-in — only shown when enabled + active on /shows

  • New setting agenda_enabled (Admin → Agenda: toggle "Show agenda on the site").
  • Agenda button in the pill only appears when premium AND enabled.
  • /shows (+ /shows/notify) gated: disabled = 404 (not reachable).
  • On the agenda page, the Agenda item in the pill is now marked "active" (the pill stays visible there, as requested).

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

Location:
src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • src/middleware/render.js

    rd7b5a6c r68b27a4  
    9494    hubTitle: getSetting('hub_title') || '',
    9595    footerNewsletter: getSetting('footer_newsletter') === '1', // nieuwsbrief-aanmelding in footer (premium)
     96    agendaEnabled: getSetting('agenda_enabled') === '1', // Agenda/evenementen tonen in de pill (premium, opt-in)
    9697    platforms_catalog: PLATFORMS_CATALOG,
    9798    permissions: PermissionsService,
  • src/routes/admin-shows.js

    rd7b5a6c r68b27a4  
    1818import { mailerConfigured, sendMail } from '../config/mailer.js';
    1919import { confirmedFor, counts } from '../services/SubscriberService.js';
     20import { getSetting, setSetting } from '../services/SettingsService.js';
    2021
    2122const router = express.Router();
     
    3637    pageTitle: 'Agenda', bodyClass: 'on-admin',
    3738    shows, smtp: mailerConfigured(), notifyCount: confirmedFor(site.id, 'notify').length,
     39    agendaEnabled: getSetting('agenda_enabled') === '1',
    3840    ...extra,
    3941  });
     
    8385});
    8486
     87router.post('/toggle', requireSiteManager, premiumGate, (req, res) => {
     88  // Agenda tonen op de site (Agenda-knop in de pill + /shows-pagina).
     89  setSetting('agenda_enabled', req.body.enabled ? '1' : '0');
     90  res.redirect((res.locals.siteUrlBase || '') + '/admin/shows');
     91});
     92
    8593router.post('/:id/delete', requireSiteManager, premiumGate, (req, res) => {
    8694  const site = res.locals.site;
  • src/routes/shows.js

    rd7b5a6c r68b27a4  
    1616import { mailerConfigured, sendMail } from '../config/mailer.js';
    1717import { addSubscriber } from '../services/SubscriberService.js';
     18import { getSetting } from '../services/SettingsService.js';
    1819
    1920const router = express.Router();
     21
     22// Agenda is opt-in: pas bereikbaar als de beheerder 'm heeft ingeschakeld.
     23function agendaOn() { return getSetting('agenda_enabled') === '1'; }
    2024
    2125function esc(s) { return String(s || '').replace(/[&<>"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c])); }
     
    3034
    3135router.get('/shows', (req, res, next) => {
    32   if (!premiumUnlocked()) return next();
     36  if (!premiumUnlocked() || !agendaOn()) return next();
    3337  const site = res.locals.site;
    3438  if (!site) return next();
     
    4246
    4347router.post('/shows/notify', async (req, res, next) => {
    44   if (!premiumUnlocked()) return next();
     48  if (!premiumUnlocked() || !agendaOn()) return next();
    4549  const site = res.locals.site;
    4650  if (!site) return next();
  • src/views/pages/admin-shows.ejs

    rd7b5a6c r68b27a4  
    1010
    1111  <% if (msg) { %><div class="ash-msg ash-<%= (typeof msgKind!=='undefined')?msgKind:'' %>"><%= msg %></div><% } %>
     12
     13  <% var agOn = (typeof agendaEnabled !== 'undefined') && agendaEnabled; %>
     14  <form method="POST" action="<%= siteUrlBase %>/admin/shows/toggle" style="margin:0 0 14px">
     15    <label style="display:flex;align-items:center;gap:10px;cursor:pointer;font-weight:600">
     16      <input type="checkbox" name="enabled" value="1" <%= agOn ? 'checked' : '' %> onchange="this.form.submit()" style="width:18px;height:18px;accent-color:var(--accent)">
     17      <span>Agenda tonen op de site <small style="font-weight:400;opacity:.7">(Agenda-knop in de balk + de agendapagina)</small></span>
     18    </label>
     19    <noscript><button type="submit" class="btn">Opslaan</button></noscript>
     20  </form>
     21  <% if (!agOn) { %><div class="ash-msg">De agenda staat nu <strong>uit</strong> — bezoekers zien geen Agenda-knop en de agendapagina is niet bereikbaar. Zet 'm aan om je evenementen te tonen.</div><% } %>
    1222
    1323  <p class="ash-note"><strong><%= nc %></strong> abonnee(s) voor evenement-aankondigingen.
  • src/views/partials/shared-styles.ejs

    rd7b5a6c r68b27a4  
    5050}
    5151.vs-agenda:hover { color: var(--ink); }
     52.vs-agenda.is-active { background: var(--paper); color: var(--ink); box-shadow: 0 1px 2px rgba(0,0,0,.06); }
    5253
    5354.grid-cols-picker {
  • src/views/partials/view-switcher.ejs

    rd7b5a6c r68b27a4  
    1717    <% } %>
    1818    <div class="view-switcher" role="tablist" aria-label="Weergave">
    19       <% if (typeof premiumUnlocked !== 'undefined' && premiumUnlocked) {
     19      <% if (typeof premiumUnlocked !== 'undefined' && premiumUnlocked && typeof agendaEnabled !== 'undefined' && agendaEnabled) {
    2020           var _sbA = (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '';
     21           var _agActive = (typeof bodyClass === 'string' && bodyClass.indexOf('on-shows') >= 0);
    2122      %>
    22       <a class="vs-agenda" href="<%= _sbA %>/shows" aria-label="Agenda — evenementen">
     23      <a class="vs-agenda<%= _agActive ? ' is-active' : '' %>" href="<%= _sbA %>/shows" aria-label="Agenda — evenementen">
    2324        <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="4" width="18" height="18" rx="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg>
    2425        <span>Agenda</span>
Note: See TracChangeset for help on using the changeset viewer.