Changeset 8afbdd6 in Klonkt for src/views/pages/admin-users.ejs


Ignore:
Timestamp:
06/14/2026 06:07:51 PM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
c869272
Parents:
b94c08e
Message:

feat: viewer role + artists directory + Klonkt Hub Beta rebrand

Viewer role (replaces the separate view-mode/readonly toggle):

  • 'kijker' is now a real role (VALID_ROLES) selectable in Admin. May view EVERYTHING including Admin, but cannot modify anything.
  • isViewer(user) (= role kijker or legacy readonly flag) is the source; requireGod/requireSiteManager(BySlug) let a viewer through (viewing), the global guard 403s every write. Existing readonly accounts are migrated on each role change (readonly=0).
  • Write leaks via GET patched: /prutter/new (INSERT) blocks for viewers, /prutter/:id skips markAsRead (UPDATE); WS upgrade rejects viewers (the HTTP guard doesn't cover WebSockets).
  • Clean "Viewer mode" page (viewer-blocked) instead of raw 403 text; styled sticky banner; account page shows read-only UI instead of an upload button that silently 403s. canMutate hides write buttons.

Scalability (>50 artists):

  • Hub home shows max 24 (most active first) + "All N artists ->".
  • New searchable, paginated /artiesten directory (hub only).
  • 'user' + 'artiesten' reserved as slugs.

Rebrand PrutFolio v1 -> Klonkt Hub Beta (footer, PWA manifest, account/
admin texts, default page title, startup, README; internal package +
PWA id 'prutfolio' remain for stability).

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/views/pages/admin-users.ejs

    rb94c08e r8afbdd6  
    55    <div>
    66      <h1>Users</h1>
    7       <p class="ax-tagline">Beheer gebruikers, rollen, en verwijderingen.</p>
     7      <p class="ax-tagline">Beheer gebruikers, rollen, en verwijderingen. Rol <strong>kijker</strong> = alles bekijken (incl. Beheer), niets wijzigen — handig voor demo's.</p>
    88    </div>
    99  </header>
     
    5858              <label class="ax-role">
    5959                <span>Rol</span>
    60                 <select name="role" onchange="this.form.submit()" <% if (u.id === user.id) { %>disabled<% } %>>
     60                <select name="role" onchange="this.form.submit()" <% if (u.id === user.id || !canMutate) { %>disabled<% } %>>
     61                  <option value="kijker" <%= u.role === 'kijker' ? 'selected' : '' %>>kijker</option>
    6162                  <option value="member" <%= u.role === 'member' ? 'selected' : '' %>>member</option>
    6263                  <option value="admin"  <%= u.role === 'admin'  ? 'selected' : '' %>>admin</option>
     
    6667            </form>
    6768
    68             <form method="post" action="/admin/users/<%= u.id %>/readonly" class="ax-role-form">
    69               <label class="ax-role ax-ro" title="Alleen-lezen: kan alles bekijken, niets wijzigen">
    70                 <span>Kijk-modus</span>
    71                 <input type="checkbox" name="readonly" value="1" <%= u.readonly ? 'checked' : '' %>
    72                        onchange="this.form.submit()" <% if (u.id === user.id) { %>disabled<% } %>>
    73               </label>
    74             </form>
    75 
    76             <% if (u.id !== user.id) { %>
     69            <% if (u.id !== user.id && canMutate) { %>
    7770              <% var _warn = (u.post_count + u.site_count > 0)
    7871                   ? ('Dit verwijdert ook hun site + ' + u.post_count + ' post(s). ')
     
    8376              </form>
    8477            <% } else { %>
    85               <%# Lege plek zodat de kolommen (rol/kijk-modus) op elke rij uitlijnen. %>
     78              <%# Lege plek zodat de rol-kolom op elke rij uitlijnt. %>
    8679              <span class="ax-icon-btn-spacer" aria-hidden="true"></span>
    8780            <% } %>
Note: See TracChangeset for help on using the changeset viewer.