From 23519feaa68acd08fb67987144a966af7e77e1d6 Mon Sep 17 00:00:00 2001 From: Joe Numainville Date: Tue, 16 Apr 2024 09:52:42 -0500 Subject: [PATCH 01/10] item data source --- plugins/ui/DESIGN.md | 297 +++++++++--------- .../ui/components/item_table_source.py | 66 ++++ .../src/deephaven/ui/components/list_view.py | 34 +- .../ui/src/deephaven/ui/components/picker.py | 42 +-- 4 files changed, 244 insertions(+), 195 deletions(-) create mode 100644 plugins/ui/src/deephaven/ui/components/item_table_source.py diff --git a/plugins/ui/DESIGN.md b/plugins/ui/DESIGN.md index f101165ac..7d823ee76 100644 --- a/plugins/ui/DESIGN.md +++ b/plugins/ui/DESIGN.md @@ -1043,6 +1043,51 @@ ui.section( ) -> SectionElement ``` +###### ui.list_action_group +A group of action buttons that can be used to create a list of actions. +This component should be used within the actions prop of a `ListView` component. + +```py +def list_action_group( + *children: ActionGroupItem, + on_action: Callable[[ActionKey, Key], None] | None = None, + on_selection_change: Callable[[Selection, Key], None] | None = None, + **props: Any +) -> ListActionGroupElement: +``` + +###### Parameters +| Parameter | Type | Description | +|-------------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| +| `*children` | `ActionGroupItem` | The actions to render within the action group. | +| `on_action` | `Callable[[ActionKey, Key], None] \| None` | Handler that is called when an item is pressed. The first argument is the key of the action, the second argument is the key of the list_view item. | +| `on_selection_change` | `Callable[[Selection, Key], None] \| None` | Handler that is called when the selection changes. The first argument is the selection, the second argument is the key of the list_view item. | +| `**props` | `Any` | Any other [ActionGroup](https://react-spectrum.adobe.com/react-spectrum/ActionGroup.html) prop. | + + + +###### ui.list_action_menu +A group of action buttons that can be used to create a list of actions. +This component should be used within the actions prop of a `ListView` component. + +```py +def list_action_menu( + *children: ActionMenuItem, + on_action: Callable[[ActionKey, Key], None] | None = None, + on_open_change: Callable[[bool, Key], None] | None = None, + **props: Any +) -> ListActionMenuElement: +``` + +###### Parameters +| Parameter | Type | Description | +|-------------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| +| `*children` | `ActionMenuItem` | The options to render within the picker. | +| `on_action` | `Callable[[ActionKey, Key], None] \| None` | Handler that is called when an item is pressed. The first argument is the key of the action, the second argument is the key of the list_view item. | +| `on_open_change` | `Callable[[bool, Key], None] \| None` | The first argument is a boolean indicating if the menu is open, the second argument is the key of the list_view item. | +| `**props` | `Any` | Any other [ActionMenu](https://react-spectrum.adobe.com/react-spectrum/ActionMenu.html) prop. | + + ###### Parameters | Parameter | Type | Description | @@ -1051,23 +1096,55 @@ ui.section( | `title` | `str \| None` | The title of the section. | | `**props` | `Any` | Any other Section prop | -##### ui.picker +##### ui.item_table_source -A picker that can be used to select from a list. Children should be one of four types: -If children are of type `Item`, they are the dropdown options. -If children are of type `SectionElement`, they are the dropdown sections. -If children are of type `Table`, the values in the table are the dropdown options. There can only be one child, the `Table`. -If children are of type `PartitionedTable`, the values in the table are the dropdown options and the partitions create multiple sections. There can only be one child, the `PartitionedTable`. +An item table source wraps a Table or PartitionedTable to provide additional information for +creating complex items from a table. +A PartitionedTable is only supported if the component itself supports a PartitionedTable as a child. +A PartitionedTable passed here will lead to the same behavior as passing +the PartitionedTable directly to a component, such as creating sections from the partitions in the case of a Picker. ```py import deephaven.ui as ui -ui.picker( - *children: Item | SectionElement | Table | PartitionedTable, +ui.item_table_source( + table: Table | PartitionedTable, key_column: ColumnName | None = None, label_column: ColumnName | None = None, description_column: ColumnName | None = None, icon_column: ColumnName | None = None, title_column: ColumnName | None = None, + actions: ListActionGroupElement | ListActionMenuElement | None = None, +) -> ItemTableSource: +``` + +###### Parameters + +| Parameter | Type | Description | +| ---------------------- | ----------------------------------------------------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `*children` | `Item \| SectionElement \| Table \| PartitionedTable` | The options to render within the picker. | +| `key_column` | `ColumnName \| None` | The column of values to use as item keys. Defaults to the first column. | +| `label_column` | `ColumnName \| None` | The column of values to display as primary text. Defaults to the `key_column` value. | +| `description_column` | `ColumnName \| None` | The column of values to display as descriptions. | +| `icon_column` | `ColumnName \| None` | The column of values to map to icons. | +| `title_column` | `ColumnName \| None` | Only valid if table is of type `PartitionedTable`. The column of values to display as section names. Should be the same for all values in the constituent `Table`. If not specified, the section titles will be created from the `key_columns` of the `PartitionedTable`. | +| `actions` | `ListActionGroupElement \| ListActionMenuElement \| None` | The action group or menus to render for all elements within the component, if supported. | + +##### ui.picker + +A picker that can be used to select from a list. Children should be one of five types: +1. If children are of type `Item`, they are the dropdown options. +2. If children are of type `SectionElement`, they are the dropdown sections. +3. If children are of type `Table`, the values in the table are the dropdown options. There can only be one child, the `Table`. +4. If children are of type `PartitionedTable`, the values in the table are the dropdown options and the partitions create multiple sections. There can only be one child, the `PartitionedTable`. +5. If children are of type `ItemTableSource`, complex items are created from the source. +There can only be one child, the `ItemTableSource`. +Supported ItemTableSource arguments are `key_column`, `label_column`, `description_column`, +`icon_column`, and `title_column`. + +```py +import deephaven.ui as ui +ui.picker( + *children: Item | SectionElement | Table | PartitionedTable | ItemTableSource, default_selected_key: Key | None = None, selected_key: Key | None = None, on_selection_change: Callable[[Key], None] | None = None, @@ -1078,19 +1155,14 @@ ui.picker( ###### Parameters -| Parameter | Type | Description | -| ---------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `*children` | `Item \| SectionElement \| Table \| PartitionedTable` | The options to render within the picker. | -| `key_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to use as item keys. Defaults to the first column. | -| `label_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to display as primary text. Defaults to the `key_column` value. | -| `description_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to display as descriptions. | -| `icon_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to map to icons. | -| `title_column` | `ColumnName \| None` | Only valid if children is of type `PartitionedTable`. The column of values to display as section names. Should be the same for all values in the constituent `Table`. If not specified, the section titles will be created from the `key_columns` of the `PartitionedTable`. | -| `default_selected_key` | `Key \| None` | The initial selected key in the collection (uncontrolled). | -| `selected_key` | `Key \| None` | The currently selected key in the collection (controlled). | -| `on_selection_change` | `Callable[[Key], None] \| None` | Handler that is called when the selection changes. | -| `on_change` | `Callable[[Key], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selection changes. | -| `**props` | `Any` | Any other [Picker](https://react-spectrum.adobe.com/react-spectrum/Picker.html) prop, with the exception of `items`, `validate`, `errorMessage` (as a callback) and `onLoadMore` | +| Parameter | Type | Description | +| ---------------------- |--------------------------------------------------------------------------| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `*children` | `Item \| SectionElement \| Table \| PartitionedTable \| ItemTableSource` | The options to render within the picker. | +| `default_selected_key` | `Key \| None` | The initial selected key in the collection (uncontrolled). | +| `selected_key` | `Key \| None` | The currently selected key in the collection (controlled). | +| `on_selection_change` | `Callable[[Key], None] \| None` | Handler that is called when the selection changes. | +| `on_change` | `Callable[[Key], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selection changes. | +| `**props` | `Any` | Any other [Picker](https://react-spectrum.adobe.com/react-spectrum/Picker.html) prop, with the exception of `items`, `validate`, `errorMessage` (as a callback) and `onLoadMore` | ```py import deephaven.ui as ui @@ -1176,76 +1248,36 @@ partitioned_table = color_table.partition_by("Sections") color, set_color = ui.use_state("salmon") # this will create a picker with two sections, one for each partition -picker7 = ui.picker( +# in order to customize the columns used for the picker, use an item_table_source +source = ui.item_table_source( partitioned_table, key_column="Keys", label_column="Labels", description_column="Descriptions", icon_column="Icons", - title_column="SectionNames", + title_column="SectionNames" +) + +picker7 = ui.picker( + source, selected_key=color, on_selection_change=set_color ) ``` -###### ui.list_action_group -A group of action buttons that can be used to create a list of actions. -This component should be used within the actions prop of a `ListView` component. - -```py -def list_action_group( - *children: ActionGroupItem, - on_action: Callable[[ActionKey, Key], None] | None = None, - on_selection_change: Callable[[Selection, Key], None] | None = None, - **props: Any -) -> ListActionGroupElement: -``` - -###### Parameters -| Parameter | Type | Description | -|-------------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| -| `*children` | `ActionGroupItem` | The actions to render within the action group. | -| `on_action` | `Callable[[ActionKey, Key], None] \| None` | Handler that is called when an item is pressed. The first argument is the key of the action, the second argument is the key of the list_view item. | -| `on_selection_change` | `Callable[[Selection, Key], None] \| None` | Handler that is called when the selection changes. The first argument is the selection, the second argument is the key of the list_view item. | -| `**props` | `Any` | Any other [ActionGroup](https://react-spectrum.adobe.com/react-spectrum/ActionGroup.html) prop. | - - - -###### ui.list_action_menu -A group of action buttons that can be used to create a list of actions. -This component should be used within the actions prop of a `ListView` component. - -```py -def list_action_menu( - *children: ActionMenuItem, - on_action: Callable[[ActionKey, Key], None] | None = None, - on_open_change: Callable[[bool, Key], None] | None = None, - **props: Any -) -> ListActionMenuElement: -``` - -###### Parameters -| Parameter | Type | Description | -|-------------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| -| `*children` | `ActionMenuItem` | The options to render within the picker. | -| `on_action` | `Callable[[ActionKey, Key], None] \| None` | Handler that is called when an item is pressed. The first argument is the key of the action, the second argument is the key of the list_view item. | -| `on_open_change` | `Callable[[bool, Key], None] \| None` | The first argument is a boolean indicating if the menu is open, the second argument is the key of the list_view item. | -| `**props` | `Any` | Any other [ActionMenu](https://react-spectrum.adobe.com/react-spectrum/ActionMenu.html) prop. | - ###### ui.list_view -A list view that can be used to create a list of items. Children should be one of two types: +A list view that can be used to create a list of items. Children should be one of three types: 1. If children are of type `Item`, they are the list items. 2. If children are of type `Table`, the values in the table are the list items. There can only be one child, the `Table`. +3. If children are of type ItemTableSource, complex items are created from the table. +There can only be one child, the `ItemTableSource`. +Supported `ItemTableSource` arguments are `key_column`, `label_column`, `description_column`, +`icon_column`, and `actions`. ```py import deephaven.ui as ui ui.list_view( - *children: Item | Table, - key_column: ColumnName | None = None, - label_column: ColumnName | None = None, - description_column: ColumnName | None = None, - icon_column: ColumnName | None = None, - actions: ListActionGroupElement | ListActionMenuElement | None = None, + *children: Item | Table | ItemTableSource, default_selected_keys: Selection | None = None, selected_keys: Selection | None = None, render_empty_state: Element | None = None, @@ -1256,20 +1288,15 @@ ui.list_view( ``` ###### Parameters -| Parameter | Type | Description | -|-------------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `*children` | `Item \| Table` | The options to render within the list_view. | -| `key_column` | `ColumnName \| None` | Only valid if children are of type `Table`. The column of values to use as item keys. Defaults to the first column. | -| `label_column` | `ColumnName \| None` | Only valid if children are of type `Table`. The column of values to display as primary text. Defaults to the `key_column` value. | -| `description_column` | `ColumnName \| None` | Only valid if children are of type `Table`. The column of values to display as descriptions. | -| `icon_column` | `ColumnName \| None` | Only valid if children are of type `Table`. The column of values to map to icons. | -| `actions` | `ListActionGroupElement \| ListActionMenuElement \| None` | Only valid if children are of type Table. The action group or menus to render for all elements within the list view. | -| `default_selected_keys` | `Selection \| None` | The initial selected keys in the collection (uncontrolled). | -| `selected_keys` | `Selection \| None` | The currently selected keys in the collection (controlled). | -| `render_empty_state` | `Element \| None` | Sets what the `list_view` should render when there is no content to display. | -| `on_selection_change` | `Callable[[Selection], None] \| None` | Handler that is called when the selections changes. | -| `on_change` | `Callable[[Selection], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selections changes. | -| `**props` | `Any` | Any other [ListView](https://react-spectrum.adobe.com/react-spectrum/ListView.html) prop, with the exception of `items`, `dragAndDropHooks`, and `onLoadMore`. | +| Parameter | Type | Description | +|-------------------------|-----------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `*children` | `Item \| Table \| ItemTableSource` | The options to render within the list_view. | +| `default_selected_keys` | `Selection \| None` | The initial selected keys in the collection (uncontrolled). | +| `selected_keys` | `Selection \| None` | The currently selected keys in the collection (controlled). | +| `render_empty_state` | `Element \| None` | Sets what the `list_view` should render when there is no content to display. | +| `on_selection_change` | `Callable[[Selection], None] \| None` | Handler that is called when the selections changes. | +| `on_change` | `Callable[[Selection], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selections changes. | +| `**props` | `Any` | Any other [ListView](https://react-spectrum.adobe.com/react-spectrum/ListView.html) prop, with the exception of `items`, `dragAndDropHooks`, and `onLoadMore`. | ```py @@ -1330,28 +1357,26 @@ color_table = new_table([ colors, set_colors = ui.use_state(["salmon", "lemonchiffon"]) # this will create a controlled list_view with color_table -list_view5 = ui.list_view( +# In order to customize the columns and add table-based buttons for the list_view, use an item_table_source +# Note key is added to the on_press handler, but is not required. +on_button_action = lambda action_key, key: print(f"Action {action_key} was pressed for list item {key}") +button = ui.list_action_group("Print Item", on_action=on_button_action) + +source = ui.item_table_source( color_table, key_column="Keys", label_column="Labels", description_column="Descriptions", icon_column="Icons", + title_column="SectionLabels", + actions=button +) +list_view5 = ui.list_view( + source, selected_keys=colors, on_selection_change=set_colors ) - -# Buttons can be embedded in the list view. Note key is added to the on_press handler, but is not required. -on_button_action = lambda action_key, key: print(f"Action {action_key} was pressed for list item {key}") -button = ui.list_action_group("Print Item", on_action=on_button_action) - -list_view7 = ui.list_view( - "Option 1", - "Option 2", - "Option 3", - "Option 4", - actions=button, -) ``` ###### ui.date_picker @@ -1485,22 +1510,20 @@ date_picker8 = ui.date_picker( ##### ui.combo_box -A combo_box that can be used to search or select from a list. -Children should be one of four types: -If children are of type `Item`, they are the dropdown options. -If children are of type `SectionElement`, they are the dropdown sections. -If children are of type `Table`, the values in the table are the dropdown options. There can only be one child, the `Table`. -If children are of type `PartitionedTable`, the values in the table are the dropdown options and the partitions create multiple sections. There can only be one child, the `PartitionedTable`. +A combo_box that can be used to search or select from a list. Children should be one of five types: +1. If children are of type `Item`, they are the dropdown options. +2. If children are of type `SectionElement`, they are the dropdown sections. +3. If children are of type `Table`, the values in the table are the dropdown options. There can only be one child, the `Table`. +4. If children are of type `PartitionedTable`, the values in the table are the dropdown options and the partitions create multiple sections. There can only be one child, the `PartitionedTable`. +5. If children are of type `ItemTableSource`, complex items are created from the source. +There can only be one child, the ItemTableSource. +Supported ItemTableSource arguments are `key_column`, `label_column`, `description_column`, +`icon_column`, and `title_column`. ```py import deephaven.ui as ui ui.combo_box( - *children: Item | SectionElement | Table | PartitionedTable, - key_column: ColumnName | None = None, - label_column: ColumnName | None = None, - description_column: ColumnName | None = None, - icon_column: ColumnName | None = None, - title_column: ColumnName | None = None, + *children: Item | SectionElement | Table | PartitionedTable | ItemTableSource, default_selected_key: Key | None = None, selected_key: Key | None = None, input_value: str | None = None, @@ -1515,23 +1538,18 @@ ui.combo_box( ###### Parameters -| Parameter | Type | Description | -| ---------------------- | ----------------------------------------------------- |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `*children` | `Item \| SectionElement \| Table \| PartitionedTable` | The options to render within the combo_box. | -| `key_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to use as item keys. Defaults to the first column. | -| `label_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to display as primary text. Defaults to the `key_column` value. | -| `description_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to display as descriptions. | -| `icon_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to map to icons. | -| `title_column` | `ColumnName \| None` | Only valid if children is of type `PartitionedTable`. The column of values to display as section names. Should be the same for all values in the constituent `Table`. If not specified, the section titles will be created from the `key_columns` of the `PartitionedTable`. | -| `default_selected_key` | `Key \| None` | The initial selected key in the collection (uncontrolled). | -| `selected_key` | `Key \| None` | The currently selected key in the collection (controlled). | -| `input_value` | `str \| None` | The value of the search input (controlled). | -| `default_input_value` | `str \| None` | The default value of the search input (uncontrolled). | -| `on_input_change` | `Callable[[str], None] \| None` | Handler that is called when the search input value changes. | -| `on_selection_change` | `Callable[[Key], None] \| None` | Handler that is called when the selection changes. | -| `on_change` | `Callable[[Key], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selection changes. | -| `on_open_change` | `Callable[[bool, MenuTriggerAction], None] \| None` | Method that is called when the open state of the menu changes. Returns the new open state and the action that caused the opening of the menu. | -| `**props` | `Any` | Any other [Combo_Box](https://react-spectrum.adobe.com/react-spectrum/ComboBox.html) prop, with the exception of `items`, `validate`, `errorMessage` (as a callback) and `onLoadMore` | +| Parameter | Type | Description | +| ---------------------- |--------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `*children` | `Item \| SectionElement \| Table \| PartitionedTable \| ItemTableSource` | The options to render within the combo_box. | +| `default_selected_key` | `Key \| None` | The initial selected key in the collection (uncontrolled). | +| `selected_key` | `Key \| None` | The currently selected key in the collection (controlled). | +| `input_value` | `str \| None` | The value of the search input (controlled). | +| `default_input_value` | `str \| None` | The default value of the search input (uncontrolled). | +| `on_input_change` | `Callable[[str], None] \| None` | Handler that is called when the search input value changes. | +| `on_selection_change` | `Callable[[Key], None] \| None` | Handler that is called when the selection changes. | +| `on_change` | `Callable[[Key], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selection changes. | +| `on_open_change` | `Callable[[bool, MenuTriggerAction], None] \| None` | Method that is called when the open state of the menu changes. Returns the new open state and the action that caused the opening of the menu. | +| `**props` | `Any` | Any other [Combo_Box](https://react-spectrum.adobe.com/react-spectrum/ComboBox.html) prop, with the exception of `items`, `validate`, `errorMessage` (as a callback) and `onLoadMore` | ```py import deephaven.ui as ui @@ -1634,24 +1652,19 @@ partitioned_table = color_table.partition_by("Sections") color, set_color = ui.use_state("salmon") # this will create a combo_box with two sections, one for each partition -combo_box9 = ui.combo_box( +# in order to customize the columns used for the combo_box, use an item_table_source + +source = ui.item_table_source( partitioned_table, key_column="Keys", label_column="Labels", description_column="Descriptions", icon_column="Icons", - title_column="SectionNames", - selected_key=color, - on_selection_change=set_color + title_column="SectionNames" ) -color, set_color = ui.use_state("salmon") - -# this will create a combo_box that matches against the start of the label when searching -combo_box10 = ui.combo_box( - color_table, - key_column="Keys", - search_type="STARTS_WITH", +combo_box9 = ui.combo_box( + source, selected_key=color, on_selection_change=set_color ) @@ -1661,7 +1674,7 @@ items = ["First Option", "Second Option", "Third Option", "Fourth Option"] filter_value, set_filter_value = ui.use_state('') filtered_items = ui.use_memo(lambda: filter(lambda item: item.startswith(filter_value), items), [filter_value, items]) -combo_box11 = ui.combo_box(*filtered_items, on_input_change=set_filter_value) +combo_box10 = ui.combo_box(*filtered_items, on_input_change=set_filter_value) ``` #### ui.table diff --git a/plugins/ui/src/deephaven/ui/components/item_table_source.py b/plugins/ui/src/deephaven/ui/components/item_table_source.py new file mode 100644 index 000000000..b8f3bc46a --- /dev/null +++ b/plugins/ui/src/deephaven/ui/components/item_table_source.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +from typing import Union, TypedDict, cast, Type, TypeGuard, TypeVar + +from deephaven.table import Table, PartitionedTable + +from .item import ItemElement +from .list_action_group import ListActionGroupElement +from .list_action_menu import ListActionMenuElement +from ..elements import Element +from ..types import ColumnName, Stringable + +ListViewItem = Union[Stringable, ItemElement] +ListViewElement = Element + + +class ItemTableSource(TypedDict): + table: Table | PartitionedTable + key_column: ColumnName | None + label_column: ColumnName | None + description_column: ColumnName | None + icon_column: ColumnName | None + title_column: ColumnName | None + actions: ListActionGroupElement | ListActionMenuElement | None + + +def item_table_source( + table: Table | PartitionedTable, + key_column: ColumnName | None = None, + label_column: ColumnName | None = None, + description_column: ColumnName | None = None, + icon_column: ColumnName | None = None, + title_column: ColumnName | None = None, + actions: ListActionGroupElement | ListActionMenuElement | None = None, +) -> ItemTableSource: + """ + An item table source wraps a Table or PartitionedTable to provide additional information for + creating complex items from a table. + A PartitionedTable is only supported if the component itself supports a PartitionedTable as a child. + A PartitionedTable passed here will lead to the same behavior as passing + the PartitionedTable directly to a component, such as creating sections from the partitions in the case of a Picker. + + Args: + table: + The table to use as the source of items. + key_column: + The column of values to use as item keys. Defaults to the first column. + label_column: + The column of values to display as primary text. Defaults to the key_column value. + description_column: + The column of values to display as descriptions. + icon_column: + The column of values to map to icons. + title_column: + Only valid if table is of type PartitionedTable. + The column of values to display as section names. + Should be the same for all values in the constituent Table. + If not specified, the section titles will be created from the key_columns of the PartitionedTable. + actions: + The action group or menus to render for all elements within the component, if supported. + + Returns: + The item table source to pass as a child to a component that supports it. + """ + + return cast(ItemTableSource, locals()) diff --git a/plugins/ui/src/deephaven/ui/components/list_view.py b/plugins/ui/src/deephaven/ui/components/list_view.py index f467ba0de..13a54449d 100644 --- a/plugins/ui/src/deephaven/ui/components/list_view.py +++ b/plugins/ui/src/deephaven/ui/components/list_view.py @@ -5,23 +5,17 @@ from deephaven.table import Table from .item import ItemElement -from .list_action_group import ListActionGroupElement -from .list_action_menu import ListActionMenuElement +from .item_table_source import ItemTableSource from ..elements import BaseElement, Element from .._internal.utils import create_props -from ..types import ColumnName, Stringable, Selection +from ..types import Stringable, Selection ListViewItem = Union[Stringable, ItemElement] ListViewElement = Element def list_view( - *children: ListViewItem | Table, - key_column: ColumnName | None = None, - label_column: ColumnName | None = None, - description_column: ColumnName | None = None, - icon_column: ColumnName | None = None, - actions: ListActionGroupElement | ListActionMenuElement | None = None, + *children: ListViewItem | Table | ItemTableSource, default_selected_keys: Selection | None = None, selected_keys: Selection | None = None, render_empty_state: Element | None = None, @@ -30,28 +24,18 @@ def list_view( **props: Any, ) -> ListViewElement: """ - A list view that can be used to create a list of items. Children should be one of two types: + A list view that can be used to create a list of items. Children should be one of three types: 1. If children are of type `ListViewItem`, they are the list items. 2. If children are of type `Table`, the values in the table are the list items. There can only be one child, the `Table`. - + The first column is used as the key and label by default. + 3. If children are of type ItemTableSource, complex items are created from the source. + There can only be one child, the `ItemTableSource`. + Supported `ItemTableSource` arguments are `key_column`, `label_column`, `description_column`, + `icon_column`, and `actions`. Args: *children: The options to render within the list_view. - key_column: - Only valid if children are of type Table. - The column of values to use as item keys. Defaults to the first column. - label_column: - Only valid if children are of type Table. - The column of values to display as primary text. Defaults to the key_column value. - description_column: - Only valid if children are of type Table. - The column of values to display as descriptions. - icon_column: Only valid if children are of type Table. - The column of values to map to icons. - actions: - Only valid if children are of type Table. - The action group or menus to render for all elements within the list view. default_selected_keys: The initial selected keys in the collection (uncontrolled). selected_keys: diff --git a/plugins/ui/src/deephaven/ui/components/picker.py b/plugins/ui/src/deephaven/ui/components/picker.py index f060b2ee4..6095df0a9 100644 --- a/plugins/ui/src/deephaven/ui/components/picker.py +++ b/plugins/ui/src/deephaven/ui/components/picker.py @@ -4,20 +4,16 @@ from deephaven.table import Table, PartitionedTable from .section import SectionElement, PickerItem +from .item_table_source import ItemTableSource from ..elements import BaseElement from .._internal.utils import create_props -from ..types import ColumnName, Key +from ..types import Key PickerElement = BaseElement def picker( - *children: PickerItem | SectionElement | Table | PartitionedTable, - key_column: ColumnName | None = None, - label_column: ColumnName | None = None, - description_column: ColumnName | None = None, - icon_column: ColumnName | None = None, - title_column: ColumnName | None = None, + *children: PickerItem | SectionElement | Table | PartitionedTable | ItemTableSource, default_selected_key: Key | None = None, selected_key: Key | None = None, on_selection_change: Callable[[Key], None] | None = None, @@ -25,32 +21,22 @@ def picker( **props: Any, ) -> PickerElement: """ - A picker that can be used to select from a list. Children should be one of four types: - If children are of type PickerItem, they are the dropdown options. - If children are of type SectionElement, they are the dropdown sections. - If children are of type Table, the values in the table are the dropdown options. + A picker that can be used to select from a list. Children should be one of five types: + 1. If children are of type PickerItem, they are the dropdown options. + 2. If children are of type SectionElement, they are the dropdown sections. + 3. If children are of type Table, the values in the table are the dropdown options. There can only be one child, the Table. - If children are of type PartitionedTable, the values in the table are the dropdown options + The first column is used as the key and label by default. + 4. If children are of type PartitionedTable, the values in the table are the dropdown options and the partitions create multiple sections. There can only be one child, the PartitionedTable. + The first column is used as the key and label by default. + 5. If children are of type ItemTableSource, complex items are created from the source. + There can only be one child, the ItemTableSource. + Supported ItemTableSource arguments are `key_column`, `label_column`, `description_column`, + `icon_column`, and `title_column`. Args: *children: The options to render within the picker. - key_column: - Only valid if children are of type Table or PartitionedTable. - The column of values to use as item keys. Defaults to the first column. - label_column: - Only valid if children are of type Table or PartitionedTable. - The column of values to display as primary text. Defaults to the key_column value. - description_column: - Only valid if children are of type Table or PartitionedTable. - The column of values to display as descriptions. - icon_column: Only valid if children are of type Table or PartitionedTable. - The column of values to map to icons. - title_column: - Only valid if children is of type PartitionedTable. - The column of values to display as section names. - Should be the same for all values in the constituent Table. - If not specified, the section titles will be created from the key_columns of the PartitionedTable. default_selected_key: The initial selected key in the collection (uncontrolled). selected_key: From dbe0abc62772b68ec408bcce66e32130b7134767 Mon Sep 17 00:00:00 2001 From: Joe Numainville Date: Tue, 16 Apr 2024 10:18:53 -0500 Subject: [PATCH 02/10] wip --- plugins/ui/src/deephaven/ui/components/item_table_source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ui/src/deephaven/ui/components/item_table_source.py b/plugins/ui/src/deephaven/ui/components/item_table_source.py index b8f3bc46a..f9d580396 100644 --- a/plugins/ui/src/deephaven/ui/components/item_table_source.py +++ b/plugins/ui/src/deephaven/ui/components/item_table_source.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Union, TypedDict, cast, Type, TypeGuard, TypeVar +from typing import Union, TypedDict, cast from deephaven.table import Table, PartitionedTable From 3547694c0158f24ad0b3e47892014097a3a7f78b Mon Sep 17 00:00:00 2001 From: Joe Numainville Date: Tue, 16 Apr 2024 11:23:59 -0500 Subject: [PATCH 03/10] wip --- plugins/ui/DESIGN.md | 34 +++++++++---------- .../src/deephaven/ui/components/__init__.py | 2 ++ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/plugins/ui/DESIGN.md b/plugins/ui/DESIGN.md index 7d823ee76..f6b9f5ce9 100644 --- a/plugins/ui/DESIGN.md +++ b/plugins/ui/DESIGN.md @@ -1043,16 +1043,24 @@ ui.section( ) -> SectionElement ``` +###### Parameters + +| Parameter | Type | Description | +| ----------- |---------------|-------------------------------------------| +| `*children` | `Item` | The options to render within the section. | +| `title` | `str \| None` | The title of the section. | +| `**props` | `Any` | Any other Section prop | + ###### ui.list_action_group A group of action buttons that can be used to create a list of actions. This component should be used within the actions prop of a `ListView` component. ```py def list_action_group( - *children: ActionGroupItem, - on_action: Callable[[ActionKey, Key], None] | None = None, - on_selection_change: Callable[[Selection, Key], None] | None = None, - **props: Any + *children: ActionGroupItem, + on_action: Callable[[ActionKey, Key], None] | None = None, + on_selection_change: Callable[[Selection, Key], None] | None = None, + **props: Any ) -> ListActionGroupElement: ``` @@ -1065,17 +1073,16 @@ def list_action_group( | `**props` | `Any` | Any other [ActionGroup](https://react-spectrum.adobe.com/react-spectrum/ActionGroup.html) prop. | - ###### ui.list_action_menu A group of action buttons that can be used to create a list of actions. This component should be used within the actions prop of a `ListView` component. ```py def list_action_menu( - *children: ActionMenuItem, - on_action: Callable[[ActionKey, Key], None] | None = None, - on_open_change: Callable[[bool, Key], None] | None = None, - **props: Any + *children: ActionMenuItem, + on_action: Callable[[ActionKey, Key], None] | None = None, + on_open_change: Callable[[bool, Key], None] | None = None, + **props: Any ) -> ListActionMenuElement: ``` @@ -1087,15 +1094,6 @@ def list_action_menu( | `on_open_change` | `Callable[[bool, Key], None] \| None` | The first argument is a boolean indicating if the menu is open, the second argument is the key of the list_view item. | | `**props` | `Any` | Any other [ActionMenu](https://react-spectrum.adobe.com/react-spectrum/ActionMenu.html) prop. | - -###### Parameters - -| Parameter | Type | Description | -| ----------- | ------- | ----------------------------------------- | -| `*children` | `Item` | The options to render within the section. | -| `title` | `str \| None` | The title of the section. | -| `**props` | `Any` | Any other Section prop | - ##### ui.item_table_source An item table source wraps a Table or PartitionedTable to provide additional information for diff --git a/plugins/ui/src/deephaven/ui/components/__init__.py b/plugins/ui/src/deephaven/ui/components/__init__.py index f0678f892..09efe6596 100644 --- a/plugins/ui/src/deephaven/ui/components/__init__.py +++ b/plugins/ui/src/deephaven/ui/components/__init__.py @@ -14,6 +14,7 @@ from .list_view import list_view from .list_action_group import list_action_group from .list_action_menu import list_action_menu +from .item_table_source import item_table_source from . import html @@ -36,6 +37,7 @@ "icon", "icon_wrapper", "item", + "item_table_source", "illustrated_message", "list_view", "list_action_group", From 848d15af53bc21800a9201570932c3cc2ac0981a Mon Sep 17 00:00:00 2001 From: Joe Numainville Date: Tue, 16 Apr 2024 14:05:34 -0500 Subject: [PATCH 04/10] selection mode --- plugins/ui/DESIGN.md | 19 ++++++++++--------- .../src/deephaven/ui/components/list_view.py | 6 +++++- plugins/ui/src/deephaven/ui/types/types.py | 3 ++- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/plugins/ui/DESIGN.md b/plugins/ui/DESIGN.md index f6b9f5ce9..04ccb18a8 100644 --- a/plugins/ui/DESIGN.md +++ b/plugins/ui/DESIGN.md @@ -1276,6 +1276,7 @@ Supported `ItemTableSource` arguments are `key_column`, `label_column`, `descrip import deephaven.ui as ui ui.list_view( *children: Item | Table | ItemTableSource, + selection_mode: SelectionMode | None = 'MULTIPLE', default_selected_keys: Selection | None = None, selected_keys: Selection | None = None, render_empty_state: Element | None = None, @@ -1286,14 +1287,15 @@ ui.list_view( ``` ###### Parameters -| Parameter | Type | Description | -|-------------------------|-----------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `*children` | `Item \| Table \| ItemTableSource` | The options to render within the list_view. | -| `default_selected_keys` | `Selection \| None` | The initial selected keys in the collection (uncontrolled). | -| `selected_keys` | `Selection \| None` | The currently selected keys in the collection (controlled). | -| `render_empty_state` | `Element \| None` | Sets what the `list_view` should render when there is no content to display. | -| `on_selection_change` | `Callable[[Selection], None] \| None` | Handler that is called when the selections changes. | -| `on_change` | `Callable[[Selection], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selections changes. | +| Parameter | Type | Description | +|-------------------------|-----------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `*children` | `Item \| Table \| ItemTableSource` | The options to render within the list_view. | +| `selection_mode` | `SelectionMode \| None` | Can be `MULTIPLE` to allow multiple selection, `SINGLE` to allow only single selection, or None to allow no selection. | +| `default_selected_keys` | `Selection \| None` | The initial selected keys in the collection (uncontrolled). | +| `selected_keys` | `Selection \| None` | The currently selected keys in the collection (controlled). | +| `render_empty_state` | `Element \| None` | Sets what the `list_view` should render when there is no content to display. | +| `on_selection_change` | `Callable[[Selection], None] \| None` | Handler that is called when the selections changes. | +| `on_change` | `Callable[[Selection], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selections changes. | | `**props` | `Any` | Any other [ListView](https://react-spectrum.adobe.com/react-spectrum/ListView.html) prop, with the exception of `items`, `dragAndDropHooks`, and `onLoadMore`. | @@ -1366,7 +1368,6 @@ source = ui.item_table_source( label_column="Labels", description_column="Descriptions", icon_column="Icons", - title_column="SectionLabels", actions=button ) list_view5 = ui.list_view( diff --git a/plugins/ui/src/deephaven/ui/components/list_view.py b/plugins/ui/src/deephaven/ui/components/list_view.py index 13a54449d..cda41bf95 100644 --- a/plugins/ui/src/deephaven/ui/components/list_view.py +++ b/plugins/ui/src/deephaven/ui/components/list_view.py @@ -8,7 +8,7 @@ from .item_table_source import ItemTableSource from ..elements import BaseElement, Element from .._internal.utils import create_props -from ..types import Stringable, Selection +from ..types import Stringable, Selection, SelectionMode ListViewItem = Union[Stringable, ItemElement] ListViewElement = Element @@ -18,6 +18,7 @@ def list_view( *children: ListViewItem | Table | ItemTableSource, default_selected_keys: Selection | None = None, selected_keys: Selection | None = None, + selection_mode: SelectionMode | None = "MULTIPLE", render_empty_state: Element | None = None, on_selection_change: Callable[[Selection], None] | None = None, on_change: Callable[[Selection], None] | None = None, @@ -40,6 +41,9 @@ def list_view( The initial selected keys in the collection (uncontrolled). selected_keys: The currently selected keys in the collection (controlled). + selection_mode: + Can be `MULTIPLE` to allow multiple selection, `SINGLE` to allow only single selection, + or None to allow no selection. render_empty_state: Sets what the `list_view` should render when there is no content to display. on_selection_change: diff --git a/plugins/ui/src/deephaven/ui/types/types.py b/plugins/ui/src/deephaven/ui/types/types.py index 90bfd8480..d125a15ca 100644 --- a/plugins/ui/src/deephaven/ui/types/types.py +++ b/plugins/ui/src/deephaven/ui/types/types.py @@ -97,7 +97,8 @@ class RowDataValue(CellData): ColumnData = List[Any] TableData = Dict[ColumnName, ColumnData] SearchMode = Literal["SHOW", "HIDE", "DEFAULT"] -SelectionMode = Literal["CELL", "ROW", "COLUMN"] +SelectionArea = Literal["CELL", "ROW", "COLUMN"] +SelectionMode = Literal["SINGLE", "MULTIPLE"] Sentinel = Any TransformedData = Any StringSortDirection = Literal["ASC", "DESC"] From 177ad93c45f916e2c21f89172136cc07fada3740 Mon Sep 17 00:00:00 2001 From: Joe Numainville Date: Tue, 16 Apr 2024 15:30:19 -0500 Subject: [PATCH 05/10] comments --- plugins/ui/DESIGN.md | 32 ++++++++++--------- .../ui/components/list_action_group.py | 4 +++ .../src/deephaven/ui/components/list_view.py | 4 +-- plugins/ui/src/deephaven/ui/types/types.py | 2 +- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/plugins/ui/DESIGN.md b/plugins/ui/DESIGN.md index 04ccb18a8..560a1e485 100644 --- a/plugins/ui/DESIGN.md +++ b/plugins/ui/DESIGN.md @@ -1060,17 +1060,19 @@ def list_action_group( *children: ActionGroupItem, on_action: Callable[[ActionKey, Key], None] | None = None, on_selection_change: Callable[[Selection, Key], None] | None = None, + on_change: Callable[[Selection, Key], None] | None = None, **props: Any ) -> ListActionGroupElement: ``` ###### Parameters -| Parameter | Type | Description | -|-------------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| -| `*children` | `ActionGroupItem` | The actions to render within the action group. | -| `on_action` | `Callable[[ActionKey, Key], None] \| None` | Handler that is called when an item is pressed. The first argument is the key of the action, the second argument is the key of the list_view item. | -| `on_selection_change` | `Callable[[Selection, Key], None] \| None` | Handler that is called when the selection changes. The first argument is the selection, the second argument is the key of the list_view item. | -| `**props` | `Any` | Any other [ActionGroup](https://react-spectrum.adobe.com/react-spectrum/ActionGroup.html) prop. | +| Parameter | Type | Description | +|-------------------------|------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `*children` | `ActionGroupItem` | The actions to render within the action group. | +| `on_action` | `Callable[[ActionKey, Key], None] \| None` | Handler that is called when an item is pressed. The first argument is the key of the action, the second argument is the key of the list_view item. | +| `on_selection_change` | `Callable[[Selection, Key], None] \| None` | Handler that is called when the selection changes. The first argument is the selection, the second argument is the key of the list_view item. | +| `on_change` | `Callable[[Selection, Key], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selection changes. The first argument is the selection, the second argument is the key of the list_view item. | +| `**props` | `Any` | Any other [ActionGroup](https://react-spectrum.adobe.com/react-spectrum/ActionGroup.html) prop. | ###### ui.list_action_menu @@ -1287,15 +1289,15 @@ ui.list_view( ``` ###### Parameters -| Parameter | Type | Description | -|-------------------------|-----------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `*children` | `Item \| Table \| ItemTableSource` | The options to render within the list_view. | -| `selection_mode` | `SelectionMode \| None` | Can be `MULTIPLE` to allow multiple selection, `SINGLE` to allow only single selection, or None to allow no selection. | -| `default_selected_keys` | `Selection \| None` | The initial selected keys in the collection (uncontrolled). | -| `selected_keys` | `Selection \| None` | The currently selected keys in the collection (controlled). | -| `render_empty_state` | `Element \| None` | Sets what the `list_view` should render when there is no content to display. | -| `on_selection_change` | `Callable[[Selection], None] \| None` | Handler that is called when the selections changes. | -| `on_change` | `Callable[[Selection], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selections changes. | +| Parameter | Type | Description | +|-------------------------|-----------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `*children` | `Item \| Table \| ItemTableSource` | The options to render within the list_view. | +| `selection_mode` | `SelectionMode \| None` | By default `"MULTIPLE"`, which allows multiple selection. May also be `"SINGLE"` to allow only single selection, or `"None"`/`None` to allow no selection. | +| `default_selected_keys` | `Selection \| None` | The initial selected keys in the collection (uncontrolled). | +| `selected_keys` | `Selection \| None` | The currently selected keys in the collection (controlled). | +| `render_empty_state` | `Element \| None` | Sets what the `list_view` should render when there is no content to display. | +| `on_selection_change` | `Callable[[Selection], None] \| None` | Handler that is called when the selections changes. | +| `on_change` | `Callable[[Selection], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selections changes. | | `**props` | `Any` | Any other [ListView](https://react-spectrum.adobe.com/react-spectrum/ListView.html) prop, with the exception of `items`, `dragAndDropHooks`, and `onLoadMore`. | diff --git a/plugins/ui/src/deephaven/ui/components/list_action_group.py b/plugins/ui/src/deephaven/ui/components/list_action_group.py index c7f9840db..a2a815eba 100644 --- a/plugins/ui/src/deephaven/ui/components/list_action_group.py +++ b/plugins/ui/src/deephaven/ui/components/list_action_group.py @@ -15,6 +15,7 @@ def list_action_group( *children: ActionGroupItem, on_action: Callable[[ActionKey, Key], None] | None = None, on_selection_change: Callable[[Selection, Key], None] | None = None, + on_change: Callable[[Selection, Key], None] | None = None, **props: Any, ) -> ListActionGroupElement: """ @@ -27,6 +28,9 @@ def list_action_group( The first argument is the key of the action, the second argument is the key of the list_view item. on_selection_change: Handler that is called when the selection changes. The first argument is the selection, the second argument is the key of the list_view item. + on_change: Alias of on_selection_change. + Handler that is called when the selection changes. + The first argument is the selection, the second argument is the key of the list_view item. **props: Any other ActionGroup prop. Returns: diff --git a/plugins/ui/src/deephaven/ui/components/list_view.py b/plugins/ui/src/deephaven/ui/components/list_view.py index cda41bf95..f6985861d 100644 --- a/plugins/ui/src/deephaven/ui/components/list_view.py +++ b/plugins/ui/src/deephaven/ui/components/list_view.py @@ -42,8 +42,8 @@ def list_view( selected_keys: The currently selected keys in the collection (controlled). selection_mode: - Can be `MULTIPLE` to allow multiple selection, `SINGLE` to allow only single selection, - or None to allow no selection. + By default `"MULTIPLE"`, which allows multiple selection. + May also be `"SINGLE"` to allow only single selection, or `"None"`/`None` to allow no selection. render_empty_state: Sets what the `list_view` should render when there is no content to display. on_selection_change: diff --git a/plugins/ui/src/deephaven/ui/types/types.py b/plugins/ui/src/deephaven/ui/types/types.py index d125a15ca..c48bde538 100644 --- a/plugins/ui/src/deephaven/ui/types/types.py +++ b/plugins/ui/src/deephaven/ui/types/types.py @@ -98,7 +98,7 @@ class RowDataValue(CellData): TableData = Dict[ColumnName, ColumnData] SearchMode = Literal["SHOW", "HIDE", "DEFAULT"] SelectionArea = Literal["CELL", "ROW", "COLUMN"] -SelectionMode = Literal["SINGLE", "MULTIPLE"] +SelectionMode = Literal["SINGLE", "MULTIPLE", "NONE"] Sentinel = Any TransformedData = Any StringSortDirection = Literal["ASC", "DESC"] From a8ff0b693a22d29956db6287707f6131fda69583 Mon Sep 17 00:00:00 2001 From: Joe Numainville Date: Thu, 18 Apr 2024 17:15:16 -0500 Subject: [PATCH 06/10] refactoring so it is still usable --- .../ui/src/deephaven/ui/_internal/utils.py | 28 ++++++++++++- .../src/deephaven/ui/components/list_view.py | 12 +++++- .../ui/src/deephaven/ui/components/picker.py | 12 +++++- plugins/ui/test/deephaven/ui/test_utils.py | 41 +++++++++++++++++++ 4 files changed, 90 insertions(+), 3 deletions(-) diff --git a/plugins/ui/src/deephaven/ui/_internal/utils.py b/plugins/ui/src/deephaven/ui/_internal/utils.py index 1cd6b66e3..27ea3d7d2 100644 --- a/plugins/ui/src/deephaven/ui/_internal/utils.py +++ b/plugins/ui/src/deephaven/ui/_internal/utils.py @@ -184,7 +184,7 @@ def wrap_callable(func: Callable) -> Callable: return func -def create_props(args: dict[str, Any]) -> tuple[tuple[Any], dict[str, Any]]: +def create_props(args: dict[str, Any]) -> tuple[tuple[Any, ...], dict[str, Any]]: """ Create props from the args. Combines the named props with the kwargs props. @@ -197,3 +197,29 @@ def create_props(args: dict[str, Any]) -> tuple[tuple[Any], dict[str, Any]]: children, props = args.pop("children"), args.pop("props") props.update(args) return children, props + + +def unpack_item_table_source( + children: tuple[Any, ...], + props: dict[str, Any], + supported_args: set[str], +) -> tuple[tuple[Any, ...], dict[str, Any]]: + """ + Unpack children and props if the children are of type dict + and merge the supported arguments into the props. + + Args: + children: The children to possibly unpack. + props: The props to unpack. + supported_args: The supported arguments for the ItemTableSource. + + Returns: + The unpacked children and props. + """ + if len(children) == 1 and isinstance(children[0], dict): + item_table_source = children[0] + children = (item_table_source.pop("table"),) + for key in supported_args: + if key in item_table_source: + props[key] = item_table_source.pop(key) + return children, props diff --git a/plugins/ui/src/deephaven/ui/components/list_view.py b/plugins/ui/src/deephaven/ui/components/list_view.py index f6985861d..d2434f9dd 100644 --- a/plugins/ui/src/deephaven/ui/components/list_view.py +++ b/plugins/ui/src/deephaven/ui/components/list_view.py @@ -7,12 +7,20 @@ from .item import ItemElement from .item_table_source import ItemTableSource from ..elements import BaseElement, Element -from .._internal.utils import create_props +from .._internal.utils import create_props, unpack_item_table_source from ..types import Stringable, Selection, SelectionMode ListViewItem = Union[Stringable, ItemElement] ListViewElement = Element +SUPPORTED_SOURCE_ARGS = { + "key_column", + "label_column", + "description_column", + "icon_column", + "actions", +} + def list_view( *children: ListViewItem | Table | ItemTableSource, @@ -58,4 +66,6 @@ def list_view( """ children, props = create_props(locals()) + children, props = unpack_item_table_source(children, props, SUPPORTED_SOURCE_ARGS) + return BaseElement("deephaven.ui.components.ListView", *children, **props) diff --git a/plugins/ui/src/deephaven/ui/components/picker.py b/plugins/ui/src/deephaven/ui/components/picker.py index 6095df0a9..4ebc5dc3d 100644 --- a/plugins/ui/src/deephaven/ui/components/picker.py +++ b/plugins/ui/src/deephaven/ui/components/picker.py @@ -6,11 +6,19 @@ from .section import SectionElement, PickerItem from .item_table_source import ItemTableSource from ..elements import BaseElement -from .._internal.utils import create_props +from .._internal.utils import create_props, unpack_item_table_source from ..types import Key PickerElement = BaseElement +SUPPORTED_SOURCE_ARGS = { + "key_column", + "label_column", + "description_column", + "icon_column", + "title_column", +} + def picker( *children: PickerItem | SectionElement | Table | PartitionedTable | ItemTableSource, @@ -53,4 +61,6 @@ def picker( """ children, props = create_props(locals()) + children, props = unpack_item_table_source(children, props, SUPPORTED_SOURCE_ARGS) + return BaseElement("deephaven.ui.components.Picker", *children, **props) diff --git a/plugins/ui/test/deephaven/ui/test_utils.py b/plugins/ui/test/deephaven/ui/test_utils.py index f67f2bb80..4d23dd545 100644 --- a/plugins/ui/test/deephaven/ui/test_utils.py +++ b/plugins/ui/test/deephaven/ui/test_utils.py @@ -1,4 +1,5 @@ import unittest + from .BaseTest import BaseTestCase @@ -217,6 +218,46 @@ def test_func_with_all_args(a, /, b, *args, c=1, **kwargs): # Test that wrapping a function without a signature doesn't throw an error wrapped = wrap_callable(print) + def test_unpack_item_table_source(self): + from deephaven.ui._internal.utils import unpack_item_table_source + from deephaven.ui import item_table_source + + children = ("table",) + props = { + "test": "foo", + } + + expected_children = ("table",) + expected_props = { + "test": "foo", + } + + self.assertTupleEqual( + unpack_item_table_source(children, props, {}), + (expected_children, expected_props), + ) + + item_data_source = item_table_source( + table="table", key_column="key", actions="actions" + ) + + children = (item_data_source,) + props = { + "test": "foo", + } + + expected_children = ("table",) + + expected_props = { + "test": "foo", + "key_column": "key", + } + + self.assertTupleEqual( + unpack_item_table_source(children, props, {"table", "key_column"}), + (expected_children, expected_props), + ) + if __name__ == "__main__": unittest.main() From f58a038a719e20f498efdf032b4fceccc112713c Mon Sep 17 00:00:00 2001 From: Joe Numainville Date: Thu, 25 Apr 2024 12:40:43 -0500 Subject: [PATCH 07/10] examples --- plugins/ui/examples/README.md | 51 ++++++++++++++++++ plugins/ui/examples/assets/pick_table.png | Bin 0 -> 16816 bytes .../ui/examples/assets/pick_table_source.png | Bin 0 -> 20391 bytes .../ui/src/deephaven/ui/_internal/utils.py | 2 +- 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 plugins/ui/examples/assets/pick_table.png create mode 100644 plugins/ui/examples/assets/pick_table_source.png diff --git a/plugins/ui/examples/README.md b/plugins/ui/examples/README.md index e1e4002b7..c03ab23d0 100644 --- a/plugins/ui/examples/README.md +++ b/plugins/ui/examples/README.md @@ -240,6 +240,57 @@ my_picker = ui_picker() ![Use a picker to select from a list of items](assets/picker.png) +## Picker (table) + +A picker can also take a Table. It will use the first column as the key and label by default. + +```python +import deephaven.ui as ui +from deephaven import time_table +import datetime + +# Ticking table with initial row count of 200 that adds a row every second +initial_row_count = 200 +column_types = time_table( + "PT1S", + start_time=datetime.datetime.now() - datetime.timedelta(seconds=initial_row_count), +).view( + [ + "Id=new Integer(i)", + "Display=new String(`Display `+i)", + ] +) + + +@ui.component +def ui_picker_table(table): + value, set_value = ui.use_state("") + + pick_table = ui.picker( + table, + label="Text", + on_change=set_value, + selected_keys=value, + ) + + text = ui.text(f"Selection: {value}") + + return ui.flex(pick_table, text, direction="column", margin=10, gap=10) + + +pick_table = ui_picker_table(column_types) + +# If you'd like to specify columns to use, you can pass in a table source. + +table_source = ui.item_table_source( + column_types, key_column="Id", label_column="Display" +) + +pick_table_source = ui_picker_table(table_source) +``` +![Use a picker to select from a table](assets/pick_table.png) +![Use a picker to select from a table source](assets/pick_table_source.png) + ## Form (two variables) You can have state with multiple different variables in one component. This example creates a [text field](https://react-spectrum.adobe.com/react-spectrum/TextField.html) and a [slider](https://react-spectrum.adobe.com/react-spectrum/Slider.html), and we display the values of both of them. diff --git a/plugins/ui/examples/assets/pick_table.png b/plugins/ui/examples/assets/pick_table.png new file mode 100644 index 0000000000000000000000000000000000000000..fdf7bfffab4fcd8733050d35eefda1f60d3309fd GIT binary patch literal 16816 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 OBrEw^qD;)_!~X%-f2pki literal 0 HcmV?d00001 diff --git a/plugins/ui/examples/assets/pick_table_source.png b/plugins/ui/examples/assets/pick_table_source.png new file mode 100644 index 0000000000000000000000000000000000000000..53a05d0542efab1bf28bbe4c7b6ca87c1315c7e8 GIT binary patch literal 20391 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 Date: Wed, 8 May 2024 12:18:21 -0500 Subject: [PATCH 08/10] convert to Item --- .../ui/src/deephaven/ui/components/item.py | 3 ++- .../src/deephaven/ui/components/list_view.py | 11 +++++----- .../ui/src/deephaven/ui/components/picker.py | 20 +++++++++---------- .../ui/src/deephaven/ui/components/section.py | 10 +++------- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/plugins/ui/src/deephaven/ui/components/item.py b/plugins/ui/src/deephaven/ui/components/item.py index d0daed2e0..b5b05e8e5 100644 --- a/plugins/ui/src/deephaven/ui/components/item.py +++ b/plugins/ui/src/deephaven/ui/components/item.py @@ -1,9 +1,10 @@ -from typing import Any +from typing import Any, Union from ..elements import BaseElement from ..types import Stringable ItemElement = BaseElement +Item = Union[Stringable, ItemElement] def item(*children: Stringable, **props: Any) -> ItemElement: diff --git a/plugins/ui/src/deephaven/ui/components/list_view.py b/plugins/ui/src/deephaven/ui/components/list_view.py index d2434f9dd..15caa3906 100644 --- a/plugins/ui/src/deephaven/ui/components/list_view.py +++ b/plugins/ui/src/deephaven/ui/components/list_view.py @@ -4,13 +4,12 @@ from deephaven.table import Table -from .item import ItemElement from .item_table_source import ItemTableSource from ..elements import BaseElement, Element from .._internal.utils import create_props, unpack_item_table_source -from ..types import Stringable, Selection, SelectionMode +from ..types import Selection, SelectionMode +from .item import Item -ListViewItem = Union[Stringable, ItemElement] ListViewElement = Element SUPPORTED_SOURCE_ARGS = { @@ -23,7 +22,7 @@ def list_view( - *children: ListViewItem | Table | ItemTableSource, + *children: Item | Table | ItemTableSource, default_selected_keys: Selection | None = None, selected_keys: Selection | None = None, selection_mode: SelectionMode | None = "MULTIPLE", @@ -34,11 +33,11 @@ def list_view( ) -> ListViewElement: """ A list view that can be used to create a list of items. Children should be one of three types: - 1. If children are of type `ListViewItem`, they are the list items. + 1. If children are of type `Item`, they are the list items. 2. If children are of type `Table`, the values in the table are the list items. There can only be one child, the `Table`. The first column is used as the key and label by default. - 3. If children are of type ItemTableSource, complex items are created from the source. + 3. If children are of type `ItemTableSource`, complex items are created from the source. There can only be one child, the `ItemTableSource`. Supported `ItemTableSource` arguments are `key_column`, `label_column`, `description_column`, `icon_column`, and `actions`. diff --git a/plugins/ui/src/deephaven/ui/components/picker.py b/plugins/ui/src/deephaven/ui/components/picker.py index 4ebc5dc3d..b5366ed4e 100644 --- a/plugins/ui/src/deephaven/ui/components/picker.py +++ b/plugins/ui/src/deephaven/ui/components/picker.py @@ -3,7 +3,7 @@ from typing import Callable, Any from deephaven.table import Table, PartitionedTable -from .section import SectionElement, PickerItem +from .section import SectionElement, Item from .item_table_source import ItemTableSource from ..elements import BaseElement from .._internal.utils import create_props, unpack_item_table_source @@ -21,7 +21,7 @@ def picker( - *children: PickerItem | SectionElement | Table | PartitionedTable | ItemTableSource, + *children: Item | SectionElement | Table | PartitionedTable | ItemTableSource, default_selected_key: Key | None = None, selected_key: Key | None = None, on_selection_change: Callable[[Key], None] | None = None, @@ -30,16 +30,16 @@ def picker( ) -> PickerElement: """ A picker that can be used to select from a list. Children should be one of five types: - 1. If children are of type PickerItem, they are the dropdown options. - 2. If children are of type SectionElement, they are the dropdown sections. - 3. If children are of type Table, the values in the table are the dropdown options. - There can only be one child, the Table. + 1. If children are of type `Item`, they are the dropdown options. + 2. If children are of type `SectionElement`, they are the dropdown sections. + 3. If children are of type `Table`, the values in the table are the dropdown options. + There can only be one child, the `Table`. The first column is used as the key and label by default. - 4. If children are of type PartitionedTable, the values in the table are the dropdown options - and the partitions create multiple sections. There can only be one child, the PartitionedTable. + 4. If children are of type `PartitionedTable`, the values in the table are the dropdown options + and the partitions create multiple sections. There can only be one child, the `PartitionedTable`. The first column is used as the key and label by default. - 5. If children are of type ItemTableSource, complex items are created from the source. - There can only be one child, the ItemTableSource. + 5. If children are of type `ItemTableSource`, complex items are created from the source. + There can only be one child, the `ItemTableSource`. Supported ItemTableSource arguments are `key_column`, `label_column`, `description_column`, `icon_column`, and `title_column`. diff --git a/plugins/ui/src/deephaven/ui/components/section.py b/plugins/ui/src/deephaven/ui/components/section.py index 4b78d28af..d3cb7eb03 100644 --- a/plugins/ui/src/deephaven/ui/components/section.py +++ b/plugins/ui/src/deephaven/ui/components/section.py @@ -1,19 +1,15 @@ from __future__ import annotations -from typing import Union, Any +from typing import Any from .._internal.utils import create_props from ..elements import Element, BaseElement -from ..types import Stringable -from .item import ItemElement +from .item import Item -PickerItem = Union[Stringable, ItemElement] SectionElement = Element -def section( - *children: PickerItem, title: str | None = None, **props: Any -) -> SectionElement: +def section(*children: Item, title: str | None = None, **props: Any) -> SectionElement: """ A section that can be added to a menu, such as a picker. Children are the dropdown options. From 76ffdd91ea3244dcc7ae067a12d6f1c3beb8b50d Mon Sep 17 00:00:00 2001 From: Joe Numainville Date: Thu, 9 May 2024 14:49:09 -0500 Subject: [PATCH 09/10] fix README --- plugins/ui/docs/README.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/plugins/ui/docs/README.md b/plugins/ui/docs/README.md index 2cf13e4b9..b9ce6412e 100644 --- a/plugins/ui/docs/README.md +++ b/plugins/ui/docs/README.md @@ -331,6 +331,9 @@ lv = ui_list_view() ``` ## ListView (table) + +A ListView can also take a Table. It will use the first column as the key and label by default. + ```python from deephaven import time_table, ui import datetime @@ -349,13 +352,11 @@ column_types = time_table( @ui.component -def ui_list_view_table(): - value, set_value = ui.use_state([2, 4, 5]) +def ui_list_view_table(table, initial_selection): + value, set_value = ui.use_state(initial_selection) lv = ui.list_view( - column_types, - key_column="Id", - label_column="Display", + table, aria_label="List View", on_change=set_value, selected_keys=value, @@ -374,8 +375,18 @@ def ui_list_view_table(): ) -lv_table = ui_list_view_table() +lv_table = ui_list_view_table(column_types, []) + +# If you'd like to specify columns to use, you can pass in a table source. + +table_source = ui.item_table_source( + column_types, key_column="Id", label_column="Display" +) + +lv_table_source = ui_list_view_table(table_source, [2, 4, 5]) ``` +![Use a picker to select from a table](_assets/lv_table.png) +![Use a picker to select from a table source](_assets/lv_table_source.png) ## Form (two variables) From 6b6d21106a4ec002772d4ad20b0dbd383a87e40e Mon Sep 17 00:00:00 2001 From: Joe Numainville Date: Fri, 10 May 2024 11:51:15 -0500 Subject: [PATCH 10/10] comments --- plugins/ui/docs/README.md | 111 ++++++++++++++++---- plugins/ui/docs/_assets/lv_table.png | Bin 0 -> 94739 bytes plugins/ui/docs/_assets/lv_table_source.png | Bin 0 -> 59550 bytes 3 files changed, 93 insertions(+), 18 deletions(-) create mode 100644 plugins/ui/docs/_assets/lv_table.png create mode 100644 plugins/ui/docs/_assets/lv_table_source.png diff --git a/plugins/ui/docs/README.md b/plugins/ui/docs/README.md index b9ce6412e..5d3abe99d 100644 --- a/plugins/ui/docs/README.md +++ b/plugins/ui/docs/README.md @@ -263,11 +263,11 @@ column_types = time_table( @ui.component -def ui_picker_table(table): +def ui_picker_table(): value, set_value = ui.use_state("") pick_table = ui.picker( - table, + column_types, label="Text", on_change=set_value, selected_keys=value, @@ -278,17 +278,51 @@ def ui_picker_table(table): return ui.flex(pick_table, text, direction="column", margin=10, gap=10) -pick_table = ui_picker_table(column_types) +pick_table = ui_picker_table() +``` +![Use a picker to select from a table](_assets/pick_table.png) + +## Picker (item table source) + +A picker can also take an `item_table_source`. It will use the columns specified. -# If you'd like to specify columns to use, you can pass in a table source. +```python +import deephaven.ui as ui +from deephaven import time_table +import datetime -table_source = ui.item_table_source( - column_types, key_column="Id", label_column="Display" +# Ticking table with initial row count of 200 that adds a row every second +initial_row_count = 200 +column_types = time_table( + "PT1S", + start_time=datetime.datetime.now() - datetime.timedelta(seconds=initial_row_count), +).view( + [ + "Id=new Integer(i)", + "Display=new String(`Display `+i)", + ] ) -pick_table_source = ui_picker_table(table_source) + +@ui.component +def ui_picker_table_source(): + value, set_value = ui.use_state("") + + pick_table = ui.picker( + ui.item_table_source(column_types, key_column="Id", label_column="Display"), + label="Text", + on_change=set_value, + selected_keys=value, + ) + + text = ui.text(f"Selection: {value}") + + return ui.flex(pick_table, text, direction="column", margin=10, gap=10) + + +pick_table_source = ui_picker_table_source() ``` -![Use a picker to select from a table](_assets/pick_table.png) + ![Use a picker to select from a table source](_assets/pick_table_source.png) ## ListView (string values) @@ -352,11 +386,11 @@ column_types = time_table( @ui.component -def ui_list_view_table(table, initial_selection): - value, set_value = ui.use_state(initial_selection) +def ui_list_view_table(): + value, set_value = ui.use_state([]) lv = ui.list_view( - table, + column_types, aria_label="List View", on_change=set_value, selected_keys=value, @@ -375,18 +409,59 @@ def ui_list_view_table(table, initial_selection): ) -lv_table = ui_list_view_table(column_types, []) +lv_table = ui_list_view_table() +``` +![Use a list view to select from a table](_assets/lv_table.png) + +## ListView (item table source) + +A list view can also take an `item_table_source`. It will use the columns specified. -# If you'd like to specify columns to use, you can pass in a table source. +```python +from deephaven import time_table, ui +import datetime -table_source = ui.item_table_source( - column_types, key_column="Id", label_column="Display" +# Ticking table with initial row count of 200 that adds a row every second +initial_row_count = 200 +column_types = time_table( + "PT1S", + start_time=datetime.datetime.now() - datetime.timedelta(seconds=initial_row_count), +).update( + [ + "Id=new Integer(i)", + "Display=new String(`Display `+i)", + ] ) -lv_table_source = ui_list_view_table(table_source, [2, 4, 5]) + +@ui.component +def ui_list_view_table_source(): + value, set_value = ui.use_state([2, 4, 5]) + + lv = ui.list_view( + ui.item_table_source(column_types, key_column="Id", label_column="Display"), + aria_label="List View", + on_change=set_value, + selected_keys=value, + ) + + text = ui.text("Selection: " + ", ".join(map(str, value))) + + return ui.flex( + lv, + text, + direction="column", + margin=10, + gap=10, + # necessary to avoid overflowing container height + min_height=0, + ) + + +lv_table_source = ui_list_view_table_source() ``` -![Use a picker to select from a table](_assets/lv_table.png) -![Use a picker to select from a table source](_assets/lv_table_source.png) + +![Use a list view to select from a table source](_assets/lv_table_source.png) ## Form (two variables) diff --git a/plugins/ui/docs/_assets/lv_table.png b/plugins/ui/docs/_assets/lv_table.png new file mode 100644 index 0000000000000000000000000000000000000000..54e4c5a576fa51e6776758ba8ee27e0104b71928 GIT binary patch literal 94739 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 z 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