gmao/app_new/yeastar/templates/yeastar/dnd_config.html
2026-08-14 16:02:25 +00:00

217 lines
No EOL
9.5 KiB
HTML

{% extends "base.html" %}
{% block title %}Configuration Watchdog DND - GMAO{% endblock %}
{% block content %}
<div class="container-fluid">
<div class="d-flex justify-content-between align-items-center mb-4">
<h1><i class="bi bi-shield-exclamation"></i> Watchdog DND</h1>
<div>
<a href="{{ url_for('yeastar.index') }}" class="btn btn-secondary">
<i class="bi bi-arrow-left"></i> Retour
</a>
</div>
</div>
<div class="row">
<div class="col-md-8">
<div class="card mb-4">
<div class="card-header">
<i class="bi bi-gear"></i> Configuration du Watchdog
</div>
<div class="card-body">
<p class="text-muted">
Le watchdog surveille les extensions en mode "Ne pas déranger" et les remet automatiquement
en statut "Disponible" après un délai configurable.
</p>
<form method="POST">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<div class="mb-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" name="is_enabled"
id="is_enabled" {% if config.is_enabled %}checked{% endif %}>
<label class="form-check-label" for="is_enabled">
<strong>Activer le watchdog DND</strong>
</label>
</div>
<small class="text-muted d-block mt-1">
Lorsqu'activé, le watchdog remet automatiquement les extensions en "Disponible"
dès qu'elles passent en "Ne pas déranger".
</small>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">Intervalle de vérification (secondes)</label>
<input type="number" class="form-control" name="refresh_seconds"
value="{{ config.refresh_seconds }}" min="1" max="60">
<small class="text-muted">Fréquence de vérification des statuts (défaut: 1s)</small>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Délai avant remise en disponible (secondes)</label>
<input type="number" class="form-control" name="reset_delay_seconds"
value="{{ config.reset_delay_seconds }}" min="1" max="60">
<small class="text-muted">Temps d'attente avant de repasser en "Disponible" (défaut: 3s)</small>
</div>
</div>
<div class="mb-4">
<label class="form-label">Extensions exclues</label>
<input type="text" class="form-control" name="excluded_extensions"
value="{{ config.excluded_extensions }}" placeholder="100,111,118">
<small class="text-muted">
Extensions à ignorer (séparées par des virgules). Ces extensions ne seront pas
automatiquement remises en "Disponible".
</small>
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-success">
<i class="bi bi-check-lg"></i> Sauvegarder la configuration
</button>
<button type="button" class="btn btn-warning" id="restart-btn">
<i class="bi bi-arrow-clockwise"></i> Redémarrer le watchdog
</button>
</div>
</form>
</div>
</div>
<div class="card">
<div class="card-header">
<i class="bi bi-info-circle"></i> Fonctionnement
</div>
<div class="card-body">
<h6>Comment ça marche ?</h6>
<ol class="mb-0">
<li>Le watchdog vérifie périodiquement le statut de toutes les extensions</li>
<li>Quand une extension passe en <span class="badge bg-warning">Ne pas déranger</span>,
le watchdog attend le délai configuré</li>
<li>Après le délai, l'extension est automatiquement remise en
<span class="badge bg-success">Disponible</span></li>
<li>Les extensions exclues ne sont jamais modifiées automatiquement</li>
</ol>
<hr class="my-3">
<h6>Extensions généralement exclues :</h6>
<ul class="mb-0">
<li><strong>100</strong> - Standard (peut être en DND légitimement)</li>
<li><strong>111</strong> - CDI (bureau en DND)</li>
<li>Toute extension qui doit conserver son statut DND manuel</li>
</ul>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-header">
<i class="bi bi-activity"></i> Statut actuel
</div>
<div class="card-body">
<div id="watchdog-status" class="mb-3">
<div class="text-center">
<div class="spinner-border spinner-border-sm" role="status"></div>
<span class="ms-2">Chargement...</span>
</div>
</div>
<div id="watchdog-info" class="small text-muted">
<!-- Infos chargées dynamiquement -->
</div>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
<i class="bi bi-clock-history"></i> Dernière modification
</div>
<div class="card-body">
<small class="text-muted">
{% if config.updated_at %}
{{ config.updated_at.strftime('%d/%m/%Y à %H:%M') }}
{% else %}
Jamais
{% endif %}
</small>
</div>
</div>
</div>
</div>
</div>
<script>
// Charger le statut du watchdog
async function loadStatus() {
try {
const resp = await fetch('/yeastar/api/watchdog/status');
const data = await resp.json();
const statusDiv = document.getElementById('watchdog-status');
const infoDiv = document.getElementById('watchdog-info');
if (data.error) {
statusDiv.innerHTML = '<span class="badge bg-danger">Erreur: ' + data.error + '</span>';
return;
}
const enabled = data.enabled;
const statusBadge = enabled
? '<span class="badge bg-success fs-6"><i class="bi bi-check-circle"></i> Actif</span>'
: '<span class="badge bg-secondary fs-6"><i class="bi bi-pause-circle"></i> Inactif</span>';
statusDiv.innerHTML = statusBadge;
infoDiv.innerHTML = `
<div><strong>Intervalle:</strong> ${data.refresh_seconds}s</div>
<div><strong>Délai:</strong> ${data.reset_delay_seconds}s</div>
<div><strong>Exclues:</strong> ${data.excluded_extensions || 'Aucune'}</div>
`;
} catch (e) {
document.getElementById('watchdog-status').innerHTML =
'<span class="badge bg-danger">Erreur de connexion</span>';
}
}
// Redémarrer le watchdog
document.getElementById('restart-btn').addEventListener('click', async function() {
if (!confirm('Redémarrer le watchdog ?')) return;
this.disabled = true;
this.innerHTML = '<span class="spinner-border spinner-border-sm"></span> Redémarrage...';
try {
// Récupérer le CSRF token du formulaire
const csrfToken = document.querySelector('input[name="csrf_token"]').value;
const resp = await fetch('/yeastar/api/watchdog/restart', {
method: 'POST',
headers: {
'X-CSRFToken': csrfToken
}
});
const data = await resp.json();
if (data.success) {
alert('Watchdog redémarré avec succès');
loadStatus();
} else {
alert('Erreur: ' + (data.error || 'Échec du redémarrage'));
}
} catch (e) {
alert('Erreur de connexion au serveur');
}
this.disabled = false;
this.innerHTML = '<i class="bi bi-arrow-clockwise"></i> Redémarrer le watchdog';
});
// Charger au démarrage
loadStatus();
setInterval(loadStatus, 10000);
</script>
{% endblock %}