Files
data_pipeline_for_YNAB/visuals/layout.py
T
2025-05-30 11:52:44 +01:00

136 lines
4.8 KiB
Python

from dash import html, dcc
from datetime import date
import dash_bootstrap_components as dbc
from datetime import timedelta
today = date.today()
one_year_ago = today - timedelta(days=365)
def create_layout(data):
main_body = create_main_body(data)
topbar = create_topbar()
return [html.Div(topbar + main_body)]
def create_topbar():
return [
dbc.Container(
[
dbc.Row(
dbc.Col(
html.Div(
html.H1("Data Pipeline For YNAB, Preview Visualisations"),
className="text-center text-light",
),
width=12,
)
),
dbc.Row(
[
dbc.Col(
dcc.DatePickerRange(
first_day_of_week=1,
display_format="YYYY-MM-DD",
id="date-picker-range",
start_date=one_year_ago,
end_date=today,
),
width=4,
),
dbc.Col(
html.Button(
"Change Date Range", id="date-range-confirm-button"
),
width=2,
),
]
),
]
)
]
def create_main_body(data):
return [
dbc.Container(
[
dbc.Row(
[
dbc.Col(
dbc.Card(
dbc.CardBody(
[
html.H4(
"Spend Per Day", className="card-title"
),
dcc.Graph(
figure=data["spend_per_day_line"],
id="spend_per_day",
),
]
),
className="mb-4",
),
width=12,
)
]
),
dbc.Row(
[
dbc.Col(
dbc.Card(
dbc.CardBody(
[
html.H4(
"Spend Per Category", className="card-title"
),
dcc.Graph(
figure=data["spend_per_category_bar"],
id="spend_per_category",
),
]
),
className="mb-4",
),
width=5,
),
dbc.Col(
dbc.Card(
dbc.CardBody(
[
dcc.Markdown("## Total Spend:"),
dcc.Markdown(
data["total_spend"], id="total_spend"
),
],
),
className="text-center text-light",
),
width=2,
),
dbc.Col(
dbc.Card(
dbc.CardBody(
[
html.H4(
"Spend Per Payee", className="card-title"
),
dcc.Graph(
figure=data["spend_per_payee_bar"],
id="spend_per_payee",
),
]
),
className="mb-4",
),
width=5,
),
]
),
],
fluid=True,
),
]