feat: sync DB prefs, update history tab, configurable dashboard shortcuts

- auth store fetchMe(): sync theme/sidebar_position/lang from DB to localStorage+stores on login/refresh
- profilePage setters: PATCH /api/auth/preferences on every preference change
- updatesPage: add history tab (GET /api/updates/history) with job list, click to view output
- dashboardPage: load shortcuts from settings API, fall back to defaults if none configured
- settingsPage: new Raccourcis tab to add/remove/configure dashboard shortcuts (saved as JSON)
- settings.go: expose dashboard_shortcuts in publicSettings for GET/PUT access
- pages.css: add .history-table, .shortcut-row styles

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
enzo 2026-03-22 00:35:24 +01:00
parent 780e5ec81d
commit 21e1e0ed1e
6 changed files with 230 additions and 10 deletions

View file

@ -68,6 +68,9 @@
<button class="tab-btn" :class="{ active: tab === 'general' }" @click="tab = 'general'">Général</button>
<button class="tab-btn" :class="{ active: tab === 'ssh' }" @click="tab = 'ssh'">SSH</button>
<button class="tab-btn" :class="{ active: tab === 'proxmox' }" @click="tab = 'proxmox'">Proxmox API</button>
<button class="tab-btn" :class="{ active: tab === 'shortcuts' }" @click="tab = 'shortcuts'">
<i class="lnid-link-1"></i> Raccourcis
</button>
</div>
<!-- Général -->
@ -128,8 +131,52 @@
</div>
</div>
<!-- Raccourcis dashboard -->
<div class="tab-panel" x-show="tab === 'shortcuts'">
<p class="form-hint" style="margin-bottom:1rem">
Ces raccourcis apparaissent dans le widget "Raccourcis" du dashboard.
Laisser vide pour utiliser les raccourcis par défaut.
</p>
<div class="shortcuts-editor">
<template x-for="(s, idx) in shortcuts" :key="idx">
<div class="shortcut-row">
<select class="neu-input shortcut-icon-sel" x-model="s.icon">
<option value="lnid-link-1">Lien</option>
<option value="lnid-server-1">Serveur</option>
<option value="lnid-terminal">Terminal</option>
<option value="lnid-arrow-upward">Mises à jour</option>
<option value="lnid-gear-1">Paramètres</option>
<option value="lnid-dashboard-square-1">Dashboard</option>
<option value="lnid-puzzle">Module</option>
<option value="lnid-folder-1">Fichiers</option>
<option value="lnid-check-circle-1">Succès</option>
</select>
<input class="neu-input shortcut-label" type="text" x-model="s.label" placeholder="Label" />
<input class="neu-input shortcut-href" type="text" x-model="s.href" placeholder="/page.html" />
<button class="neu-btn neu-btn--sm neu-btn--danger neu-btn--icon-sm"
@click="removeShortcut(idx)" title="Supprimer">
<i class="lnid-cross"></i>
</button>
</div>
</template>
<button class="neu-btn" @click="addShortcut()">
<i class="lnid-plus"></i> Ajouter un raccourci
</button>
</div>
<div class="save-bar" style="margin-top:1rem">
<div class="save-feedback">
<span class="save-success" x-show="saved"><i class="lnid-check-circle-1"></i> Raccourcis sauvegardés</span>
<span class="save-error" x-show="error" x-text="error"></span>
</div>
<button class="neu-btn neu-btn--primary" @click="saveShortcuts()" :disabled="saving">
<span x-show="!saving"><i class="lnid-check-circle-1"></i> Sauvegarder</span>
<span x-show="saving"><span class="spinner-sm"></span></span>
</button>
</div>
</div>
<!-- Save actions -->
<div class="save-bar">
<div class="save-bar" x-show="tab !== 'shortcuts'">
<div class="save-feedback">
<span class="save-success" x-show="saved">
<i class="lnid-check-circle-1"></i> Paramètres sauvegardés