diff --git a/.changeset/afraid-radios-vanish.md b/.changeset/afraid-radios-vanish.md new file mode 100644 index 0000000000..b01aa04753 --- /dev/null +++ b/.changeset/afraid-radios-vanish.md @@ -0,0 +1,6 @@ +--- +"@gradio/gallery": patch +"gradio": patch +--- + +fix:Fix `gr.SelectData` so that the target attribute is correctly attached, and the filedata is included in the data attribute with `gr.Gallery` diff --git a/gradio/route_utils.py b/gradio/route_utils.py index ce223eb306..a2af62ed7c 100644 --- a/gradio/route_utils.py +++ b/gradio/route_utils.py @@ -14,6 +14,7 @@ from gradio.helpers import EventData from gradio.state_holder import SessionState if TYPE_CHECKING: + from gradio.blocks import Blocks from gradio.routes import App set_documentation_group("routes") @@ -186,22 +187,30 @@ def restore_session_state(app: App, body: PredictBody): return session_state, iterators +def prepare_event_data( + blocks: Blocks, + body: PredictBody, + fn_index_inferred: int, +) -> EventData: + dependency = blocks.dependencies[fn_index_inferred] + target = dependency["targets"][0] if len(dependency["targets"]) else None + event_data = EventData( + blocks.blocks.get(target[0]) if target else None, + body.event_data, + ) + return event_data + + async def call_process_api( app: App, body: PredictBody, gr_request: Union[Request, list[Request]], - fn_index_inferred, + fn_index_inferred: int, ): session_state, iterators = restore_session_state(app=app, body=body) dependency = app.get_blocks().dependencies[fn_index_inferred] - - target = dependency["targets"][0] if len(dependency["targets"]) else None - event_data = EventData( - app.get_blocks().blocks.get(target) if target else None, - body.event_data, - ) - + event_data = prepare_event_data(app.get_blocks(), body, fn_index_inferred) event_id = getattr(body, "event_id", None) fn_index = body.fn_index diff --git a/js/gallery/static/Gallery.svelte b/js/gallery/static/Gallery.svelte index c3a94d5fdf..15df142554 100644 --- a/js/gallery/static/Gallery.svelte +++ b/js/gallery/static/Gallery.svelte @@ -134,7 +134,7 @@ if (selected_index !== null) { dispatch("select", { index: selected_index, - value: _value?.[selected_index][1] + value: [_value?.[selected_index][0].data, _value?.[selected_index][1]] }); } } diff --git a/test/test_route_utils.py b/test/test_route_utils.py new file mode 100644 index 0000000000..bcef9e681d --- /dev/null +++ b/test/test_route_utils.py @@ -0,0 +1,19 @@ +import gradio as gr +from gradio.data_classes import PredictBody +from gradio.helpers import EventData +from gradio.route_utils import prepare_event_data + + +def test_prepare_event_data(): + def on_select(evt: gr.SelectData): + return f"You selected {evt.value} at {evt.index} from {evt.target}" + + with gr.Blocks() as demo: + textbox = gr.Textbox("Hello World!") + statement = gr.Textbox() + textbox.select(on_select, None, statement) + + body = PredictBody(data=[], event_data={"value": "World", "index": [6, 11]}) + event_data = prepare_event_data(demo, body, 0) + correct_event_data = EventData(textbox, {"value": "World", "index": [6, 11]}) + assert vars(event_data) == vars(correct_event_data)