feat: Implement modular plugin architecture

- Convert invcount to self-contained module
- Add Module Manager for install/uninstall
- Create module_registry database table
- Support hot-reloading of modules
- Move data imports into invcount module
- Update all templates and routes to new structure

Version bumped to 0.16.0
This commit is contained in:
Javier
2026-02-07 01:47:49 -06:00
parent 2a649fdbcc
commit 406219547d
35 changed files with 3887 additions and 492 deletions

View File

@@ -4,28 +4,45 @@
{% block content %}
<div class="dashboard-container">
<div class="dashboard-header" style="margin-top: var(--space-lg);">
<div class="dashboard-header" style="margin-top: var(--space-lg);">
<div class="header-left" style="display: flex; align-items: center; gap: var(--space-md);">
<a href="{{ url_for('home') }}" class="btn btn-secondary btn-sm">
<i class="fa-solid fa-arrow-left"></i> Back to Home
</a>
<h1 class="page-title" style="margin-bottom: 0;">Admin Dashboard</h1>
</div>
<div class="header-right">
<a href="{{ url_for('module_manager_ui') }}" class="btn btn-primary btn-sm">
<i class="fa-solid fa-puzzle-piece"></i> Module Manager
</a>
</div>
</div>
<div class="modules-section">
<h2 class="section-title">Modules</h2>
{% if modules %}
<div class="modules-grid">
<a href="{{ url_for('counting.admin_dashboard') }}" class="module-card">
<div class="module-icon">📊</div> <h3 class="module-name">Counts</h3>
<p class="module-desc">Cycle counts & physical inventory</p>
</a>
<a href="{{ url_for('cons_sheets.admin_processes') }}" class="module-card module-card-link">
<div class="module-icon">📝</div> <h3 class="module-name">Consumption Sheets</h3>
<p class="module-desc">Production consumption tracking</p>
{% for module in modules %}
<a href="/{{ module.module_key }}/admin" class="module-card module-card-link">
<div class="module-icon">
{% if module.icon %}
<i class="{{ module.icon }}"></i>
{% else %}
📦
{% endif %}
</div>
<h3 class="module-name">{{ module.module_name }}</h3>
<p class="module-desc">{{ module.description }}</p>
</a>
{% endfor %}
</div>
{% else %}
<div class="alert alert-info">
<i class="fa-solid fa-info-circle"></i> No modules installed yet.
<a href="{{ url_for('module_manager_ui') }}">Install modules</a> to get started.
</div>
{% endif %}
</div>
</div>
{% endblock %}