Skip to content

Commit 910d174

Browse files
authored
docs: DOC-824: multi select combo_box example (#1255)
1 parent 7dae890 commit 910d174

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

plugins/ui/docs/components/combo_box.md

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,86 @@ def ui_combo_box_alignment_direction_examples():
765765
my_combo_box_alignment_direction_examples = ui_combo_box_alignment_direction_examples()
766766
```
767767

768+
## How to create a multi-select component
769+
770+
By leveraging the `on_change` handler of `ui.combo_box` to dynamically generate items, you can pair it with `ui.tag_group` to build a multi-select component.
771+
772+
```python
773+
from deephaven import ui
774+
775+
776+
@ui.component
777+
def ui_combo_box_multi_select_example(
778+
options, on_input_change_callback=None, on_selection_change_callback=None
779+
):
780+
input_value, set_input_value = ui.use_state("")
781+
selection_state, set_selection_state = ui.use_state("")
782+
items, set_items = ui.use_state([])
783+
784+
def handle_input_change(new_value):
785+
set_selection_state("")
786+
set_input_value(new_value)
787+
print(f"Text changed to {new_value}")
788+
if on_input_change_callback:
789+
on_input_change_callback(new_value)
790+
791+
def handle_selection_change(new_value):
792+
set_input_value("")
793+
set_selection_state(new_value)
794+
set_items(
795+
lambda prev_items: prev_items + [new_value]
796+
if new_value not in prev_items and new_value is not None
797+
else prev_items
798+
)
799+
print(f"Selection changed to {items}")
800+
if on_selection_change_callback:
801+
on_selection_change_callback(new_value, items)
802+
803+
return [
804+
ui.flex(
805+
ui.flex(
806+
ui.combo_box(
807+
*[ui.item(option) for option in options],
808+
input_value=input_value,
809+
on_input_change=handle_input_change,
810+
selected_key=selection_state,
811+
on_change=handle_selection_change,
812+
),
813+
ui.tag_group(
814+
*[ui.item(item, key=item.lower()) for item in items],
815+
on_remove=lambda keys: set_items(
816+
[item for item in items if item.lower() not in keys]
817+
),
818+
),
819+
direction="row",
820+
align_items="center",
821+
),
822+
align_items="start",
823+
)
824+
]
825+
826+
827+
my_options = [
828+
"Option 1",
829+
"Option 2",
830+
"Option 3",
831+
"Option 4",
832+
"Option 5",
833+
"Option 6",
834+
"Option 7",
835+
"Option 8",
836+
"Option 9",
837+
]
838+
839+
my_combo_box_multi_select_example = ui_combo_box_multi_select_example(
840+
options=my_options,
841+
on_input_change_callback=lambda value: print(f"Custom input handler: {value}"),
842+
on_selection_change_callback=lambda value, items: print(
843+
f"Custom selection handler: {value}, {items}"
844+
),
845+
)
846+
```
847+
768848
## API Reference
769849

770850
```{eval-rst}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"file":"components/combo_box.md","objects":{"my_combo_box_multi_select_example":{"type":"deephaven.ui.Element","data":{"document":{"__dhElemName":"__main__.ui_combo_box_multi_select_example","props":{"children":[{"__dhElemName":"deephaven.ui.components.Flex","props":{"alignItems":"start","gap":"size-100","flex":"auto","children":{"__dhElemName":"deephaven.ui.components.Flex","props":{"direction":"row","alignItems":"center","gap":"size-100","flex":"auto","children":[{"__dhElemName":"deephaven.ui.components.ComboBox","props":{"menuTrigger":"input","align":"end","direction":"bottom","shouldFlip":true,"formValue":"text","inputValue":"","selectedKey":"","validationBehavior":"aria","labelPosition":"top","onChange":{"__dhCbid":"cb0"},"onInputChange":{"__dhCbid":"cb1"},"children":[{"__dhElemName":"deephaven.ui.components.Item","props":{"children":"Option 1"}},{"__dhElemName":"deephaven.ui.components.Item","props":{"children":"Option 2"}},{"__dhElemName":"deephaven.ui.components.Item","props":{"children":"Option 3"}},{"__dhElemName":"deephaven.ui.components.Item","props":{"children":"Option 4"}},{"__dhElemName":"deephaven.ui.components.Item","props":{"children":"Option 5"}},{"__dhElemName":"deephaven.ui.components.Item","props":{"children":"Option 6"}},{"__dhElemName":"deephaven.ui.components.Item","props":{"children":"Option 7"}},{"__dhElemName":"deephaven.ui.components.Item","props":{"children":"Option 8"}},{"__dhElemName":"deephaven.ui.components.Item","props":{"children":"Option 9"}}]}},{"__dhElemName":"deephaven.ui.components.TagGroup","props":{"labelPosition":"top","labelAlign":"start","onRemove":{"__dhCbid":"cb2"}}}]}}}}]}},"state":"{\"state\": {\"0\": \"\", \"1\": \"\"}}"}}}}

0 commit comments

Comments
 (0)