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
87 lines
3.4 KiB
JavaScript
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)
|
|
}
|
|
})
|