Changeset d7e72b8 in Klonkt


Ignore:
Timestamp:
08/09/2026 07:47:48 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
b406d25
Parents:
c832064
Message:

Audio is geen keuze meer: Album en Playlist staan in de balk (shaer-cyg)

De posttype-balk had post/foto/video/audio. Audio verdwijnt als keuze -- alles
wat muziek is landt voortaan op album of playlist, en dat maakt de keuze
betekenisvol in plaats van cosmetisch. Album en Playlist delen het muziekpaneel,
want het verschil zit in de playlist en niet in wat je uploadt.

De knop Audio blijft alleen staan zolang een post nog type=audio IS. Anders zou
het openen van een oude post hem stilzwijgend van type veranderen, en dat is
precies het soort verlies dat niemand ziet gebeuren.

De lijst van geldige types stond op DRIE plaatsen los van elkaar: twee keer in
routes/posts.js en een keer in routes/types.js. Dat viel niet op zolang ze
gelijk waren, maar het faalt stil: kent het opslaan 'playlist' niet, dan wordt
de post zonder melding een gewone post en is de keuze verdwenen in plaats van
geweigerd. Nu een lijst, in config/post-types.js, die ook de editor voedt.

En de migratie: scripts/backfill-post-types.mjs zet bestaande audio-posts om via
postMusicType. Proefdraai is de standaard, --doen schrijft. Wat de afleiding
niet tot album of playlist maakt blijft met rust en wordt apart gemeld -- die
verdienen een blik en geen gok.

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

Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • package.json

    rc832064 rd7e72b8  
    1212    "migrate": "node src/db/migrate.js",
    1313    "reset-admin": "node scripts/reset-admin.mjs",
    14     "backfill:durations": "node scripts/backfill-durations.mjs"
     14    "backfill:durations": "node scripts/backfill-durations.mjs",
     15    "backfill:post-types": "node scripts/backfill-post-types.mjs"
    1516  },
    1617  "dependencies": {
  • src/assets/js/mod/post-edit.js

    rc832064 rd7e72b8  
    980980        b.setAttribute('aria-checked', on ? 'true' : 'false');
    981981      });
    982       panels.forEach(p => { p.hidden = (p.dataset.panel !== tt); });
     982      // data-panel mag meerdere types noemen: Album en Playlist delen het
     983      // muziekpaneel, want het verschil zit in de playlist en niet in de upload.
     984      panels.forEach(p => {
     985        const voor = String(p.dataset.panel || '').trim().split(/\s+/);
     986        p.hidden = !voor.includes(tt);
     987      });
    983988    }
    984989    seg.addEventListener('click', (e) => {
  • src/routes/posts.js

    rc832064 rd7e72b8  
    66import ejs from 'ejs';
    77import db from '../config/database.js';
     8import { POST_TYPES, KEUZE_TYPES } from '../config/post-types.js';
    89import { requireAuth, requireSiteManager, isViewer } from '../middleware/auth.js';
    910import { renderPage } from '../middleware/render.js';
     
    265266    },
    266267    isNew: true,
     268    keuzeTypes: KEUZE_TYPES,
    267269    pageTitle: 'New post',
    268270    bodyClass: 'on-special',
     
    359361  finalSlug = uniqueSlug(site.id, finalSlug);
    360362
    361   const validTypes = new Set(['post', 'foto', 'video', 'audio']);
    362   const finalType = validTypes.has(type) ? type : 'post';
     363  const finalType = POST_TYPES.has(type) ? type : 'post';
    363364  const pollJson = parsePollForm(req.body);   // AS2 Question definition, or null
    364365  const postId = uuid();
     
    454455    post,
    455456    isNew: false,
     457    keuzeTypes: KEUZE_TYPES,
    456458    pollLocked,
    457459    fediOpenAudio: postAudioFediOpen(site.id, post.content),
     
    486488  const newSlug = req.body.slug;
    487489  const action = req.body.action || 'save';
    488   const validTypes = new Set(['post', 'foto', 'video', 'audio']);
    489   const finalType = validTypes.has(type) ? type : (post.type || 'post');
     490  const finalType = POST_TYPES.has(type) ? type : (post.type || 'post');
    490491
    491492  // A poll that has already received votes is frozen (you can still edit the surrounding
  • src/routes/types.js

    rc832064 rd7e72b8  
    88import express from 'express';
    99import db from '../config/database.js';
     10import { POST_TYPES } from '../config/post-types.js';
    1011import { renderPage } from '../middleware/render.js';
    1112
    1213const router = express.Router();
    13 const VALID_TYPES = new Set(['post', 'foto', 'video', 'audio']);
     14// Een lijst, drie gebruikers: zie config/post-types.js.
     15const VALID_TYPES = POST_TYPES;
    1416
    1517router.get('/:type', (req, res) => {
  • src/services/i18n.js

    rc832064 rd7e72b8  
    706706    'pedit.type_video': 'Video',
    707707    'pedit.type_audio': 'Audio',
     708    'pedit.type_album': 'Album',
     709    'pedit.type_playlist': 'Playlist',
    708710    'pedit.s_type': 'Wat voor post?',
    709711    'pedit.audio_up_drop': 'Sleep audio hierheen of klik om te kiezen',
     
    16501652    'pedit.type_video': 'Video',
    16511653    'pedit.type_audio': 'Audio',
     1654    'pedit.type_album': 'Album',
     1655    'pedit.type_playlist': 'Playlist',
    16521656    'pedit.s_type': 'What kind of post?',
    16531657    'pedit.audio_up_drop': 'Drop audio here or click to choose',
     
    25942598    'pedit.type_video': 'Video',
    25952599    'pedit.type_audio': 'Audio',
     2600    'pedit.type_album': 'Album',
     2601    'pedit.type_playlist': 'Playlist',
    25962602    'pedit.s_type': 'Was für ein Beitrag?',
    25972603    'pedit.audio_up_drop': 'Audio hierher ziehen oder klicken',
  • src/views/pages/post-edit.ejs

    rc832064 rd7e72b8  
    2424        Foto → cover/insert hint. %>
    2525    <% var ptype = post.type || 'post'; %>
    26     <% var TYPE_ICONS = { post: '📝', foto: '📷', video: '🎬', audio: '🎵' }; %>
     26    <% var TYPE_ICONS = { post: '📝', foto: '📷', video: '🎬', album: '💿', playlist: '📃', audio: '🎵' }; %>
     27    <%# Audio is geen keuze meer (shaer-cyg): alles wat muziek is landt op Album
     28        of Playlist. De knop blijft alleen staan zolang deze post nog audio IS,
     29        zodat een oude post niet stilzwijgend van type verandert bij het openen. %>
     30    <% var TYPES = (typeof keuzeTypes !== 'undefined' && keuzeTypes.length)
     31                     ? keuzeTypes.slice() : ['post','foto','video','album','playlist']; %>
     32    <% if (ptype === 'audio' && TYPES.indexOf('audio') < 0) TYPES.push('audio'); %>
    2733    <section class="pe-card pe-type-card">
    2834      <div class="pe-section-title"><%= t('pedit.s_type') %></div>
    2935      <input type="hidden" name="type" id="pe-type-input" value="<%= ptype %>">
    3036      <div class="pe-typeseg" role="radiogroup" aria-label="<%= t('pedit.s_type') %>">
    31         <% ['post','foto','video','audio'].forEach(function (tt) { %>
     37        <% TYPES.forEach(function (tt) { %>
    3238          <button type="button" class="pe-typeseg-btn<%= ptype === tt ? ' is-active' : '' %>"
    3339                  data-type="<%= tt %>" role="radio" aria-checked="<%= ptype === tt ? 'true' : 'false' %>">
     
    3844      </div>
    3945
    40       <%# Audio: inline upload (transcodes + drops [[track]] into the post) %>
    41       <div class="pe-type-panel" data-panel="audio" hidden>
     46      <%# Muziek: inline upload (transcodes + drops [[track]] into the post).
     47          Album en Playlist delen dit paneel -- het verschil zit in de playlist,
     48          niet in wat je hier uploadt. Audio staat er alleen nog voor oude posts. %>
     49      <div class="pe-type-panel" data-panel="album playlist audio" hidden>
    4250        <div class="pe-audio-up" id="pe-audio-drop" tabindex="0" role="button" aria-label="<%= t('pedit.audio_up_drop') %>">
    4351          <input type="file" id="pe-audio-file" accept="audio/*,.mp3,.m4a,.ogg,.opus,.flac,.wav" multiple hidden>
Note: See TracChangeset for help on using the changeset viewer.