Skip to content

Commit

Permalink
Fixed issue setting (Multi)Select value when options changed (#291)
Browse files Browse the repository at this point in the history
* Skip setting unavailable values

* Fixed issue setting (Multi)Select value when options changed
  • Loading branch information
philippjfr committed Mar 9, 2019
1 parent 5a9ee4b commit 8e0ef61
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 3 deletions.
32 changes: 32 additions & 0 deletions panel/tests/test_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,22 @@ def test_select_mutables(document, comm):
assert widget.value == 'A'


def test_select_change_options(document, comm):
select = Select(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]),
value='A', name='Select')

def set_options(event):
if event.new == 1:
select.options = OrderedDict([('D', 2), ('E', 'a')])
select.param.watch(set_options, 'value')

model = select._get_root(document, comm=comm)

select.value = 1
assert model.value == 'D'
assert model.options == ['D', 'E']


def test_multi_select(document, comm):
select = MultiSelect(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]),
value=[object, 1], name='Select')
Expand All @@ -292,6 +308,22 @@ def test_multi_select(document, comm):
assert widget.value == ['C', 'A']


def test_multi_select_change_options(document, comm):
select = MultiSelect(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]),
value=[object, 1], name='Select')

def set_options(event):
if event.new == [1]:
select.options = OrderedDict([('D', 2), ('E', 'a')])
select.param.watch(set_options, 'value')

model = select._get_root(document, comm=comm)

select.value = [1]
assert model.value == []
assert model.options == ['D', 'E']


def test_toggle_group_error_init(document, comm):
with pytest.raises(ValueError):
ToggleGroup(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]),
Expand Down
14 changes: 11 additions & 3 deletions panel/widgets/select.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,22 @@ def _process_param_change(self, msg):
msg = super(Select, self)._process_param_change(msg)
mapping = {hashable(v): k for k, v in self.options.items()}
if msg.get('value') is not None:
msg['value'] = mapping[hashable(msg['value'])]
hash_val = hashable(msg['value'])
if hash_val in mapping:
msg['value'] = mapping[hash_val]
else:
msg['value'] = list(self.options)[0]
if 'options' in msg:
msg['options'] = list(msg['options'])
return msg

def _process_property_change(self, msg):
msg = super(Select, self)._process_property_change(msg)
if 'value' in msg:
msg['value'] = self.options[msg['value']]
if msg['value'] is None:
msg['value'] = None
else:
msg['value'] = self.options[msg['value']]
msg.pop('options', None)
return msg

Expand All @@ -72,7 +79,8 @@ def _process_param_change(self, msg):
msg = super(Select, self)._process_param_change(msg)
mapping = {hashable(v): k for k, v in self.options.items()}
if 'value' in msg:
msg['value'] = [hashable(mapping[v]) for v in msg['value']]
msg['value'] = [hashable(mapping[v]) for v in msg['value']
if v in mapping]
if 'options' in msg:
msg['options'] = list(msg['options'])
return msg
Expand Down

0 comments on commit 8e0ef61

Please sign in to comment.