File size: 3,465 Bytes
987be42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71a0abe
b1a4e67
 
987be42
b1a4e67
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""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()