Skip to content

Commit aab3652

Browse files
cpsievertwch
authored andcommitted
Close #23: allow date_input() and date_range_input() to handle ISO-formatted strings
1 parent 66ef76c commit aab3652

File tree

2 files changed

+42
-43
lines changed

2 files changed

+42
-43
lines changed

shiny/ui_toolkit/input_date.py

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import json
22
from datetime import date
3-
from typing import Optional
3+
from typing import Optional, List, Union
44

55
from htmltools import tags, Tag, div, span, TagAttrArg, TagChildArg, css
66

@@ -13,26 +13,21 @@
1313
def input_date(
1414
id: str,
1515
label: TagChildArg,
16-
value: Optional[date] = None,
17-
min: Optional[date] = None,
18-
max: Optional[date] = None,
16+
value: Optional[Union[date, str]] = None,
17+
min: Optional[Union[date, str]] = None,
18+
max: Optional[Union[date, str]] = None,
1919
format: str = "yyyy-mm-dd",
2020
startview: str = "month",
2121
weekstart: int = 0,
2222
language: str = "en",
2323
width: Optional[str] = None,
2424
autoclose: bool = True,
25-
datesdisabled: Optional[str] = None,
26-
daysofweekdisabled: Optional[str] = None,
25+
datesdisabled: Optional[List[str]] = None,
26+
daysofweekdisabled: Optional[List[int]] = None,
2727
) -> Tag:
28-
# TODO: needed?
29-
# value = dateYMD(value, "value")
30-
# min = dateYMD(min, "min")
31-
# max = dateYMD(max, "max")
32-
# datesdisabled = dateYMD(datesdisabled, "datesdisabled")
3328
return div(
3429
shiny_input_label(id, label),
35-
date_input_tag(
30+
_date_input_tag(
3631
id=id,
3732
value=value,
3833
min=min,
@@ -54,10 +49,10 @@ def input_date(
5449
def input_date_range(
5550
id: str,
5651
label: TagChildArg,
57-
start: Optional[date] = None,
58-
end: Optional[date] = None,
59-
min: Optional[date] = None,
60-
max: Optional[date] = None,
52+
start: Optional[Union[date, str]] = None,
53+
end: Optional[Union[date, str]] = None,
54+
min: Optional[Union[date, str]] = None,
55+
max: Optional[Union[date, str]] = None,
6156
format: str = "yyyy-mm-dd",
6257
startview: str = "month",
6358
weekstart: int = 0,
@@ -66,15 +61,10 @@ def input_date_range(
6661
width: Optional[str] = None,
6762
autoclose: bool = True,
6863
) -> Tag:
69-
# TODO: needed?
70-
# start = dateYMD(start, "start")
71-
# end = dateYMD(end, "end")
72-
# min = dateYMD(min, "min")
73-
# max = dateYMD(max, "max")
7464
return div(
7565
shiny_input_label(id, label),
7666
div(
77-
date_input_tag(
67+
_date_input_tag(
7868
id=id,
7969
value=start,
8070
min=min,
@@ -90,7 +80,7 @@ def input_date_range(
9080
span(separator, class_="input-group-text"),
9181
class_="input-group-addon input-group-prepend input-group-append",
9282
),
93-
date_input_tag(
83+
_date_input_tag(
9484
id=id,
9585
value=end,
9686
min=min,
@@ -110,11 +100,11 @@ def input_date_range(
110100
)
111101

112102

113-
def date_input_tag(
103+
def _date_input_tag(
114104
id: str,
115-
value: Optional[date],
116-
min: Optional[date],
117-
max: Optional[date],
105+
value: Optional[Union[date, str]],
106+
min: Optional[Union[date, str]],
107+
max: Optional[Union[date, str]],
118108
format: str,
119109
startview: str,
120110
weekstart: int,
@@ -134,9 +124,17 @@ def date_input_tag(
134124
data_date_week_start=weekstart,
135125
data_date_format=format,
136126
data_date_start_view=startview,
137-
data_min_date=min,
138-
data_max_date=max,
139-
data_initial_date=value,
127+
data_min_date=_as_date_attr(min),
128+
data_max_date=_as_date_attr(max),
129+
data_initial_date=_as_date_attr(value),
140130
data_date_autoclose="true" if autoclose else "false",
141131
**kwargs,
142132
)
133+
134+
135+
def _as_date_attr(x: Optional[Union[date, str]]) -> Optional[str]:
136+
if x is None:
137+
return None
138+
if isinstance(x, date):
139+
return str(x)
140+
return str(date.fromisoformat(x))

shiny/ui_toolkit/input_update.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from htmltools import TagChildArg
1212

1313
from .input_check_radio import ChoicesArg, _generate_options
14+
from .input_date import _as_date_attr
1415
from .input_select import SelectChoicesArg, _normalize_choices, _render_choices
1516
from .input_slider import SliderValueArg, SliderStepArg, _slider_type, _as_numeric
1617
from ..utils import drop_none
@@ -118,18 +119,18 @@ def update_date(
118119
id: str,
119120
*,
120121
label: Optional[str] = None,
121-
value: Optional[date] = None,
122-
min: Optional[date] = None,
123-
max: Optional[date] = None,
122+
value: Optional[Union[date, str]] = None,
123+
min: Optional[Union[date, str]] = None,
124+
max: Optional[Union[date, str]] = None,
124125
session: Optional[Session] = None,
125126
) -> None:
126127

127128
session = _require_active_session(session)
128129
msg = {
129130
"label": label,
130-
"value": str(value),
131-
"min": str(min),
132-
"max": str(max),
131+
"value": _as_date_attr(value),
132+
"min": _as_date_attr(min),
133+
"max": _as_date_attr(max),
133134
}
134135
session.send_input_message(id, drop_none(msg))
135136

@@ -138,19 +139,19 @@ def update_date_range(
138139
id: str,
139140
*,
140141
label: Optional[str] = None,
141-
start: Optional[date] = None,
142-
end: Optional[date] = None,
143-
min: Optional[date] = None,
144-
max: Optional[date] = None,
142+
start: Optional[Union[date, str]] = None,
143+
end: Optional[Union[date, str]] = None,
144+
min: Optional[Union[date, str]] = None,
145+
max: Optional[Union[date, str]] = None,
145146
session: Optional[Session] = None,
146147
) -> None:
147148
session = _require_active_session(session)
148-
value = {"start": str(start), "end": str(end)}
149+
value = {"start": _as_date_attr(start), "end": _as_date_attr(end)}
149150
msg = {
150151
"label": label,
151152
"value": drop_none(value),
152-
"min": str(min),
153-
"max": str(max),
153+
"min": _as_date_attr(min),
154+
"max": _as_date_attr(max),
154155
}
155156
session.send_input_message(id, drop_none(msg))
156157

0 commit comments

Comments
 (0)