Source code for algomancy_content.pages.standardhomepage
from dash import html, get_app
import dash
import dash_bootstrap_components as dbc
from algomancy_gui.page import BaseHomePage
from algomancy_scenario import ScenarioStatus
from algomancy_gui.managers.managergetters import get_scenario_manager
[docs]
class StandardHomePage(BaseHomePage):
"""
StandardHomePage is a subclass of BaseHomePage that provides a standard home page layout for an application.
It includes a logo, status indicators for scenario processing, and a summary of scenario counts.
USAGE:
>>> config = AppConfig(
... page_config=PageConfig(home_page="standard"),
... ...
... )
"""
[docs]
@staticmethod
def create_content():
"""
Creates the content for the home page, including logo, status indicators,
and a summary of scenario processing status.
Implements the HomePage Protocol
Returns:
html.Div: A Dash HTML component representing the home page content
"""
# Get scenario information
scenario_manager = get_scenario_manager(get_app().server)
all_scenarios = scenario_manager.list_scenarios()
# Count scenarios in each status
processing_count = sum(
1 for s in all_scenarios if s.status == ScenarioStatus.PROCESSING
)
queued_count = sum(
1 for s in all_scenarios if s.status == ScenarioStatus.QUEUED
)
completed_count = sum(
1 for s in all_scenarios if s.status == ScenarioStatus.COMPLETE
)
failed_count = sum(
1 for s in all_scenarios if s.status == ScenarioStatus.FAILED
)
created_count = sum(
1 for s in all_scenarios if s.status == ScenarioStatus.CREATED
)
# Define status indicators
status_indicators = [
StandardHomePage._create_status_card(
"Processing",
processing_count,
"primary",
"Scenarios currently being processed",
),
StandardHomePage._create_status_card(
"Queued", queued_count, "info", "Scenarios waiting to be processed"
),
StandardHomePage._create_status_card(
"Completed",
completed_count,
"success",
"Successfully completed scenarios",
),
StandardHomePage._create_status_card(
"Failed", failed_count, "danger", "Scenarios that encountered errors"
),
StandardHomePage._create_status_card(
"Created", created_count, "secondary", "Newly created scenarios"
),
]
logo_url = dash.get_asset_url("cqm-logo.png")
return html.Div(
[
# Header with logo
dbc.Row(
[
dbc.Col(width=4),
dbc.Col(
html.Div(
[
html.H1(
"WARP Dashboard",
className="display-4",
style={"color": "var(--text-color)"},
),
html.P(
"Workflow Analysis and Reporting Platform",
className="lead",
style={
"color": "var(--text-color)",
"opacity": 0.8,
},
),
]
),
width={"size": 6},
className="d-flex align-items-center",
),
dbc.Col(
html.Img(src=logo_url, height="80px", className="mb-4"),
width={"size": 2},
className="d-flex align-items-center",
),
],
className="mb-4",
),
# System Status Section
dbc.Card(
[
dbc.CardHeader(
html.H3("System Status", className="mb-0"),
style={
"backgroundColor": "transparent",
"color": "var(--text-color)",
},
),
dbc.CardBody(
[
dbc.Row(
[
dbc.Col(
html.Div(
[
html.H5(
"Scenario Status Overview",
className="mb-3",
style={
"color": "var(--text-color)"
},
),
dbc.Row(status_indicators),
]
),
width=12,
)
]
)
]
),
],
className="mb-4",
style={
"backgroundColor": "var(--card-surface)",
"border": "none",
"boxShadow": "0 2px 8px rgba(0,0,0,0.12)",
},
),
# Quick Links Section
dbc.Card(
[
dbc.CardHeader(
html.H3("Quick Links", className="mb-0"),
style={
"backgroundColor": "transparent",
"color": "var(--text-color)",
},
),
dbc.CardBody(
dbc.Row(
[
StandardHomePage._create_quick_link(
"Create Scenario",
"/scenarios/create",
"Create a new scenario",
"primary",
),
StandardHomePage._create_quick_link(
"View Scenarios",
"/scenarios",
"View all scenarios",
"info",
),
StandardHomePage._create_quick_link(
"Compare",
"/compare",
"Compare two scenarios",
"success",
),
StandardHomePage._create_quick_link(
"Data Import",
"/data",
"Import or manage data",
"warning",
),
]
)
),
],
style={
"backgroundColor": "var(--card-surface)",
"border": "none",
"boxShadow": "0 2px 8px rgba(0,0,0,0.12)",
},
),
],
className="p-4",
style={"color": "var(--text-color)"},
)
@staticmethod
def _create_status_card(title, count, color, tooltip):
"""Create a card showing a status count with appropriate styling responsive to theme."""
return dbc.Col(
dbc.Card(
[
dbc.CardBody(
[
html.H4(
f"{count}",
className="text-center",
style={"color": "var(--text-selected)"},
),
html.P(
title,
className="text-center mb-0",
style={"color": "var(--text-selected)"},
),
]
)
],
className="mb-3 text-center",
id=f"status-card-{title.lower()}",
style={
"cursor": "pointer",
"background": f"var(--status-{title.lower()})",
"border": "none",
"boxShadow": "0 2px 8px rgba(0,0,0,0.12)",
},
),
width={"size": 2, "offset": 0},
className="mx-auto",
)
@staticmethod
def _create_quick_link(title, href, description, color):
"""Create a quick link card for navigation."""
return dbc.Col(
dbc.Card(
[
dbc.CardBody(
[
html.H5(
title,
className="card-title",
style={"color": "var(--text-color)"},
),
html.P(
description,
className="card-text",
style={"color": "var(--text-color)", "opacity": 0.9},
),
dbc.Button(
"Go",
href=href,
className="mt-2",
style={
"backgroundColor": "var(--theme-secondary)",
"color": "var(--text-selected)",
"border": "none",
},
),
]
)
],
className="h-100",
style={
"backgroundColor": "rgba(0,0,0,0.0)",
"border": "1px solid rgba(255,255,255,0.1)",
},
),
width=3,
className="mb-4",
)
[docs]
@staticmethod
def register_callbacks():
"""Has no additional callbacks - navlinks do not require a callback"""
pass