feat: add scenarios list page with metrics and quick actions
Some checks failed
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / lint (push) Failing after 15s
CI / deploy (push) Has been skipped

- Introduced a new template for listing scenarios associated with a project.
- Added metrics for total, active, draft, and archived scenarios.
- Implemented quick actions for creating new scenarios and reviewing project overview.
- Enhanced navigation with breadcrumbs for better user experience.

refactor: update Opex and Profitability templates for consistency

- Changed titles and button labels for clarity in Opex and Profitability templates.
- Updated form IDs and action URLs for better alignment with new naming conventions.
- Improved navigation links to include scenario and project overviews.

test: add integration tests for Opex calculations

- Created new tests for Opex calculation HTML and JSON flows.
- Validated successful calculations and ensured correct data persistence.
- Implemented tests for currency mismatch and unsupported frequency scenarios.

test: enhance project and scenario route tests

- Added tests to verify scenario list rendering and calculator shortcuts.
- Ensured scenario detail pages link back to the portfolio correctly.
- Validated project detail pages show associated scenarios accurately.
This commit is contained in:
2025-11-13 16:21:36 +01:00
parent 4f00bf0d3c
commit 522b1e4105
54 changed files with 3419 additions and 700 deletions

View File

@@ -367,17 +367,17 @@ a.sidebar-brand:focus {
.sidebar-nav-controls {
display: flex;
justify-content: center;
gap: 10px;
gap: 1rem;
margin: 0;
}
.nav-chevron {
width: 80px;
height: 80px;
width: 5rem;
height: 5rem;
border: none;
background: rgba(255, 255, 255, 0.1);
background: rgba(0, 0, 0, 0.5);
color: rgba(255, 255, 255, 0.88);
font-size: 1.2rem;
font-size: 4.5rem;
font-weight: bold;
cursor: pointer;
display: flex;
@@ -388,8 +388,9 @@ a.sidebar-brand:focus {
.nav-chevron:hover,
.nav-chevron:focus {
background: rgba(255, 255, 255, 0.2);
transform: scale(1.05);
background: rgba(0, 0, 0, 0.1);
color: rgba(255, 255, 255, 1);
transform: scale(0.9);
}
.nav-chevron:disabled {
@@ -1188,8 +1189,16 @@ footer a:focus {
justify-content: center;
}
.sidebar-nav-controls {
display: none;
}
.sidebar-link-block {
align-items: center;
}
.sidebar-link {
flex: 1 1 140px;
flex: 1 1 40px;
justify-content: center;
}
@@ -1219,6 +1228,10 @@ footer a:focus {
overflow: hidden;
}
body.sidebar-open .app-main {
position: relative;
z-index: 1;
}
body.sidebar-open .app-sidebar {
display: block;
position: fixed;
@@ -1227,7 +1240,7 @@ footer a:focus {
width: min(320px, 82vw);
height: 100vh;
overflow-y: auto;
z-index: 900;
z-index: 999;
box-shadow: 0 12px 30px rgba(8, 14, 25, 0.4);
}
@@ -1235,9 +1248,4 @@ footer a:focus {
opacity: 1;
pointer-events: auto;
}
body.sidebar-open .app-main {
position: relative;
z-index: 950;
}
}