Files
pmomusic/pmoapp/webapp/src/views/DebugView.vue
Eric Coissac e47c1f1a86 feat: refactor drawers with shared styles and add unified debug hub
- Extract common drawer styles into new `drawers.css`
- Refactor `ServerDrawer` and `RendererDrawer` to use shared `.app-drawer` class
- Update routing: replace `/debug/api-dashboard` with unified `/debug` route pointing to new `DebugView`
- Add debug tools grid view (`DebugView.vue`) with icons and navigation
- Refactor `PlayListManager` styles to use CSS variables for consistency
- Update font sizing: replace global zoom with base `15px` font size in `main.css`
- Improve lazy metadata fallback logic in Rust API
2026-03-25 20:51:10 +01:00

198 lines
4.5 KiB
Vue

<script setup lang="ts">
import { useRouter } from "vue-router";
import {
Music,
ScrollText,
Image,
Database,
ListMusic,
Network,
LayoutDashboard,
Radio,
ArrowLeft,
} from "lucide-vue-next";
const router = useRouter();
const tools = [
{
path: "/debug/covers-cache",
name: "Cache des couvertures",
description: "Visualiser et gérer le cache d'images de couverture",
icon: Image,
},
{
path: "/debug/audio-cache",
name: "Cache audio",
description: "Gérer le cache des fichiers audio",
icon: Database,
},
{
path: "/debug/playlists",
name: "Playlists",
description: "Gérer et inspecter les playlists en cache",
icon: ListMusic,
},
{
path: "/debug/logs",
name: "Logs",
description: "Consulter les logs du serveur en temps réel",
icon: ScrollText,
},
{
path: "/debug/upnp",
name: "Explorateur UPnP",
description: "Parcourir les dispositifs et services UPnP",
icon: Network,
},
{
path: "/debug/api-dashboard",
name: "API Dashboard",
description: "Documentation et test des API disponibles",
icon: LayoutDashboard,
},
{
path: "/debug/generic-player",
name: "Lecteur générique",
description: "Lecteur de test pour les flux audio",
icon: Music,
},
{
path: "/debug/radio-paradise",
name: "Radio Paradise",
description: "Explorateur Radio Paradise",
icon: Radio,
},
];
</script>
<template>
<div class="debug-view">
<header class="debug-header">
<button class="back-btn" @click="router.push('/')" title="Retour">
<ArrowLeft :size="20" />
</button>
<h1 class="debug-title">Outils de debug</h1>
</header>
<div class="debug-grid">
<button
v-for="tool in tools"
:key="tool.path"
class="tool-card"
@click="router.push(tool.path)"
>
<div class="tool-icon">
<component :is="tool.icon" :size="28" />
</div>
<div class="tool-info">
<div class="tool-name">{{ tool.name }}</div>
<div class="tool-desc">{{ tool.description }}</div>
</div>
</button>
</div>
</div>
</template>
<style scoped>
.debug-view {
min-height: 100vh;
padding: var(--spacing-lg);
box-sizing: border-box;
}
.debug-header {
display: flex;
align-items: center;
gap: var(--spacing-md);
margin-bottom: var(--spacing-xl);
}
.back-btn {
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
padding: 0;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 50%;
cursor: pointer;
color: var(--color-text);
transition: background var(--transition-fast) ease;
flex-shrink: 0;
}
.back-btn:hover {
background: rgba(255, 255, 255, 0.2);
}
.debug-title {
font-size: var(--text-2xl);
font-weight: 700;
margin: 0;
color: var(--color-text);
}
.debug-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: var(--spacing-md);
}
.tool-card {
display: flex;
align-items: center;
gap: var(--spacing-md);
padding: var(--spacing-lg);
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: var(--radius-lg);
cursor: pointer;
text-align: left;
color: var(--color-text);
transition: all var(--transition-fast) ease;
font-family: inherit;
}
.tool-card:hover {
background: rgba(255, 255, 255, 0.12);
border-color: rgba(255, 255, 255, 0.2);
transform: translateY(-2px);
}
.tool-card:active {
transform: translateY(0);
}
.tool-icon {
display: flex;
align-items: center;
justify-content: center;
width: 52px;
height: 52px;
flex-shrink: 0;
border-radius: var(--radius-md);
background: rgba(102, 126, 234, 0.15);
color: var(--color-primary);
}
.tool-info {
flex: 1;
min-width: 0;
}
.tool-name {
font-size: var(--text-base);
font-weight: 600;
margin-bottom: 4px;
}
.tool-desc {
font-size: var(--text-sm);
color: var(--color-text-secondary);
line-height: 1.4;
}
</style>