mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-06-25 16:19:19 +02:00
Replace the client-side FileArray + Sortable drag-to-reorder with a
server-side session-based upload flow:
- New endpoints: /partage/upload-tfe-file, /partage/remove-tfe-file
(and /admin/ variants) — single-file incremental upload via HTMX
multipart/form-data with progress bar support
- Session storage: uploaded files go to STORAGE_ROOT/uploads/{session_id}/
with metadata in $_SESSION['tfe_uploads']
- file-upload-queue.js reduced to single-file previews only (couverture,
note_intention, annexes thumbnails)
- ThesisFileHandler gains handleTfeFilesFromSession + writeTfeFileFromSrc
+ cleanupSessionUploads for final commit from session temp
- Sortable.min.js removed from all script tags; drag handles and ghost
CSS removed
- No file_orders[]/file_labels[] hidden field injection needed
- Upload queue survives page refresh (server-owned list)
This eliminates the SortableJS dependency entirely while keeping the
same UX: pick files, see them in a queue, remove individual files.
63 lines
2.1 KiB
PHP
63 lines
2.1 KiB
PHP
<?php
|
|
require_once __DIR__ . "/../../bootstrap.php";
|
|
require_once __DIR__ . '/../../src/AdminAuth.php';
|
|
AdminAuth::requireLogin();
|
|
|
|
if (empty($_SESSION["csrf_token"])) {
|
|
$_SESSION["csrf_token"] = bin2hex(random_bytes(32));
|
|
}
|
|
|
|
$pageTitle = "Ajouter un TFE";
|
|
|
|
require_once __DIR__ . '/../../src/Controllers/ThesisCreateController.php';
|
|
|
|
try {
|
|
$ctrl = ThesisCreateController::make();
|
|
extract($ctrl->loadFormData());
|
|
} catch (Exception $e) {
|
|
error_log('Failed to load form data: ' . $e->getMessage());
|
|
die('Erreur lors du chargement du formulaire.');
|
|
}
|
|
|
|
$formData = $_SESSION['form_data'] ?? [];
|
|
unset($_SESSION['form_data']);
|
|
$autofocusField = App::consumeAutofocus();
|
|
|
|
// Site settings for licence / access type toggles
|
|
$siteSettings = Database::getInstance()->getAllSettings();
|
|
// Form help blocks
|
|
$helpBlocks = Database::getInstance()->getAllFormHelpBlocks();
|
|
$helpFn = fn(string $key) => empty($helpBlocks[$key]['enabled']) ? '' : ($helpBlocks[$key]['content'] ?? '');
|
|
|
|
function withAutofocus(string $fieldName, array $attrs = []): array {
|
|
global $autofocusField;
|
|
if ($autofocusField === $fieldName) {
|
|
$attrs['autofocus'] = true;
|
|
}
|
|
return $attrs;
|
|
}
|
|
|
|
function old($key, $default = "") {
|
|
global $formData;
|
|
if (!isset($formData[$key])) return $default;
|
|
if (is_array($formData[$key])) return $formData[$key]; // Return raw array for callers that handle it
|
|
if ($formData[$key] === null) return $default;
|
|
return htmlspecialchars((string)$formData[$key]);
|
|
}
|
|
|
|
function wasSelected($key, $value) {
|
|
global $formData;
|
|
if (!isset($formData[$key])) return false;
|
|
if (is_array($formData[$key])) return in_array($value, $formData[$key]);
|
|
return $formData[$key] == $value;
|
|
}
|
|
|
|
$isAdmin = true;
|
|
$bodyClass = 'admin-body';
|
|
$extraCss = ['/assets/css/form.css'];
|
|
$extraJs = ['/assets/js/file-upload-queue.js', '/assets/js/beforeunload-guard.js'];
|
|
require_once APP_ROOT . '/templates/head.php';
|
|
include APP_ROOT . '/templates/header.php';
|
|
include APP_ROOT . '/templates/admin/add.php';
|
|
require_once APP_ROOT . '/templates/admin/footer.php';
|