6c0d5a4e63
- Flask-based mold cost calculation application - PostgreSQL database with SQLAlchemy ORM - Docker/Podman containerization - Comprehensive documentation in docs/ - Clean, organized codebase without obsolete files - Production-ready deployment configuration - Enhanced pytest configuration with coverage reporting - Master/Development branch structure
130 lines
4.9 KiB
HTML
130 lines
4.9 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>{% block title %}Admin Panel{% endblock %}</title>
|
|
{% block styles %}
|
|
<!-- Bootstrap CSS -->
|
|
<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet">
|
|
<!-- Bootstrap Icons -->
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap-icons.css') }}">
|
|
<!-- Admin Styles -->
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/admin.css') }}">
|
|
<!-- Custom Styles -->
|
|
<style>
|
|
:root {
|
|
--primary-color: #0d6efd;
|
|
--secondary-color: #6c757d;
|
|
--success-color: #198754;
|
|
--warning-color: #ffc107;
|
|
--danger-color: #dc3545;
|
|
--light-color: #f8f9fa;
|
|
--dark-color: #212529;
|
|
}
|
|
|
|
body {
|
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
background-color: #f8f9fa;
|
|
}
|
|
|
|
.navbar {
|
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
}
|
|
|
|
.card {
|
|
border: none;
|
|
box-shadow: 0 0.125rem 0.25rem rgba(0,0,0,0.075);
|
|
transition: box-shadow 0.15s ease-in-out;
|
|
}
|
|
|
|
.card:hover {
|
|
box-shadow: 0 0.5rem 1rem rgba(0,0,0,0.15);
|
|
}
|
|
|
|
.btn {
|
|
border-radius: 0.375rem;
|
|
}
|
|
|
|
.table {
|
|
border-radius: 0.375rem;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.alert {
|
|
border: none;
|
|
border-radius: 0.375rem;
|
|
}
|
|
</style>
|
|
{% endblock %}
|
|
</head>
|
|
<body>
|
|
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
|
<div class="container-fluid">
|
|
<a class="navbar-brand" href="{{ url_for('admin.dashboard') }}">
|
|
<i class="bi bi-gear-fill me-2"></i>Admin Panel
|
|
</a>
|
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
<div class="collapse navbar-collapse" id="navbarNav">
|
|
<ul class="navbar-nav">
|
|
<li class="nav-item">
|
|
<a class="nav-link {% if request.endpoint == 'admin.dashboard' %}active{% endif %}"
|
|
href="{{ url_for('admin.dashboard') }}">
|
|
<i class="bi bi-graph-up me-1"></i>Dashboard
|
|
</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link {% if request.endpoint == 'admin.users' %}active{% endif %}"
|
|
href="{{ url_for('admin.users') }}">
|
|
<i class="bi bi-people me-1"></i>Users
|
|
</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link {% if request.endpoint == 'admin.quotations' %}active{% endif %}"
|
|
href="{{ url_for('admin.quotations') }}">
|
|
<i class="bi bi-file-earmark-text me-1"></i>Quotations
|
|
</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link {% if request.endpoint == 'admin.cost_factors' %}active{% endif %}"
|
|
href="{{ url_for('admin.cost_factors') }}">
|
|
<i class="bi bi-calculator me-1"></i>Cost Factors
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
<ul class="navbar-nav ms-auto">
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="{{ url_for('auth.logout') }}">
|
|
<i class="bi bi-box-arrow-right me-1"></i>Logout
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<div class="container-fluid py-4">
|
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
|
{% if messages %}
|
|
{% for category, message in messages %}
|
|
<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
|
|
{{ message }}
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
|
</div>
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% endwith %}
|
|
|
|
{% block content %}{% endblock %}
|
|
</div>
|
|
|
|
{% block scripts %}
|
|
<!-- Bootstrap Bundle with Popper -->
|
|
<script src="{{ url_for('static', filename='js/bootstrap.bundle.min.js') }}"></script>
|
|
<!-- jQuery -->
|
|
<script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>
|
|
{% endblock %}
|
|
</body>
|
|
</html> |