maxschulz-COL's picture
Update app.py
71a0abe verified
"""Dev app to try things out."""
import vizro.models as vm
import vizro.plotly.express as px
import plotly.graph_objects as go
from vizro import Vizro
from vizro.tables import dash_ag_grid
from dash import Input, Output, State, callback, no_update, ctx
import pandas as pd
df = pd.DataFrame({
"date": pd.Series(dtype="datetime64[ns]"),
"value": pd.Series(dtype="float")
})
columnDefs = [
{"headerName": "Date", "field": "date", "editable": True, "cellEditor": "datePicker","checkboxSelection": True},
{"headerName": "Value", "field": "value", "editable": True, "cellEditor": "numericEditor"},
]
empty_figure = go.Figure(
layout={
"title": "Timeline of input data",
"paper_bgcolor": "rgba(0,0,0,0)",
"plot_bgcolor": "rgba(0,0,0,0)",
"xaxis": {"visible": False},
"yaxis": {"visible": False},
}
)
#update the chart based on the edited table
@callback(
Output("output_chart", "figure", allow_duplicate=True),
Input("__input_editing-grid2", "cellValueChanged"),
Input("__input_editing-grid2", "rowData"),
Input("theme_selector", "checked"),
prevent_initial_call=True
)
def update(_, rows,theme_selector):
dff = pd.DataFrame(rows)
if dff.empty:
return empty_figure
fig = px.line(dff,title = "Timeline of input data", x="date", y="value")
fig.update_layout(template="vizro_light" if theme_selector else "vizro_dark") #to get the theme right
return fig
# add or delete rows of table
@callback(
Output("__input_editing-grid2", "deleteSelectedRows"),
Output("__input_editing-grid2", "rowData"),
Input("delete-row-btn", "n_clicks"),
Input("add-row-btn", "n_clicks"),
State("__input_editing-grid2", "rowData"),
prevent_initial_call=True,
)
def update_dash_table(n_dlt, n_add, data):
if ctx.triggered_id == "add-row-btn":
new_row = {
"date": ["2020-01-01"],
"value": [0.0]
}
df_new_row = pd.DataFrame(new_row)
updated_table = pd.concat([pd.DataFrame(data), df_new_row])
return False, updated_table.to_dict("records")
elif ctx.triggered_id == "delete-row-btn":
return True, no_update
page = vm.Page(
title="Example of adding rows to AG Grid and updating a chart based on the edited table",
layout=vm.Layout(grid = [
[0,0,0,0,1,1,1,1],
[0,0,0,0,1,1,1,1],
[0,0,0,0,1,1,1,1],
[2,3,-1,-1,-1,-1,-1,-1],
] ),
components=[
vm.AgGrid(
id = "editing-grid2",
title="Editable Table / AG Grid",
figure=dash_ag_grid(
data_frame=df,
columnDefs=columnDefs,
defaultColDef={"editable": True},
columnSize="sizeToFit",
dashGridOptions={"rowSelection": "multiple", "suppressRowClickSelection": True},
),
),
vm.Graph(id = "output_chart",figure = px.line(df, title = "Timeline of input data",x="date", y="value")),
vm.Button(
id="delete-row-btn",
text="Delete row",
),
vm.Button(
id="add-row-btn",
text="Add row",
),
],
)
dashboard = vm.Dashboard(pages=[page])
app = Vizro().build(dashboard)
server = app.dash.server
if __name__ == "__main__":
app.run()