gmao/app_new/planning/templates/planning/tasks.html
root b6c94b74d7
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
Unifie les règles et échéances de maintenance
2026-08-14 21:39:55 +00:00

167 lines
6.9 KiB
HTML

{% extends "base.html" %}
{% block title %}Tâches Préventives — GMAO Collège{% endblock %}
{% block content %}
<div class="d-flex justify-content-between align-items-center mb-4">
<h1><i class="bi bi-list-check"></i> Tâches Préventives</h1>
</div>
<div class="row mb-3">
<div class="col-md-3">
<label class="form-label">Filtrer par lot</label>
<select class="form-select" id="filterLot">
<option value="">Tous les lots</option>
{% for lot in lots %}
<option value="{{ lot.id }}">{{ lot.name }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-3">
<label class="form-label">Filtrer par catégorie</label>
<select class="form-select" id="filterCategory">
<option value="">Toutes les catégories</option>
{% for cat in categories %}
<option value="{{ cat.id }}">{{ cat.name }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-3">
<label class="form-label">Filtrer par périodicité</label>
<select class="form-select" id="filterPeriod">
<option value="">Toutes</option>
<option value="Quotidien">Quotidien</option>
<option value="Hebdomadaire">Hebdomadaire</option>
<option value="Mensuel">Mensuel</option>
<option value="Annuel">Annuel</option>
</select>
</div>
<div class="col-md-3">
<label class="form-label">Filtrer par contrat</label>
<select class="form-select" id="filterContract">
<option value="">Tous</option>
<option value="1">Avec contrat</option>
<option value="0">Sans contrat</option>
</select>
</div>
</div>
<div class="table-responsive">
<table class="table table-hover table-sm">
<thead class="table-light">
<tr>
<th></th>
<th>Lot</th>
<th>Catégorie</th>
<th>Tâche</th>
<th>Périodicité</th>
<th>Durée</th>
<th>Gestionnaire</th>
<th>Contrat</th>
<th></th>
</tr>
</thead>
<tbody>
{% for task in tasks %}
<tr class="task-row"
data-lot="{{ task.lot_id }}"
data-category="{{ task.lot.category_id if task.lot else '' }}"
data-period="{{ task.periodicite or '' }}"
data-contract="{{ '1' if task.contrat else '0' }}">
<td><code>{{ task.num_tache or '-' }}</code></td>
<td>
{% if task.lot %}
<a href="{{ url_for('lots.detail', id=task.lot.id) }}">
{{ task.lot.name }}
</a>
{% else %}
<span class="text-muted">-</span>
{% endif %}
</td>
<td>
{% if task.lot and task.lot.category %}
<a href="{{ url_for('equipments.category_detail', id=task.lot.category.id) }}">
{{ task.lot.category.name }}
</a>
{% else %}
<span class="text-muted">-</span>
{% endif %}
</td>
<td>{{ task.tache or '-' }}</td>
<td>
{% if task.periodicite %}
<span class="badge bg-info">{{ task.periodicite }}</span>
{% elif task.jours_entre_interventions %}
<span class="badge bg-secondary">Tous les {{ task.jours_entre_interventions }} jours</span>
{% else %}
<span class="text-muted">-</span>
{% endif %}
</td>
<td>
{% if task.duree_minutes %}
<span class="badge bg-primary">{{ task.duree_minutes }} min</span>
{% else %}
<span class="text-muted">-</span>
{% endif %}
</td>
<td>{{ task.gestionnaire or '-' }}</td>
<td>
{% if task.contrat %}
<i class="bi bi-check-circle text-success"></i> Oui
{% else %}
<i class="bi bi-x-circle text-muted"></i> Non
{% endif %}
</td>
<td>
<a href="{{ url_for('planning.edit_task', id=task.id) }}" class="btn btn-sm btn-outline-primary" title="Modifier">
<i class="bi bi-pencil"></i>
</a>
<form class="d-inline" method="post" action="{{ url_for('planning.generate_task', id=task.id) }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><input type="hidden" name="event" value="{{ task.trigger_event or '' }}"><button class="btn btn-sm btn-outline-success" title="Générer les échéances"><i class="bi bi-calendar-plus"></i></button></form>
</td>
</tr>
{% else %}
<tr>
<td colspan="9" class="text-center text-muted py-4">
Aucune tâche préventive.
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="card mt-4">
<div class="card-body">
<h5><i class="bi bi-info-circle"></i> Légende</h5>
<p class="mb-0">
<strong>Périodicité:</strong> Les tâches sont planifiées automatiquement selon leur périodicité.
<br><strong>Contrat:</strong> Indique si la tâche est couverte par un contrat de maintenance.
</p>
</div>
</div>
{% endblock %}
{% block scripts %}
<script>
// Filtrage combiné
function filterTasks() {
const lotId = document.getElementById('filterLot').value;
const categoryId = document.getElementById('filterCategory').value;
const period = document.getElementById('filterPeriod').value;
const contract = document.getElementById('filterContract').value;
document.querySelectorAll('.task-row').forEach(row => {
const matchLot = !lotId || row.dataset.lot === lotId;
const matchCategory = !categoryId || row.dataset.category === categoryId;
const matchPeriod = !period || row.dataset.period.includes(period);
const matchContract = !contract || row.dataset.contract === contract;
row.style.display = (matchLot && matchCategory && matchPeriod && matchContract) ? '' : 'none';
});
}
document.getElementById('filterLot').addEventListener('change', filterTasks);
document.getElementById('filterCategory').addEventListener('change', filterTasks);
document.getElementById('filterPeriod').addEventListener('change', filterTasks);
document.getElementById('filterContract').addEventListener('change', filterTasks);
</script>
{% endblock %}