okld / streamlit-elements

Create a draggable and resizable dashboard in Streamlit, featuring Material UI widgets, Monaco editor (Visual Studio Code), Nivo charts, and more!
MIT License
679 stars 77 forks source link

onChange event not working on Streamlit 1.34 #35

Open dectoplate opened 4 months ago

dectoplate commented 4 months ago

onChange event is not working after Streamlit 1.34 release.

vikvikvr commented 3 months ago

@okld is this repo still mantained?

we love your library and use it extensively throughout our projects Unfortunately this issue prevents us from upgrading Streamlit 😣

Thanks! 😀

shuZro commented 3 months ago

Bump

moonbug-car commented 3 months ago

Bump x2 @okld it would be great if you could update it, Thank You.

KhabarovaNina commented 1 month ago

Bump @okld please!

KhabarovaNina commented 1 month ago

Hello!

This issue is related to the refactoring of streamlit in using custom components.

It is possible to restore the previous functionality by replacing in the file /streamlit_elements/core/callback.py: # from streamlit.components.v1 import components - OLD from streamlit.components.v1 import custom_component as components - NEW

However, I hope the streamlit developers will fix this issue in future releases.

vikvikvr commented 1 month ago

Thanks @KhabarovaNina a lot!

I made a small script to patch it automatically (needed for our Docker builds), hope it helps other people :)

import os
import streamlit_elements
import re

def patch_streamlit_elements():

    # issue: https://github.com/okld/streamlit-elements/issues/35
    relative_file_path = 'core/callback.py'
    library_root = list(streamlit_elements.__path__)[0]
    file_path = os.path.join(library_root, relative_file_path)

    # Read broken file
    with open(file_path, 'r') as file:
        lines = file.readlines()

    broken_import = 'from streamlit.components.v1 import components'
    fixed_import = 'from streamlit.components.v1 import custom_component as components\n'

    # Fix broken import line
    for index, line in enumerate(lines):

        if re.match(broken_import, line):
            print(f'Replaced broken import in {file_path}')
            lines[index] = fixed_import

    # Update broken file with fix
    with open(file_path, 'w') as file:
        file.writelines(lines)

if __name__ == "__main__":
    patch_streamlit_elements()