feat(oxibadge): add settings screen for shifts, rounding and language
Check, format and test / build (push) Successful in 10m22s

Add a settings screen (gear button on the month-confirmation screen)
to configure the expected shift times, the rounding step, the
interface language, and the time clock address — replacing the old
onboarding-only connection flow. Settings persist to the same
preferences.toml as the reader address, under a single load_settings/
save_settings command pair.

The review screen's "fix shifts" action now redistributes stacked
punches by nearest configured shift time instead of blind position,
and a stacked cell manually cleared down to one entry no longer
leaves a dangling empty input.

Assisted-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-10-08 18:29:57 +02:00
parent acd3efeac6
commit b65e85f908
26 changed files with 1397 additions and 118 deletions
+42
View File
@@ -115,5 +115,47 @@
"back_to_review": "Back to review",
"round_and_export": "Round and export",
"export_anyway": "Export anyway"
},
"settings": {
"title": "Settings",
"device_title": "Time clock",
"device_desc": "The time clock Oxibadge downloads punches from.",
"device_label": "Address",
"status_testing": "Checking…",
"status_ok": "Reachable",
"status_idle": "Not verified",
"edit_address": "Edit address",
"test_connection": "Test connection",
"ip_label": "IP address",
"port_label": "Port",
"ip_invalid": "Invalid format, e.g. 192.168.1.100",
"cancel": "Cancel",
"confirm": "Confirm",
"shifts_title": "Expected shifts",
"shifts_desc": "The standard work schedule. The break between the two shifts is the one used by \"Add lunch break\" in the review.",
"shift_1": "1st shift",
"shift_2": "2nd shift",
"shift_in": "In",
"shift_out": "Out",
"shift_error_format": "Enter all times in HH:MM format.",
"shift_error_out1": "The 1st shift's clock-out must be after its clock-in.",
"shift_error_in2": "The 2nd shift must start after the 1st one ends.",
"shift_error_out2": "The 2nd shift's clock-out must be after its clock-in.",
"hours_per_day_label": "Expected hours",
"per_day": "per day",
"break_label": "Break",
"round_title": "Time rounding",
"round_desc": "Times are rounded to the nearest multiple.",
"round_example": "E.g. {from} → {to}.",
"round_label": "Minutes",
"minutes_short": "min",
"round_range": "From 1 to 60 minutes",
"language_title": "Language",
"language_desc": "Oxibadge's interface language.",
"save_idle": "Changes are saved automatically",
"save_saving": "Saving…",
"save_saved": "Changes saved",
"save_invalid": "Not saved: fix the error",
"save_failed": "Save failed"
}
}