233 lines
9.3 KiB
HTML
233 lines
9.3 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 %}{{ COMPANY_NAME }}{% endblock %}</title>
|
|
|
|
<!-- Main CSS -->
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}" />
|
|
|
|
<!-- Theme Override (set THEME_NAME in .env to activate, e.g. THEME_NAME=gov) -->
|
|
{% if THEME_NAME %}
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/theme-' + THEME_NAME + '.css') }}" />
|
|
{% endif %}
|
|
|
|
<!-- Font Awesome -->
|
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet" />
|
|
|
|
<!-- Page-specific CSS -->
|
|
{% block extra_head %}{% endblock %}
|
|
|
|
<!-- Favicon -->
|
|
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}" />
|
|
</head>
|
|
|
|
<body class="has-sidebar">
|
|
<!-- Authenticated Layout with Sidebar -->
|
|
<div class="app-layout">
|
|
<!-- Sidebar -->
|
|
<nav class="sidebar" id="sidebar">
|
|
<!-- Brand Section -->
|
|
<div class="sidebar-brand">
|
|
<div class="brand-content">
|
|
<i class="fas fa-qrcode"></i>
|
|
<span class="brand-text">{{ COMPANY_NAME }}</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Navigation Menu -->
|
|
<div class="sidebar-menu">
|
|
<div class="menu-section">
|
|
<div class="menu-items">
|
|
<a href="{{ url_for('dashboard.dashboard') }}" class="menu-item">
|
|
<i class="fas fa-tachometer-alt"></i>
|
|
<span class="menu-text">Dashboard</span>
|
|
</a>
|
|
|
|
{% if session.role == 'admin' %}
|
|
<a href="{{ url_for('qr_codes.create_qr_code') }}" class="menu-item">
|
|
<i class="fas fa-plus"></i>
|
|
<span class="menu-text">Create QR</span>
|
|
</a>
|
|
<a href="{{ url_for('projects.projects') }}"
|
|
class="menu-item {% if request.endpoint in ['projects', 'create_project', 'edit_project'] %}active{% endif %}">
|
|
<i class="fas fa-folder"></i>
|
|
<span class="menu-text">Projects</span>
|
|
</a>
|
|
<a href="{{ url_for('users.users') }}" class="menu-item">
|
|
<i class="fas fa-user-cog"></i>
|
|
<span class="menu-text">Users</span>
|
|
</a>
|
|
<a href="{{ url_for('employees.employees') }}" class="menu-item">
|
|
<i class="fas fa-user"></i>
|
|
<span class="menu-text">Employees</span>
|
|
</a>
|
|
<a href="{{ url_for('attendance.attendance_report') }}" class="menu-item">
|
|
<i class="fas fa-chart-line"></i>
|
|
<span class="menu-text">Reports</span>
|
|
</a>
|
|
<a href="{{ url_for('attendance.verification_review') }}"
|
|
class="menu-item {% if request.endpoint == 'verification_review' %}active{% endif %}">
|
|
<i class="fas fa-camera-retro"></i>
|
|
<span class="menu-text">Verification Review</span>
|
|
</a>
|
|
<a href="{{ url_for('time_attendance.time_attendance_dashboard') }}"
|
|
class="menu-item {% if request.endpoint and (request.endpoint.startswith('time_attendance') or request.endpoint.startswith('import_time_attendance')) %}active{% endif %}">
|
|
<i class="fas fa-clock"></i>
|
|
<span class="menu-text">Time Attendance</span>
|
|
</a>
|
|
<a href="{{ url_for('payroll.payroll_dashboard') }}" class="menu-item">
|
|
<i class="fas fa-calculator"></i>
|
|
<span class="menu-text">Payroll</span>
|
|
</a>
|
|
<a href="{{ url_for('statistics.qr_statistics') }}"
|
|
class="menu-item {% if request.endpoint == 'qr_statistics' %}active{% endif %}">
|
|
<i class="fas fa-chart-pie"></i>
|
|
<span class="menu-text">Statistics</span>
|
|
</a>
|
|
<a href="{{ url_for('admin.admin_logs') }}"
|
|
class="menu-item {% if request.endpoint == 'admin_logs' %}active{% endif %}">
|
|
<i class="fas fa-clipboard-list"></i>
|
|
<span class="menu-text">System Logs</span>
|
|
</a>
|
|
{% elif session.role in ['payroll', 'accounting'] %}
|
|
<a href="{{ url_for('employees.employees') }}" class="menu-item">
|
|
<i class="fas fa-user"></i>
|
|
<span class="menu-text">Employees</span>
|
|
</a>
|
|
<a href="{{ url_for('attendance.attendance_report') }}" class="menu-item">
|
|
<i class="fas fa-chart-line"></i>
|
|
<span class="menu-text">Reports</span>
|
|
</a>
|
|
<a href="{{ url_for('attendance.verification_review') }}"
|
|
class="menu-item {% if request.endpoint == 'verification_review' %}active{% endif %}">
|
|
<i class="fas fa-camera-retro"></i>
|
|
<span class="menu-text">Verification Review</span>
|
|
</a>
|
|
<a href="{{ url_for('time_attendance.time_attendance_dashboard') }}"
|
|
class="menu-item {% if request.endpoint and (request.endpoint.startswith('time_attendance') or request.endpoint.startswith('import_time_attendance')) %}active{% endif %}">
|
|
<i class="fas fa-clock"></i>
|
|
<span class="menu-text">Time Attendance</span>
|
|
</a>
|
|
<!--
|
|
<a href="{{ url_for('payroll.payroll_dashboard') }}" class="menu-item">
|
|
<i class="fas fa-calculator"></i>
|
|
<span class="menu-text">Payroll</span>
|
|
</a>
|
|
-->
|
|
{% elif session.role in ['project_manager'] %}
|
|
<a href="{{ url_for('attendance.attendance_report') }}" class="menu-item">
|
|
<i class="fas fa-chart-line"></i>
|
|
<span class="menu-text">Reports</span>
|
|
</a>
|
|
{% endif %}
|
|
<a href="{{ url_for('auth.profile') }}" class="menu-item">
|
|
<i class="fas fa-user"></i>
|
|
<span class="menu-text">Profile</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Bottom Section -->
|
|
<div class="sidebar-bottom">
|
|
<div class="menu-items">
|
|
<a href="{{ url_for('auth.logout') }}" class="menu-item logout">
|
|
<i class="fas fa-sign-out-alt"></i>
|
|
<span class="menu-text">Logout</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Sidebar Toggle Button -->
|
|
<button class="sidebar-toggle" id="sidebarToggle">
|
|
<i class="fas fa-chevron-left"></i>
|
|
</button>
|
|
</nav>
|
|
|
|
<!-- Mobile Overlay -->
|
|
<div class="sidebar-overlay" id="sidebarOverlay"></div>
|
|
|
|
<!-- Main Content Area -->
|
|
<div class="main-wrapper">
|
|
<!-- Top Header Bar -->
|
|
<header class="top-header">
|
|
<div class="header-left">
|
|
<button class="mobile-menu-btn" id="mobileMenuBtn">
|
|
<span class="hamburger-line"></span>
|
|
<span class="hamburger-line"></span>
|
|
<span class="hamburger-line"></span>
|
|
</button>
|
|
<h1 class="page-title">
|
|
{% block page_title %}{{ COMPANY_NAME }}{% endblock %}
|
|
</h1>
|
|
</div>
|
|
|
|
<div class="header-right">
|
|
<div class="user-info">
|
|
<span class="user-name">{{ session.full_name or 'User' }}</span>
|
|
<span class="user-role">{{ session.role|title }}</span>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
<!-- Main Content -->
|
|
<main class="main-content">
|
|
<!-- Flash Messages -->
|
|
{% with messages = get_flashed_messages(with_categories=true) %} {% if
|
|
messages %}
|
|
<div class="flash-messages">
|
|
{% for category, message in messages %}
|
|
<div class="alert alert-{{ category }}">
|
|
<i
|
|
class="fas {% if category == 'success' %}fa-check-circle{% elif category == 'error' %}fa-exclamation-circle{% elif category == 'info' %}fa-info-circle{% else %}fa-exclamation-triangle{% endif %}"></i>
|
|
{{ message }}
|
|
<button class="alert-close" onclick="this.parentElement.style.display='none'">
|
|
<i class="fas fa-times"></i>
|
|
</button>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %} {% endwith %}
|
|
|
|
<!-- Page Content -->
|
|
<div class="container">{% block content %}{% endblock %}</div>
|
|
</main>
|
|
|
|
<!-- Footer -->
|
|
<footer class="footer">
|
|
<div class="container">
|
|
<div class="footer-content">
|
|
<p>© {{ CURRENT_YEAR }} {{ COMPANY_NAME }}. All rights reserved.</p>
|
|
<div class="footer-links">
|
|
<a href="#" class="footer-link">Privacy Policy</a>
|
|
<a href="#" class="footer-link">Terms of Service</a>
|
|
<a href="#" class="footer-link">Support</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Main JavaScript -->
|
|
<script src="{{ url_for('static', filename='js/script.js') }}"></script>
|
|
|
|
<!-- Page-specific JavaScript -->
|
|
{% block extra_scripts %}{% endblock %}
|
|
|
|
<!-- Global JavaScript Variables -->
|
|
<script>
|
|
// Pass Flask session data to JavaScript
|
|
window.qrConfig = {
|
|
currentUserId: {{ session.user_id |default ('null') }},
|
|
currentUserRole: '{{ session.role|default('') }}',
|
|
currentUserName: '{{ session.full_name|default('') }}',
|
|
csrfToken: '{{ csrf_token() if csrf_token else '' }}'
|
|
};
|
|
</script>
|
|
</body>
|
|
|
|
</html> |