fix: calendar day-of-week offset off by one, nav double-jump, race conditions
- Fix Jalali/Gregorian/Hijri day-of-week startOffset formulas (dow returns 0=Sat, not 0=Sun as the old comment claimed) - Fix calendar and export month picker navigation jumping 2 months (navMonth buttons already have pre-computed values; handlers were decrementing/incrementing them again) - Fix GetOrCreateUser/GetOrCreateDay race condition with INSERT OR IGNORE - Add month/day bounds validation in handleEditMsg to prevent panic
This commit is contained in:
@@ -180,7 +180,7 @@ func gregorianToHijri(gy, gm, gd int) (int, int, int) {
|
||||
}
|
||||
|
||||
func dayOfWeekGregorian(gy, gm, gd int) int {
|
||||
// Zeller-like: returns 0=Sun,1=Mon,...,6=Sat
|
||||
// Zeller-like: returns 0=Sat,1=Sun,2=Mon,3=Tue,4=Wed,5=Thu,6=Fri
|
||||
if gm < 3 {
|
||||
gm += 12
|
||||
gy--
|
||||
@@ -211,7 +211,7 @@ func buildCalendarMonth(cal string, year, month int) calMonth {
|
||||
|
||||
gy, gm, gd := jalaliToGregorian(year, month, 1)
|
||||
dow := dayOfWeekGregorian(gy, gm, gd)
|
||||
startOffset := (dow + 1) % 7
|
||||
startOffset := dow
|
||||
|
||||
var days []calDay
|
||||
for i := 0; i < startOffset; i++ {
|
||||
@@ -234,7 +234,7 @@ func buildCalendarMonth(cal string, year, month int) calMonth {
|
||||
|
||||
gy, gm, gd := hijriToGregorian(year, month, 1)
|
||||
dow := dayOfWeekGregorian(gy, gm, gd)
|
||||
startOffset := (dow + 6) % 7
|
||||
startOffset := (dow + 5) % 7
|
||||
|
||||
var days []calDay
|
||||
for i := 0; i < startOffset; i++ {
|
||||
@@ -255,7 +255,7 @@ func buildCalendarMonth(cal string, year, month int) calMonth {
|
||||
totalDays = monthLenGreg(year, month)
|
||||
|
||||
dow := dayOfWeekGregorian(year, month, 1)
|
||||
startOffset := (dow + 6) % 7
|
||||
startOffset := (dow + 5) % 7
|
||||
|
||||
var days []calDay
|
||||
for i := 0; i < startOffset; i++ {
|
||||
@@ -290,6 +290,33 @@ func formatDateForCalendar(date, calType string) string {
|
||||
}
|
||||
}
|
||||
|
||||
// userDateToGregorian converts a YYYY-MM-DD string in the user's calendar
|
||||
// to the corresponding Gregorian YYYY-MM-DD string.
|
||||
func userDateToGregorian(dateStr, cal string) string {
|
||||
y, m, d := parseGregorianDateKey(dateStr)
|
||||
switch cal {
|
||||
case "jalali":
|
||||
y, m, d = jalaliToGregorian(y, m, d)
|
||||
case "hijri":
|
||||
y, m, d = hijriToGregorian(y, m, d)
|
||||
}
|
||||
return fmt.Sprintf("%04d-%02d-%02d", y, m, d)
|
||||
}
|
||||
|
||||
// userYearMonthToGregorian converts a (year, month) in the user's calendar
|
||||
// to the corresponding Gregorian (year, month). The day is assumed to be 1.
|
||||
func userYearMonthToGregorian(year, month int, cal string) (int, int) {
|
||||
switch cal {
|
||||
case "jalali":
|
||||
gy, gm, _ := jalaliToGregorian(year, month, 1)
|
||||
return gy, gm
|
||||
case "hijri":
|
||||
gy, gm, _ := hijriToGregorian(year, month, 1)
|
||||
return gy, gm
|
||||
}
|
||||
return year, month
|
||||
}
|
||||
|
||||
// monthGregorianRange returns the Gregorian start and end date strings
|
||||
// for a given calendar month (cal=gregorian|jalali|hijri).
|
||||
func monthGregorianRange(cal string, year, month int) (start, end string) {
|
||||
|
||||
Reference in New Issue
Block a user