Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed issue setting (Multi)Select value when options changed #291

Merged
merged 2 commits into from Mar 9, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
32 changes: 32 additions & 0 deletions panel/tests/test_widgets.py
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
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