stammtisch-hersbruck/backend/pb_migrations/1754501800_riders_single_name.js
Daniel Michelberger 8c11095b17 feat: Ein Fahrer hat einen Namen, nicht zwei
Vorname und Nachname getrennt zu fuehren versprach eine Ordnung, die es
hier nie gab: sortiert wird ueber den ganzen Namen, angezeigt wird der
ganze Name, gesucht wird ueber beides zugleich. Dafuer musste jede Maske
zwei Felder anbieten und jede Anzeige sie wieder zusammensetzen — und
wer schlicht "Schorsch" heisst, stand vor der Frage, welches der beiden
Felder das ist.

Das Feld name gibt es an riders laengst; es lag nur brach, weil die
Anwendung firstname und lastname benutzte. Es uebernimmt deren Inhalt —
kein neues Feld, keine zweite Spalte, nichts, was auf bestehenden
Instanzen erst entstehen muesste.

Zurueck geht es nur ungenau: Die Umkehrung trennt am ersten Leerzeichen
und raet damit bei jedem Doppelvornamen falsch. Das ist der Preis dafuer,
dass die Trennung ueberhaupt verschwindet.

fullName heisst jetzt riderName und ist nur noch ein Feldzugriff — die
Funktion bleibt als die eine Stelle, an der ein namenloser Fahrer zu
einem leeren String wird statt als undefined durch die Oberflaeche zu
geistern.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P32KoesVtABd6xWsqMKzhr
2026-09-07 22:10:30 +02:00

87 lines
3.4 KiB
JavaScript

/// <reference path="../pb_data/types.d.ts" />
// Ein Fahrer hat einen Namen, nicht zwei.
//
// Vorname und Nachname getrennt zu führen versprach eine Ordnung, die es hier
// nie gab: sortiert wird über den ganzen Namen, angezeigt wird der ganze Name,
// gesucht wird über beides zugleich. Dafür musste jede Maske zwei Felder
// anbieten und jede Anzeige sie wieder zusammensetzen — und wer schlicht
// „Schorsch" heißt, stand vor der Frage, welches der beiden Felder das ist.
//
// Das Feld `name` gibt es an riders längst; es lag nur brach, weil die
// Anwendung firstname und lastname benutzte. Es bleibt deshalb, wie es ist,
// und bekommt nur den Inhalt der beiden anderen — kein neues Feld, keine
// zweite Spalte, nichts, was auf bestehenden Instanzen erst entstehen müsste.
//
// Beim Zusammenlegen geht nichts verloren: firstname und lastname werden mit
// einem Leerzeichen verbunden. Zurück geht es nur ungenau — die Umkehrung
// trennt am ersten Leerzeichen und rät damit bei jedem Doppelvornamen falsch.
// Das ist der Preis dafür, dass die Trennung überhaupt verschwindet.
migrate((app) => {
const riders = app.findCollectionByNameOrId('riders')
// Erst zusammenführen, dann die alten Felder abräumen — andersherum wären
// die Daten fort, bevor sie jemand liest. Auf einer frischen Datenbank hat
// der Snapshot die beiden Felder gar nicht erst.
if (riders.fields.getByName('firstname') || riders.fields.getByName('lastname')) {
for (const rider of app.findRecordsByFilter('riders', 'id != ""', '', 0, 0)) {
const merged = [rider.get('firstname'), rider.get('lastname')]
.map((part) => (part || '').trim())
.filter(Boolean)
.join(' ')
// Ein bereits gefülltes `name` gewinnt: Es wäre von Hand gesetzt
// worden und wüsste mehr als die beiden Bruchstücke.
if (merged && !(rider.get('name') || '').trim()) {
rider.set('name', merged)
app.save(rider)
}
}
}
riders.fields.removeByName('firstname')
riders.fields.removeByName('lastname')
// Im Admin-UI steht ein Fahrer jetzt mit Namen statt mit seiner ID da.
const name = riders.fields.getByName('name')
if (name) name.presentable = true
app.save(riders)
}, (app) => {
const riders = app.findCollectionByNameOrId('riders')
if (!riders.fields.getByName('firstname')) {
riders.fields.add(new Field({
id: 'text2208304744',
name: 'firstname',
type: 'text',
presentable: true,
}))
}
if (!riders.fields.getByName('lastname')) {
riders.fields.add(new Field({
id: 'text824489398',
name: 'lastname',
type: 'text',
presentable: true,
}))
}
const name = riders.fields.getByName('name')
if (name) name.presentable = false
app.save(riders)
// Am ersten Leerzeichen trennen: davor der Vorname, danach der Rest. Aus
// „Anna Maria Huber" wird so „Anna" und „Maria Huber".
for (const rider of app.findRecordsByFilter('riders', 'id != ""', '', 0, 0)) {
const full = (rider.get('name') || '').trim()
if (!full) continue
const cut = full.indexOf(' ')
rider.set('firstname', cut === -1 ? full : full.slice(0, cut))
rider.set('lastname', cut === -1 ? '' : full.slice(cut + 1).trim())
app.save(rider)
}
})