Changeset 34a0053 in Klonkt for src/views


Ignore:
Timestamp:
08/13/2026 09:16:05 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
4101c89
Parents:
4766720
Message:

Het slot afmaken: posten tegenhouden en grijzen wat dicht is

Robin keek naar zijn verhuisde instance en zei: alles is nog functioneel. Klopt, en
er zaten drie fouten in wat ik gisteren bouwde.

EEN: movedLock stond niet in de default-export, terwijl de routes hem via die weg
aanroepen. ActivityPubService.movedLock was dus geen functie, en elke route die hem
raakte gooide een 500. Daarom zag Robin ook geen banner op Connect: die pagina
strandde voordat hij hem kon tonen. Twee bestaande tests vielen hierdoor om zodra
ik de poort in de aanmaakroute zette, en dat was maar goed ook.

TWEE: de poort zat op de BEZORGING en niet op het MAKEN. deliverCreate weigerde,
maar de post werd daarvoor al opgeslagen. Je kon dus gewoon schrijven en publiceren;
het federeerde alleen niet. Dan lijkt het gelukt, staat het er, en sterft het met
het domein: precies de halve toestand die dit slot moest voorkomen, en die ik
vandaag drie keer bij anderen heb aangewezen.

DRIE: de UI wist van niets. Alleen connect.ejs en de homepage kenden movedTo; de
posteditor, de like- en boostknoppen en het reactieveld stonden er gewoon. Voor een
gebruiker ziet dat eruit als een werkende site.

Changed files:
src/services/ActivityPubService.js

  • movedLock in de default-export (de oorzaak van de 500's)

src/routes/posts.js

  • /posts/create weigert met 409 op een verhuisd account, VOOR de post bestaat
  • /posts/:slug/save weigert alleen het alsnog PUBLICEREN van een concept; een bestaande post bewerken mag, daar wil je "ik ben verhuisd naar" in kunnen zetten en die URI bestaat al

src/middleware/site.js

  • res.locals.movedTo, zodat elke view kan grijzen wat toch geweigerd wordt. Zelfde plek en zelfde reden als mayReply erboven

src/views/partials/tl-item.ejs

  • like, boost en reageren krijgen disabled; blokkeren blijft klikbaar, dat is een veiligheidsklep net als rapporteren

src/views/pages/news.ejs

  • banner bovenaan plus de grijze staat. Een uitleg boven de lijst en niet een tooltip per knop, want een tooltip op een disabled knop is onzichtbaar

test/moved-lockdown.test.js

  • 12 en 13: de aanmaakroute strandt op 409, en een gewoon account niet

remarks: 951 groen in UTC en Europe/Amsterdam. De Krant in beide standen gerenderd:
banner alleen als er verhuisd is, geen onvertaalde sleutels. Onderweg viel mijn
eigen testopzet twee keer om op ontbrekende locals (timeline, thumb); dat was de
test.

Les voor mezelf: ik had dit gisteren "af" genoemd terwijl de enige controle een
grep op de uitgerolde bestanden was. Dat de code ergens staat is niet hetzelfde als
dat hij draait.

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

Location:
src/views
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/views/pages/news.ejs

    r4766720 r34a0053  
    77    </button>
    88  </div>
     9  <% if (typeof movedTo !== 'undefined' && movedTo) { %>
     10    <%# Eén uitleg bovenaan in plaats van een tooltip per knop: een tooltip op een
     11        uitgeschakelde knop is toch onzichtbaar. Lezen blijft werken, dus de Krant
     12        zelf staat er gewoon onder. %>
     13    <div class="alert alert-error tl-moved">
     14      <strong><%= t('tl.moved_title') %></strong>
     15      <p><%= t('tl.moved_lead') %> <a href="<%= movedTo %>"><%= movedTo %></a></p>
     16      <p class="form-hint"><%= t('tl.moved_hint') %></p>
     17    </div>
     18  <% } %>
    919  <p class="tl-lead"><%= t('tl.lead') %></p>
    1020
     
    127137  /* Uniform circular action buttons with coloured icons (no emoji). */
    128138  .tl-actions { display: flex; gap: .5rem; margin-top: .9rem; align-items: center; }
     139  /* Verhuisd account: liken, boosten en reageren worden door de service toch
     140     geweigerd, dus toon dat ook. Blokkeren blijft aanklikbaar (veiligheidsklep). */
     141  .tl-act[disabled] { opacity: .35; cursor: not-allowed; }
     142  .tl-actions.is-moved { position: relative; }
    129143  .tl-act-form { margin: 0; display: inline-flex; }
    130144  .tl-act { width: 36px; height: 36px; flex: 0 0 36px; border-radius: 50%; padding: 0; box-sizing: border-box;
  • src/views/partials/tl-item.ejs

    r4766720 r34a0053  
    3535          <% if (p.url) { %><a class="tl-orig" href="<%= p.url %>" target="_blank" rel="nofollow noopener"><%= t('tl.view_original') %></a><% } %>
    3636
    37           <div class="tl-actions">
    38             <form method="post" action="/news/like" class="tl-act-form tl-react-form"><input type="hidden" name="note" value="<%= p.id %>"><input type="hidden" name="author" value="<%= p.author_uri %>"><button type="submit" class="tl-act tl-act-like<%= p.liked ? ' is-on' : '' %>" title="<%= p.liked ? t('fedi.unlike_short') : t('fedi.likes') %>" aria-label="<%= p.liked ? t('fedi.unlike_short') : t('fedi.likes') %>"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2.6l2.9 5.88 6.49.95-4.7 4.58 1.11 6.46L12 17.96l-5.8 3.06 1.1-6.46-4.69-4.58 6.49-.95z"/></svg></button></form>
    39             <form method="post" action="/news/boost" class="tl-act-form tl-react-form"><input type="hidden" name="note" value="<%= p.id %>"><input type="hidden" name="author" value="<%= p.author_uri %>"><button type="submit" class="tl-act tl-act-boost<%= p.boosted ? ' is-on' : '' %>" title="<%= p.boosted ? t('tl.unboost') : t('fedi.boosts') %>" aria-label="<%= p.boosted ? t('tl.unboost') : t('fedi.boosts') %>"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="17 1 21 5 17 9"/><path d="M3 11V9a4 4 0 0 1 4-4h14"/><polyline points="7 23 3 19 7 15"/><path d="M21 13v2a4 4 0 0 1-4 4H3"/></svg></button></form>
    40             <button type="button" class="tl-act tl-act-reply fedi-remote-reply-btn" data-fedi-uri="<%= p.id %>" data-fedi-ph="<%= t('fedi.remote_ph') %>" title="<%= t('fedi.remote_reply') %>" aria-label="<%= t('fedi.remote_reply') %>"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="9 17 4 12 9 7"/><path d="M20 18v-2a4 4 0 0 0-4-4H4"/></svg></button>
     37          <% var _mv = (typeof movedTo !== 'undefined' && movedTo) ? movedTo : null; %>
     38          <%# Verhuisd: liken, boosten en reageren worden door de service toch
     39              geweigerd. Grijs ze dan ook, want een knop die niets doet laat je
     40              zoeken naar een storing die er niet is. Blokkeren blijft wel werken:
     41              dat is een veiligheidsklep, net als rapporteren. %>
     42          <div class="tl-actions<%= _mv ? ' is-moved' : '' %>">
     43            <form method="post" action="/news/like" class="tl-act-form tl-react-form"><input type="hidden" name="note" value="<%= p.id %>"><input type="hidden" name="author" value="<%= p.author_uri %>"><button type="submit" <%= _mv ? "disabled" : "" %> class="tl-act tl-act-like<%= p.liked ? ' is-on' : '' %>" title="<%= p.liked ? t('fedi.unlike_short') : t('fedi.likes') %>" aria-label="<%= p.liked ? t('fedi.unlike_short') : t('fedi.likes') %>"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2.6l2.9 5.88 6.49.95-4.7 4.58 1.11 6.46L12 17.96l-5.8 3.06 1.1-6.46-4.69-4.58 6.49-.95z"/></svg></button></form>
     44            <form method="post" action="/news/boost" class="tl-act-form tl-react-form"><input type="hidden" name="note" value="<%= p.id %>"><input type="hidden" name="author" value="<%= p.author_uri %>"><button type="submit" <%= _mv ? "disabled" : "" %> class="tl-act tl-act-boost<%= p.boosted ? ' is-on' : '' %>" title="<%= p.boosted ? t('tl.unboost') : t('fedi.boosts') %>" aria-label="<%= p.boosted ? t('tl.unboost') : t('fedi.boosts') %>"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="17 1 21 5 17 9"/><path d="M3 11V9a4 4 0 0 1 4-4h14"/><polyline points="7 23 3 19 7 15"/><path d="M21 13v2a4 4 0 0 1-4 4H3"/></svg></button></form>
     45            <button type="button" <%= _mv ? "disabled" : "" %> class="tl-act tl-act-reply fedi-remote-reply-btn" data-fedi-uri="<%= p.id %>" data-fedi-ph="<%= t('fedi.remote_ph') %>" title="<%= t('fedi.remote_reply') %>" aria-label="<%= t('fedi.remote_reply') %>"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="9 17 4 12 9 7"/><path d="M20 18v-2a4 4 0 0 0-4-4H4"/></svg></button>
    4146            <form method="post" action="/blocking/add" class="tl-act-form" data-confirm="<%= t('tl.block') %>?"><input type="hidden" name="target" value="<%= p.author_uri %>"><button type="submit" class="tl-act tl-act-block" title="<%= t('tl.block') %>" aria-label="<%= t('tl.block') %>"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><line x1="4.9" y1="4.9" x2="19.1" y2="19.1"/></svg></button></form>
    4247          </div>
Note: See TracChangeset for help on using the changeset viewer.