feat(projects): sektioner kan trækkes op og ned, og båndet står ikke længere skævt
Rækkefølgen af sektioner *er* planen — "Planlægning" står før "I gang", fordi det er den vej arbejdet går — og indtil nu kunne den kun laves om ved at slette en sektion og lave den igen, hvilket smider dens opgaver ud i det usektionerede område på vejen. Hele overskriften er håndtaget. En sektionsoverskrift indeholder ikke noget, der selv bliver trukket, så der er ingen geste at stjæle — hvilket er grunden til, at sidebjælkens rækker skulle have et greb, og grunden til at disse ikke skal. Ikke draggable mens den omdøbes: et draggable element lader ikke markøren vælge tekst i det felt, det indeholder. Serversiden er hele listen på én gang som projekter og grupper, og af samme grund: et projekt har en håndfuld sektioner, så 0, 1, 2 … er én lille transaktion uden præcision at løbe tør for, og en liste kan ikke ende halvt anvendt. `ReorderSections` er scopet til projektet og ikke til en ejer — en sektion har ingen ejer, den hører til et projekt, og om du må rykke rundt er et spørgsmål om det projekt, som handleren allerede har stillet. Id'er fra et andet projekt springes over af WHERE-klausulen; der er en prøve på præcis det, fordi ingenting ellers kontrollerer id'erne enkeltvis. Båndet stod fire pixels skævt. Det var trukket ud med --s2 og polstret med --s3 — samme idé gjort med to forskellige tal — så det blev otte pixels bredere end listen i hver side, og teksten landede fire pixels uden for den kolonne, rækkerne holder. Til venstre var det usynligt. Til højre var det Omdøb og Slet, der stod fire pixels forbi alt over og under sig, hvilket er præcis langt nok til at ligne en fejl og ikke langt nok til at se hvorfor. En række er `.row` med `padding: var(--s2)` inde i en boks uden, så båndet har nu samme polstring og ingen margen. Board-visningen er ikke rørt: der er kolonnerne vandrette, og det er en anden geste. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
98bfa216d6
commit
e46aaa462a
@@ -646,6 +646,35 @@ func (db *DB) ReorderProjects(ctx context.Context, userID string, ids []string)
|
||||
})
|
||||
}
|
||||
|
||||
// ReorderSections writes the order of one project's sections, top to bottom.
|
||||
//
|
||||
// The whole list at once, the same as ReorderProjects and for the same reasons: a
|
||||
// project has a handful of sections, so writing 0, 1, 2 … is one small
|
||||
// transaction that cannot run out of precision, and a list is impossible to get
|
||||
// into the half-ordered state a sequence of individual moves leaves behind when
|
||||
// one of them fails.
|
||||
//
|
||||
// Scoped to the project rather than to a user. A section has no owner of its own —
|
||||
// it belongs to a project, and whether the caller may rearrange it is a question
|
||||
// about that project, which the handler has already asked. Ids belonging to some
|
||||
// other project are skipped by the WHERE clause rather than refused, so a stale
|
||||
// list from a client that has just moved a section elsewhere cannot rearrange a
|
||||
// project the caller was never looking at.
|
||||
func (db *DB) ReorderSections(ctx context.Context, projectID string, ids []string) error {
|
||||
return db.Tx(ctx, func(tx *sql.Tx) error {
|
||||
now := time.Now().Unix()
|
||||
for i, id := range ids {
|
||||
if _, err := tx.ExecContext(ctx,
|
||||
`UPDATE sections SET sort_order = ?, updated_at = ?
|
||||
WHERE id = ? AND project_id = ? AND deleted_at IS NULL`,
|
||||
float64(i), now, id, projectID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// SectionByName resolves a "/name" from quick add within one project.
|
||||
//
|
||||
// Case-insensitive, and scoped to the project the task is landing in — a section
|
||||
|
||||
Reference in New Issue
Block a user