Changeset 8e1af9c in Klonkt


Ignore:
Timestamp:
08/22/2026 09:11:56 AM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
16fd4fe
Parents:
25dd08f
git-author:
Robin <roboburr@…> (08/22/2026 09:11:36 AM)
git-committer:
Robin <roboburr@…> (08/22/2026 09:11:56 AM)
Message:

Mixtape als posttype, kiesbaar in de composer

Het bandje bestond wel als soort playlist, maar je kon er geen post van maken.
Nu wel: een eigen knop met een eigen teken, en het muziekpaneel deelt hij met
album en playlist -- het verschil zit in de playlist die je insluit, niet in
wat je uploadt.

KEUZE_TYPES en MUZIEK_TYPES in config/post-types.js waren de goede plek; dat
bestand bestaat precies omdat die lijst eerder drie keer los rondslingerde.

Nog twee keer dezelfde binaire vorm opgeruimd, en de tweede was een echte:

  • VOLGBAAR kende geen mixtape, dus het type volgde de muziek niet.
  • De editor zocht de soort op met de vorm p.kind === 'playlist' ? 'playlist' : 'album'. Het scherm zag dus album terwijl de server mixtape opsloeg: het type verspringt onder je handen bij het bewaren.
  • De renderer koos teken en woord met dezelfde tweewegkeuze, waardoor een ingesloten mixtape het jasje van een album droeg.

De SPELER is er nog niet -- een mixtape rendert voorlopig als de gewone lijst.
Wat af is, is dat hij overal zichzelf noemt.

Zes tests, waaronder de opslagweg door de echte route: kent de opslag een type
niet, dan wordt de post zonder melding een gewone post, en dat is precies de
fout waar config/post-types.js voor waarschuwt. Een van de tests riep eerst een
methode aan die niet bestaat en sloeg zichzelf over; die gaat nu door
embedPlaylistShortcodes heen en valt om als je de tweewegkeuze terugzet.

MOD_V naar 51.

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

Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/mod/post-edit.js

    r25dd08f r8e1af9c  
    88// Dezelfde regel die de server gebruikt -- zie shared/post-music-type.js voor
    99// waarom hij daar staat en niet twee keer.
    10 import { afleidenUitInsluitingen } from '../shared/post-music-type.js';
     10import { afleidenUitInsluitingen, SOORTEN } from '../shared/post-music-type.js';
    1111
    1212// De oude inline scripts draaiden bij ELKE render; een module draait zijn
     
    10201020    // alleen als ijkpunt onthouden. Anders zou een oude post van type veranderen
    10211021    // door hem te bekijken.
    1022     const VOLGBAAR = new Set(['post', 'album', 'playlist', 'audio']);
     1022    const VOLGBAAR = new Set(['post', 'album', 'playlist', 'mixtape', 'audio']);
    10231023    const kindVan = new Map();
    10241024    let vorigeAfleiding = null;
     
    10281028      .then((j) => {
    10291029        if (j && j.ok && Array.isArray(j.playlists)) {
    1030           for (const p of j.playlists) kindVan.set(p.id, p.kind === 'playlist' ? 'playlist' : 'album');
     1030          // De soort ZOALS HIJ IS. Dit was `=== 'playlist' ? 'playlist' : 'album'`,
     1031          // en dan ziet de editor een mixtape als album terwijl de server hem
     1032          // als mixtape opslaat: het type verspringt onder je handen bij het
     1033          // bewaren. SOORTEN is dezelfde lijst die de server gebruikt.
     1034          for (const p of j.playlists) kindVan.set(p.id, SOORTEN.includes(p.kind) ? p.kind : 'album');
    10311035        }
    10321036      })
  • src/config/post-types.js

    r25dd08f r8e1af9c  
    1313 * zo'n post mag zijn type niet stilzwijgend weggooien -- tot de backfill hem
    1414 * heeft omgezet. Daarna kan audio hier weg.
     15 *
     16 * MIXTAPE erbij (Robins idee, 21-8): een bandje, samengesteld uit de nummers
     17 * van een playlist, dat alleen vooruit en achteruit speelt. Het draagt muziek,
     18 * dus het deelt het muziekpaneel en de afleiding met album en playlist -- het
     19 * verschil zit in de playlist die je insluit, niet in wat je hier uploadt.
    1520 */
    1621
    1722/** Types die een gebruiker in de editor kan kiezen. */
    18 export const KEUZE_TYPES = ['post', 'foto', 'video', 'album', 'playlist'];
     23export const KEUZE_TYPES = ['post', 'foto', 'video', 'album', 'playlist', 'mixtape'];
    1924
    2025/** Alles wat in de kolom posts.type mag staan, inclusief wat er historisch is. */
     
    2227
    2328/** De types die muziek dragen -- ze delen hetzelfde paneel en dezelfde afleiding. */
    24 export const MUZIEK_TYPES = new Set(['album', 'playlist', 'audio']);
     29export const MUZIEK_TYPES = new Set(['album', 'playlist', 'audio', 'mixtape']);
  • src/services/AudioEmbedService.js

    r25dd08f r8e1af9c  
    1010 * </figure>
    1111 */
     12
     13// Dezelfde lijst soorten als de server en de editor gebruiken. Zie
     14// assets/js/shared/post-music-type.js: die module is puur, dus hij mag hier.
     15import { SOORTEN } from '../assets/js/shared/post-music-type.js';
    1216
    1317// "Open in" icons (brand-colored via CSS .pat-link--).
     
    538542
    539543      const albumDomId = 'album-' + id;
    540       const kind = (pl.kind === 'playlist') ? 'playlist' : 'album';
    541       const kindLabel = kind === 'playlist' ? '📃 Playlist' : '💿 Album';
     544      // De soort zoals hij is opgeslagen. Stond hier als ternair met twee
     545      // uitkomsten, en dan draagt een mixtape het jasje en het woord van een
     546      // album -- dezelfde vorm die op vier andere plekken al misging.
     547      // DE SPELER IS ER NOG NIET. Een mixtape rendert voorlopig als de gewone
     548      // lijst; wat hier af is, is dat hij zichzelf goed noemt.
     549      const kind = SOORTEN.includes(pl.kind) ? pl.kind : 'album';
     550      const KIND_LABEL = { album: '💿 Album', playlist: '📃 Playlist', mixtape: '📼 Mixtape' };
     551      const kindLabel = KIND_LABEL[kind] || KIND_LABEL.album;
    542552      const titleH  = this.escape(pl.title || 'Naamloos');
    543553      const artistH = this.escape(pl.artist || '');
     
    638648            data-pcms-track-url="${firstUrl}"
    639649            data-pcms-album-id="${albumDomId}"
    640             aria-label="Speel ${kind === 'playlist' ? 'playlist' : 'album'}">
     650            aria-label="Speel ${kind}">
    641651      ${coverH
    642652        ? `<span class="post-album-cover" style="background-image:url('${coverH}')"></span>`
  • src/services/i18n.js

    r25dd08f r8e1af9c  
    770770    'pedit.type_audio': 'Audio',
    771771    'pedit.type_album': 'Album',
    772     'pedit.type_playlist': 'Playlist',
     772    'pedit.type_playlist': 'Playlist', 'pedit.type_mixtape': 'Mixtape',
    773773    'pedit.s_type': 'Wat voor post?',
    774774    'pedit.audio_up_drop': 'Sleep audio hierheen of klik om te kiezen',
     
    17791779    'pedit.type_audio': 'Audio',
    17801780    'pedit.type_album': 'Album',
    1781     'pedit.type_playlist': 'Playlist',
     1781    'pedit.type_playlist': 'Playlist', 'pedit.type_mixtape': 'Mixtape',
    17821782    'pedit.s_type': 'What kind of post?',
    17831783    'pedit.audio_up_drop': 'Drop audio here or click to choose',
     
    27882788    'pedit.type_audio': 'Audio',
    27892789    'pedit.type_album': 'Album',
    2790     'pedit.type_playlist': 'Playlist',
     2790    'pedit.type_playlist': 'Playlist', 'pedit.type_mixtape': 'Mixtape',
    27912791    'pedit.s_type': 'Was für ein Beitrag?',
    27922792    'pedit.audio_up_drop': 'Audio hierher ziehen oder klicken',
  • src/views/pages/post-edit.ejs

    r25dd08f r8e1af9c  
    2424        Foto → cover/insert hint. %>
    2525    <% var ptype = post.type || 'post'; %>
    26     <% var TYPE_ICONS = { post: '📝', foto: '📷', video: '🎬', album: '💿', playlist: '📃', audio: '🎵' }; %>
     26    <% var TYPE_ICONS = { post: '📝', foto: '📷', video: '🎬', album: '💿', playlist: '📃', mixtape: '📼', audio: '🎵' }; %>
    2727    <%# Audio is geen keuze meer (shaer-cyg): alles wat muziek is landt op Album
    2828        of Playlist. De knop blijft alleen staan zolang deze post nog audio IS,
    2929        zodat een oude post niet stilzwijgend van type verandert bij het openen. %>
    3030    <% var TYPES = (typeof keuzeTypes !== 'undefined' && keuzeTypes.length)
    31                      ? keuzeTypes.slice() : ['post','foto','video','album','playlist']; %>
     31                     ? keuzeTypes.slice() : ['post','foto','video','album','playlist','mixtape']; %>
    3232    <% if (ptype === 'audio' && TYPES.indexOf('audio') < 0) TYPES.push('audio'); %>
    3333    <section class="pe-card pe-type-card">
     
    4545
    4646      <%# 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>
     47          Album, Playlist en Mixtape delen dit paneel -- het verschil zit in de
     48          playlist die je insluit, niet in wat je hier uploadt. Audio staat er
     49          alleen nog voor oude posts. %>
     50      <div class="pe-type-panel" data-panel="album playlist mixtape audio" hidden>
    5051        <div class="pe-audio-up" id="pe-audio-drop" tabindex="0" role="button" aria-label="<%= t('pedit.audio_up_drop') %>">
    5152          <input type="file" id="pe-audio-file" accept="audio/*,.mp3,.m4a,.ogg,.opus,.flac,.wav" multiple hidden>
  • src/views/shell.ejs

    r25dd08f r8e1af9c  
    505505  // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig
    506506  // bumpen kost een bugfix die nooit aankomt.
    507   var MOD_V = 50;
     507  var MOD_V = 51;
    508508
    509509  // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Note: See TracChangeset for help on using the changeset viewer.