htmx/frontend/templates/partials/cloud_list.html

81 lines
No EOL
2.8 KiB
HTML

<div class="card bg-base-100 shadow">
<div class="card-body">
<h2 class="card-title text-base mb-2">🗂️ Nuages de points</h2>
<div class="flex justify-between items-center mb-4">
<button
type="button"
class="btn btn-ghost"
hx-get="/viewer/list"
hx-target="#cloud-list-body"
hx-swap="innerHTML"
hx-indicator="#cloud-list-spinner"
>
🔄 Actualiser
</button>
<span id="cloud-list-spinner" class="loading loading-spinner loading-sm htmx-indicator"></span>
</div>
<!-- ✅ CORRECTION BUG 1 : cible séparée du bouton -->
<div id="cloud-list-body">
{% if error %}
<div class="alert alert-error">
<span>{{ error }}</span>
</div>
{% elif not pointclouds %}
<p class="text-base-content/40 text-sm text-center py-8">
Aucun nuage disponible sur le serveur.
</p>
{% else %}
<p class="text-xs text-base-content/40 mb-3">{{ pointclouds|length }} nuage(s)</p>
<div class="overflow-x-auto">
<table class="table table-sm">
<thead>
<tr>
<th>ID</th>
<th>Taille</th>
<th>Fichiers</th>
<th>Créé le</th>
<th>Actions</th>
</tr>
</thead>
<tbody id="cloud-table-body">
{% for pc in pointclouds %}
<tr>
<td class="font-mono text-xs">{{ pc.id }}</td>
<td>{{ pc.size_mb }} MB</td>
<td>{{ pc.file_count }}</td>
<td>{{ pc.created|datetimeformat }}</td>
<td class="flex gap-1 flex-wrap">
<a href="/admin/debug/{{ pc.id }}" class="btn btn-sm btn-ghost">🔍</a>
<a href="/viewer/{{ pc.id }}" class="btn btn-sm" target="_blank">👁️</a>
<!-- ✅ NOUVEAU : bouton Crop qui charge la section crop dans #crop-panel -->
<button
type="button"
class="btn btn-sm btn-warning"
hx-get="/crop?pc_id={{ pc.id }}"
hx-target="#crop-panel"
hx-swap="innerHTML"
onclick="document.getElementById('crop-panel').scrollIntoView({behavior:'smooth'})"
>✂️</button>
<button
type="button"
class="btn btn-sm btn-error"
hx-delete="/admin/delete/{{ pc.id }}"
hx-target="#cloud-list-body"
hx-swap="innerHTML"
hx-confirm="Supprimer le nuage {{ pc.id }} ?"
>🗑️</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
</div>
</div>
</div>
<!-- ✅ NOUVEAU : section crop injectée dynamiquement ici -->
<div id="crop-panel" class="mt-4"></div>