diff --git a/e2e/scripts/st_select_slider.py b/e2e/scripts/st_select_slider.py index b594802ef2bf..8a82a0f59fbc 100644 --- a/e2e/scripts/st_select_slider.py +++ b/e2e/scripts/st_select_slider.py @@ -49,6 +49,14 @@ ) st.write("Value 4:", w4) +w5 = st.select_slider( + "Label 5", + value=("orange", "blue"), + options=["red", "orange", "yellow", "green", "blue", "indigo", "violet"], + disabled=True, +) +st.write("Value 5:", w5) + if st._is_running_with_streamlit: @@ -56,10 +64,10 @@ def on_change(): st.session_state.select_slider_changed = True st.select_slider( - "Label 5", + "Label 6", options=np.array([1, 2, 3, 4, 5]), - key="select_slider5", + key="select_slider6", on_change=on_change, ) - st.write("Value 5:", st.session_state.select_slider5) + st.write("Value 6:", st.session_state.select_slider6) st.write("Select slider changed:", "select_slider_changed" in st.session_state) diff --git a/e2e/specs/st_select_slider.spec.js b/e2e/specs/st_select_slider.spec.js index ac30e3b81b9f..0acd9acc828b 100644 --- a/e2e/specs/st_select_slider.spec.js +++ b/e2e/specs/st_select_slider.spec.js @@ -21,7 +21,13 @@ describe("st.select_slider", () => { }); it("displays correct number of elements", () => { - cy.get(".element-container .stSlider").should("have.length", 5); + cy.get(".element-container .stSlider").should("have.length", 6); + }); + + it("looks right when disabled", () => { + cy.getIndexed(".stSlider", 4).matchThemedSnapshots( + "disabled-select-slider" + ); }); it("shows labels", () => { @@ -34,6 +40,8 @@ describe("st.select_slider", () => { cy.getIndexed(".stSlider label", 3).should("have.text", "Label 4"); cy.getIndexed(".stSlider label", 4).should("have.text", "Label 5"); + + cy.getIndexed(".stSlider label", 5).should("have.text", "Label 6"); }); it("has correct values", () => { @@ -48,9 +56,14 @@ describe("st.select_slider", () => { cy.getIndexed(".stMarkdown", 3).should("have.text", "Value 4: 5"); - cy.getIndexed(".stMarkdown", 4).should("have.text", "Value 5: 1"); + cy.getIndexed(".stMarkdown", 4).should( + "have.text", + "Value 5: ('orange', 'blue')" + ); + + cy.getIndexed(".stMarkdown", 5).should("have.text", "Value 6: 1"); - cy.getIndexed(".stMarkdown", 5).should( + cy.getIndexed(".stMarkdown", 6).should( "have.text", "Select slider changed: False" ); @@ -135,14 +148,14 @@ describe("st.select_slider", () => { it("calls callback if one is registered", () => { // This selects the slider ends, so range sliders have two, and this is the - // seventh element in the list. - cy.getIndexed('.stSlider [role="slider"]', 6) + // ninth element in the list. + cy.getIndexed('.stSlider [role="slider"]', 8) .click() .type("{rightarrow}", { force: true }); cy.get(".stMarkdown").should( "contain.text", - "Value 5: 2" + "Select slider changed: True" + "Value 6: 2" + "Select slider changed: True" ); }); }); diff --git a/frontend/cypress/snapshots/linux/2x/st_select_slider.spec.js/disabled-select-slider-dark.snap.png b/frontend/cypress/snapshots/linux/2x/st_select_slider.spec.js/disabled-select-slider-dark.snap.png new file mode 100644 index 000000000000..01c5d6f7d001 Binary files /dev/null and b/frontend/cypress/snapshots/linux/2x/st_select_slider.spec.js/disabled-select-slider-dark.snap.png differ diff --git a/frontend/cypress/snapshots/linux/2x/st_select_slider.spec.js/disabled-select-slider.snap.png b/frontend/cypress/snapshots/linux/2x/st_select_slider.spec.js/disabled-select-slider.snap.png new file mode 100644 index 000000000000..3597883b3863 Binary files /dev/null and b/frontend/cypress/snapshots/linux/2x/st_select_slider.spec.js/disabled-select-slider.snap.png differ diff --git a/lib/streamlit/elements/select_slider.py b/lib/streamlit/elements/select_slider.py index 1f679206c672..fcf5f8330ab0 100644 --- a/lib/streamlit/elements/select_slider.py +++ b/lib/streamlit/elements/select_slider.py @@ -43,6 +43,8 @@ def select_slider( on_change: Optional[WidgetCallback] = None, args: Optional[WidgetArgs] = None, kwargs: Optional[WidgetKwargs] = None, + *, # keyword-only arguments: + disabled: bool = False, ) -> Any: """ Display a slider widget to select items from a list. @@ -86,6 +88,9 @@ def select_slider( An optional tuple of args to pass to the callback. kwargs : dict An optional dict of kwargs to pass to the callback. + disabled : bool + An optional boolean, which disables the select slider if set to True. + The default is False. This argument can only be supplied by keyword. Returns ------- @@ -119,6 +124,7 @@ def select_slider( on_change=on_change, args=args, kwargs=kwargs, + disabled=disabled, ctx=ctx, ) @@ -133,6 +139,7 @@ def _select_slider( on_change: Optional[WidgetCallback] = None, args: Optional[WidgetArgs] = None, kwargs: Optional[WidgetKwargs] = None, + disabled: bool = False, ctx: Optional[ScriptRunContext] = None, ) -> Any: key = to_key(key) @@ -177,6 +184,7 @@ def as_index_list(v): slider_proto.data_type = SliderProto.INT slider_proto.options[:] = [str(format_func(option)) for option in opt] slider_proto.form_id = current_form_id(self.dg) + slider_proto.disabled = disabled if help is not None: slider_proto.help = dedent(help) diff --git a/lib/tests/streamlit/select_slider_test.py b/lib/tests/streamlit/select_slider_test.py index 2c46f9281392..11dd5585a142 100644 --- a/lib/tests/streamlit/select_slider_test.py +++ b/lib/tests/streamlit/select_slider_test.py @@ -40,6 +40,15 @@ def test_no_value(self): self.assertEqual(c.max, 2) self.assertEqual(c.step, 1) + def test_just_disabled(self): + """Test that it can be called with disabled param.""" + st.select_slider( + "the label", options=["red", "orange", "yellow"], disabled=True + ) + + c = self.get_delta_from_queue().new_element.slider + self.assertEqual(c.disabled, True) + @parameterized.expand( [ (5, [1, 2, 3, 4, 5], [4]), # list