From 908785ee73bda36c59364910b4cb4a24edf6ae7a Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Sun, 8 Feb 2026 10:59:45 +0100 Subject: [PATCH] Add documentation system Phase 1 - Core infrastructure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Created documentation blueprint (doc_bp) with routes and navigation - Added documentation menu item (📖) to navbar for all users - Implemented hierarchical navigation with 9 sections, 33 pages - Created base layout with sidebar, breadcrumb, and prev/next navigation - Added documentation.css with dark mode support - Created first 3 getting-started pages (what-is-backupchecks, first-login, quick-start) - Updated changelog Co-Authored-By: Claude Sonnet 4.5 --- .../backupchecks/src/backend/app/__init__.py | 2 + .../backend/app/main/routes_documentation.py | 185 ++++++++++ .../src/static/css/documentation.css | 315 ++++++++++++++++++ .../templates/documentation/_navigation.html | 24 ++ .../src/templates/documentation/base.html | 59 ++++ .../getting-started/first-login.html | 50 +++ .../getting-started/quick-start.html | 88 +++++ .../getting-started/what-is-backupchecks.html | 160 +++++++++ .../src/templates/layout/base.html | 10 + docs/changelog-claude.md | 30 ++ 10 files changed, 923 insertions(+) create mode 100644 containers/backupchecks/src/backend/app/main/routes_documentation.py create mode 100644 containers/backupchecks/src/static/css/documentation.css create mode 100644 containers/backupchecks/src/templates/documentation/_navigation.html create mode 100644 containers/backupchecks/src/templates/documentation/base.html create mode 100644 containers/backupchecks/src/templates/documentation/getting-started/first-login.html create mode 100644 containers/backupchecks/src/templates/documentation/getting-started/quick-start.html create mode 100644 containers/backupchecks/src/templates/documentation/getting-started/what-is-backupchecks.html diff --git a/containers/backupchecks/src/backend/app/__init__.py b/containers/backupchecks/src/backend/app/__init__.py index 0893c5a..e46dd29 100644 --- a/containers/backupchecks/src/backend/app/__init__.py +++ b/containers/backupchecks/src/backend/app/__init__.py @@ -10,6 +10,7 @@ from .models import User # noqa: F401 from .auth import login_manager from .auth.routes import auth_bp from .main.routes import main_bp +from .main.routes_documentation import doc_bp from .migrations import run_migrations from .auto_importer_service import start_auto_importer @@ -62,6 +63,7 @@ def create_app(): app.register_blueprint(auth_bp) app.register_blueprint(main_bp) + app.register_blueprint(doc_bp) @app.template_filter("local_datetime") def format_local_datetime(utc_dt, format="%Y-%m-%d %H:%M:%S"): diff --git a/containers/backupchecks/src/backend/app/main/routes_documentation.py b/containers/backupchecks/src/backend/app/main/routes_documentation.py new file mode 100644 index 0000000..66c2f16 --- /dev/null +++ b/containers/backupchecks/src/backend/app/main/routes_documentation.py @@ -0,0 +1,185 @@ +"""Documentation routes. + +Provides access to static HTML documentation pages for logged-in users. +All pages are accessible to any authenticated user (admin, operator, reporter, viewer). +""" + +from flask import Blueprint, render_template, abort, redirect, url_for +from flask_login import login_required + + +doc_bp = Blueprint('documentation', __name__, url_prefix='/documentation') + + +# Documentation structure (for navigation and routing) +DOCUMENTATION_STRUCTURE = { + 'getting-started': { + 'title': 'Getting Started', + 'icon': '🏠', + 'pages': [ + {'slug': 'what-is-backupchecks', 'title': 'What is BackupChecks?'}, + {'slug': 'first-login', 'title': 'First Login & Dashboard'}, + {'slug': 'quick-start', 'title': 'Quick Start Checklist'}, + ] + }, + 'users': { + 'title': 'User Management', + 'icon': '👥', + 'pages': [ + {'slug': 'users-and-roles', 'title': 'Users & Roles'}, + {'slug': 'login-authentication', 'title': 'Login & Authentication'}, + {'slug': 'profile-settings', 'title': 'Profile Settings'}, + ] + }, + 'customers-jobs': { + 'title': 'Customers & Jobs', + 'icon': '💼', + 'pages': [ + {'slug': 'managing-customers', 'title': 'Managing Customers'}, + {'slug': 'configuring-jobs', 'title': 'Configuring Jobs'}, + {'slug': 'approved-jobs', 'title': 'Approved Jobs'}, + {'slug': 'job-schedules', 'title': 'Job Schedules'}, + ] + }, + 'mail-import': { + 'title': 'Mail & Import', + 'icon': '📧', + 'pages': [ + {'slug': 'setup', 'title': 'Mail Import Setup'}, + {'slug': 'inbox-management', 'title': 'Inbox Management'}, + {'slug': 'mail-parsing', 'title': 'Mail Parsing'}, + {'slug': 'auto-import', 'title': 'Auto-Import Configuration'}, + ] + }, + 'backup-review': { + 'title': 'Backup Review', + 'icon': '✅', + 'pages': [ + {'slug': 'approving-backups', 'title': 'Approving Backups'}, + {'slug': 'daily-jobs', 'title': 'Daily Jobs View'}, + {'slug': 'run-checks-modal', 'title': 'Run Checks Modal'}, + {'slug': 'overrides', 'title': 'Overrides & Exceptions'}, + {'slug': 'remarks-tickets', 'title': 'Remarks & Tickets'}, + ] + }, + 'reports': { + 'title': 'Reports', + 'icon': '📊', + 'pages': [ + {'slug': 'creating-reports', 'title': 'Creating Reports'}, + {'slug': 'relative-periods', 'title': 'Relative Periods'}, + {'slug': 'scheduling', 'title': 'Report Scheduling'}, + {'slug': 'exporting-data', 'title': 'Exporting Data'}, + ] + }, + 'autotask': { + 'title': 'Autotask Integration', + 'icon': '🎫', + 'pages': [ + {'slug': 'setup-configuration', 'title': 'Setup & Configuration'}, + {'slug': 'company-mapping', 'title': 'Company Mapping'}, + {'slug': 'creating-tickets', 'title': 'Creating Tickets'}, + {'slug': 'ticket-management', 'title': 'Ticket Management'}, + ] + }, + 'settings': { + 'title': 'Settings', + 'icon': '⚙️', + 'pages': [ + {'slug': 'general', 'title': 'General Settings'}, + {'slug': 'mail-configuration', 'title': 'Mail Configuration'}, + {'slug': 'autotask-integration', 'title': 'Autotask Integration'}, + {'slug': 'reporting-settings', 'title': 'Reporting Settings'}, + {'slug': 'user-management', 'title': 'User Management'}, + {'slug': 'maintenance', 'title': 'Maintenance'}, + ] + }, + 'troubleshooting': { + 'title': 'Troubleshooting', + 'icon': '❓', + 'pages': [ + {'slug': 'common-issues', 'title': 'Common Issues'}, + {'slug': 'faq', 'title': 'FAQ'}, + {'slug': 'support-contact', 'title': 'Support Contact'}, + ] + }, +} + + +def get_navigation_context(current_section=None, current_page=None): + """Build navigation context with active states.""" + return { + 'structure': DOCUMENTATION_STRUCTURE, + 'current_section': current_section, + 'current_page': current_page + } + + +def get_prev_next(section, page_slug): + """Get previous and next page for navigation.""" + # Flatten all pages into single list + all_pages = [] + for sect_key, sect_data in DOCUMENTATION_STRUCTURE.items(): + for page in sect_data['pages']: + all_pages.append({ + 'section': sect_key, + 'slug': page['slug'], + 'title': page['title'] + }) + + # Find current page index + current_idx = None + for i, p in enumerate(all_pages): + if p['section'] == section and p['slug'] == page_slug: + current_idx = i + break + + if current_idx is None: + return None, None + + prev_page = all_pages[current_idx - 1] if current_idx > 0 else None + next_page = all_pages[current_idx + 1] if current_idx < len(all_pages) - 1 else None + + return prev_page, next_page + + +@doc_bp.route('/') +@doc_bp.route('/index') +@login_required +def index(): + """Documentation home - redirect to first page.""" + return redirect(url_for('documentation.page', section='getting-started', page='what-is-backupchecks')) + + +@doc_bp.route('/
/') +@login_required +def page(section, page): + """Render a documentation page.""" + # Validate section and page exist + if section not in DOCUMENTATION_STRUCTURE: + abort(404) + + section_data = DOCUMENTATION_STRUCTURE[section] + page_exists = any(p['slug'] == page for p in section_data['pages']) + if not page_exists: + abort(404) + + # Get page title + page_title = next(p['title'] for p in section_data['pages'] if p['slug'] == page) + + # Get navigation context + nav_context = get_navigation_context(section, page) + + # Get prev/next pages + prev_page, next_page = get_prev_next(section, page) + + # Render template + template_path = f'documentation/{section}/{page}.html' + return render_template( + template_path, + page_title=page_title, + section_title=section_data['title'], + navigation=nav_context, + prev_page=prev_page, + next_page=next_page + ) diff --git a/containers/backupchecks/src/static/css/documentation.css b/containers/backupchecks/src/static/css/documentation.css new file mode 100644 index 0000000..1b7eee8 --- /dev/null +++ b/containers/backupchecks/src/static/css/documentation.css @@ -0,0 +1,315 @@ +/* Documentation Container */ +.documentation-container { + margin-top: 20px; +} + +/* Sidebar */ +.doc-sidebar-wrapper { + border-right: 1px solid #dee2e6; + min-height: calc(100vh - 80px); +} + +.doc-nav { + position: sticky; + top: 20px; + padding: 20px; + max-height: calc(100vh - 100px); + overflow-y: auto; +} + +.doc-nav-header h5 { + margin-bottom: 20px; + padding-bottom: 10px; + border-bottom: 2px solid #007bff; +} + +.doc-nav-section { + margin-bottom: 20px; +} + +.doc-nav-section-title { + font-weight: 600; + margin-bottom: 10px; + padding: 8px 12px; + background-color: #f8f9fa; + border-radius: 4px; + cursor: pointer; +} + +.doc-nav-section.active .doc-nav-section-title { + background-color: #e7f1ff; + color: #0056b3; +} + +.doc-nav-icon { + margin-right: 8px; +} + +.doc-nav-pages { + list-style: none; + padding-left: 30px; + margin: 0; +} + +.doc-nav-pages li { + margin: 5px 0; +} + +.doc-nav-pages li a { + display: block; + padding: 5px 10px; + color: #495057; + text-decoration: none; + border-radius: 4px; + transition: all 0.2s; +} + +.doc-nav-pages li a:hover { + background-color: #f8f9fa; + color: #007bff; +} + +.doc-nav-pages li.active a { + background-color: #007bff; + color: white; + font-weight: 500; +} + +/* Content Area */ +.doc-content-wrapper { + padding: 20px 40px; +} + +.doc-content { + max-width: 900px; + margin: 0 auto; +} + +.doc-content h1 { + margin-bottom: 30px; + padding-bottom: 15px; + border-bottom: 3px solid #007bff; +} + +.doc-content h2 { + margin-top: 40px; + margin-bottom: 20px; + color: #0056b3; +} + +.doc-content h3 { + margin-top: 30px; + margin-bottom: 15px; +} + +.doc-content img { + max-width: 100%; + height: auto; + border: 1px solid #dee2e6; + border-radius: 4px; + margin: 20px 0; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +.doc-content figcaption { + text-align: center; + font-style: italic; + color: #6c757d; + margin-top: -15px; + margin-bottom: 20px; +} + +.doc-content .lead { + font-size: 1.15rem; + color: #6c757d; + margin-bottom: 2rem; +} + +/* Code Blocks */ +.doc-content pre { + background-color: #f8f9fa; + border: 1px solid #dee2e6; + border-radius: 4px; + padding: 15px; + overflow-x: auto; +} + +.doc-content code { + background-color: #f8f9fa; + padding: 2px 6px; + border-radius: 3px; + font-family: 'Courier New', monospace; + font-size: 0.9em; +} + +.doc-content pre code { + background-color: transparent; + padding: 0; +} + +/* Tables */ +.doc-content table { + width: 100%; + margin: 20px 0; + border-collapse: collapse; +} + +.doc-content table th, +.doc-content table td { + padding: 12px; + border: 1px solid #dee2e6; + text-align: left; +} + +.doc-content table th { + background-color: #f8f9fa; + font-weight: 600; +} + +.doc-content table tr:nth-child(even) { + background-color: #f8f9fa; +} + +/* Callout Boxes */ +.doc-callout { + padding: 15px 20px; + margin: 20px 0; + border-left: 4px solid; + border-radius: 4px; +} + +.doc-callout-info { + background-color: #e7f3ff; + border-left-color: #007bff; +} + +.doc-callout-warning { + background-color: #fff3cd; + border-left-color: #ffc107; +} + +.doc-callout-tip { + background-color: #d4edda; + border-left-color: #28a745; +} + +.doc-callout-danger { + background-color: #f8d7da; + border-left-color: #dc3545; +} + +.doc-callout strong { + display: block; + margin-bottom: 5px; +} + +/* Pagination */ +.doc-pagination { + margin-top: 40px; +} + +/* Dark mode support */ +[data-bs-theme="dark"] .doc-sidebar-wrapper { + border-right-color: #495057; +} + +[data-bs-theme="dark"] .doc-nav-section-title { + background-color: #343a40; +} + +[data-bs-theme="dark"] .doc-nav-section.active .doc-nav-section-title { + background-color: #1a4d8f; + color: #a8c9f5; +} + +[data-bs-theme="dark"] .doc-nav-pages li a { + color: #adb5bd; +} + +[data-bs-theme="dark"] .doc-nav-pages li a:hover { + background-color: #343a40; + color: #a8c9f5; +} + +[data-bs-theme="dark"] .doc-nav-pages li.active a { + background-color: #0d6efd; + color: white; +} + +[data-bs-theme="dark"] .doc-content h1 { + border-bottom-color: #0d6efd; +} + +[data-bs-theme="dark"] .doc-content h2 { + color: #a8c9f5; +} + +[data-bs-theme="dark"] .doc-content img { + border-color: #495057; +} + +[data-bs-theme="dark"] .doc-content pre { + background-color: #212529; + border-color: #495057; +} + +[data-bs-theme="dark"] .doc-content code { + background-color: #212529; +} + +[data-bs-theme="dark"] .doc-content table th, +[data-bs-theme="dark"] .doc-content table td { + border-color: #495057; +} + +[data-bs-theme="dark"] .doc-content table th { + background-color: #343a40; +} + +[data-bs-theme="dark"] .doc-content table tr:nth-child(even) { + background-color: #2b3035; +} + +[data-bs-theme="dark"] .doc-callout-info { + background-color: #1a3a52; + border-left-color: #0d6efd; +} + +[data-bs-theme="dark"] .doc-callout-warning { + background-color: #4a3f1f; + border-left-color: #ffc107; +} + +[data-bs-theme="dark"] .doc-callout-tip { + background-color: #1f3d2a; + border-left-color: #28a745; +} + +[data-bs-theme="dark"] .doc-callout-danger { + background-color: #4a2329; + border-left-color: #dc3545; +} + +/* Responsive */ +@media (max-width: 991px) { + .doc-sidebar-wrapper { + border-right: none; + border-bottom: 1px solid #dee2e6; + min-height: auto; + } + + .doc-nav { + position: static; + max-height: none; + } + + .doc-content-wrapper { + padding: 20px 15px; + } +} + +@media (max-width: 991px) { + [data-bs-theme="dark"] .doc-sidebar-wrapper { + border-bottom-color: #495057; + } +} diff --git a/containers/backupchecks/src/templates/documentation/_navigation.html b/containers/backupchecks/src/templates/documentation/_navigation.html new file mode 100644 index 0000000..594604f --- /dev/null +++ b/containers/backupchecks/src/templates/documentation/_navigation.html @@ -0,0 +1,24 @@ + diff --git a/containers/backupchecks/src/templates/documentation/base.html b/containers/backupchecks/src/templates/documentation/base.html new file mode 100644 index 0000000..d26b043 --- /dev/null +++ b/containers/backupchecks/src/templates/documentation/base.html @@ -0,0 +1,59 @@ +{% extends "layout/base.html" %} + +{% block head %} + +{% endblock %} + +{% block main_class %}container-fluid content-container{% endblock %} + +{% block content %} +
+
+ +
+ {% include 'documentation/_navigation.html' %} +
+ + +
+
+ + + + + {% block doc_content %}{% endblock %} + + +
+
+
+ {% if prev_page %} + + ← {{ prev_page.title }} + + {% endif %} +
+
+ {% if next_page %} + + {{ next_page.title }} → + + {% endif %} +
+
+
+
+
+
+
+{% endblock %} diff --git a/containers/backupchecks/src/templates/documentation/getting-started/first-login.html b/containers/backupchecks/src/templates/documentation/getting-started/first-login.html new file mode 100644 index 0000000..71cf335 --- /dev/null +++ b/containers/backupchecks/src/templates/documentation/getting-started/first-login.html @@ -0,0 +1,50 @@ +{% extends "documentation/base.html" %} + +{% block doc_content %} +

First Login & Dashboard

+ +

+ Learn how to log in to BackupChecks and navigate the dashboard interface. +

+ +
+ 📝 Coming Soon: + This page is under construction. Full content will be added in a future update. +
+ +

Logging In

+ +

To access BackupChecks:

+ +
    +
  1. Navigate to the BackupChecks URL in your web browser
  2. +
  3. Enter your username and password
  4. +
  5. Click the "Login" button
  6. +
+ +

Dashboard Overview

+ +

The dashboard provides a quick overview of your backup status:

+ +
    +
  • Today's Jobs: Summary of backup jobs expected today
  • +
  • Recent Activity: Latest backup reports and reviews
  • +
  • Statistics: Success rates and trends
  • +
  • Quick Actions: Common tasks and shortcuts
  • +
+ +

Navigation

+ +

Use the navigation bar at the top to access different sections:

+ +
    +
  • Inbox: View incoming backup report emails
  • +
  • Customers: Manage customer accounts
  • +
  • Jobs: Configure backup jobs
  • +
  • Daily Jobs: Review today's backup status
  • +
  • Run Checks: Approve or reject backup runs
  • +
  • Reports: Generate and view reports
  • +
  • Settings: Configure system settings (admin only)
  • +
+ +{% endblock %} diff --git a/containers/backupchecks/src/templates/documentation/getting-started/quick-start.html b/containers/backupchecks/src/templates/documentation/getting-started/quick-start.html new file mode 100644 index 0000000..d4e4c1c --- /dev/null +++ b/containers/backupchecks/src/templates/documentation/getting-started/quick-start.html @@ -0,0 +1,88 @@ +{% extends "documentation/base.html" %} + +{% block doc_content %} +

Quick Start Checklist

+ +

+ Follow this checklist to set up your first customer and backup job in BackupChecks. +

+ +
+ 📝 Coming Soon: + This page is under construction. Full content will be added in a future update. +
+ +

Prerequisites

+ +

Before you begin, ensure you have:

+ +
    +
  • Admin or Operator access to BackupChecks
  • +
  • Email credentials for the backup report mailbox
  • +
  • Information about your first customer and their backup software
  • +
+ +

Step 1: Configure Mail Import

+ +
    +
  1. Navigate to SettingsMail
  2. +
  3. Enter your IMAP server details (host, port, username, password)
  4. +
  5. Test the connection
  6. +
  7. Enable automatic mail import
  8. +
+ +

Step 2: Add a Customer

+ +
    +
  1. Go to Customers in the navigation menu
  2. +
  3. Click New Customer
  4. +
  5. Fill in the customer details (name, contact info)
  6. +
  7. Save the customer
  8. +
+ +

Step 3: Configure a Job

+ +
    +
  1. From the customer detail page, click New Job
  2. +
  3. Select the backup software type (Veeam, Synology, etc.)
  4. +
  5. Configure job matching rules (sender email, subject keywords)
  6. +
  7. Set the expected schedule
  8. +
  9. Save the job configuration
  10. +
+ +

Step 4: Import First Backup Report

+ +
    +
  1. Go to Inbox
  2. +
  3. Click Import Now to fetch recent emails
  4. +
  5. Find your backup report email in the inbox
  6. +
  7. Click on the email to view details
  8. +
  9. Click Link to Job and select the job you created
  10. +
+ +

Step 5: Review and Approve

+ +
    +
  1. Navigate to Daily Jobs
  2. +
  3. You should see your job listed for today
  4. +
  5. Click Run Checks to review pending backups
  6. +
  7. Approve or reject the backup run
  8. +
+ +
+ 💡 Tip: + After completing these steps, your job will automatically process future backup reports from the same sender. +
+ +

Next Steps

+ +

Now that you have your first job configured, you can:

+ + + +{% endblock %} diff --git a/containers/backupchecks/src/templates/documentation/getting-started/what-is-backupchecks.html b/containers/backupchecks/src/templates/documentation/getting-started/what-is-backupchecks.html new file mode 100644 index 0000000..710b3f7 --- /dev/null +++ b/containers/backupchecks/src/templates/documentation/getting-started/what-is-backupchecks.html @@ -0,0 +1,160 @@ +{% extends "documentation/base.html" %} + +{% block doc_content %} +

What is BackupChecks?

+ +

+ BackupChecks is a backup monitoring and validation system designed to help IT teams + verify that backups are running successfully across their customer infrastructure. +

+ +

Key Features

+ +
    +
  • Automated Mail Parsing: Import backup reports via email and automatically parse results
  • +
  • Approval Workflow: Review and approve backup jobs on a daily basis
  • +
  • Customer Management: Organize backups by customer and manage multiple backup jobs per customer
  • +
  • Autotask Integration: Create tickets in Autotask PSA for failed backups
  • +
  • Reporting: Generate backup status reports with flexible scheduling
  • +
  • Role-Based Access: Admin, Operator, Reporter, and Viewer roles
  • +
+ +
+ 💡 Note: + Screenshots will be added in a future update to illustrate the dashboard and key features. +
+ +

How It Works

+ +

BackupChecks follows a simple workflow:

+ +
    +
  1. Import: Backup reports are sent via email to a configured mailbox
  2. +
  3. Parse: The system parses email content to extract backup status
  4. +
  5. Match: Reports are matched to configured jobs based on sender, subject, and content
  6. +
  7. Review: Operators review backup status and approve successful jobs
  8. +
  9. Alert: Failed backups can trigger Autotask tickets or manual follow-up
  10. +
  11. Report: Generate periodic reports to track backup health over time
  12. +
+ +
+ 💡 Tip: + Start with the Quick Start Checklist + to get your first customer and job configured. +
+ +

Who Should Use BackupChecks?

+ +

BackupChecks is designed for:

+ +
    +
  • Managed Service Providers (MSPs): Monitor backups across multiple customer environments
  • +
  • IT Departments: Track backup compliance for internal infrastructure
  • +
  • Backup Administrators: Centralize backup verification from multiple backup solutions
  • +
+ +

Supported Backup Software

+ +

BackupChecks supports parsing backup reports from:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SoftwareSupport LevelNotes
Veeam Backup & ReplicationFullEmail notifications with detailed job status
Acronis Cyber ProtectFullBackup completion reports
Synology Active BackupFullTask result notifications
QNAP Hybrid Backup SyncFullJob completion emails
Custom/OtherConfigurableManual job configuration for non-standard formats
+ +
+ ⚠️ Important: + BackupChecks monitors backup reports, not the backup data itself. Ensure your backup software is configured to send email notifications on job completion. +
+ +

Architecture Overview

+ +

BackupChecks is a web-based application with the following components:

+ +
    +
  • Backend: Flask (Python) application with PostgreSQL database
  • +
  • Frontend: Bootstrap 5 for responsive UI
  • +
  • Mail Import: IMAP integration for automated email retrieval
  • +
  • Autotask API: Optional integration for ticket creation
  • +
  • Reporting: Built-in report generation with scheduling
  • +
+ +

User Roles

+ +

BackupChecks supports four user roles with different permissions:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RolePermissions
AdminFull access to all features, settings, and configuration
OperatorCan review and approve backups, manage customers and jobs, create tickets
ReporterCan view and generate reports, no access to operational features
ViewerRead-only access to customers, jobs, and reports
+ +
+ 💡 Note: + Users can be assigned multiple roles and can switch between them using the role selector in the navigation bar. +
+ +

Next Steps

+ +

Ready to get started? Continue to:

+ + + +{% endblock %} diff --git a/containers/backupchecks/src/templates/layout/base.html b/containers/backupchecks/src/templates/layout/base.html index 27f4927..346069b 100644 --- a/containers/backupchecks/src/templates/layout/base.html +++ b/containers/backupchecks/src/templates/layout/base.html @@ -80,6 +80,11 @@ + @@ -139,6 +144,11 @@ Parsers {% endif %} + diff --git a/docs/changelog-claude.md b/docs/changelog-claude.md index bca0d1b..5bfd12a 100644 --- a/docs/changelog-claude.md +++ b/docs/changelog-claude.md @@ -2,6 +2,36 @@ This file documents all changes made to this project via Claude Code. +## [2026-02-08] + +### Added +- Added comprehensive documentation system for user onboarding and reference: + - **Documentation Blueprint**: New `/documentation` route with dedicated blueprint (doc_bp) + - **Navigation Structure**: Hierarchical documentation with 9 sections and 33 pages covering all features + - Getting Started (3 pages): What is BackupChecks, First Login, Quick Start + - User Management (3 pages): Users & Roles, Authentication, Profile Settings + - Customers & Jobs (4 pages): Managing Customers, Configuring Jobs, Approved Jobs, Job Schedules + - Mail & Import (4 pages): Setup, Inbox Management, Mail Parsing, Auto-Import + - Backup Review (5 pages): Approving Backups, Daily Jobs, Run Checks Modal, Overrides, Remarks & Tickets + - Reports (4 pages): Creating Reports, Relative Periods, Scheduling, Exporting Data + - Autotask Integration (4 pages): Setup, Company Mapping, Creating Tickets, Ticket Management + - Settings (6 pages): General, Mail, Autotask, Reporting, User Management, Maintenance + - Troubleshooting (3 pages): Common Issues, FAQ, Support Contact + - **UI Components**: + - Sidebar navigation with collapsible sections and active page highlighting + - Breadcrumb navigation for current location context + - Previous/Next pagination buttons for sequential reading + - Documentation menu item in main navbar (📖 icon) visible to all authenticated users + - **Styling**: + - Custom CSS with support for dark mode + - Callout boxes (info, warning, tip, danger) for highlighting important content + - Code blocks, tables, and image support + - Responsive design for mobile and desktop + - **Access Control**: Login required (@login_required) - accessible to all user roles + - **Current Status**: Core infrastructure complete, first three getting-started pages created + - **Placeholder Pages**: First-login and quick-start pages created with basic content structure + - Full content for all pages will be added incrementally in future updates + ## [2026-02-07] ### Changed