{% extends "base.html" %} {% from "components/ui.html" import page_header, breadcrumb_nav, button, filter_badge %} {% block extra_css %} {% endblock %} {% block title %}{{ _('Module Management') }} - {{ _('Admin') }}{% endblock %} {% block content %} {% set breadcrumbs = [ {'text': 'Admin', 'url': url_for('admin.admin_dashboard')}, {'text': 'System Settings'}, {'text': 'Module Management'} ] %} {{ page_header( icon_class='fas fa-puzzle-piece', title_text='Module Management', subtitle_text='Enable or disable modules system-wide. Disabled modules will not appear in the navigation for non-admin users.', breadcrumbs=breadcrumbs, actions_html=None ) }} {% if blueprint_load_status is defined and blueprint_load_status %} {% set _optional_ok = (blueprint_load_status|selectattr('kind', 'equalto', 'optional')|selectattr('ok')|list)|length %} {% set _optional_total = (blueprint_load_status|selectattr('kind', 'equalto', 'optional')|list)|length %} {% set _special_failed = (blueprint_load_status|selectattr('kind', 'equalto', 'special')|rejectattr('ok')|list)|length %}

{{ _('Feature Module Load Status') }}

{{ _('This reflects which optional feature modules successfully loaded when the server started.') }}

{{ _('Optional loaded:') }} {{ _optional_ok }}/{{ _optional_total }} {% if _special_failed > 0 %} {{ _('Attention needed') }} {% endif %}
{% for s in blueprint_load_status %} {% endfor %}
{{ _('Module') }} {{ _('Blueprint') }} {{ _('Status') }} {{ _('Details') }}
{{ s.module }} {{ s.attr }} {% if s.ok %} {{ _('Loaded') }} {% else %} {{ _('Failed') }} {% endif %} {% if not s.ok and s.error %} {{ s.error }} {% else %} {{ _('—') }} {% endif %}
{% endif %}
{% if modules_by_category is defined and modules_by_category %}

{{ _('Client Lock (optional)') }}

{{ _('If set, all client selectors across the app will auto-select this client and prevent changes.') }}

{{ _('Module Visibility') }}

{{ _('Disable modules to hide them from all users. Disabled modules will not appear in the sidebar. Core modules (Dashboard, Projects, Timer, etc.) are always enabled and cannot be disabled.') }}

{% set _d = (settings.disabled_module_ids or []) %} {% set _total_modules = 0 %} {% set _enabled_count = 0 %} {% for category, modules in modules_by_category.items() %} {% set _total_modules = _total_modules + modules|length %} {% for module in modules %} {% if module.id not in _d %}{% set _enabled_count = _enabled_count + 1 %}{% endif %} {% endfor %} {% endfor %}
{{ _('Total Modules:') }} {{ _total_modules }}
{{ _('Enabled:') }} {{ _enabled_count }}
{{ _('Disabled:') }} {{ _total_modules - _enabled_count }}
{% for category, modules in modules_by_category.items() %}

{% if category == ModuleCategory.TIME_TRACKING %}{{ _('Time Tracking') }} {% elif category == ModuleCategory.PROJECT_MANAGEMENT %}{{ _('Project Management') }} {% elif category == ModuleCategory.CRM %}{{ _('CRM') }} {% elif category == ModuleCategory.FINANCE %}{{ _('Finance & Expenses') }} {% elif category == ModuleCategory.INVENTORY %}{{ _('Inventory') }} {% elif category == ModuleCategory.ANALYTICS %}{{ _('Analytics') }} {% elif category == ModuleCategory.TOOLS %}{{ _('Tools & Data') }} {% elif category == ModuleCategory.ADVANCED %}{{ _('Advanced') }} {% else %}{{ category.value|title }}{% endif %}

({{ modules|length }})
{% endfor %}

{{ _('Disabling "Reports" hides the whole Reports submenu including Report Builder and Scheduled Reports.') }}

{% else %}

{{ _('No modules available.') }}

{% endif %}

{{ _('Note') }}:

  • {{ _('All modules are enabled by default.') }}
  • {{ _('Core modules cannot be disabled as they are required for the application to function.') }}
  • {{ _('Disabling a module affects all users system-wide. Disabled modules will not appear in the navigation sidebar.') }}
{% endblock %}