feat: add FilePond pools for couverture, note_intention, video, audio; refactor queue config

This commit is contained in:
Pontoporeia
2026-05-10 20:33:29 +02:00
parent ecb559a18a
commit 7b5f3efe40
4 changed files with 81 additions and 48 deletions

View File

@@ -15,24 +15,38 @@
(function () {
"use strict";
// ── Constants (mirrors file-upload-queue.js ALLOWED_BY_TYPE) ──────────
// ── Per-queue-type configuration ────────────────────────────────────
var ALLOWED_BY_TYPE = {
var QUEUE_CONFIG = {
tfe: {
exts: ["jpg","jpeg","png","gif","webp","pdf","mp4","webm","ogv","mov","mp3","ogg","oga","wav","flac","aac","m4a","vtt","zip","tar","gz","tgz"],
maxSize: function (f) { return (/\.pdf$/i.test(f.name) ? 100 : 500) * 1024 * 1024; },
multiple: true,
},
video: {
exts: ["mp4","webm","ogv","mov"],
maxSize: function () { return 500 * 1024 * 1024; },
multiple: true,
},
audio: {
exts: ["mp3","ogg","oga","wav","flac","aac","m4a"],
maxSize: function () { return 500 * 1024 * 1024; },
multiple: true,
},
annexe: {
exts: ["pdf","zip","tar","gz","tgz"],
maxSize: function () { return 500 * 1024 * 1024; },
multiple: true,
},
cover: {
exts: ["jpg","jpeg","png","webp"],
maxSize: function () { return 20 * 1024 * 1024; },
multiple: false,
},
note_intention: {
exts: ["pdf"],
maxSize: function () { return 100 * 1024 * 1024; },
multiple: false,
},
};
@@ -43,6 +57,8 @@
"video-files-input": "video",
"audio-files-input": "audio",
"annexe-files-input": "annexe",
"couverture": "cover",
"note_intention": "note_intention",
};
function ext(fn) {
@@ -53,10 +69,9 @@
// ── FilePond configuration per queue type ─────────────────────────────
function buildFilePondOptions(queueType, input) {
var rules = ALLOWED_BY_TYPE[queueType];
if (!rules) return null;
var cfg = QUEUE_CONFIG[queueType];
if (!cfg) return null;
// Build acceptedFileTypes from extensions
var mimeMap = {
jpg: "image/jpeg", jpeg: "image/jpeg", png: "image/png",
gif: "image/gif", webp: "image/webp",
@@ -67,29 +82,20 @@
vtt: "text/vtt",
zip: "application/zip", tar: "application/x-tar", gz: "application/gzip", tgz: "application/gzip",
};
var accepted = rules.exts.map(function(e) { return mimeMap[e] || ("." + e); });
var accepted = cfg.exts.map(function(e) { return mimeMap[e] || ("." + e); });
return {
allowMultiple: (queueType !== "video" && queueType !== "audio"),
allowMultiple: cfg.multiple,
allowReorder: true,
storeAsFile: true,
labelIdle: "Glissez-déposez vos fichiers ou <span class='filepond--label-action'>Parcourir</span>",
acceptedFileTypes: accepted,
labelFileTypeNotAllowed: "Type de fichier non accepté",
fileValidateTypeLabelExpectedTypes: "Types acceptés : " + rules.exts.map(function(e) { return "." + e; }).join(", "),
fileValidateSizeLabelMaxFileSize: function (fileSize) {
var max = rules.maxSize({name: "", size: 0});
return "Taille maximale : " + Math.round(max / 1024 / 1024) + " MB";
},
maxFileSize: function () {
// We can't do per-file max based on extension easily with FilePond.
// Use the larger limit and validate PDFs as a special case in the
// beforeAddFile callback.
return "500MB";
},
fileValidateTypeLabelExpectedTypes: "Types acceptés : " + cfg.exts.map(function(e) { return "." + e; }).join(", "),
maxFileSize: function () { return "500MB"; },
beforeAddFile: function (item) {
var f = item.file;
var max = rules.maxSize(f);
var max = cfg.maxSize(f);
if (f.size > max) {
var maxMb = Math.round(max / 1024 / 1024);
return {
@@ -123,9 +129,8 @@
var id = input.id;
var queueType = INPUT_ID_TO_TYPE[id];
if (!queueType) {
// Try to infer from data attr on the container
var container = input.closest("[data-queue-type]");
if (container) queueType = container.dataset.queueType;
// Try data-queue-type on the input itself
queueType = input.dataset.queueType || null;
}
if (!queueType) return;