A week that starts where the person reading it starts theirs
The scheduler's day picker began on Sunday because that is where Intl numbers the days from, which is a fact about the API and not about anybody's week. Monday leads it across most of Europe. A row of seven buttons in the wrong order is not just odd to read — it is easy to misclick, and a misclicked day in a schedule is a car charging on the wrong night. So Settings › Appearance asks, beneath the date and the clock, as the third question a region gets: first day of the week, following the region unless it is answered outright. The same shape the time format already had, and the same "auto" default, so nothing changes for an account that never opens it. The rule lives in lib/format.js beside the clock's, with the ordering, the day names and the sort all coming from there. The two places that lay weekdays out — the picker and the line each task is summarised on — read it rather than each keeping an opinion, so a day set is written and read back in the same order. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
5a4515978f
commit
0f48093d1a
@@ -30,6 +30,7 @@ type userRecord struct {
|
||||
Locale string `json:"locale"`
|
||||
DateFormat string `json:"date_format"`
|
||||
TimeFormat string `json:"time_format"`
|
||||
WeekStart string `json:"week_start"`
|
||||
Currency string `json:"currency"`
|
||||
FontSize string `json:"font_size"`
|
||||
DragLocked bool `json:"drag_locked"`
|
||||
@@ -99,6 +100,7 @@ func (rec userRecord) toModel() models.User {
|
||||
Locale: orDefault(rec.Locale, "en-US"),
|
||||
DateFormat: orDefault(rec.DateFormat, "YMD"),
|
||||
TimeFormat: orDefault(rec.TimeFormat, "auto"),
|
||||
WeekStart: orDefault(rec.WeekStart, "auto"),
|
||||
Currency: orDefault(rec.Currency, "USD"),
|
||||
FontSize: orDefault(rec.FontSize, "medium"),
|
||||
DragLocked: rec.DragLocked,
|
||||
@@ -164,6 +166,7 @@ type updateMeRequest struct {
|
||||
Locale *string `json:"locale"`
|
||||
DateFormat *string `json:"dateFormat"`
|
||||
TimeFormat *string `json:"timeFormat"`
|
||||
WeekStart *string `json:"weekStart"`
|
||||
Currency *string `json:"currency"`
|
||||
FontSize *string `json:"fontSize"`
|
||||
DragLocked *bool `json:"dragLocked"`
|
||||
@@ -264,6 +267,12 @@ var validDateFormats = map[string]bool{"YMD": true, "DMY_NUM": true, "DMY": true
|
||||
// the app did before there was a setting; the other two say it outright, for
|
||||
// the people whose region and habit disagree.
|
||||
var validTimeFormats = map[string]bool{"auto": true, "24": true, "12": true}
|
||||
|
||||
// Which day a week is drawn as starting on. "auto" is the chosen region's own
|
||||
// convention — Monday across most of Europe, Sunday in the US — and is what
|
||||
// every weekday row read before there was a setting; the other two say it
|
||||
// outright, for the people whose region and habit disagree.
|
||||
var validWeekStarts = map[string]bool{"auto": true, "monday": true, "sunday": true}
|
||||
var validFontSizes = map[string]bool{"small": true, "medium": true, "large": true}
|
||||
|
||||
// Kept in step with the users.currency select options in setup-pocketbase.mjs:
|
||||
@@ -333,6 +342,13 @@ func (s *Server) handleUpdateMe(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
payload["time_format"] = *in.TimeFormat
|
||||
}
|
||||
if in.WeekStart != nil {
|
||||
if !validWeekStarts[*in.WeekStart] {
|
||||
writeError(w, http.StatusBadRequest, "weekStart must be auto, monday, or sunday")
|
||||
return
|
||||
}
|
||||
payload["week_start"] = *in.WeekStart
|
||||
}
|
||||
if in.Currency != nil {
|
||||
if !validCurrencies[*in.Currency] {
|
||||
writeError(w, http.StatusBadRequest, "currency must be a supported ISO 4217 code")
|
||||
|
||||
@@ -262,6 +262,10 @@ var collectionsSchema = map[string][]fieldDef{
|
||||
// "auto" is the region's own convention, which is what every clock in the
|
||||
// app read before this field existed.
|
||||
fSelect("time_format", []string{"auto", "24", "12"}, false),
|
||||
// The day a week is drawn as starting on, wherever weekdays are laid out
|
||||
// in a row. "auto" is the region's own convention, which is what the
|
||||
// scheduler's day picker read before this field existed.
|
||||
fSelect("week_start", []string{"auto", "monday", "sunday"}, false),
|
||||
fSelect("currency", []string{
|
||||
"EUR", "GBP", "CHF", "PLN", "CZK", "HUF", "RON", "BGN", "DKK", "SEK", "NOK",
|
||||
"ISK", "ALL", "AMD", "AZN", "BAM", "BYN", "GEL", "MDL", "MKD", "RSD", "RUB",
|
||||
|
||||
@@ -519,9 +519,12 @@ type User struct {
|
||||
Locale string `json:"locale"` // e.g. "en-US"
|
||||
DateFormat string `json:"dateFormat"` // YMD | DMY | MDY
|
||||
TimeFormat string `json:"timeFormat"` // auto (the region's own) | 24 | 12
|
||||
Currency string `json:"currency"` // ISO 4217 code, e.g. "EUR"
|
||||
FontSize string `json:"fontSize"` // small | medium | large
|
||||
Role string `json:"role"` // user | admin
|
||||
// The day a week is drawn as starting on, wherever a client lays weekdays
|
||||
// out in a row — the scheduler's day picker today.
|
||||
WeekStart string `json:"weekStart"` // auto (the region's own) | monday | sunday
|
||||
Currency string `json:"currency"` // ISO 4217 code, e.g. "EUR"
|
||||
FontSize string `json:"fontSize"` // small | medium | large
|
||||
Role string `json:"role"` // user | admin
|
||||
|
||||
// DragLocked holds every arrangement on this account's pages still: the
|
||||
// garage, a car's tabs, its Information rows, the provider's readings. A
|
||||
|
||||
@@ -517,6 +517,10 @@ const DESIRED = {
|
||||
// "auto" is the region's own convention. Kept in step with
|
||||
// validTimeFormats in internal/api/me.go.
|
||||
F.select("time_format", ["auto", "24", "12"]),
|
||||
// The day a week is drawn as starting on, wherever a client lays weekdays
|
||||
// out in a row. "auto" is the region's own convention. Kept in step with
|
||||
// validWeekStarts in internal/api/me.go.
|
||||
F.select("week_start", ["auto", "monday", "sunday"]),
|
||||
// European currencies plus the non-European ones the panel already offered.
|
||||
// Kept in step with validCurrencies in internal/api/me.go and CURRENCY_CODES
|
||||
// in the web app's Settings.vue.
|
||||
|
||||
Reference in New Issue
Block a user