source: Klonkt/src/views/pages/admin-migrate.ejs@ fc664ce

main
Last change on this file since fc664ce was fc664ce, checked in by Robin <roboburr@…>, 4 weeks ago

Je volglijst verhuist mee naar de migrate-pagina

Robin stuurde een schermafbeelding van het blok op Connect: "this is still very
ugly". Terecht. "Kies je gedownloade CSV-bestand:" stond naast zijn invoerveld,
"Of plak" werd naar rechts geduwd en "de lijst hier:" viel eronder, met een
textarea van vijf tekens breed ertussen.

De reden is simpel: er was geen enkele opmaak voor .tl-move. Geen display,
geen breedte, niets. De labels waren dus inline en de tekst brak om de velden
heen.

Niet ter plekke bijgepoetst maar verplaatst, want dit is een migratie-optie en
die horen sinds vanmiddag bij elkaar. Op /admin/migrate erft het blok de
kaartopmaak die de andere secties al hadden: labels op eigen regels, invoervelden
over de volle breedte.

Gemeten in de browser: label display block, textarea 408px in een kaart van
455px. Op Connect blijft niets achter.

Changed files:
src/views/pages/admin-migrate.ejs

  • de volglijst als echte sectie, met downloadknop, bestand, plakveld

src/views/pages/connect.ejs

  • het ongestileerde <details>-blok eruit

src/routes/posts.js

  • /news/following/import mag terugsturen naar een eigen pad

src/services/i18n.js

  • mig.follows_note in nl/en/de

remarks: de sectie hergebruikt de bestaande tl.move_*-teksten, dus er hoefde
niets opnieuw vertaald. Suite 1005 groen.

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

  • Property mode set to 100644
File size: 15.6 KB
Line 
1<div class="container mig-wrap">
2 <h1><%= t('mig.title') %></h1>
3 <p class="mig-lead"><%= t('mig.lead') %></p>
4
5 <% if (typeof success !== 'undefined' && success) { %><div class="alert alert-success"><%= success %></div><% } %>
6 <% if (typeof error !== 'undefined' && error) { %><div class="alert alert-error"><%= error %></div><% } %>
7
8 <%# ── Je oude account claimen (FEP-7628 alsoKnownAs) ─────────── %>
9 <%# Bewust als EERSTE: zonder deze claim weigert de oude instantie de Move
10 met no_backreference, en kan de ophaalknop hieronder ook niets. Dit stond
11 op de site-bewerkpagina tussen de kleuren; daar zoekt niemand het als hij
12 aan het verhuizen is. %>
13 <section class="mig-card">
14 <h2><%= t('mig.alias_title') %></h2>
15 <p class="form-hint"><%= t('mig.alias_hint') %></p>
16 <form method="post" action="/admin/migrate/aliases">
17 <label for="mig-alias"><%= t('mig.alias_label') %></label>
18 <textarea id="mig-alias" name="ap_aliases" rows="3" class="mig-input"
19 placeholder="@oud@mastodon.social&#10;https://oude-klonkt.nl/ap/users/jij"><%= aliassen || '' %></textarea>
20 <p class="form-hint"><%= t('mig.alias_note') %></p>
21 <button type="submit" class="btn"><%= t('mig.alias_btn') %></button>
22 </form>
23 </section>
24
25 <%# ── Exporteren ─────────────────────────────────────────────── %>
26 <section class="mig-card">
27 <h2><%= t('mig.export_title') %></h2>
28 <p class="form-hint"><%= t('mig.export_hint') %></p>
29
30 <% if (telling) { %>
31 <ul class="mig-counts">
32 <li><strong><%= telling.posts %></strong> <%= t('mig.c_posts') %></li>
33 <li><strong><%= telling.replies %></strong> <%= t('mig.c_replies') %></li>
34 <li><strong><%= telling.media %></strong> <%= t('mig.c_media') %></li>
35 <%# Muziek APART tellen, niet onder "media". Dit ontbrak, en juist daardoor
36 kon een export van 140 nummers er als 4,5 MB uitzien zonder dat iemand
37 het merkte: de teller zei "39 mediabestanden" en zweeg over de rest. %>
38 <% if (telling.tracks) { %>
39 <%# Wat er ECHT meegaat, niet hoeveel rijen er in de database staan.
40 "8 nummers" met daaronder "van 3 ontbreekt het bestand" telt niet
41 op; 5 plus die waarschuwing wel. %>
42 <li><strong><%= telling.tracks - (telling.audioMissing || 0) %></strong> <%= t('mig.c_tracks') %></li>
43 <% } %>
44 <% if (telling.playlists) { %>
45 <li><strong><%= telling.playlists %></strong> <%= t('mig.c_playlists') %></li>
46 <% } %>
47 <% if (typeof telling.following === 'number') { %>
48 <li><strong><%= telling.following %></strong> <%= t('mig.c_following') %></li>
49 <% } %>
50 <li><strong><%= mb(telling.bytes) %></strong> <%= t('mig.c_size') %></li>
51 </ul>
52
53 <% if (telling.ontbrekend) { %>
54 <%# Niets stils: media die op schijf ontbreekt wordt geteld en gemeld, want
55 een archief dat stilzwijgend minder bevat is erger dan een waarschuwing. %>
56 <p class="alert alert-error"><%= t('mig.missing', { n: telling.ontbrekend }) %></p>
57 <% } %>
58
59 <% if (telling.audioMissing) { %>
60 <%# Een eigen zin voor muziek. "N mediaverwijzingen" zei niets over de
61 vraag die er toe doet: gaat mijn bibliotheek mee. %>
62 <p class="alert alert-error"><%= t('mig.audio_missing', { n: telling.audioMissing }) %></p>
63 <% } %>
64
65
66 <% if (telling.groot) { %>
67 <p class="alert alert-error"><%= t('mig.too_big') %></p>
68 <% } else { %>
69 <p><a class="btn btn-primary" href="/admin/migrate/export"><%= t('mig.export_btn') %></a></p>
70 <% } %>
71 <% } else { %>
72 <p class="form-hint"><%= t('mig.export_none') %></p>
73 <% } %>
74 </section>
75
76 <%# ── Rechtstreeks ophalen (FEP-1580) ────────────────────────── %>
77 <section class="mig-card">
78 <h2><%= t('mig.pull_title') %></h2>
79 <p class="form-hint"><%= t('mig.pull_hint') %></p>
80
81 <% if (haalVerslag) { %>
82 <div class="mig-report<%= haalVerslag.error ? '' : ' is-done' %>">
83 <% if (haalVerslag.error) { %>
84 <h3><%= t('mig.pull_failed') %></h3>
85 <%# Elke weigering krijgt een eigen zin. "Er ging iets mis" laat je
86 raden welke van de twee kanten van de afspraak ontbreekt, en dat
87 is precies wat je moet weten om het op te lossen. %>
88 <p><%= t('mig.e_' + haalVerslag.error) !== 'mig.e_' + haalVerslag.error
89 ? t('mig.e_' + haalVerslag.error) : (haalVerslag.melding || haalVerslag.error) %></p>
90 <% if (haalVerslag.error === 'not_moved_here' && haalVerslag.movedTo) { %>
91 <p class="form-hint"><%= t('mig.e_points_at') %> <code><%= haalVerslag.movedTo %></code></p>
92 <% } %>
93 <% } else { %>
94 <h3><%= t('mig.pull_done') %></h3>
95 <ul class="mig-counts">
96 <li><strong><%= haalVerslag.posts %></strong> <%= t('mig.r_imported') %></li>
97 <% if (haalVerslag.overgeslagen) { %><li><strong><%= haalVerslag.overgeslagen %></strong> <%= t('mig.r_skipped') %></li><% } %>
98 <% if (haalVerslag.media) { %><li><strong><%= haalVerslag.media %></strong> <%= t('mig.r_media') %></li><% } %>
99 <% if (haalVerslag.blocks) { %><li><strong><%= haalVerslag.blocks %></strong> <%= t('mig.r_blocks') %></li><% } %>
100 <% if (haalVerslag.tracksBinnen) { %><li><strong><%= haalVerslag.tracksBinnen %></strong> <%= t('mig.c_tracks') %></li><% } %>
101 <%# Aangevuld telt apart van nieuw. Een tweede ronde die "0 erbij"
102 meldt terwijl hij drie nummers compleet maakte, leest als niets
103 gedaan. %>
104 <% if (haalVerslag.tracksBijgewerkt) { %><li><strong><%= haalVerslag.tracksBijgewerkt %></strong> <%= t('mig.r_tracks_updated') %></li><% } %>
105 <% if (haalVerslag.postsBijgewerkt) { %><li><strong><%= haalVerslag.postsBijgewerkt %></strong> <%= t('mig.r_posts_updated') %></li><% } %>
106 <% if (haalVerslag.linksBijgetrokken) { %><li><strong><%= haalVerslag.linksBijgetrokken %></strong> <%= t('mig.r_links_fixed') %></li><% } %>
107 <% if (haalVerslag.playlistsBinnen) { %><li><strong><%= haalVerslag.playlistsBinnen %></strong> <%= t('mig.c_playlists') %></li><% } %>
108 </ul>
109 <% if (haalVerslag.tracksMislukt) { %>
110 <p class="alert alert-error"><%= t('mig.r_tracks_missing', { n: haalVerslag.tracksMislukt }) %></p>
111 <% } %>
112 <% } %>
113 <% if (haalVerslag.waarschuwingen && haalVerslag.waarschuwingen.length) { %>
114 <ul class="mig-warnlist">
115 <% haalVerslag.waarschuwingen.slice(0, 6).forEach(function (w) { %><li><%= w %></li><% }); %>
116 </ul>
117 <% } %>
118 </div>
119 <% } %>
120
121 <form method="post" action="/admin/migrate/pull">
122 <label for="mig-bron"><%= t('mig.pull_source') %></label>
123 <input type="url" id="mig-bron" name="bron" value="<%= bron || '' %>"
124 placeholder="https://oude-klonkt.nl/ap/users/jij" class="mig-input">
125 <p class="form-hint"><%= t('mig.pull_source_hint') %></p>
126 <button type="submit" class="btn"><%= t('mig.pull_btn') %></button>
127 </form>
128
129 <% if (mig && (mig.total || mig.moves)) { %>
130 <p class="form-hint mig-state">
131 <%= t('mig.state', { n: mig.total }) %>
132 <%= mig.complete ? t('mig.state_done') : t('mig.state_busy') %>
133 </p>
134 <% } %>
135 </section>
136
137 <%# ── Importeren ─────────────────────────────────────────────── %>
138 <section class="mig-card">
139 <h2><%= t('mig.import_title') %></h2>
140 <p class="form-hint"><%= t('mig.import_hint') %></p>
141
142 <% if (verslag) { %>
143 <div class="mig-report<%= verslag.echt ? ' is-done' : '' %>">
144 <h3><%= verslag.echt ? t('mig.r_done') : t('mig.r_dry') %></h3>
145 <p class="form-hint"><%= verslag.bestand %> &middot; <%= mb(verslag.bytes) %></p>
146 <ul class="mig-counts">
147 <li><strong><%= verslag.posts %></strong> <%= verslag.echt ? t('mig.r_imported') : t('mig.r_would') %></li>
148 <li><strong><%= verslag.overgeslagen %></strong> <%= t('mig.r_skipped') %></li>
149 <% if (verslag.overschreven) { %><li><strong><%= verslag.overschreven %></strong> <%= t('mig.r_overwritten') %></li><% } %>
150 <% if (verslag.mediaMissing) { %><li><strong><%= verslag.mediaMissing %></strong> <%= t('mig.r_media_missing') %></li><% } %>
151 <% if (verslag.media) { %><li><strong><%= verslag.media %></strong> <%= t('mig.r_media') %></li><% } %>
152 <%# Ook hier: muziek apart. Zonder deze twee regels zie je aan de
153 ontvangende kant net zo min of je bibliotheek is aangekomen. %>
154 <% if (verslag.tracks) { %><li><strong><%= verslag.tracks %></strong> <%= t('mig.c_tracks') %></li><% } %>
155 <% if (verslag.playlists) { %><li><strong><%= verslag.playlists %></strong> <%= t('mig.c_playlists') %></li><% } %>
156 <% if (verslag.linksBijgetrokken) { %><li><strong><%= verslag.linksBijgetrokken %></strong> <%= t('mig.r_links_fixed') %></li><% } %>
157 </ul>
158 <% if (verslag.tracksMissing) { %>
159 <p class="alert alert-error"><%= t('mig.r_tracks_missing', { n: verslag.tracksMissing }) %></p>
160 <% } %>
161 <% if (verslag.waarschuwingen && verslag.waarschuwingen.length) { %>
162 <ul class="mig-warnlist">
163 <% verslag.waarschuwingen.slice(0, 6).forEach(function (w) { %><li><%= w %></li><% }); %>
164 </ul>
165 <% } %>
166 <% if (verslag.idsBehouden === false) { %>
167 <%# Dit is de belangrijkste regel van het hele verslag: komt het archief
168 van een ANDER adres, dan krijgen de posts nieuwe id's en zijn het
169 nieuwe objecten voor de fediverse. %>
170 <p class="alert alert-error"><%= t('mig.r_new_ids') %></p>
171 <% } %>
172
173 <% if (!verslag.echt && verslag.posts > 0) { %>
174 <form method="post" action="/admin/migrate/import" enctype="multipart/form-data" class="mig-confirm">
175 <p class="form-hint"><%= t('mig.r_confirm_hint') %></p>
176 <label for="mig-file2"><%= t('mig.file_label') %></label>
177 <input type="file" id="mig-file2" name="archief" accept=".zip,application/zip" required>
178 <input type="hidden" name="echt" value="1">
179 <% if (verslag.overschrijf) { %><input type="hidden" name="overschrijf" value="1"><% } %>
180 <button type="submit" class="btn btn-primary"><%= t('mig.r_confirm_btn') %></button>
181 </form>
182 <% } %>
183 </div>
184 <% } %>
185
186 <form method="post" action="/admin/migrate/import" enctype="multipart/form-data">
187 <label for="mig-file"><%= t('mig.file_label') %></label>
188 <input type="file" id="mig-file" name="archief" accept=".zip,application/zip" required>
189
190 <label class="mig-check">
191 <input type="checkbox" name="overschrijf" value="1">
192 <%= t('mig.overwrite_label') %>
193 </label>
194 <p class="form-hint mig-warn"><%= t('mig.overwrite_hint') %></p>
195
196 <button type="submit" class="btn"><%= t('mig.check_btn') %></button>
197 <p class="form-hint"><%= t('mig.check_hint') %></p>
198 </form>
199 </section>
200
201 <%# ── De verhuizing aankondigen (FEP-7628 Move) ──────────────── %>
202 <%# ONDERAAN, en met een rode knop. Dit is de enige knop op deze pagina die
203 de fediverse in gaat en niet terug te draaien is: je volgers verhuizen
204 mee en dit account gaat op slot. Alles hierboven kun je overdoen. %>
205 <section class="mig-card mig-card-danger">
206 <h2><%= t('mig.move_title') %></h2>
207 <p class="form-hint"><%= t('mig.move_hint') %></p>
208 <% if (movedTo) { %>
209 <p class="alert alert-error"><%= t('mig.move_done') %> <code><%= movedTo %></code></p>
210 <% } else { %>
211 <form method="post" action="/admin/sites/<%= site.slug %>/move"
212 onsubmit="return confirm('<%= t('mig.move_confirm') %>');">
213 <input type="hidden" name="next" value="/admin/migrate">
214 <label for="mig-move"><%= t('mig.move_label') %></label>
215 <input type="text" id="mig-move" name="move_target" class="mig-input"
216 placeholder="@nieuw@andere-server.nl" required>
217 <p class="form-hint mig-warn"><%= t('mig.move_warn') %></p>
218 <button type="submit" class="btn btn-danger"><%= t('mig.move_btn') %></button>
219 </form>
220 <% } %>
221 </section>
222
223 <%# ── Wie je volgt ────────────────────────────────────────────── %>
224 <%# Stond op Connect, in een <details> zonder een greintje opmaak: labels als
225 losse tekst naast hun invoerveld, een textarea van vijf regels breed. Hier
226 krijgt hij de kaartopmaak van deze pagina, en hij hoort hier ook: je
227 volglijst meenemen is een migratie-optie. %>
228 <section class="mig-card">
229 <h2><%= t('mig.follows_title') %></h2>
230 <p class="form-hint"><%= t('tl.move_hint') %></p>
231 <p><a class="btn" href="/news/following.csv" download>&#11015; <%= t('tl.move_export') %></a></p>
232
233 <form method="post" action="/news/following/import" enctype="multipart/form-data">
234 <input type="hidden" name="next" value="/admin/migrate">
235 <label for="mig-volg-bestand"><%= t('tl.move_import_file') %></label>
236 <input type="file" id="mig-volg-bestand" name="csvfile" accept=".csv,text/csv,text/plain">
237
238 <label for="mig-volg-csv"><%= t('tl.move_import_lbl') %></label>
239 <textarea id="mig-volg-csv" name="csv" rows="5" spellcheck="false" class="mig-input"
240 placeholder="Account address,Show boosts,Notify on new posts,Languages,Featured"></textarea>
241 <p class="form-hint"><%= t('mig.follows_note') %></p>
242
243 <button type="submit" class="btn btn-primary"><%= t('tl.move_import') %></button>
244 </form>
245 </section>
246</div>
247
248<style>
249 .mig-wrap { max-width: 46rem; }
250 .mig-lead { color: var(--sub); margin-bottom: 1.5rem; }
251 .mig-card { border: 1px solid var(--rule); border-radius: 12px; padding: 1.25rem 1.4rem; margin-bottom: 1.25rem; }
252 .mig-card h2 { margin: 0 0 .35rem; font-size: 1.1rem; }
253 .mig-counts { list-style: none; padding: 0; margin: .9rem 0; display: flex; flex-wrap: wrap; gap: .4rem 1.4rem; }
254 .mig-counts li { color: var(--sub); font-size: .94rem; }
255 .mig-counts strong { color: var(--ink); font-size: 1.05rem; }
256 .mig-card label { display: block; margin: .9rem 0 .35rem; font-weight: 600; font-size: .92rem; }
257 .mig-card input[type="file"] { display: block; margin-bottom: .6rem; }
258 .mig-check { display: flex; align-items: center; gap: .5rem; font-weight: 400 !important; }
259 .mig-input { width: 100%; max-width: 34rem; padding: .5rem .6rem; border: 1px solid var(--rule);
260 border-radius: 8px; background: transparent; color: var(--ink); font-size: .95rem; }
261 .mig-state { margin-top: .9rem; }
262 .mig-report code { word-break: break-all; font-size: .88rem; }
263 .mig-warn { color: var(--accent); }
264 .mig-card-danger { border-color: color-mix(in srgb, var(--accent, #c33) 45%, var(--rule)); }
265 textarea.mig-input { font-family: inherit; resize: vertical; }
266 .mig-report { border-left: 3px solid var(--accent); padding: .8rem 1rem; margin-bottom: 1.2rem;
267 background: color-mix(in srgb, var(--ink, #000) 4%, transparent); border-radius: 0 8px 8px 0; }
268 .mig-report.is-done { border-left-color: #3fa843; }
269 .mig-report h3 { margin: 0 0 .3rem; font-size: 1rem; }
270 .mig-warnlist { margin: .5rem 0; padding-left: 1.2rem; color: var(--accent); font-size: .9rem; }
271 .mig-confirm { margin-top: .9rem; padding-top: .9rem; border-top: 1px solid var(--rule); }
272</style>
Note: See TracBrowser for help on using the repository browser.