From f076cf0a3191e09cbddf9fbce5da85ec3b2c23af Mon Sep 17 00:00:00 2001 From: sayalaruano Date: Fri, 14 Feb 2025 17:28:57 +0100 Subject: [PATCH 1/9] =?UTF-8?q?=E2=9C=A8=20Feat(streamlit=5Freportview.py)?= =?UTF-8?q?:=20Display=20dataframes=20in=20streamlit=20apps=20with=20st-ag?= =?UTF-8?q?grid=20to=20add=20searching=20and=20filtering=20features.=20Fix?= =?UTF-8?q?es=20#62?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 6 +++--- src/vuegen/streamlit_reportview.py | 23 ++++++++++++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 60f6103..98c326c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,8 @@ version = "0.1.0" [tool.poetry.dependencies] python = ">=3.9,<3.9.7 || >3.9.7,<4.0" streamlit = "1.39.0" +streamlit-aggrid = "1.1.0" +quarto-cli = "*" plotly = "5.15.0" pyvis = "^0.3.2" pandas = {extras = ["parquet"], version = "^2.2.3"} @@ -28,6 +30,7 @@ vl-convert-python = "^1.7.0" dataframe-image = "^0.2.6" strenum = { version = "^0.4.15", python = "<3.11" } pyyaml = "^6.0.2" + # optional doc depencencies, follow approach as described here: # https://github.com/python-poetry/poetry/issues/2567#issuecomment-646766059 sphinx = {version="*", optional=true} @@ -36,15 +39,12 @@ myst-nb = {version="*", optional=true} ipywidgets = {version="*", optional=true} sphinx-new-tab-link = {version = "!=0.2.2", optional=true} jupytext = {version="*", optional=true} -# quarto -quarto-cli = "*" [tool.poetry.group.dev.dependencies] ipykernel = {version="^6.29.5", optional=true} [tool.poetry.requires-plugins] poetry-dynamic-versioning = { version = ">=1.0.0,<2.0.0", extras = ["plugin"] } - [tool.poetry-dynamic-versioning] enable = true diff --git a/src/vuegen/streamlit_reportview.py b/src/vuegen/streamlit_reportview.py index cad0619..1466911 100644 --- a/src/vuegen/streamlit_reportview.py +++ b/src/vuegen/streamlit_reportview.py @@ -466,9 +466,26 @@ def _generate_dataframe_content(self, dataframe) -> List[str]: read_function = read_function_mapping[file_extension] dataframe_content.append(f"""df = pd.{read_function.__name__}('{dataframe.file_path}')""") - # Display the dataframe - dataframe_content.append("st.dataframe(df, use_container_width=True)") - + # Displays a DataFrame using AgGrid with configurable options. + dataframe_content.append(""" +# Displays a DataFrame using AgGrid with configurable options. +grid_builder = GridOptionsBuilder.from_dataframe(df) +grid_builder.configure_default_column(editable=True, groupable=True) +grid_builder.configure_side_bar(filters_panel=True, columns_panel=True) +grid_builder.configure_selection(selection_mode="multiple") +grid_builder.configure_pagination(enabled=True, paginationAutoPageSize=False, paginationPageSize=20) +grid_options = grid_builder.build() + +AgGrid(df, gridOptions=grid_options) + +# Button to download the df +df_csv = utils.convert_df(df) +st.download_button( + label=f"Download dataframe as CSV", + data=df, + file_name=f"dataframe.csv", + mime='text/csv', +)""") except Exception as e: self.report.logger.error(f"Error generating content for DataFrame: {dataframe.title}. Error: {str(e)}") raise From 0e9da7d35eb5c7a8e60f754f0c21098513eae311 Mon Sep 17 00:00:00 2001 From: sayalaruano Date: Fri, 14 Feb 2025 17:33:36 +0100 Subject: [PATCH 2/9] =?UTF-8?q?=E2=AC=87=EF=B8=8F=20Fix:=20downgrade=20str?= =?UTF-8?q?eamlit-aggrid=20version=20to=20pass=20CI=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 98c326c..d8ccebf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ version = "0.1.0" [tool.poetry.dependencies] python = ">=3.9,<3.9.7 || >3.9.7,<4.0" streamlit = "1.39.0" -streamlit-aggrid = "1.1.0" +streamlit-aggrid = "1.0.5" quarto-cli = "*" plotly = "5.15.0" pyvis = "^0.3.2" From aed70b60e0432c0bb42ec95143e07070a70ea8a7 Mon Sep 17 00:00:00 2001 From: sayalaruano Date: Fri, 14 Feb 2025 17:39:29 +0100 Subject: [PATCH 3/9] =?UTF-8?q?=E2=9E=95=20Fix:=20do=20not=20specify=20agg?= =?UTF-8?q?rid=20version=20to=20avoid=20conflicts=20with=20other=20package?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d8ccebf..af0b049 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ version = "0.1.0" [tool.poetry.dependencies] python = ">=3.9,<3.9.7 || >3.9.7,<4.0" streamlit = "1.39.0" -streamlit-aggrid = "1.0.5" +streamlit-aggrid quarto-cli = "*" plotly = "5.15.0" pyvis = "^0.3.2" From 52fb11f6dfa5d1889f0e7543c2b82ddebfb46496 Mon Sep 17 00:00:00 2001 From: sayalaruano Date: Fri, 14 Feb 2025 17:46:53 +0100 Subject: [PATCH 4/9] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Try=201.0.4=20aggrid?= =?UTF-8?q?=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index af0b049..270141f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ version = "0.1.0" [tool.poetry.dependencies] python = ">=3.9,<3.9.7 || >3.9.7,<4.0" streamlit = "1.39.0" -streamlit-aggrid +streamlit-aggrid = "1.0.4" quarto-cli = "*" plotly = "5.15.0" pyvis = "^0.3.2" From be4a6c7f44f64e117428cf09d1902960a40126d7 Mon Sep 17 00:00:00 2001 From: sayalaruano Date: Fri, 14 Feb 2025 17:50:29 +0100 Subject: [PATCH 5/9] =?UTF-8?q?=F0=9F=93=8C=20Fix:=20Try=201.1.0=20aggrid?= =?UTF-8?q?=20version=20and=20altair=20without=20a=20specific=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 270141f..caa08fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ version = "0.1.0" [tool.poetry.dependencies] python = ">=3.9,<3.9.7 || >3.9.7,<4.0" streamlit = "1.39.0" -streamlit-aggrid = "1.0.4" +streamlit-aggrid = "1.1.0" quarto-cli = "*" plotly = "5.15.0" pyvis = "^0.3.2" @@ -23,7 +23,7 @@ xlrd = "^2.0.1" nbformat = "^5.10.4" nbclient = "^0.10.0" matplotlib = "^3.9.2" -altair = "^5.4.1" +altair itables = "^2.2.2" kaleido = "0.2.0" vl-convert-python = "^1.7.0" From 377c7da18ae637d52ee530f0d78241b058f4b0b2 Mon Sep 17 00:00:00 2001 From: sayalaruano Date: Fri, 14 Feb 2025 17:52:19 +0100 Subject: [PATCH 6/9] =?UTF-8?q?=F0=9F=93=8C=20Do=20not=20specific=20versio?= =?UTF-8?q?ns=20for=20altair=20and=20aggrid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index caa08fb..6e4b088 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ version = "0.1.0" [tool.poetry.dependencies] python = ">=3.9,<3.9.7 || >3.9.7,<4.0" streamlit = "1.39.0" -streamlit-aggrid = "1.1.0" +streamlit-aggrid = "*" quarto-cli = "*" plotly = "5.15.0" pyvis = "^0.3.2" @@ -23,7 +23,7 @@ xlrd = "^2.0.1" nbformat = "^5.10.4" nbclient = "^0.10.0" matplotlib = "^3.9.2" -altair +altair = "*" itables = "^2.2.2" kaleido = "0.2.0" vl-convert-python = "^1.7.0" From 44cf8a6eb543a762fa2c306a47a2201fa9681728 Mon Sep 17 00:00:00 2001 From: sayalaruano Date: Mon, 17 Feb 2025 09:56:21 +0100 Subject: [PATCH 7/9] =?UTF-8?q?=F0=9F=90=9B=20Fix(streamlit=5Freportview.p?= =?UTF-8?q?y):=20add=20aggird=20imports=20and=20fix=20issues=20in=20the=20?= =?UTF-8?q?code=20to=20loaf=20the=20dfs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vuegen/streamlit_reportview.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/vuegen/streamlit_reportview.py b/src/vuegen/streamlit_reportview.py index 1466911..a6d83ea 100644 --- a/src/vuegen/streamlit_reportview.py +++ b/src/vuegen/streamlit_reportview.py @@ -468,6 +468,7 @@ def _generate_dataframe_content(self, dataframe) -> List[str]: # Displays a DataFrame using AgGrid with configurable options. dataframe_content.append(""" +df_index = 1 # Displays a DataFrame using AgGrid with configurable options. grid_builder = GridOptionsBuilder.from_dataframe(df) grid_builder.configure_default_column(editable=True, groupable=True) @@ -479,13 +480,14 @@ def _generate_dataframe_content(self, dataframe) -> List[str]: AgGrid(df, gridOptions=grid_options) # Button to download the df -df_csv = utils.convert_df(df) +df_csv = df.to_csv(sep=',', header=True, index=False).encode('utf-8') st.download_button( - label=f"Download dataframe as CSV", - data=df, - file_name=f"dataframe.csv", + label="Download dataframe {df_index} as CSV", + data=df_csv, + file_name="dataframe_{df_index}.csv", mime='text/csv', -)""") + key="download_button_{df_index}") +df_index += 1""") except Exception as e: self.report.logger.error(f"Error generating content for DataFrame: {dataframe.title}. Error: {str(e)}") raise @@ -724,7 +726,7 @@ def _generate_component_imports(self, component: r.Component) -> List[str]: r.PlotType.PLOTLY: ['import json', 'import requests'], r.PlotType.INTERACTIVE_NETWORK: ['import requests'] }, - 'dataframe': ['import pandas as pd'], + 'dataframe': ['import pandas as pd', 'from st_aggrid import AgGrid, GridOptionsBuilder'], 'markdown': ['import requests'], 'chatbot': ['import time', 'import json', 'import requests'] } From aa8b4437e391fb8714304ec391803cf6eba59baf Mon Sep 17 00:00:00 2001 From: sayalaruano Date: Mon, 17 Feb 2025 10:30:01 +0100 Subject: [PATCH 8/9] =?UTF-8?q?=F0=9F=90=9B=20Fix(streamlit=5Freportview.p?= =?UTF-8?q?y):=20add=20f=20string=20to=20print=20df=5Findex=20and=20create?= =?UTF-8?q?=20this=20variable=20once?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vuegen/streamlit_reportview.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vuegen/streamlit_reportview.py b/src/vuegen/streamlit_reportview.py index a6d83ea..6e85c3a 100644 --- a/src/vuegen/streamlit_reportview.py +++ b/src/vuegen/streamlit_reportview.py @@ -468,7 +468,6 @@ def _generate_dataframe_content(self, dataframe) -> List[str]: # Displays a DataFrame using AgGrid with configurable options. dataframe_content.append(""" -df_index = 1 # Displays a DataFrame using AgGrid with configurable options. grid_builder = GridOptionsBuilder.from_dataframe(df) grid_builder.configure_default_column(editable=True, groupable=True) @@ -482,11 +481,11 @@ def _generate_dataframe_content(self, dataframe) -> List[str]: # Button to download the df df_csv = df.to_csv(sep=',', header=True, index=False).encode('utf-8') st.download_button( - label="Download dataframe {df_index} as CSV", + label="Download dataframe as CSV", data=df_csv, - file_name="dataframe_{df_index}.csv", + file_name=f"dataframe_{df_index}.csv", mime='text/csv', - key="download_button_{df_index}") + key=f"download_button_{df_index}") df_index += 1""") except Exception as e: self.report.logger.error(f"Error generating content for DataFrame: {dataframe.title}. Error: {str(e)}") @@ -739,12 +738,13 @@ def _generate_component_imports(self, component: r.Component) -> List[str]: plot_type = getattr(component, 'plot_type', None) if plot_type in components_imports['plot']: component_imports.extend(components_imports['plot'][plot_type]) - elif component_type == r.ComponentType.DATAFRAME: - component_imports.extend(components_imports['dataframe']) elif component_type == r.ComponentType.MARKDOWN: component_imports.extend(components_imports['markdown']) elif component_type == r.ComponentType.CHATBOT: component_imports.extend(components_imports['chatbot']) + elif component_type == r.ComponentType.DATAFRAME: + component_imports.extend(components_imports['dataframe']) + component_imports.extend("df_index = 1") # Return the list of import statements - return component_imports + return component_imports \ No newline at end of file From d8682ac6fc584ca092efae08520953c882c67865 Mon Sep 17 00:00:00 2001 From: sayalaruano Date: Mon, 17 Feb 2025 10:59:10 +0100 Subject: [PATCH 9/9] =?UTF-8?q?=F0=9F=90=9B=20Fix(streamlit=5Freportview.p?= =?UTF-8?q?y):=20correct=20df=5Findex=20creation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vuegen/streamlit_reportview.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vuegen/streamlit_reportview.py b/src/vuegen/streamlit_reportview.py index 6e85c3a..789c73a 100644 --- a/src/vuegen/streamlit_reportview.py +++ b/src/vuegen/streamlit_reportview.py @@ -744,7 +744,7 @@ def _generate_component_imports(self, component: r.Component) -> List[str]: component_imports.extend(components_imports['chatbot']) elif component_type == r.ComponentType.DATAFRAME: component_imports.extend(components_imports['dataframe']) - component_imports.extend("df_index = 1") + component_imports.append('df_index = 1') # Return the list of import statements return component_imports \ No newline at end of file