Refactor test cases for improved readability and consistency
- Updated test functions in various test files to enhance code clarity by formatting long lines and improving indentation. - Adjusted assertions to use multi-line formatting for better readability. - Added new test cases for theme settings API to ensure proper functionality. - Ensured consistent use of line breaks and spacing across test files for uniformity.
This commit is contained in:
@@ -20,5 +20,6 @@
|
||||
</div>
|
||||
</div>
|
||||
{% block scripts %}{% endblock %}
|
||||
<script src="/static/js/theme.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
17
templates/forgot_password.html
Normal file
17
templates/forgot_password.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Forgot Password{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<h1>Forgot Password</h1>
|
||||
<form id="forgot-password-form">
|
||||
<div class="form-group">
|
||||
<label for="email">Email:</label>
|
||||
<input type="email" id="email" name="email" required>
|
||||
</div>
|
||||
<button type="submit">Reset Password</button>
|
||||
</form>
|
||||
<p>Remember your password? <a href="/login">Login here</a></p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
22
templates/login.html
Normal file
22
templates/login.html
Normal file
@@ -0,0 +1,22 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Login{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<h1>Login</h1>
|
||||
<form id="login-form">
|
||||
<div class="form-group">
|
||||
<label for="username">Username:</label>
|
||||
<input type="text" id="username" name="username" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password">Password:</label>
|
||||
<input type="password" id="password" name="password" required>
|
||||
</div>
|
||||
<button type="submit">Login</button>
|
||||
</form>
|
||||
<p>Don't have an account? <a href="/register">Register here</a></p>
|
||||
<p><a href="/forgot-password">Forgot password?</a></p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,88 +1,49 @@
|
||||
{% set nav_groups = [
|
||||
{
|
||||
"label": "Dashboard",
|
||||
"links": [
|
||||
{"href": "/", "label": "Dashboard"},
|
||||
],
|
||||
},
|
||||
{
|
||||
"label": "Scenarios",
|
||||
"links": [
|
||||
{"href": "/ui/scenarios", "label": "Overview"},
|
||||
{"href": "/ui/parameters", "label": "Parameters"},
|
||||
{"href": "/ui/costs", "label": "Costs"},
|
||||
{"href": "/ui/consumption", "label": "Consumption"},
|
||||
{"href": "/ui/production", "label": "Production"},
|
||||
{
|
||||
"href": "/ui/equipment",
|
||||
"label": "Equipment",
|
||||
"children": [
|
||||
{"href": "/ui/maintenance", "label": "Maintenance"},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"label": "Analysis",
|
||||
"links": [
|
||||
{"href": "/ui/simulations", "label": "Simulations"},
|
||||
{"href": "/ui/reporting", "label": "Reporting"},
|
||||
],
|
||||
},
|
||||
{
|
||||
"label": "Settings",
|
||||
"links": [
|
||||
{
|
||||
"href": "/ui/settings",
|
||||
"label": "Settings",
|
||||
"children": [
|
||||
{"href": "/ui/currencies", "label": "Currency Management"},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
] %}
|
||||
{% set nav_groups = [ { "label": "Dashboard", "links": [ {"href": "/", "label":
|
||||
"Dashboard"}, ], }, { "label": "Overview", "links": [ {"href": "/ui/parameters",
|
||||
"label": "Parameters"}, {"href": "/ui/costs", "label": "Costs"}, {"href":
|
||||
"/ui/consumption", "label": "Consumption"}, {"href": "/ui/production", "label":
|
||||
"Production"}, { "href": "/ui/equipment", "label": "Equipment", "children": [
|
||||
{"href": "/ui/maintenance", "label": "Maintenance"}, ], }, ], }, { "label":
|
||||
"Simulations", "links": [ {"href": "/ui/simulations", "label": "Simulations"},
|
||||
], }, { "label": "Analytics", "links": [ {"href": "/ui/reporting", "label":
|
||||
"Reporting"}, ], }, { "label": "Settings", "links": [ { "href": "/ui/settings",
|
||||
"label": "Settings", "children": [ {"href": "/theme-settings", "label":
|
||||
"Themes"}, {"href": "/ui/currencies", "label": "Currency Management"}, ], }, ],
|
||||
}, ] %}
|
||||
|
||||
<nav class="sidebar-nav" aria-label="Primary navigation">
|
||||
{% set current_path = request.url.path if request else "" %}
|
||||
{% for group in nav_groups %}
|
||||
<div class="sidebar-section">
|
||||
<div class="sidebar-section-label">{{ group.label }}</div>
|
||||
<div class="sidebar-section-links">
|
||||
{% for link in group.links %}
|
||||
{% set href = link.href %}
|
||||
{% if href == "/" %}
|
||||
{% set is_active = current_path == "/" %}
|
||||
{% else %}
|
||||
{% set is_active = current_path.startswith(href) %}
|
||||
{% endif %}
|
||||
<div class="sidebar-link-block">
|
||||
<a
|
||||
href="{{ href }}"
|
||||
class="sidebar-link{% if is_active %} is-active{% endif %}"
|
||||
>
|
||||
{{ link.label }}
|
||||
</a>
|
||||
{% if link.children %}
|
||||
<div class="sidebar-sublinks">
|
||||
{% for child in link.children %}
|
||||
{% if child.href == "/" %}
|
||||
{% set child_active = current_path == "/" %}
|
||||
{% else %}
|
||||
{% set child_active = current_path.startswith(child.href) %}
|
||||
{% endif %}
|
||||
<a
|
||||
href="{{ child.href }}"
|
||||
class="sidebar-sublink{% if child_active %} is-active{% endif %}"
|
||||
>
|
||||
{{ child.label }}
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% set current_path = request.url.path if request else "" %} {% for group in
|
||||
nav_groups %}
|
||||
<div class="sidebar-section">
|
||||
<div class="sidebar-section-label">{{ group.label }}</div>
|
||||
<div class="sidebar-section-links">
|
||||
{% for link in group.links %} {% set href = link.href %} {% if href == "/"
|
||||
%} {% set is_active = current_path == "/" %} {% else %} {% set is_active =
|
||||
current_path.startswith(href) %} {% endif %}
|
||||
<div class="sidebar-link-block">
|
||||
<a
|
||||
href="{{ href }}"
|
||||
class="sidebar-link{% if is_active %} is-active{% endif %}"
|
||||
>
|
||||
{{ link.label }}
|
||||
</a>
|
||||
{% if link.children %}
|
||||
<div class="sidebar-sublinks">
|
||||
{% for child in link.children %} {% if child.href == "/" %} {% set
|
||||
child_active = current_path == "/" %} {% else %} {% set child_active =
|
||||
current_path.startswith(child.href) %} {% endif %}
|
||||
<a
|
||||
href="{{ child.href }}"
|
||||
class="sidebar-sublink{% if child_active %} is-active{% endif %}"
|
||||
>
|
||||
{{ child.label }}
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</nav>
|
||||
|
||||
31
templates/profile.html
Normal file
31
templates/profile.html
Normal file
@@ -0,0 +1,31 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Profile{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<h1>User Profile</h1>
|
||||
<p>Username: <span id="profile-username"></span></p>
|
||||
<p>Email: <span id="profile-email"></span></p>
|
||||
<button id="edit-profile-button">Edit Profile</button>
|
||||
|
||||
<div id="edit-profile-form" style="display:none;">
|
||||
<h2>Edit Profile</h2>
|
||||
<form>
|
||||
<div class="form-group">
|
||||
<label for="edit-username">Username:</label>
|
||||
<input type="text" id="edit-username" name="username">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="edit-email">Email:</label>
|
||||
<input type="email" id="edit-email" name="email">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="edit-password">New Password:</label>
|
||||
<input type="password" id="edit-password" name="password">
|
||||
</div>
|
||||
<button type="submit">Save Changes</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
25
templates/register.html
Normal file
25
templates/register.html
Normal file
@@ -0,0 +1,25 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Register{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<h1>Register</h1>
|
||||
<form id="register-form">
|
||||
<div class="form-group">
|
||||
<label for="username">Username:</label>
|
||||
<input type="text" id="username" name="username" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="email">Email:</label>
|
||||
<input type="email" id="email" name="email" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password">Password:</label>
|
||||
<input type="password" id="password" name="password" required>
|
||||
</div>
|
||||
<button type="submit">Register</button>
|
||||
</form>
|
||||
<p>Already have an account? <a href="/login">Login here</a></p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,113 +1,26 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Settings · CalMiner{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section class="page-header">
|
||||
<div>
|
||||
<h1>Settings</h1>
|
||||
<p class="page-subtitle">Configure platform defaults and administrative options.</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="settings-grid">
|
||||
<article class="settings-card">
|
||||
<h2>Currency Management</h2>
|
||||
<p>Manage available currencies, symbols, and default selections from the Currency Management page.</p>
|
||||
<a class="button-link" href="/ui/currencies">Go to Currency Management</a>
|
||||
</article>
|
||||
<article class="settings-card">
|
||||
<h2>Visual Theme</h2>
|
||||
<p>Adjust CalMiner theme colors and preview changes instantly.</p>
|
||||
<p class="settings-card-note">Changes save to the settings table and apply across the UI after submission. Environment overrides (if configured) remain read-only.</p>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<section class="panel" id="theme-settings" data-api="/api/settings/css">
|
||||
<header class="panel-header">
|
||||
<div>
|
||||
<h2>Theme Colors</h2>
|
||||
<p class="chart-subtitle">Update global CSS variables to customize CalMiner's appearance.</p>
|
||||
</div>
|
||||
</header>
|
||||
<form id="theme-settings-form" class="form-grid color-form-grid" novalidate>
|
||||
{% for key, value in css_variables.items() %}
|
||||
{% set env_meta = css_env_override_meta.get(key) %}
|
||||
<label class="color-form-field{% if env_meta %} is-env-override{% endif %}" data-variable="{{ key }}">
|
||||
<span class="color-field-header">
|
||||
<span class="color-field-name">{{ key }}</span>
|
||||
<span class="color-field-default">Default: {{ css_defaults[key] }}</span>
|
||||
</span>
|
||||
<span class="color-field-helper" id="color-helper-{{ loop.index }}">Accepts hex, rgb(a), or hsl(a) values.</span>
|
||||
{% if env_meta %}
|
||||
<span class="color-env-flag">Managed via {{ env_meta.env_var }} (read-only)</span>
|
||||
{% endif %}
|
||||
<span class="color-input-row">
|
||||
<input
|
||||
type="text"
|
||||
name="{{ key }}"
|
||||
class="color-value-input"
|
||||
value="{{ value }}"
|
||||
autocomplete="off"
|
||||
aria-describedby="color-helper-{{ loop.index }}"
|
||||
{% if env_meta %}disabled aria-disabled="true" data-env-override="true"{% endif %}
|
||||
/>
|
||||
<span class="color-preview" aria-hidden="true" style="background: {{ value }}"></span>
|
||||
</span>
|
||||
</label>
|
||||
{% endfor %}
|
||||
|
||||
<div class="button-row">
|
||||
<button type="submit" class="btn primary">Save Theme</button>
|
||||
<button type="button" class="btn" id="theme-settings-reset">Reset to Defaults</button>
|
||||
</div>
|
||||
</form>
|
||||
{% from "partials/components.html" import feedback with context %}
|
||||
{{ feedback("theme-settings-feedback") }}
|
||||
</section>
|
||||
|
||||
<section class="panel" id="theme-env-overrides">
|
||||
<header class="panel-header">
|
||||
<div>
|
||||
<h2>Environment Overrides</h2>
|
||||
<p class="chart-subtitle">The following CSS variables are controlled via environment variables and take precedence over database values.</p>
|
||||
</div>
|
||||
</header>
|
||||
{% if css_env_override_rows %}
|
||||
<div class="table-container env-overrides-table">
|
||||
<table aria-label="Environment-controlled theme variables">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">CSS Variable</th>
|
||||
<th scope="col">Environment Variable</th>
|
||||
<th scope="col">Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for row in css_env_override_rows %}
|
||||
<tr>
|
||||
<td><code>{{ row.css_key }}</code></td>
|
||||
<td><code>{{ row.env_var }}</code></td>
|
||||
<td><code>{{ row.value }}</code></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="empty-state">No environment overrides configured.</p>
|
||||
{% endif %}
|
||||
</section>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
{{ super() }}
|
||||
<script id="theme-settings-data" type="application/json">
|
||||
{{ {
|
||||
"variables": css_variables,
|
||||
"defaults": css_defaults,
|
||||
"envOverrides": css_env_overrides,
|
||||
"envSources": css_env_override_rows
|
||||
} | tojson }}
|
||||
</script>
|
||||
<script src="/static/js/settings.js"></script>
|
||||
{% extends "base.html" %} {% block title %}Settings · CalMiner{% endblock %} {%
|
||||
block content %}
|
||||
<section class="page-header">
|
||||
<div>
|
||||
<h1>Settings</h1>
|
||||
<p class="page-subtitle">
|
||||
Configure platform defaults and administrative options.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="settings-grid">
|
||||
<article class="settings-card">
|
||||
<h2>Currency Management</h2>
|
||||
<p>
|
||||
Manage available currencies, symbols, and default selections from the
|
||||
Currency Management page.
|
||||
</p>
|
||||
<a class="button-link" href="/ui/currencies">Go to Currency Management</a>
|
||||
</article>
|
||||
<article class="settings-card">
|
||||
<h2>Themes</h2>
|
||||
<p>Adjust CalMiner theme colors and preview changes instantly.</p>
|
||||
<a class="button-link" href="/theme-settings">Go to Theme Settings</a>
|
||||
</article>
|
||||
</section>
|
||||
{% endblock %}
|
||||
|
||||
125
templates/theme_settings.html
Normal file
125
templates/theme_settings.html
Normal file
@@ -0,0 +1,125 @@
|
||||
{% extends "base.html" %} {% block title %}Theme Settings · CalMiner{% endblock
|
||||
%} {% block content %}
|
||||
<section class="page-header">
|
||||
<div>
|
||||
<h1>Theme Settings</h1>
|
||||
<p class="page-subtitle">
|
||||
Adjust CalMiner theme colors and preview changes instantly.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="panel" id="theme-settings" data-api="/api/settings/css">
|
||||
<header class="panel-header">
|
||||
<div>
|
||||
<h2>Theme Colors</h2>
|
||||
<p class="chart-subtitle">
|
||||
Update global CSS variables to customize CalMiner's appearance.
|
||||
</p>
|
||||
</div>
|
||||
</header>
|
||||
<form id="theme-settings-form" class="form-grid color-form-grid" novalidate>
|
||||
{% for key, value in css_variables.items() %} {% set env_meta =
|
||||
css_env_override_meta.get(key) %}
|
||||
<label
|
||||
class="color-form-field{% if env_meta %} is-env-override{% endif %}"
|
||||
data-variable="{{ key }}"
|
||||
>
|
||||
<span class="color-field-header">
|
||||
<span class="color-field-name">{{ key }}</span>
|
||||
<span class="color-field-default"
|
||||
>Default: {{ css_defaults[key] }}</span
|
||||
>
|
||||
</span>
|
||||
<span class="color-field-helper" id="color-helper-{{ loop.index }}"
|
||||
>Accepts hex, rgb(a), or hsl(a) values.</span
|
||||
>
|
||||
{% if env_meta %}
|
||||
<span class="color-env-flag"
|
||||
>Managed via {{ env_meta.env_var }} (read-only)</span
|
||||
>
|
||||
{% endif %}
|
||||
<span class="color-input-row">
|
||||
<input
|
||||
type="text"
|
||||
name="{{ key }}"
|
||||
class="color-value-input"
|
||||
value="{{ value }}"
|
||||
autocomplete="off"
|
||||
aria-describedby="color-helper-{{ loop.index }}"
|
||||
{%
|
||||
if
|
||||
env_meta
|
||||
%}disabled
|
||||
aria-disabled="true"
|
||||
data-env-override="true"
|
||||
{%
|
||||
endif
|
||||
%}
|
||||
/>
|
||||
<span
|
||||
class="color-preview"
|
||||
aria-hidden="true"
|
||||
style="background: {{ value }}"
|
||||
></span>
|
||||
</span>
|
||||
</label>
|
||||
{% endfor %}
|
||||
|
||||
<div class="button-row">
|
||||
<button type="submit" class="btn primary">Save Theme</button>
|
||||
<button type="button" class="btn" id="theme-settings-reset">
|
||||
Reset to Defaults
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
{% from "partials/components.html" import feedback with context %} {{
|
||||
feedback("theme-settings-feedback") }}
|
||||
</section>
|
||||
|
||||
<section class="panel" id="theme-env-overrides">
|
||||
<header class="panel-header">
|
||||
<div>
|
||||
<h2>Environment Overrides</h2>
|
||||
<p class="chart-subtitle">
|
||||
The following CSS variables are controlled via environment variables and
|
||||
take precedence over database values.
|
||||
</p>
|
||||
</div>
|
||||
</header>
|
||||
{% if css_env_override_rows %}
|
||||
<div class="table-container env-overrides-table">
|
||||
<table aria-label="Environment-controlled theme variables">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">CSS Variable</th>
|
||||
<th scope="col">Environment Variable</th>
|
||||
<th scope="col">Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for row in css_env_override_rows %}
|
||||
<tr>
|
||||
<td><code>{{ row.css_key }}</code></td>
|
||||
<td><code>{{ row.env_var }}</code></td>
|
||||
<td><code>{{ row.value }}</code></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="empty-state">No environment overrides configured.</p>
|
||||
{% endif %}
|
||||
</section>
|
||||
{% endblock %} {% block scripts %} {{ super() }}
|
||||
<script id="theme-settings-data" type="application/json">
|
||||
{{ {
|
||||
"variables": css_variables,
|
||||
"defaults": css_defaults,
|
||||
"envOverrides": css_env_overrides,
|
||||
"envSources": css_env_override_rows
|
||||
} | tojson }}
|
||||
</script>
|
||||
<script src="/static/js/settings.js"></script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user