diff --git a/panel/widgets/select.py b/panel/widgets/select.py index 8b8a1c30b9..782e389b83 100644 --- a/panel/widgets/select.py +++ b/panel/widgets/select.py @@ -32,7 +32,7 @@ RadioButtonGroup as _BkRadioButtonGroup, SingleSelect as _BkSingleSelect, ) from ..util import ( - PARAM_NAME_PATTERN, indexOf, isIn, unique_iterator, + PARAM_NAME_PATTERN, edit_readonly, indexOf, isIn, unique_iterator, ) from ._mixin import TooltipMixin from .base import CompositeWidget, Widget @@ -79,12 +79,22 @@ class SingleSelectBase(SelectBase): value = param.Parameter(default=None) + value_label = param.String(allow_None=True, constant=True) + _allows_values: ClassVar[bool] = True _allows_none: ClassVar[bool] = False _supports_embed: bool = True + _rename: ClassVar[Mapping[str, str | None]] = { + 'value_label': None, + } + + _source_transforms: ClassVar[Mapping[str, str | None]] = { + 'value_label': None + } + __abstract = True def __init__(self, **params): @@ -93,6 +103,16 @@ def __init__(self, **params): if self.value is None and None not in values and values and not self._allows_none: self.value = values[0] + @param.depends('value', watch=True, on_init=True) + def _update_value_label(self): + try: + idx = indexOf(self.value, self.values) + label = self.labels[idx] + except ValueError: + label = None + with edit_readonly(self): + self.value_label = label + def _process_param_change(self, msg): msg = super()._process_param_change(msg) labels, values = self.labels, self.values @@ -204,7 +224,7 @@ class Select(SingleSelectBase): } _source_transforms: ClassVar[Mapping[str, str | None]] = { - 'size': None, 'groups': None + 'size': None, 'groups': None, 'value_label': None } _stylesheets: ClassVar[list[str]] = [f'{CDN_DIST}css/select.css'] @@ -1012,7 +1032,7 @@ class _RadioGroupBase(SingleSelectBase): 'name': None, 'options': 'labels', 'value': 'active' } - _source_transforms = {'value': "source.labels[value]"} + _source_transforms = {'value': "source.labels[value]", 'value_label': None} _target_transforms = {'value': "target.labels.indexOf(value)"} @@ -1084,7 +1104,7 @@ class RadioButtonGroup(_RadioGroupBase, _ButtonBase, TooltipMixin): _rename: ClassVar[Mapping[str, str | None]] = {**_RadioGroupBase._rename, **TooltipMixin._rename} _source_transforms = { - 'value': "source.labels[value]", 'button_style': None, 'description': None + 'value': "source.labels[value]", 'button_style': None, 'description': None, 'value_label': None } _supports_embed: bool = True @@ -1127,7 +1147,7 @@ class _CheckGroupBase(SingleSelectBase): _rename: ClassVar[Mapping[str, str | None]] = {'name': None, 'options': 'labels', 'value': 'active'} - _source_transforms = {'value': "value.map((index) => source.labels[index])"} + _source_transforms = {'value': "value.map((index) => source.labels[index])", 'value_label': None} _target_transforms = {'value': "value.map((label) => target.labels.indexOf(label))"} @@ -1186,7 +1206,7 @@ class CheckButtonGroup(_CheckGroupBase, _ButtonBase, TooltipMixin): _source_transforms = { 'value': "value.map((index) => source.labels[index])", 'button_style': None, - 'description': None + 'description': None, 'value_label': None } _widget_type: ClassVar[type[Model]] = _BkCheckboxButtonGroup