feat: Add NPV comparison and distribution charts to reporting
- Implemented NPV comparison chart generation using Plotly in ReportingService. - Added distribution histogram for Monte Carlo results. - Updated reporting templates to include new charts and improved layout. - Created new settings and currencies management pages. - Enhanced sidebar navigation with dynamic URL handling. - Improved CSS styles for chart containers and overall layout. - Added new simulation and theme settings pages with placeholders for future features.
This commit is contained in:
109
routes/ui.py
Normal file
109
routes/ui.py
Normal file
@@ -0,0 +1,109 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends, Request
|
||||
from fastapi.responses import HTMLResponse
|
||||
from fastapi.templating import Jinja2Templates
|
||||
|
||||
from dependencies import require_any_role, require_roles
|
||||
from models import User
|
||||
|
||||
router = APIRouter(tags=["UI"])
|
||||
templates = Jinja2Templates(directory="templates")
|
||||
|
||||
READ_ROLES = ("viewer", "analyst", "project_manager", "admin")
|
||||
MANAGE_ROLES = ("project_manager", "admin")
|
||||
|
||||
|
||||
@router.get(
|
||||
"/ui/simulations",
|
||||
response_class=HTMLResponse,
|
||||
include_in_schema=False,
|
||||
name="ui.simulations",
|
||||
)
|
||||
def simulations_dashboard(
|
||||
request: Request,
|
||||
_: User = Depends(require_any_role(*READ_ROLES)),
|
||||
) -> HTMLResponse:
|
||||
return templates.TemplateResponse(
|
||||
request,
|
||||
"simulations.html",
|
||||
{
|
||||
"title": "Simulations",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@router.get(
|
||||
"/ui/reporting",
|
||||
response_class=HTMLResponse,
|
||||
include_in_schema=False,
|
||||
name="ui.reporting",
|
||||
)
|
||||
def reporting_dashboard(
|
||||
request: Request,
|
||||
_: User = Depends(require_any_role(*READ_ROLES)),
|
||||
) -> HTMLResponse:
|
||||
return templates.TemplateResponse(
|
||||
request,
|
||||
"reporting.html",
|
||||
{
|
||||
"title": "Reporting",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@router.get(
|
||||
"/ui/settings",
|
||||
response_class=HTMLResponse,
|
||||
include_in_schema=False,
|
||||
name="ui.settings",
|
||||
)
|
||||
def settings_page(
|
||||
request: Request,
|
||||
_: User = Depends(require_any_role(*READ_ROLES)),
|
||||
) -> HTMLResponse:
|
||||
return templates.TemplateResponse(
|
||||
request,
|
||||
"settings.html",
|
||||
{
|
||||
"title": "Settings",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@router.get(
|
||||
"/theme-settings",
|
||||
response_class=HTMLResponse,
|
||||
include_in_schema=False,
|
||||
name="ui.theme_settings",
|
||||
)
|
||||
def theme_settings_page(
|
||||
request: Request,
|
||||
_: User = Depends(require_any_role(*READ_ROLES)),
|
||||
) -> HTMLResponse:
|
||||
return templates.TemplateResponse(
|
||||
request,
|
||||
"theme_settings.html",
|
||||
{
|
||||
"title": "Theme Settings",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@router.get(
|
||||
"/ui/currencies",
|
||||
response_class=HTMLResponse,
|
||||
include_in_schema=False,
|
||||
name="ui.currencies",
|
||||
)
|
||||
def currencies_page(
|
||||
request: Request,
|
||||
_: User = Depends(require_roles(*MANAGE_ROLES)),
|
||||
) -> HTMLResponse:
|
||||
return templates.TemplateResponse(
|
||||
request,
|
||||
"currencies.html",
|
||||
{
|
||||
"title": "Currency Management",
|
||||
},
|
||||
)
|
||||
Reference in New Issue
Block a user