import cpsl
app = cpsl.App(name="dashboard-demo", image=cpsl.Image())
app.setting("daily_goal", scope="user", type=int, default=3, label="Daily goal")
app.setting("show_completed", scope="user", type=bool, default=True, label="Show completed")
app.setting(
"default_view",
scope="user",
type=str,
default="table",
options=["table", "chart"],
label="Default view",
)
app.setting("summary_prompt", scope="user", type=str, default="Short and useful")
@app.data("stats", access="authenticated")
def get_stats(ctx: cpsl.RequestContext):
return {
"viewer": ctx.user.email,
"open_tasks": 12,
"completed_today": 4,
"health": 0.97,
}
@app.data("activity", access="authenticated")
def get_activity(period: str = "7d"):
return [
{"day": "Mon", "count": 3},
{"day": "Tue", "count": 5},
{"day": "Wed", "count": 4},
{"day": "Thu", "count": 7},
{"day": "Fri", "count": 2},
]
@app.data("recent_tasks", access="authenticated")
def get_recent_tasks():
return [
{"title": "Import leads", "status": "done", "owner": "Ada"},
{"title": "Generate report", "status": "running", "owner": "Ibrahim"},
{"title": "Review findings", "status": "queued", "owner": "Mina"},
]
@app.page("Overview", icon="layout-dashboard", access="authenticated")
def overview():
return cpsl.ui.Page(
[
cpsl.ui.Row(
[
cpsl.ui.Metric("Open Tasks", data="stats", field="open_tasks"),
cpsl.ui.Metric("Completed Today", data="stats", field="completed_today"),
cpsl.ui.Metric("Health", data="stats", field="health", format="percent"),
]
),
cpsl.ui.Divider(),
cpsl.ui.Chart(data="activity", chart_type="bar", x="day", y="count"),
cpsl.ui.Divider(),
cpsl.ui.Table(data="recent_tasks", columns=["title", "status", "owner"]),
]
)
@app.page("Preferences", icon="sliders-horizontal", access="authenticated")
def preferences():
return cpsl.ui.Page(
[
cpsl.ui.Card(
"Display",
[
cpsl.ui.Toggle("Show completed items", setting="show_completed"),
cpsl.ui.NumberInput("Daily goal", setting="daily_goal", min=1, max=20, step=1),
cpsl.ui.Select("Default view", setting="default_view"),
],
),
cpsl.ui.Card(
"Prompting",
[
cpsl.ui.TextInput(
"Summary prompt",
setting="summary_prompt",
multiline=True,
placeholder="How should the app summarize results?",
),
],
),
]
)