11import json
22from datetime import date
3- from typing import Optional
3+ from typing import Optional , List , Union
44
55from htmltools import tags , Tag , div , span , TagAttrArg , TagChildArg , css
66
1313def 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(
5449def 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 ))
0 commit comments