feat: onglet Réparation dans paramètres — gestion modules fantômes

- GET /api/repair/modules : liste les modules non-core en DB
- DELETE /api/repair/modules/{id} : supprime un module de la DB
- settings.html : onglet Réparation avec liste + bouton Supprimer
- app.js : loadRepair() + resetModule() dans settingsPage

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
enzo 2026-03-22 18:27:37 +01:00
parent ab834600ba
commit 3bc55a4c6f
4 changed files with 132 additions and 1 deletions

View file

@ -71,6 +71,9 @@
<button class="tab-btn" :class="{ active: tab === 'shortcuts' }" @click="tab = 'shortcuts'">
<i class="lnid-link-1"></i> Raccourcis
</button>
<button class="tab-btn" :class="{ active: tab === 'repair' }" @click="tab = 'repair'; loadRepair()">
<i class="lnid-wrench-1"></i> Réparation
</button>
</div>
<!-- Général -->
@ -175,8 +178,45 @@
</div>
</div>
<!-- Réparation -->
<div class="tab-panel" x-show="tab === 'repair'">
<p class="form-hint" style="margin-bottom:1rem">
Les <strong>modules fantômes</strong> sont des modules présents en base de données
mais dont le code n'est pas chargé. Les supprimer permet de les réinstaller proprement.
</p>
<div class="loading-state" x-show="repairLoading">
<div class="spinner-lg"></div><span>Chargement…</span>
</div>
<div x-show="!repairLoading">
<p class="empty-state" x-show="repairModules.length === 0">Aucun module non-core en base de données.</p>
<div class="modules-grid" x-show="repairModules.length > 0">
<template x-for="mod in repairModules" :key="mod.id">
<div class="neu-card module-card">
<div class="module-header">
<div class="module-icon"><i class="lnid-puzzle"></i></div>
<div class="module-info">
<span class="module-name" x-text="mod.name || mod.id"></span>
<span class="module-version" x-text="mod.is_enabled ? 'Activé' : 'Désactivé'"></span>
<span class="module-desc" x-text="mod.installed_at ? 'Installé le ' + mod.installed_at.slice(0,10) : 'Date inconnue'"></span>
</div>
<div class="module-toggle">
<button class="neu-btn neu-btn--sm neu-btn--danger"
@click="resetModule(mod)"
:disabled="resetting[mod.id]">
<span x-show="resetting[mod.id]" class="spinner-sm"></span>
<i x-show="!resetting[mod.id]" class="lnid-trash-1"></i>
Supprimer de la DB
</button>
</div>
</div>
</div>
</template>
</div>
</div>
</div>
<!-- Save actions -->
<div class="save-bar" x-show="tab !== 'shortcuts'">
<div class="save-bar" x-show="tab !== 'shortcuts' && tab !== 'repair'">
<div class="save-feedback">
<span class="save-success" x-show="saved">
<i class="lnid-check-circle-1"></i> Paramètres sauvegardés