initial commit

This commit is contained in:
2026-03-24 07:17:48 +01:00
commit 371cbce202
147 changed files with 18244 additions and 0 deletions

301
templates/admin.html Normal file
View File

@@ -0,0 +1,301 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PC Monitor - Admin</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/admin.css') }}">
<!-- SortableJS pour le drag & drop -->
<script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/Sortable.min.js"></script>
</head>
<body>
<div class="container">
<header>
<h1>⚙️ Configuration PC Monitor</h1>
<div class="header-actions">
<a href="/dashboard" class="btn btn-secondary">📊 Dashboard</a>
<button id="save-btn" class="btn btn-primary">💾 Sauvegarder</button>
</div>
</header>
<div class="content">
<!-- Navigation des sections -->
<nav class="sections-nav">
<button class="section-tab active" data-section="plugin">🔌 Source</button>
<button class="section-tab" data-section="sensors">📡 Capteurs</button>
<button class="section-tab" data-section="order">↕️ Ordre</button>
<button class="section-tab" data-section="tabs">📑 Onglets</button>
<button class="section-tab" data-section="media">🎵 Média</button>
<button class="section-tab" data-section="apps">🚀 Applications</button>
<button class="section-tab" data-section="theme">🎨 Thème</button>
</nav>
<!-- Section Plugin -->
<section id="section-plugin" class="config-section active">
<h2>Source de monitoring</h2>
<p class="help-text">Choisissez le logiciel de monitoring à utiliser</p>
<div class="plugin-selector" id="plugin-selector">
<!-- Généré dynamiquement -->
</div>
<div class="plugin-config" id="plugin-config">
<h3>⚙️ Configuration de la connexion</h3>
<div class="config-group">
<label>🌐 Hôte</label>
<input type="text" id="plugin-host" value="127.0.0.1" placeholder="127.0.0.1">
</div>
<div class="config-group">
<label>🔢 Port</label>
<input type="number" id="plugin-port" value="8085" placeholder="8085">
</div>
<div class="plugin-actions">
<button id="test-connection-btn" class="btn btn-secondary">🔍 Tester la connexion</button>
<span id="connection-status"></span>
</div>
</div>
<div class="plugin-info" id="plugin-info">
<!-- Info sur le plugin sélectionné -->
</div>
</section>
<!-- Section Capteurs -->
<section id="section-sensors" class="config-section">
<h2>Sélection des capteurs</h2>
<p class="help-text">Cochez les capteurs que vous souhaitez afficher sur le dashboard</p>
<div class="sensors-container">
<div id="sensors-loading">Chargement des capteurs...</div>
<div id="sensors-list" style="display: none;"></div>
</div>
</section>
<!-- Section Ordre des capteurs -->
<section id="section-order" class="config-section">
<h2>Ordre des capteurs</h2>
<p class="help-text">Glissez-déposez les capteurs pour changer leur ordre d'affichage</p>
<div id="order-tabs-container">
<!-- Généré dynamiquement -->
</div>
</section>
<!-- Section Onglets -->
<section id="section-tabs" class="config-section">
<h2>Gestion des onglets</h2>
<p class="help-text">Créez et organisez vos onglets personnalisés</p>
<div class="tabs-manager">
<div class="tabs-list" id="tabs-list"></div>
<button id="add-tab-btn" class="btn btn-primary">âž• Ajouter un onglet</button>
</div>
</section>
<!-- Section Applications -->
<!-- Section Média (Plexamp) -->
<section id="section-media" class="config-section">
<h2>🎵 Lecteur Média</h2>
<p class="help-text">Configurez Plexamp pour afficher le lecteur sur le dashboard</p>
<div class="plugin-card">
<div class="plugin-header">
<label class="plugin-toggle">
<input type="checkbox" id="plexamp-enabled">
<span class="toggle-slider"></span>
</label>
<div class="plugin-title">
<h3>Plexamp</h3>
<p>Lecteur Plex (via serveur Plex)</p>
</div>
</div>
<div class="plugin-config" id="plexamp-config">
<div class="config-group">
<label>🖥️ Serveur Plex (IP)</label>
<input type="text" id="plexamp-host" value="192.168.1.235" placeholder="192.168.1.235">
</div>
<div class="config-group">
<label>🔢 Port</label>
<input type="number" id="plexamp-port" value="32400" placeholder="32400">
</div>
<div class="config-group">
<label>🔑 Token Plex</label>
<input type="password" id="plexamp-token" placeholder="Votre token Plex">
<small>Trouvez-le dans Plexamp → Paramètres → Dépannage → Copier le token</small>
</div>
<div class="plugin-actions">
<button id="plexamp-test-btn" class="btn btn-secondary">🔍 Tester</button>
<button id="plexamp-save-btn" class="btn btn-primary">💾 Sauvegarder</button>
<span id="plexamp-status"></span>
</div>
</div>
</div>
</section>
<section id="section-apps" class="config-section">
<h2>Applications lancables</h2>
<p class="help-text">Configurez les applications que vous voulez lancer depuis le dashboard</p>
<div class="config-group" style="margin-bottom: 20px;">
<label>📑 Afficher les applications dans l'onglet :</label>
<select id="apps-tab-select">
<option value="">-- Section séparée (en bas) --</option>
<!-- Options générées dynamiquement -->
</select>
</div>
<div class="apps-list" id="apps-list"></div>
<button id="add-app-btn" class="btn btn-primary">âž• Ajouter une application</button>
</section>
<!-- Section Thème -->
<section id="section-theme" class="config-section">
<h2>Apparence</h2>
<p class="help-text">Personnalisez le thème de l'interface</p>
<div class="theme-selector">
<label>
<input type="radio" name="theme" value="dark" checked>
<div class="theme-option">
<div class="theme-preview theme-dark"></div>
<span>Sombre</span>
</div>
</label>
<label>
<input type="radio" name="theme" value="light">
<div class="theme-option">
<div class="theme-preview theme-light"></div>
<span>Clair</span>
</div>
</label>
<label>
<input type="radio" name="theme" value="blue">
<div class="theme-option">
<div class="theme-preview theme-blue"></div>
<span>Bleu</span>
</div>
</label>
</div>
</section>
</div>
</div>
<!-- Modal de configuration capteur -->
<div id="sensor-config-modal" class="modal" style="display: none;">
<div class="modal-content">
<div class="modal-header">
<h3>⚙️ Configuration du capteur</h3>
<button class="modal-close">&times;</button>
</div>
<div class="modal-body">
<div class="config-group">
<label>📐 Taille de la carte</label>
<select id="config-card-size">
<option value="tiny">Minuscule (½ colonne) - Mobile</option>
<option value="xs">Très petit (1 colonne) - Mobile</option>
<option value="small">Petit (1.5 colonnes)</option>
<option value="medium" selected>Moyen (2 colonnes)</option>
<option value="large">Grand (3 colonnes)</option>
<option value="xl">Très grand (4 colonnes)</option>
</select>
<label style="margin-top: 10px;">🔤 Police de caractères</label>
<select id="config-font-family">
<option value="system" selected>System (par défaut)</option>
<option value="roboto">Roboto</option>
<option value="opensans">Open Sans</option>
<option value="lato">Lato</option>
<option value="montserrat">Montserrat</option>
<option value="poppins">Poppins</option>
<option value="inter">Inter</option>
<option value="mono">Monospace (technique)</option>
<option value="digital">Digital (LCD)</option>
</select>
<label style="margin-top: 10px;">
<input type="checkbox" id="config-font-bold" checked>
Texte en gras (bold)
</label>
<label style="margin-top: 10px;">📱 Taille de police</label>
<select id="config-font-size">
<option value="tiny">Minuscule (8px nom, 14px valeur) - Ultra compact</option>
<option value="xs">Très petit (9px nom, 16px valeur) - Compact</option>
<option value="small" selected>Petit (10px nom, 18px valeur) - Par défaut</option>
<option value="medium">Moyen (11px nom, 20px valeur) - Confortable</option>
<option value="large">Grand (12px nom, 22px valeur) - Large</option>
</select>
<label style="margin-top: 10px;">
<input type="checkbox" id="config-hide-value-mobile">
Masquer la valeur sur mobile (plus d'espace pour le graphique)
</label>
<label style="margin-top: 10px;">
<input type="checkbox" id="config-show-type-badge" checked>
Afficher le badge de type (temperature, frequency, etc.)
</label>
</div>
<div class="config-group" id="gauge-options-group" style="display: none;">
<h4>🎯 Options de la jauge</h4>
<label>
<input type="checkbox" id="config-gauge-show-value" checked>
Afficher la valeur au centre
</label>
<label>Taille de la jauge</label>
<select id="config-gauge-size">
<option value="tiny">Minuscule (60px) - Mobile</option>
<option value="xs">Très petit (90px) - Mobile</option>
<option value="small">Petit (120px)</option>
<option value="medium" selected>Moyen (180px)</option>
<option value="large">Grand (240px)</option>
</select>
<label>Style de la jauge</label>
<select id="config-gauge-style">
<option value="arc" selected>Arc (3/4 cercle)</option>
<option value="semicircle">Demi-cercle</option>
<option value="circle">Cercle complet</option>
</select>
</div>
<div class="config-group" id="chart-options-group" style="display: none;">
<h4>📈 Options du graphique</h4>
<label>Hauteur du graphique</label>
<select id="config-chart-height">
<option value="tiny">Minuscule (50px) - Mobile</option>
<option value="xs">Très petit (70px) - Mobile</option>
<option value="small">Petit (90px)</option>
<option value="medium" selected>Moyen (120px)</option>
<option value="large">Grand (180px)</option>
</select>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-secondary modal-cancel">Annuler</button>
<button class="btn btn-primary modal-save">Appliquer</button>
</div>
</div>
</div>
<div id="notification" class="notification"></div>
<script src="{{ url_for('static', filename='js/admin.js') }}"></script>
</body>
</html>

93
templates/dashboard.html Normal file
View File

@@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PC Monitor - Dashboard</title>
<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Lato:wght@400;700&family=Montserrat:wght@400;500;600;700&family=Open+Sans:wght@400;600;700&family=Poppins:wght@400;500;600;700&family=Roboto:wght@400;500;700&family=Orbitron:wght@400;500;700&family=Share+Tech+Mono&display=swap" rel="stylesheet">
<link rel="stylesheet" href="{{ url_for('static', filename='css/dashboard.css') }}">
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
</head>
<body>
<div class="container">
<header>
<h1 id="dashboard-title">📊 PC Monitor</h1>
<div class="header-actions">
<span id="last-update">-</span>
<a href="/admin" class="btn btn-secondary">⚙️</a>
</div>
</header>
<!-- Onglets -->
<nav class="tabs-nav" id="tabs-nav" style="display: none;">
<!-- Généré dynamiquement par JS -->
</nav>
<!-- Contenu des onglets -->
<div class="tabs-content" id="tabs-content">
<!-- Généré dynamiquement par JS -->
</div>
<!-- Widget Plexamp -->
<div class="plexamp-widget" id="plexamp-widget" style="display: none;">
<div class="plexamp-artwork">
<img id="plexamp-cover" src="" alt="Album cover">
<div class="plexamp-no-music" id="plexamp-no-music">
<span>🎵</span>
<p>Aucune lecture</p>
</div>
</div>
<div class="plexamp-info">
<div class="plexamp-track">
<div class="plexamp-title" id="plexamp-title">-</div>
<div class="plexamp-artist" id="plexamp-artist">-</div>
<div class="plexamp-album" id="plexamp-album">-</div>
</div>
<div class="plexamp-progress">
<div class="plexamp-progress-bar">
<div class="plexamp-progress-fill" id="plexamp-progress-fill"></div>
</div>
<div class="plexamp-times">
<span id="plexamp-time-current">0:00</span>
<span id="plexamp-time-total">0:00</span>
</div>
</div>
<div class="plexamp-controls">
<button class="plexamp-btn" id="plexamp-prev" title="Précédent">⏮️</button>
<button class="plexamp-btn plexamp-btn-play" id="plexamp-playpause" title="Play/Pause">▶️</button>
<button class="plexamp-btn" id="plexamp-next" title="Suivant">⏭️</button>
</div>
</div>
</div>
<!-- Section Applications -->
<div class="apps-section" id="apps-section" style="display: none;">
<h3>🚀 Applications</h3>
<div class="apps-grid" id="apps-grid">
<!-- Généré dynamiquement par JS -->
</div>
</div>
<!-- Message quand aucun capteur n'est configuré -->
<div id="empty-state" class="empty-state">
<div class="empty-icon">📊</div>
<h2>Aucun capteur configuré</h2>
<p>Rendez-vous dans la page d'administration pour configurer vos capteurs</p>
<a href="/admin" class="btn btn-primary">⚙️ Configuration</a>
</div>
<!-- Erreur de connexion -->
<div id="error-state" class="error-state" style="display: none;">
<div class="error-icon">⚠️</div>
<h2>Erreur de connexion</h2>
<p id="error-message">Impossible de se connecter à LibreHardwareMonitor</p>
<button onclick="location.reload()" class="btn btn-primary">🔄 Réessayer</button>
</div>
</div>
<script src="{{ url_for('static', filename='js/dashboard.js') }}"></script>
</body>
</html>