Skip to content

Commit f297722

Browse files
authored
Support for multiple date formats (#498)
1 parent 4176741 commit f297722

File tree

3 files changed

+46
-10
lines changed

3 files changed

+46
-10
lines changed

timetagger/app/dialogs.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2837,7 +2837,9 @@ def open(self, t1=None, t2=None, tags=None):
28372837
close_but = self.maindiv.children[0].children[-1]
28382838
close_but.onclick = self.close
28392839
self._date_range.innerHTML = (
2840-
t1_date + "  –  " + t2_date
2840+
dt.format_isodate(t1_date)
2841+
+ "  –  "
2842+
+ dt.format_isodate(t2_date)
28412843
)
28422844
self._date_range.innerHTML += (
28432845
"&nbsp;&nbsp;<button type='button'><i class='fas'>\uf073</i></button>"
@@ -3040,7 +3042,7 @@ def _generate_table_rows(self, t1, t2):
30403042
date = dt.time2localstr(record.t1).split(" ")[0]
30413043
year = int(date.split("-")[0])
30423044
if group_period == "day":
3043-
period = "-".join(reversed(date.split("-")))
3045+
period = dt.format_isodate(date)
30443046
elif group_period == "week":
30453047
week = dt.get_weeknumber(record.t1)
30463048
period = f"{year}W{week}"
@@ -3114,7 +3116,7 @@ def _generate_table_rows(self, t1, t2):
31143116
"record",
31153117
record.key,
31163118
duration,
3117-
sd1,
3119+
dt.format_isodate(sd1),
31183120
st1,
31193121
st2,
31203122
to_str(record.get("ds", "")), # strip tabs and newlines
@@ -3261,8 +3263,8 @@ def _save_as_pdf(self):
32613263
# )
32623264

32633265
tagname = self._tags.join(" ") if self._tags else "all"
3264-
d1 = reversed(self._t1_date.split("-")).join("-")
3265-
d2 = reversed(self._t2_date.split("-")).join("-")
3266+
d1 = dt.format_isodate(self._t1_date)
3267+
d2 = dt.format_isodate(self._t2_date)
32663268
doc.setFontSize(11)
32673269
doc.text("Tags: ", margin + 20, margin + 15, {"align": "right"})
32683270
doc.text(tagname, margin + 20, margin + 15)
@@ -3877,6 +3879,12 @@ def open(self, callback=None):
38773879
<option value='1'>Monday - Saturday</option>
38783880
<option value='0'>Monday - Sunday</option>
38793881
</select>
3882+
<div>Show dates as:</div>
3883+
<select>
3884+
<option value='yyyy-mm-dd'>yyyy-mm-dd (ISO 8601)</option>
3885+
<option value='dd-mm-yyyy'>dd-mm-yyyy (default)</option>
3886+
<option value='mm/dd/yyyy'>mm/dd/yyyy (US)</option>
3887+
</select>
38803888
<div>Show time as:</div>
38813889
<select>
38823890
<option value='auto'>Auto</option>
@@ -3991,27 +3999,33 @@ def open(self, callback=None):
39913999
self._workdays.value = workdays
39924000
self._workdays.onchange = self._on_workdays_change
39934001

4002+
# Date representation
4003+
date_repr = window.simplesettings.get("date_repr")
4004+
self._date_repr = self._repr_form.children[5]
4005+
self._date_repr.value = date_repr
4006+
self._date_repr.onchange = self._on_date_repr_change
4007+
39944008
# Time representation
39954009
time_repr = window.simplesettings.get("time_repr")
3996-
self._time_repr = self._repr_form.children[5]
4010+
self._time_repr = self._repr_form.children[7]
39974011
self._time_repr.value = time_repr
39984012
self._time_repr.onchange = self._on_time_repr_change
39994013

40004014
# Duration representation
40014015
duration_repr = window.simplesettings.get("duration_repr")
4002-
self._duration_repr = self._repr_form.children[7]
4016+
self._duration_repr = self._repr_form.children[9]
40034017
self._duration_repr.value = duration_repr
40044018
self._duration_repr.onchange = self._on_duration_repr_change
40054019

40064020
# Today snap time/offset
40074021
today_snap_offset = window.simplesettings.get("today_snap_offset")
4008-
self._today_snap_offset = self._repr_form.children[9]
4022+
self._today_snap_offset = self._repr_form.children[11]
40094023
self._today_snap_offset.value = today_snap_offset
40104024
self._today_snap_offset.onchange = self._on_today_snap_offset_change
40114025

40124026
# Today number of hours
40134027
today_end_offset = window.simplesettings.get("today_end_offset")
4014-
self._today_end_offset = self._repr_form.children[11]
4028+
self._today_end_offset = self._repr_form.children[13]
40154029
self._today_end_offset.value = today_end_offset
40164030
self._today_end_offset.onchange = self._on_today_end_offset_change
40174031

@@ -4062,6 +4076,10 @@ def _on_workdays_change(self):
40624076
workdays = int(self._workdays.value)
40634077
window.simplesettings.set("workdays", workdays)
40644078

4079+
def _on_date_repr_change(self):
4080+
date_repr = self._date_repr.value
4081+
window.simplesettings.set("date_repr", date_repr)
4082+
40654083
def _on_time_repr_change(self):
40664084
time_repr = self._time_repr.value
40674085
window.simplesettings.set("time_repr", time_repr)

timetagger/app/dt.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,30 @@ def time2str(t, utc_offset=None):
164164

165165

166166
def time2localstr(t):
167-
"""Convert a time int into a textual local representation, and with a space instead of T."""
167+
"""Convert a time int into a textual local representation, and with a space instead of T. Note that the date is always yyyy-mm-dd"""
168168
s = time2str(t)
169169
s1, s2 = s.split("T")
170170
s2 = s2.split("-")[0].split("+")[0].rstrip("Z")
171171
return s1 + " " + s2
172172

173173

174+
def format_isodate(date, fmt=None):
175+
"Format an iso date to a formatted date."
176+
yyyy, mm, dd = date.split("-")
177+
if fmt is None:
178+
fmt = "dd-mm-yyyy"
179+
if window.simplesettings:
180+
fmt = window.simplesettings.get("date_repr", fmt)
181+
if fmt == "yyyy-mm-dd":
182+
return yyyy + "-" + mm + "-" + dd
183+
elif fmt == "dd-mm-yyyy":
184+
return dd + "-" + mm + "-" + yyyy
185+
elif fmt == "mm/dd/yyyy":
186+
return mm + "/" + dd + "/" + yyyy
187+
else:
188+
return date
189+
190+
174191
def round(t, res):
175192
"""Round the given date to the nearest resolution step."""
176193
PSCRIPT_OVERLOAD = False # noqa

timetagger/app/utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,7 @@ def __init__(self):
623623
self._synced_keys = {
624624
"first_day_of_week": 1,
625625
"workdays": 0,
626+
"date_repr": "dd-mm-yyyy",
626627
"time_repr": "auto",
627628
"duration_repr": "hms",
628629
"today_snap_offset": "",

0 commit comments

Comments
 (0)