mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-06-25 08:09:18 +02:00
112 lines
7.8 KiB
PHP
112 lines
7.8 KiB
PHP
<script>
|
|
function toggleAll(src){document.querySelectorAll('input[name="selected_theses[]"]').forEach(cb=>cb.checked=src.checked);updateBulk();}
|
|
function updateBulk(){const n=document.querySelectorAll('input[name="selected_theses[]"]:checked').length;const b=document.getElementById('bulk-actions');document.getElementById('selected-count').textContent=n;b.style.display=n>0?'flex':'none';document.getElementById('admin-table-wrap').style.setProperty('--sticky-top',n>0?b.offsetHeight+'px':'0px');}
|
|
function getSelectedIds(){return Array.from(document.querySelectorAll('input[name="selected_theses[]"]:checked')).map(cb=>cb.value);}
|
|
function confirmBulk(act){const ids=getSelectedIds();if(!ids.length){document.getElementById('no-selection-dialog').showModal();return;}const n=ids.length;document.getElementById('bulk-action-input').value=act;if(act==='delete'){document.getElementById('bulk-delete-count').textContent=n;document.getElementById('bulk-delete-dialog').showModal();}else{document.getElementById('bulk-confirm-word').textContent=act=='publish'?'Publier':'Dépublier';document.getElementById('bulk-confirm-count').textContent=n;document.getElementById('bulk-confirm-dialog').showModal();}}
|
|
function execBulk(){const a=document.getElementById('bulk-action-input').value;const f=document.getElementById('bulk-form');f.action = a=='delete' ? 'actions/delete.php' : 'actions/publish.php';const c=document.getElementById('bulk-checkboxes');c.innerHTML='';getSelectedIds().forEach(id=>{const inp=document.createElement('input');inp.type='hidden';inp.name='selected_theses[]';inp.value=id;c.appendChild(inp);});f.submit();}
|
|
function confirmExport(){const ids=getSelectedIds();if(!ids.length){document.getElementById('no-selection-dialog').showModal();return;}window.location.href='/admin/actions/export.php?csv=1&ids='+ids.join(',');}
|
|
function confirmExportFiles(){const ids=getSelectedIds();if(!ids.length){document.getElementById('no-selection-dialog').showModal();return;}window.location.href='/admin/actions/export.php?files=1&ids='+ids.join(',');}
|
|
function confirmDelete(id,title){document.getElementById('delete-thesis-title').textContent=title;document.getElementById('delete-thesis-dialog').showModal();document.getElementById('delete-dialog-confirm').onclick=function(){document.getElementById('delete-form-'+id).submit();};}
|
|
document.addEventListener('DOMContentLoaded',()=>{document.querySelectorAll('input[name="selected_theses[]"]').forEach(cb=>cb.addEventListener('change',updateBulk));});
|
|
document.addEventListener('htmx:afterSwap',()=>{document.querySelectorAll('input[name="selected_theses[]"]').forEach(cb=>cb.addEventListener('change',updateBulk));updateBulk();});
|
|
</script>
|
|
|
|
<main id="main-content" class="admin-main--list">
|
|
<!-- Title + filters + stats + import all in one toolbar row -->
|
|
<div class="admin-list-toolbar admin-list-toolbar--list">
|
|
<div class="admin-toolbar-top">
|
|
<div class="admin-toolbar-title-row">
|
|
<h1>Liste des TFE</h1>
|
|
<div class="admin-stats">
|
|
<fieldset class="admin-stat">
|
|
<legend class="admin-stat__label">Total</legend>
|
|
<span class="admin-stat__number"><?= $stats['total'] ?></span>
|
|
</fieldset>
|
|
<fieldset class="admin-stat admin-stat--pub">
|
|
<legend class="admin-stat__label">Publiés</legend>
|
|
<span class="admin-stat__number"><?= $stats['published'] ?></span>
|
|
</fieldset>
|
|
<fieldset class="admin-stat admin-stat--pend">
|
|
<legend class="admin-stat__label">Attente</legend>
|
|
<span class="admin-stat__number"><?= $stats['pending'] ?></span>
|
|
</fieldset>
|
|
</div>
|
|
</div>
|
|
<div class="admin-btn-group">
|
|
<a href="/admin/add.php" class="btn btn--primary btn--sm">+ Ajouter un TFE</a>
|
|
<?php if ($trashCount > 0): ?>
|
|
<a href="/admin/index.php?tab=trash" class="btn btn--sm <?= $tab === 'trash' ? 'btn--primary' : 'btn--secondary' ?>">
|
|
Corbeille (<?= $trashCount ?>)
|
|
</a>
|
|
<?php endif; ?>
|
|
<?php if ($tmpTotalCount > 0): ?>
|
|
<button type="button" class="btn btn--sm btn--secondary" id="tmp-cleanup-btn"
|
|
onclick="document.getElementById('tmp-cleanup-dialog').showModal(); htmx.trigger('#tmp-cleanup-stats-wrapper','loadStats'); htmx.trigger('#peertube-orphans-wrapper','loadPeertube')">
|
|
Nettoyer (<?= $tmpTotalCount ?>)
|
|
</button>
|
|
<?php endif; ?>
|
|
<button type="button" class="btn btn--primary btn--sm" id="import-dialog-btn"
|
|
onclick="document.getElementById('import-dialog').showModal(); window.XamxamInitFilePonds()">
|
|
Importer
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<form id="admin-filter-form" class="admin-filters" method="get" action="/admin/"
|
|
hx-get="/admin/"
|
|
hx-trigger="change from:select, input changed delay:300ms from:input[name=search], keyup[key=='Enter'] from:input[name=search]"
|
|
hx-target="#admin-table-wrap"
|
|
hx-swap="innerHTML"
|
|
hx-indicator="#admin-search-indicator"
|
|
hx-include="#admin-filter-form, #admin-table-wrap input[name=sort], #admin-table-wrap input[name=dir]"
|
|
hx-push-url="true"
|
|
hx-sync="#admin-filter-form:replace">
|
|
<input type="text" name="search" placeholder="Titre, auteur..."
|
|
value="<?= htmlspecialchars($searchQuery) ?>">
|
|
<select name="year">
|
|
<option value="">Année</option>
|
|
<?php foreach ($years as $y): ?>
|
|
<option value="<?= $y ?>" <?= $yearFilter == $y ? 'selected' : '' ?>><?= $y ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
<select name="ap">
|
|
<option value="">AP</option>
|
|
<?php foreach ($apPrograms as $ap): ?>
|
|
<option value="<?= $ap['id'] ?>" <?= $apFilter == $ap['id'] ? 'selected' : '' ?>>
|
|
<?= htmlspecialchars($ap['code'] ?? $ap['name']) ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
<select name="orientation">
|
|
<option value="">Orientation</option>
|
|
<?php foreach ($orientations as $o): ?>
|
|
<option value="<?= $o['id'] ?>" <?= $orientationFilter == $o['id'] ? 'selected' : '' ?>>
|
|
<?= htmlspecialchars($o['name']) ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
<?php if ($searchQuery || $yearFilter || $orientationFilter || $apFilter): ?>
|
|
<a href="/admin/" class="btn btn--secondary btn--sm admin-filters-reset">✕ Réinitialiser</a>
|
|
<?php endif; ?>
|
|
</form>
|
|
|
|
<!-- Loading indicator bar -->
|
|
<div id="admin-search-indicator" class="admin-search-indicator"></div>
|
|
</div>
|
|
|
|
<?php include APP_ROOT . '/templates/admin/index-table.php'; ?>
|
|
</main>
|
|
|
|
<?php include APP_ROOT . '/templates/admin/partials/dialogs/no-selection.php'; ?>
|
|
<?php include APP_ROOT . '/templates/admin/partials/dialogs/bulk-confirm.php'; ?>
|
|
<?php include APP_ROOT . '/templates/admin/partials/dialogs/bulk-delete.php'; ?>
|
|
<?php include APP_ROOT . '/templates/admin/partials/dialogs/delete-thesis.php'; ?>
|
|
|
|
<?php include APP_ROOT . '/templates/admin/partials/dialogs/import.php'; ?>
|
|
|
|
<?php include APP_ROOT . '/templates/admin/partials/dialogs/tmp-cleanup.php'; ?>
|
|
|
|
<?php if ($importMessage || !empty($importErrors)): ?>
|
|
<script>document.getElementById('import-dialog').showModal();</script>
|
|
<?php endif; ?>
|