solara-ui 1.49.0__py3-none-any.whl → 1.50.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- solara/__init__.py +1 -1
- solara/components/input.py +150 -15
- solara/components/input_text_area.py +15 -1
- solara/lab/components/input_date.py +37 -4
- solara/server/starlette.py +13 -6
- solara/server/static/solara_bootstrap.py +1 -1
- {solara_ui-1.49.0.dist-info → solara_ui-1.50.0.dist-info}/METADATA +1 -1
- {solara_ui-1.49.0.dist-info → solara_ui-1.50.0.dist-info}/RECORD +12 -12
- {solara_ui-1.49.0.data → solara_ui-1.50.0.data}/data/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
- {solara_ui-1.49.0.data → solara_ui-1.50.0.data}/data/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
- {solara_ui-1.49.0.dist-info → solara_ui-1.50.0.dist-info}/WHEEL +0 -0
- {solara_ui-1.49.0.dist-info → solara_ui-1.50.0.dist-info}/licenses/LICENSE +0 -0
solara/__init__.py
CHANGED
solara/components/input.py
CHANGED
|
@@ -36,11 +36,61 @@ def use_change(el: reacton.core.Element, on_value: Callable[[Any], Any], enabled
|
|
|
36
36
|
solara.use_effect(add_events, [enabled])
|
|
37
37
|
|
|
38
38
|
|
|
39
|
+
@overload
|
|
39
40
|
@solara.component
|
|
40
41
|
def InputText(
|
|
41
42
|
label: str,
|
|
42
43
|
value: Union[str, solara.Reactive[str]] = "",
|
|
43
|
-
on_value: Callable[[str], None] =
|
|
44
|
+
on_value: Optional[Callable[[str], None]] = ...,
|
|
45
|
+
disabled: bool = ...,
|
|
46
|
+
password: bool = ...,
|
|
47
|
+
continuous_update: bool = ...,
|
|
48
|
+
update_events: list = ...,
|
|
49
|
+
error: Union[bool, str] = ...,
|
|
50
|
+
message: Optional[str] = ...,
|
|
51
|
+
classes: List[str] = ...,
|
|
52
|
+
style: Optional[Union[str, Dict[str, str]]] = ...,
|
|
53
|
+
autofocus: bool = ...,
|
|
54
|
+
dense: bool = ...,
|
|
55
|
+
hide_details: Union[str, bool] = ...,
|
|
56
|
+
placeholder: Optional[str] = ...,
|
|
57
|
+
prefix: Optional[str] = ...,
|
|
58
|
+
suffix: Optional[str] = ...,
|
|
59
|
+
clearable: Literal[False] = ...,
|
|
60
|
+
optional: Literal[False] = ...,
|
|
61
|
+
) -> reacton.core.ValueElement[vw.TextField, Any]: ...
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@overload
|
|
65
|
+
@solara.component
|
|
66
|
+
def InputText(
|
|
67
|
+
label: str,
|
|
68
|
+
value: Union[Optional[str], solara.Reactive[Optional[str]]] = ...,
|
|
69
|
+
on_value: Optional[Callable[[Optional[str]], None]] = ...,
|
|
70
|
+
disabled: bool = ...,
|
|
71
|
+
password: bool = ...,
|
|
72
|
+
continuous_update: bool = ...,
|
|
73
|
+
update_events: list = ...,
|
|
74
|
+
error: Union[bool, str] = ...,
|
|
75
|
+
message: Optional[str] = ...,
|
|
76
|
+
classes: List[str] = ...,
|
|
77
|
+
style: Optional[Union[str, Dict[str, str]]] = ...,
|
|
78
|
+
autofocus: bool = ...,
|
|
79
|
+
dense: bool = ...,
|
|
80
|
+
hide_details: Union[str, bool] = ...,
|
|
81
|
+
placeholder: Optional[str] = ...,
|
|
82
|
+
prefix: Optional[str] = ...,
|
|
83
|
+
suffix: Optional[str] = ...,
|
|
84
|
+
clearable: bool = ...,
|
|
85
|
+
optional: Literal[True] = ...,
|
|
86
|
+
) -> reacton.core.ValueElement[vw.TextField, Any]: ...
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@solara.component
|
|
90
|
+
def InputText(
|
|
91
|
+
label: str,
|
|
92
|
+
value: Union[None, str, solara.Reactive[str], solara.Reactive[Optional[str]]] = "",
|
|
93
|
+
on_value: Union[None, Callable[[Optional[str]], None], Callable[[str], None]] = None,
|
|
44
94
|
disabled: bool = False,
|
|
45
95
|
password: bool = False,
|
|
46
96
|
continuous_update: bool = False,
|
|
@@ -50,7 +100,14 @@ def InputText(
|
|
|
50
100
|
classes: List[str] = [],
|
|
51
101
|
style: Optional[Union[str, Dict[str, str]]] = None,
|
|
52
102
|
autofocus: bool = False,
|
|
53
|
-
|
|
103
|
+
dense: bool = False,
|
|
104
|
+
hide_details: Union[str, bool] = "auto",
|
|
105
|
+
placeholder: Optional[str] = None,
|
|
106
|
+
prefix: Optional[str] = None,
|
|
107
|
+
suffix: Optional[str] = None,
|
|
108
|
+
clearable: bool = False,
|
|
109
|
+
optional: bool = False,
|
|
110
|
+
) -> reacton.core.ValueElement[vw.TextField, Optional[str]]:
|
|
54
111
|
"""Free form text input.
|
|
55
112
|
|
|
56
113
|
### Basic example:
|
|
@@ -107,8 +164,15 @@ def InputText(
|
|
|
107
164
|
* `classes`: List of CSS classes to apply to the input.
|
|
108
165
|
* `style`: CSS style to apply to the input.
|
|
109
166
|
* `autofocus`: Determines if a component is to be autofocused or not (Default is False). Autofocus will occur during page load and only one component per page can have autofocus active.
|
|
167
|
+
* `dense`: Reduces the input height.
|
|
168
|
+
* `hide_details`: Hides hint and validation errors. When set to 'auto', messages will be rendered only if there's a message (hint, error message, etc) to display.
|
|
169
|
+
* `placeholder`: Sets the input's placeholder text.
|
|
170
|
+
* `prefix`: Displays prefix text.
|
|
171
|
+
* `suffix`: Displays suffix text.
|
|
172
|
+
* `clearable`: Whether the input can be cleared.
|
|
173
|
+
* `optional`: Whether the value can be None. If `clearable=True`, `optional` is forced to True.
|
|
110
174
|
"""
|
|
111
|
-
reactive_value = solara.use_reactive(value, on_value)
|
|
175
|
+
reactive_value = solara.use_reactive(value, on_value) # type: ignore
|
|
112
176
|
del value, on_value
|
|
113
177
|
style_flat = solara.util._flatten_style(style)
|
|
114
178
|
classes_flat = solara.util._combine_classes(classes)
|
|
@@ -130,12 +194,18 @@ def InputText(
|
|
|
130
194
|
on_v_model=on_v_model,
|
|
131
195
|
label=label,
|
|
132
196
|
disabled=disabled,
|
|
133
|
-
type="password" if password else
|
|
197
|
+
type="password" if password else "text",
|
|
134
198
|
error=bool(error),
|
|
135
199
|
messages=messages,
|
|
136
200
|
class_=classes_flat,
|
|
137
201
|
style_=style_flat,
|
|
138
202
|
autofocus=autofocus,
|
|
203
|
+
dense=dense,
|
|
204
|
+
hide_details=hide_details,
|
|
205
|
+
placeholder=placeholder if placeholder is not None else "",
|
|
206
|
+
prefix=prefix if prefix is not None else "",
|
|
207
|
+
suffix=suffix if suffix is not None else "",
|
|
208
|
+
clearable=clearable,
|
|
139
209
|
)
|
|
140
210
|
use_change(text_field, set_value_cast, enabled=not continuous_update, update_events=update_events)
|
|
141
211
|
return text_field
|
|
@@ -154,6 +224,11 @@ def InputFloat(
|
|
|
154
224
|
classes: List[str] = ...,
|
|
155
225
|
style: Optional[Union[str, Dict[str, str]]] = ...,
|
|
156
226
|
autofocus: bool = False,
|
|
227
|
+
dense: bool = False,
|
|
228
|
+
hide_details: Union[str, bool] = "auto",
|
|
229
|
+
placeholder: Optional[str] = None,
|
|
230
|
+
prefix: Optional[str] = None,
|
|
231
|
+
suffix: Optional[str] = None,
|
|
157
232
|
) -> reacton.core.ValueElement[vw.TextField, Any]: ...
|
|
158
233
|
|
|
159
234
|
|
|
@@ -170,6 +245,11 @@ def InputFloat(
|
|
|
170
245
|
classes: List[str] = ...,
|
|
171
246
|
style: Optional[Union[str, Dict[str, str]]] = ...,
|
|
172
247
|
autofocus: bool = False,
|
|
248
|
+
dense: bool = False,
|
|
249
|
+
hide_details: Union[str, bool] = "auto",
|
|
250
|
+
placeholder: Optional[str] = None,
|
|
251
|
+
prefix: Optional[str] = None,
|
|
252
|
+
suffix: Optional[str] = None,
|
|
173
253
|
) -> reacton.core.ValueElement[vw.TextField, Any]: ...
|
|
174
254
|
|
|
175
255
|
|
|
@@ -185,6 +265,11 @@ def InputFloat(
|
|
|
185
265
|
classes: List[str] = [],
|
|
186
266
|
style: Optional[Union[str, Dict[str, str]]] = None,
|
|
187
267
|
autofocus: bool = False,
|
|
268
|
+
dense: bool = False,
|
|
269
|
+
hide_details: Union[str, bool] = "auto",
|
|
270
|
+
placeholder: Optional[str] = None,
|
|
271
|
+
prefix: Optional[str] = None,
|
|
272
|
+
suffix: Optional[str] = None,
|
|
188
273
|
):
|
|
189
274
|
"""Numeric input (floats).
|
|
190
275
|
|
|
@@ -218,6 +303,11 @@ def InputFloat(
|
|
|
218
303
|
* `classes`: List of CSS classes to apply to the input.
|
|
219
304
|
* `style`: CSS style to apply to the input.
|
|
220
305
|
* `autofocus`: Determines if a component is to be autofocused or not (Default is False). Autofocus will occur either during page load, or when the component becomes visible (for example, dialog being opened). Only one component per page should have autofocus on each such event.
|
|
306
|
+
* `dense`: Reduces the input height.
|
|
307
|
+
* `hide_details`: Hides hint and validation errors. When set to 'auto', messages will be rendered only if there's a message (hint, error message, etc) to display.
|
|
308
|
+
* `placeholder`: Sets the input's placeholder text.
|
|
309
|
+
* `prefix`: Displays prefix text.
|
|
310
|
+
* `suffix`: Displays suffix text.
|
|
221
311
|
|
|
222
312
|
"""
|
|
223
313
|
|
|
@@ -237,15 +327,20 @@ def InputFloat(
|
|
|
237
327
|
return _InputNumeric(
|
|
238
328
|
str_to_float,
|
|
239
329
|
label=label,
|
|
240
|
-
value=value,
|
|
241
|
-
on_value=on_value,
|
|
330
|
+
value=value, # type: ignore
|
|
331
|
+
on_value=on_value, # type: ignore
|
|
242
332
|
disabled=disabled,
|
|
243
333
|
continuous_update=continuous_update,
|
|
244
334
|
clearable=clearable,
|
|
245
335
|
classes=classes,
|
|
246
336
|
style=style,
|
|
247
337
|
autofocus=autofocus,
|
|
248
|
-
|
|
338
|
+
dense=dense,
|
|
339
|
+
hide_details=hide_details,
|
|
340
|
+
placeholder=placeholder,
|
|
341
|
+
prefix=prefix,
|
|
342
|
+
suffix=suffix,
|
|
343
|
+
) # type: ignore
|
|
249
344
|
|
|
250
345
|
|
|
251
346
|
@overload
|
|
@@ -261,6 +356,11 @@ def InputInt(
|
|
|
261
356
|
classes: List[str] = ...,
|
|
262
357
|
style: Optional[Union[str, Dict[str, str]]] = ...,
|
|
263
358
|
autofocus: bool = False,
|
|
359
|
+
dense: bool = False,
|
|
360
|
+
hide_details: Union[str, bool] = "auto",
|
|
361
|
+
placeholder: Optional[str] = None,
|
|
362
|
+
prefix: Optional[str] = None,
|
|
363
|
+
suffix: Optional[str] = None,
|
|
264
364
|
) -> reacton.core.ValueElement[vw.TextField, Any]: ...
|
|
265
365
|
|
|
266
366
|
|
|
@@ -277,6 +377,11 @@ def InputInt(
|
|
|
277
377
|
classes: List[str] = ...,
|
|
278
378
|
style: Optional[Union[str, Dict[str, str]]] = ...,
|
|
279
379
|
autofocus: bool = False,
|
|
380
|
+
dense: bool = False,
|
|
381
|
+
hide_details: Union[str, bool] = "auto",
|
|
382
|
+
placeholder: Optional[str] = None,
|
|
383
|
+
prefix: Optional[str] = None,
|
|
384
|
+
suffix: Optional[str] = None,
|
|
280
385
|
) -> reacton.core.ValueElement[vw.TextField, Any]: ...
|
|
281
386
|
|
|
282
387
|
|
|
@@ -292,6 +397,11 @@ def InputInt(
|
|
|
292
397
|
classes: List[str] = [],
|
|
293
398
|
style: Optional[Union[str, Dict[str, str]]] = None,
|
|
294
399
|
autofocus: bool = False,
|
|
400
|
+
dense: bool = False,
|
|
401
|
+
hide_details: Union[str, bool] = "auto",
|
|
402
|
+
placeholder: Optional[str] = None,
|
|
403
|
+
prefix: Optional[str] = None,
|
|
404
|
+
suffix: Optional[str] = None,
|
|
295
405
|
):
|
|
296
406
|
"""Numeric input (integers).
|
|
297
407
|
|
|
@@ -324,6 +434,11 @@ def InputInt(
|
|
|
324
434
|
* `classes`: List of CSS classes to apply to the input.
|
|
325
435
|
* `style`: CSS style to apply to the input.
|
|
326
436
|
* `autofocus`: Determines if a component is to be autofocused or not (Default is False). Autofocus will occur either during page load, or when the component becomes visible (for example, dialog being opened). Only one component per page should have autofocus on each such event.
|
|
437
|
+
* `dense`: Reduces the input height.
|
|
438
|
+
* `hide_details`: Hides hint and validation errors. When set to 'auto', messages will be rendered only if there's a message (hint, error message, etc) to display.
|
|
439
|
+
* `placeholder`: Sets the input's placeholder text.
|
|
440
|
+
* `prefix`: Displays prefix text.
|
|
441
|
+
* `suffix`: Displays suffix text.
|
|
327
442
|
"""
|
|
328
443
|
|
|
329
444
|
def str_to_int(value: Optional[str]):
|
|
@@ -341,15 +456,20 @@ def InputInt(
|
|
|
341
456
|
return _InputNumeric(
|
|
342
457
|
str_to_int,
|
|
343
458
|
label=label,
|
|
344
|
-
value=value,
|
|
345
|
-
on_value=on_value,
|
|
459
|
+
value=value, # type: ignore
|
|
460
|
+
on_value=on_value, # type: ignore
|
|
346
461
|
disabled=disabled,
|
|
347
462
|
continuous_update=continuous_update,
|
|
348
463
|
clearable=clearable,
|
|
349
464
|
classes=classes,
|
|
350
465
|
style=style,
|
|
351
466
|
autofocus=autofocus,
|
|
352
|
-
|
|
467
|
+
dense=dense,
|
|
468
|
+
hide_details=hide_details,
|
|
469
|
+
placeholder=placeholder,
|
|
470
|
+
prefix=prefix,
|
|
471
|
+
suffix=suffix,
|
|
472
|
+
) # type: ignore
|
|
353
473
|
|
|
354
474
|
|
|
355
475
|
def _use_input_type(
|
|
@@ -360,7 +480,7 @@ def _use_input_type(
|
|
|
360
480
|
):
|
|
361
481
|
reactive_value = solara.use_reactive(input_value, on_value) # type: ignore
|
|
362
482
|
del input_value, on_value
|
|
363
|
-
string_value, set_string_value = solara.use_state(stringify(reactive_value.value) if reactive_value.value is not None else None)
|
|
483
|
+
string_value, set_string_value = solara.use_state(stringify(reactive_value.value) if reactive_value.value is not None else None) # type: ignore
|
|
364
484
|
# Use a ref to make sure sync_back_input_value() does not get a stale string_value
|
|
365
485
|
string_value_ref = solara.use_ref(string_value)
|
|
366
486
|
string_value_ref.current = string_value
|
|
@@ -368,14 +488,14 @@ def _use_input_type(
|
|
|
368
488
|
error_message = cast(Union[str, None], None)
|
|
369
489
|
|
|
370
490
|
try:
|
|
371
|
-
reactive_value.set(parse(string_value))
|
|
491
|
+
reactive_value.set(parse(string_value)) # type: ignore
|
|
372
492
|
except ValueError as e:
|
|
373
493
|
error_message = str(e.args[0])
|
|
374
494
|
|
|
375
495
|
def sync_back_input_value():
|
|
376
496
|
# Make sure we update string_value when the effect is rerun,
|
|
377
497
|
# Since the parsing & stringigying functions might have changed
|
|
378
|
-
set_string_value(stringify(reactive_value.value) if reactive_value.value is not None else None)
|
|
498
|
+
set_string_value(stringify(reactive_value.value) if reactive_value.value is not None else None) # type: ignore
|
|
379
499
|
|
|
380
500
|
def on_external_value_change(new_value: Optional[T]):
|
|
381
501
|
new_string_value = stringify(new_value)
|
|
@@ -388,7 +508,7 @@ def _use_input_type(
|
|
|
388
508
|
if new_value != parse(string_value_ref.current):
|
|
389
509
|
set_string_value(new_string_value)
|
|
390
510
|
|
|
391
|
-
return reactive_value.subscribe(on_external_value_change)
|
|
511
|
+
return reactive_value.subscribe(on_external_value_change) # type: ignore
|
|
392
512
|
|
|
393
513
|
solara.use_effect(sync_back_input_value, [reactive_value, parse, stringify])
|
|
394
514
|
|
|
@@ -407,6 +527,11 @@ def _InputNumeric(
|
|
|
407
527
|
classes: List[str] = [],
|
|
408
528
|
style: Optional[Union[str, Dict[str, str]]] = None,
|
|
409
529
|
autofocus: bool = False,
|
|
530
|
+
dense: bool = False,
|
|
531
|
+
hide_details: Union[str, bool] = "auto",
|
|
532
|
+
placeholder: Optional[str] = None,
|
|
533
|
+
prefix: Optional[str] = None,
|
|
534
|
+
suffix: Optional[str] = None,
|
|
410
535
|
):
|
|
411
536
|
"""Numeric input.
|
|
412
537
|
|
|
@@ -420,6 +545,12 @@ def _InputNumeric(
|
|
|
420
545
|
* `classes`: List of CSS classes to apply to the input.
|
|
421
546
|
* `style`: CSS style to apply to the input.
|
|
422
547
|
* `autofocus`: Determines if a component is to be autofocused or not (Default is False). Autofocus will occur either during page load, or when the component becomes visible (for example, dialog being opened). Only one component per page should have autofocus on each such event.
|
|
548
|
+
* `dense`: Reduces the input height.
|
|
549
|
+
* `hide_details`: Hides hint and validation errors. When set to 'auto', messages will be rendered only if there's a message (hint, error message, etc) to display.
|
|
550
|
+
* `placeholder`: Sets the input's placeholder text.
|
|
551
|
+
* `prefix`: Displays prefix text.
|
|
552
|
+
* `suffix`: Displays suffix text.
|
|
553
|
+
* `clearable`: Whether the input can be cleared.
|
|
423
554
|
"""
|
|
424
555
|
style_flat = solara.util._flatten_style(style)
|
|
425
556
|
classes_flat = solara.util._combine_classes(classes)
|
|
@@ -445,12 +576,16 @@ def _InputNumeric(
|
|
|
445
576
|
# we are not using the number type, since we cannot validate invalid input
|
|
446
577
|
# see https://stackoverflow.blog/2022/12/26/why-the-number-input-is-the-worst-input/
|
|
447
578
|
# type="number",
|
|
448
|
-
hide_details=
|
|
579
|
+
hide_details=hide_details,
|
|
449
580
|
clearable=clearable,
|
|
450
581
|
error=bool(error),
|
|
451
582
|
class_=classes_flat,
|
|
452
583
|
style_=style_flat,
|
|
453
584
|
autofocus=autofocus,
|
|
585
|
+
dense=dense,
|
|
586
|
+
placeholder=placeholder if placeholder is not None else "",
|
|
587
|
+
prefix=prefix if prefix is not None else "",
|
|
588
|
+
suffix=suffix if suffix is not None else "",
|
|
454
589
|
)
|
|
455
590
|
use_change(text_field, set_value_cast, enabled=not continuous_update)
|
|
456
591
|
return text_field
|
|
@@ -16,6 +16,11 @@ def InputTextArea(
|
|
|
16
16
|
message: Optional[str] = None,
|
|
17
17
|
auto_grow: bool = True,
|
|
18
18
|
rows: int = 5,
|
|
19
|
+
dense: bool = False,
|
|
20
|
+
hide_details: Union[str, bool] = "auto",
|
|
21
|
+
placeholder: Optional[str] = None,
|
|
22
|
+
prefix: Optional[str] = None,
|
|
23
|
+
suffix: Optional[str] = None,
|
|
19
24
|
):
|
|
20
25
|
r"""Free form text area input.
|
|
21
26
|
|
|
@@ -53,6 +58,11 @@ def InputTextArea(
|
|
|
53
58
|
* `message`: Message to show below the input. If `error` is a string, this will be ignored.
|
|
54
59
|
* `classes`: List of CSS classes to apply to the input.
|
|
55
60
|
* `style`: CSS style to apply to the input.
|
|
61
|
+
* `dense`: Reduces the input height.
|
|
62
|
+
* `hide_details`: Hides hint and validation errors. When set to 'auto', messages will be rendered only if there's a message (hint, error message, counter value etc) to display.
|
|
63
|
+
* `placeholder`: Sets the input's placeholder text.
|
|
64
|
+
* `prefix`: Displays prefix text.
|
|
65
|
+
* `suffix`: Displays suffix text.
|
|
56
66
|
"""
|
|
57
67
|
reactive_value = solara.use_reactive(value, on_value)
|
|
58
68
|
del value, on_value
|
|
@@ -77,10 +87,14 @@ def InputTextArea(
|
|
|
77
87
|
error=bool(error),
|
|
78
88
|
messages=messages,
|
|
79
89
|
solo=True,
|
|
80
|
-
hide_details=
|
|
90
|
+
hide_details=hide_details,
|
|
81
91
|
outlined=True,
|
|
82
92
|
rows=rows,
|
|
83
93
|
auto_grow=auto_grow,
|
|
94
|
+
dense=dense,
|
|
95
|
+
placeholder=placeholder if placeholder is not None else "",
|
|
96
|
+
prefix=prefix if prefix is not None else "",
|
|
97
|
+
suffix=suffix if suffix is not None else "",
|
|
84
98
|
)
|
|
85
99
|
use_change(text_area, set_value_cast, enabled=not continuous_update, update_events=update_events)
|
|
86
100
|
return text_area
|
|
@@ -46,6 +46,12 @@ def InputDate(
|
|
|
46
46
|
date_picker_type: str = "date",
|
|
47
47
|
min_date: Optional[str] = None,
|
|
48
48
|
max_date: Optional[str] = None,
|
|
49
|
+
dense: bool = False,
|
|
50
|
+
hide_details: Union[str, bool] = "auto",
|
|
51
|
+
placeholder: Optional[str] = None,
|
|
52
|
+
prefix: Optional[str] = None,
|
|
53
|
+
suffix: Optional[str] = None,
|
|
54
|
+
clearable: bool = False,
|
|
49
55
|
):
|
|
50
56
|
"""
|
|
51
57
|
Show a textfield, which when clicked, opens a datepicker. The input date should be of type `datetime.date`.
|
|
@@ -84,6 +90,12 @@ def InputDate(
|
|
|
84
90
|
* date_picker_type: Sets the type of the datepicker. Use `"date"` for date selection or `"month"` for month selection. Defaults to `"date"`.
|
|
85
91
|
* min_date: Earliest allowed date/month (ISO 8601 format). If not specified, there is no limit.
|
|
86
92
|
* max_date: Latest allowed date/month (ISO 8601 format). If not specified, there is no limit.
|
|
93
|
+
* dense: Reduces the input height.
|
|
94
|
+
* hide_details: Hides hint and validation errors. When set to 'auto', messages will be rendered only if there's a message (hint, error message, counter value etc) to display.
|
|
95
|
+
* placeholder: Sets the input's placeholder text.
|
|
96
|
+
* prefix: Displays prefix text.
|
|
97
|
+
* suffix: Displays suffix text.
|
|
98
|
+
* clearable: Whether the input can be cleared.
|
|
87
99
|
"""
|
|
88
100
|
value_reactive = solara.use_reactive(value, on_value) # type: ignore
|
|
89
101
|
del value, on_value
|
|
@@ -142,6 +154,12 @@ def InputDate(
|
|
|
142
154
|
error=bool(error_message),
|
|
143
155
|
style_="min-width: 290px;" + style_flat,
|
|
144
156
|
class_=", ".join(classes) if classes else "",
|
|
157
|
+
dense=dense,
|
|
158
|
+
hide_details=hide_details,
|
|
159
|
+
placeholder=placeholder if placeholder is not None else "",
|
|
160
|
+
prefix=prefix if prefix is not None else "",
|
|
161
|
+
suffix=suffix if suffix is not None else "",
|
|
162
|
+
clearable=clearable,
|
|
145
163
|
)
|
|
146
164
|
|
|
147
165
|
use_close_menu(input, datepicker_is_open)
|
|
@@ -157,8 +175,8 @@ def InputDate(
|
|
|
157
175
|
on_v_model=set_date_cast,
|
|
158
176
|
first_day_of_week=first_day_of_the_week,
|
|
159
177
|
style_="width: 100%;",
|
|
160
|
-
max=max_date,
|
|
161
|
-
min=min_date,
|
|
178
|
+
max=max_date, # type: ignore
|
|
179
|
+
min=min_date, # type: ignore
|
|
162
180
|
type=date_picker_type,
|
|
163
181
|
):
|
|
164
182
|
if len(children) > 0:
|
|
@@ -182,6 +200,11 @@ def InputDateRange(
|
|
|
182
200
|
min_date: Optional[str] = None,
|
|
183
201
|
max_date: Optional[str] = None,
|
|
184
202
|
sort: Optional[bool] = False,
|
|
203
|
+
dense: bool = False,
|
|
204
|
+
hide_details: Union[str, bool] = "auto",
|
|
205
|
+
placeholder: Optional[str] = None,
|
|
206
|
+
prefix: Optional[str] = None,
|
|
207
|
+
suffix: Optional[str] = None,
|
|
185
208
|
):
|
|
186
209
|
"""
|
|
187
210
|
Show a textfield, which when clicked, opens a datepicker that allows users to select a range of dates by choosing a starting and ending date.
|
|
@@ -224,6 +247,11 @@ def InputDateRange(
|
|
|
224
247
|
* max_date: Latest allowed date/month (ISO 8601 format). If not specified, there is no limit.
|
|
225
248
|
* sort: If True, selected dates will be sorted in ascending order, regardless of the order they were picked. If False, preserves the order the
|
|
226
249
|
dates were selected.
|
|
250
|
+
* dense: Reduces the input height.
|
|
251
|
+
* hide_details: Hides hint and validation errors. When set to 'auto', messages will be rendered only if there's a message (hint, error message, counter value etc) to display.
|
|
252
|
+
* placeholder: Sets the input's placeholder text.
|
|
253
|
+
* prefix: Displays prefix text.
|
|
254
|
+
* suffix: Displays suffix text.
|
|
227
255
|
|
|
228
256
|
## A More Advanced Example
|
|
229
257
|
|
|
@@ -313,6 +341,11 @@ def InputDateRange(
|
|
|
313
341
|
style_="min-width: 290px;" + style_flat,
|
|
314
342
|
readonly=True,
|
|
315
343
|
class_=", ".join(classes) if classes else "",
|
|
344
|
+
dense=dense,
|
|
345
|
+
hide_details=hide_details,
|
|
346
|
+
placeholder=placeholder if placeholder is not None else "",
|
|
347
|
+
prefix=prefix if prefix is not None else "",
|
|
348
|
+
suffix=suffix if suffix is not None else "",
|
|
316
349
|
)
|
|
317
350
|
|
|
318
351
|
# We include closing on tab in case users want to skip the field with tab
|
|
@@ -330,8 +363,8 @@ def InputDateRange(
|
|
|
330
363
|
range=True,
|
|
331
364
|
first_day_of_week=first_day_of_the_week,
|
|
332
365
|
style_="width: 100%;",
|
|
333
|
-
max=max_date,
|
|
334
|
-
min=min_date,
|
|
366
|
+
max=max_date, # type: ignore
|
|
367
|
+
min=min_date, # type: ignore
|
|
335
368
|
type=date_picker_type,
|
|
336
369
|
):
|
|
337
370
|
if len(children) > 0:
|
solara/server/starlette.py
CHANGED
|
@@ -638,6 +638,13 @@ def readyz(request: Request):
|
|
|
638
638
|
return JSONResponse(json, status_code=status)
|
|
639
639
|
|
|
640
640
|
|
|
641
|
+
def _sanitize_for_json(value):
|
|
642
|
+
"""Convert infinite values to None for JSON serialization."""
|
|
643
|
+
if isinstance(value, (int, float)) and math.isinf(value):
|
|
644
|
+
return None
|
|
645
|
+
return value
|
|
646
|
+
|
|
647
|
+
|
|
641
648
|
async def resourcez(request: Request):
|
|
642
649
|
_ensure_limiter()
|
|
643
650
|
assert limiter is not None
|
|
@@ -664,16 +671,16 @@ async def resourcez(request: Request):
|
|
|
664
671
|
"has_disconnected": len([k for k in contexts if kernel_context.PageStatus.DISCONNECTED in k.page_status.values()]),
|
|
665
672
|
"has_closed": len([k for k in contexts if kernel_context.PageStatus.CLOSED in k.page_status.values()]),
|
|
666
673
|
"limiter": {
|
|
667
|
-
"total_tokens": limiter.total_tokens,
|
|
668
|
-
"borrowed_tokens": limiter.borrowed_tokens,
|
|
669
|
-
"available_tokens": limiter.available_tokens,
|
|
674
|
+
"total_tokens": _sanitize_for_json(limiter.total_tokens),
|
|
675
|
+
"borrowed_tokens": _sanitize_for_json(limiter.borrowed_tokens),
|
|
676
|
+
"available_tokens": _sanitize_for_json(limiter.available_tokens),
|
|
670
677
|
},
|
|
671
678
|
}
|
|
672
679
|
default_limiter = anyio.to_thread.current_default_thread_limiter()
|
|
673
680
|
data["anyio.to_thread.limiter"] = {
|
|
674
|
-
"total_tokens": default_limiter.total_tokens,
|
|
675
|
-
"borrowed_tokens": default_limiter.borrowed_tokens,
|
|
676
|
-
"available_tokens": default_limiter.available_tokens,
|
|
681
|
+
"total_tokens": _sanitize_for_json(default_limiter.total_tokens),
|
|
682
|
+
"borrowed_tokens": _sanitize_for_json(default_limiter.borrowed_tokens),
|
|
683
|
+
"available_tokens": _sanitize_for_json(default_limiter.available_tokens),
|
|
677
684
|
}
|
|
678
685
|
if verbose:
|
|
679
686
|
try:
|
|
@@ -119,7 +119,7 @@ async def main():
|
|
|
119
119
|
]
|
|
120
120
|
for dep in requirements:
|
|
121
121
|
await micropip.install(dep, keep_going=True)
|
|
122
|
-
await micropip.install("/wheels/solara-1.
|
|
122
|
+
await micropip.install("/wheels/solara-1.50.0-py2.py3-none-any.whl", keep_going=True)
|
|
123
123
|
import solara
|
|
124
124
|
|
|
125
125
|
el = solara.Warning("lala")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
prefix/etc/jupyter/jupyter_notebook_config.d/solara.json,sha256=3UhTBQi6z7F7pPjmqXxfddv79c8VGR9H7zStDLp6AwY,115
|
|
2
2
|
prefix/etc/jupyter/jupyter_server_config.d/solara.json,sha256=D9J-rYxAzyD5GOqWvuPjacGUVFHsYtTfZ4FUbRzRvIA,113
|
|
3
|
-
solara/__init__.py,sha256=
|
|
3
|
+
solara/__init__.py,sha256=sAwo5ilYgvykEmTDawkWICtbv2z1XUaEy1WglDsBrvM,3647
|
|
4
4
|
solara/__main__.py,sha256=pm79jfba-0ZapLR0PtwZfMeiTHrLz8kEt79EygRyXxQ,24828
|
|
5
5
|
solara/_stores.py,sha256=N2Ec-61XNFXwigBx8f5QYPx7gDXenCOBdmLPXiJB45E,12320
|
|
6
6
|
solara/alias.py,sha256=9vfLzud77NP8in3OID9b5mmIO8NyrnFjN2_aE0lSb1k,216
|
|
@@ -52,8 +52,8 @@ solara/components/head.py,sha256=QZRTbwaUH0trfce3ntEcOqmLjw74CbSHpuMt9gGj7oA,648
|
|
|
52
52
|
solara/components/head_tag.py,sha256=xPj_ug0TUAZF4yN6ypKlmLcsHORIHU8zfIZgEDNi4PQ,1591
|
|
53
53
|
solara/components/head_tag.vue,sha256=vw0PJzAajq1XbyKhrTakfzJGF_beXAjupkFXPKJbVDo,1642
|
|
54
54
|
solara/components/image.py,sha256=o44iu0_wv3cPKnKv47mw10d2f67vuBaW2Jhs775hNAM,4503
|
|
55
|
-
solara/components/input.py,sha256=
|
|
56
|
-
solara/components/input_text_area.py,sha256=
|
|
55
|
+
solara/components/input.py,sha256=xvnxbT_MSa-xU3dG_F9UGlvXosUG5Yk5d7RYobKEZBc,21875
|
|
56
|
+
solara/components/input_text_area.py,sha256=TPsq2B3Dg1X_u0gXM6it259gz_MViAfeHXAAtOqZI9U,3742
|
|
57
57
|
solara/components/link.py,sha256=bYXVencL9hjBcrGniXdE0JlSzBE9bkUFFmd4apfYhjk,1842
|
|
58
58
|
solara/components/markdown.py,sha256=PQqa0yv95qPJWdePnBZulnOkQfsXdMVkLiyy_ANop6A,14511
|
|
59
59
|
solara/components/markdown_editor.py,sha256=egsCsxeAuot2oolSLt_XjTUmg6S4YCtArQUIbQ9YC6E,874
|
|
@@ -90,7 +90,7 @@ solara/lab/components/__init__.py,sha256=u723AESIHyInjD_7LaonMSheo3-6a-LOmrk6NGk
|
|
|
90
90
|
solara/lab/components/chat.py,sha256=m2hW4CGkTjydN5p_CL_HAwtkl6t14psoSZrwlSMRvJc,9305
|
|
91
91
|
solara/lab/components/confirmation_dialog.py,sha256=V48iN3SovPLLuYI0HVNGlSJ1jfyeCOK2BDFhLW3gg9Y,5822
|
|
92
92
|
solara/lab/components/cross_filter.py,sha256=qJZTRDMCNGy8UuHzuDyWuGA_dU4pI8lzSCDw0hmN8I4,186
|
|
93
|
-
solara/lab/components/input_date.py,sha256=
|
|
93
|
+
solara/lab/components/input_date.py,sha256=ivbZZWr5SGF2W-TTwdM0WwtyeC2V3eHSZ-EKQCk36XI,15575
|
|
94
94
|
solara/lab/components/input_time.py,sha256=Lko7EhN6Ny68aiszwCu8dBVhAYXpLo2W0jLe1alU6EU,5399
|
|
95
95
|
solara/lab/components/menu.py,sha256=Ig2icuftK5m27k5SUO-98hn6S6Ng4g6s4p_g5ccSkTw,5962
|
|
96
96
|
solara/lab/components/menu.vue,sha256=wiHv6NP4LtCxdYHl62oz_3DiFoVzeRBdgL3be3p2bPo,1319
|
|
@@ -120,7 +120,7 @@ solara/server/reload.py,sha256=BBH7QhrV1-e9RVyNE3uz1oPj1DagC3t_XSqGPNz0nJE,9747
|
|
|
120
120
|
solara/server/server.py,sha256=9NQcg_ncrGPQUDs50-jJGdzhlub3G3dsgcBjxqrIxX0,17120
|
|
121
121
|
solara/server/settings.py,sha256=tXXpoK5CBBDbuRSMiert6UKpzMQaDbsBfyoX1Hk8iLM,7599
|
|
122
122
|
solara/server/shell.py,sha256=eLrpTAw3j_1pU-2S7_Jzd4xkoSs_CA7Nv7w0Q7IVLUM,9333
|
|
123
|
-
solara/server/starlette.py,sha256=
|
|
123
|
+
solara/server/starlette.py,sha256=gEBSJf-jZQ6Ep3HKIkcZNadpxgCp6VWdvlq67TjxJQ8,32934
|
|
124
124
|
solara/server/telemetry.py,sha256=GPKGA5kCIqJb76wgxQ2_U2uV_s0r-1tKqv-GVxo5hs8,6038
|
|
125
125
|
solara/server/threaded.py,sha256=k9k461md4MxEFX-RLit5RpVRPFlQNwr-qp5pprT8JB0,2347
|
|
126
126
|
solara/server/utils.py,sha256=1Pa6HF8O1jsxDBcCWlVfP_9jFiUIQgqiIhT4oJ-iUmo,1207
|
|
@@ -146,7 +146,7 @@ solara/server/static/highlight-dark.css,sha256=xO8-vta9vG4s1OfJNHXWqiLWzx_gM03jo
|
|
|
146
146
|
solara/server/static/highlight.css,sha256=k8ZdT5iwrGQ5tXTQHAXuxvZrSUq3kwCdEpy3mlFoZjs,2637
|
|
147
147
|
solara/server/static/main-vuetify.js,sha256=R3qM4xMlstMpRUdRaul78p34z_Av2ONSTXksg2V9TqQ,9503
|
|
148
148
|
solara/server/static/main.js,sha256=mcx4JNQ4Lg4pNdUIqMoZos1mZyYFS48yd_JNFFJUqIE,5679
|
|
149
|
-
solara/server/static/solara_bootstrap.py,sha256=
|
|
149
|
+
solara/server/static/solara_bootstrap.py,sha256=cIh-4dt_etWJrcPHobnu8SkhQ1PFrzzFYwXQ1kP0ZRc,3195
|
|
150
150
|
solara/server/static/sun.svg,sha256=jEKBAGCr7b9zNYv0VUb7lMWKjnU2dX69_Ye_DZWGXJI,6855
|
|
151
151
|
solara/server/static/webworker.js,sha256=cjAFz7-SygStHJnYlJUlJs-gE_7YQeQ-WBDcmKYyjvo,1372
|
|
152
152
|
solara/server/templates/index.html.j2,sha256=JXQo1M-STFHLBOFetgG7509cAq8xUP0VAEtYDzz35fY,31
|
|
@@ -456,9 +456,9 @@ solara/widgets/vue/gridlayout.vue,sha256=LZk-YlqM7nv_7Y5TTq2xqfH1j2SLP1QOH5eiz7G
|
|
|
456
456
|
solara/widgets/vue/html.vue,sha256=48K5rjp0AdJDeRV6F3nOHW3J0WXPeHn55r5pGClK2fU,112
|
|
457
457
|
solara/widgets/vue/navigator.vue,sha256=7fkX-4_YSnnMIPUMKMvQVVEzrmhY9BFAYvHMqZqTXpI,4790
|
|
458
458
|
solara/widgets/vue/vegalite.vue,sha256=zhocRsUCNIRQCEbD16er5sYnuHU0YThatRHnorA3P18,4596
|
|
459
|
-
solara_ui-1.
|
|
460
|
-
solara_ui-1.
|
|
461
|
-
solara_ui-1.
|
|
462
|
-
solara_ui-1.
|
|
463
|
-
solara_ui-1.
|
|
464
|
-
solara_ui-1.
|
|
459
|
+
solara_ui-1.50.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json,sha256=3UhTBQi6z7F7pPjmqXxfddv79c8VGR9H7zStDLp6AwY,115
|
|
460
|
+
solara_ui-1.50.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json,sha256=D9J-rYxAzyD5GOqWvuPjacGUVFHsYtTfZ4FUbRzRvIA,113
|
|
461
|
+
solara_ui-1.50.0.dist-info/METADATA,sha256=r0DTlg-HfHyjB5IT76jfwQZeeIIf3Kf4TswqHH6z5mI,7459
|
|
462
|
+
solara_ui-1.50.0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
|
|
463
|
+
solara_ui-1.50.0.dist-info/licenses/LICENSE,sha256=fFJUz-CWzZ9nEc4QZKu44jMEoDr5fEW-SiqljKpD82E,1086
|
|
464
|
+
solara_ui-1.50.0.dist-info/RECORD,,
|
|
File without changes
|
{solara_ui-1.49.0.data → solara_ui-1.50.0.data}/data/etc/jupyter/jupyter_server_config.d/solara.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|