177 lines
5.6 KiB
JavaScript
177 lines
5.6 KiB
JavaScript
(function (window, document) {
|
|
'use strict';
|
|
|
|
var page = document.getElementById('media-admin-page');
|
|
if (!page) {
|
|
return;
|
|
}
|
|
|
|
var uploadForm = document.getElementById('media-upload-form');
|
|
var uploadButton = document.getElementById('media-upload-submit');
|
|
var uploadInput = document.getElementById('media-upload-input');
|
|
var feedback = document.getElementById('media-upload-feedback');
|
|
var isPickerMode = page.dataset.pickerMode === '1';
|
|
|
|
function setFeedback(message, isError) {
|
|
if (!feedback) {
|
|
return;
|
|
}
|
|
|
|
feedback.textContent = message;
|
|
feedback.style.color = isError ? '#b91c1c' : '';
|
|
}
|
|
|
|
async function copyToClipboard(text) {
|
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
await navigator.clipboard.writeText(text);
|
|
return;
|
|
}
|
|
|
|
var helper = document.createElement('textarea');
|
|
helper.value = text;
|
|
helper.setAttribute('readonly', 'readonly');
|
|
helper.style.position = 'absolute';
|
|
helper.style.left = '-9999px';
|
|
document.body.appendChild(helper);
|
|
helper.select();
|
|
document.execCommand('copy');
|
|
document.body.removeChild(helper);
|
|
}
|
|
|
|
function toAbsoluteUrl(url) {
|
|
try {
|
|
return new URL(String(url || ''), window.location.origin).href;
|
|
} catch (error) {
|
|
return String(url || '');
|
|
}
|
|
}
|
|
|
|
function buildImageHtml(url, mediaId) {
|
|
return '<img src="' + String(url)
|
|
.replace(/&/g, '&')
|
|
.replace(/"/g, '"')
|
|
.replace(/</g, '<')
|
|
.replace(/>/g, '>') + '" alt="" data-media-id="' + Number(mediaId) + '">';
|
|
}
|
|
|
|
function flashButtonLabel(button, message, isError) {
|
|
if (!button) {
|
|
return;
|
|
}
|
|
|
|
if (!button.dataset.originalLabel) {
|
|
button.dataset.originalLabel = button.textContent.trim();
|
|
}
|
|
|
|
if (button.dataset.restoreTimerId) {
|
|
window.clearTimeout(Number(button.dataset.restoreTimerId));
|
|
}
|
|
|
|
button.textContent = message;
|
|
|
|
if (isError) {
|
|
button.classList.add('btn--danger');
|
|
}
|
|
|
|
button.dataset.restoreTimerId = String(window.setTimeout(function () {
|
|
button.textContent = button.dataset.originalLabel || '';
|
|
button.classList.remove('btn--danger');
|
|
delete button.dataset.restoreTimerId;
|
|
}, 1800));
|
|
}
|
|
|
|
async function handleUpload() {
|
|
if (!uploadForm || !uploadButton || !uploadInput) {
|
|
return;
|
|
}
|
|
|
|
if (!uploadInput.files || uploadInput.files.length === 0) {
|
|
setFeedback('Sélectionnez une image avant de téléverser.', true);
|
|
return;
|
|
}
|
|
|
|
uploadButton.disabled = true;
|
|
setFeedback('Téléversement en cours…', false);
|
|
|
|
try {
|
|
var response = await fetch(uploadForm.dataset.uploadUrl || uploadForm.action || window.location.href, {
|
|
method: 'POST',
|
|
body: new FormData(uploadForm),
|
|
credentials: 'same-origin',
|
|
headers: {
|
|
'X-Requested-With': 'XMLHttpRequest'
|
|
}
|
|
});
|
|
|
|
var contentType = response.headers.get('content-type') || '';
|
|
var raw = await response.text();
|
|
var payload = {};
|
|
|
|
if (contentType.indexOf('application/json') !== -1) {
|
|
try {
|
|
payload = JSON.parse(raw);
|
|
} catch (parseError) {
|
|
payload = {};
|
|
}
|
|
}
|
|
|
|
if (!response.ok) {
|
|
throw new Error(payload.error || ('HTTP ' + response.status + (raw ? ' - ' + raw.slice(0, 180) : '')));
|
|
}
|
|
|
|
setFeedback('Image téléversée. Rafraîchissement…', false);
|
|
window.location.reload();
|
|
} catch (error) {
|
|
setFeedback(error instanceof Error ? error.message : 'Le téléversement a échoué.', true);
|
|
} finally {
|
|
uploadButton.disabled = false;
|
|
}
|
|
}
|
|
|
|
if (uploadButton) {
|
|
uploadButton.addEventListener('click', function () {
|
|
handleUpload();
|
|
});
|
|
}
|
|
|
|
page.addEventListener('click', async function (event) {
|
|
var button = event.target.closest('[data-media-action]');
|
|
if (!button) {
|
|
return;
|
|
}
|
|
|
|
var action = button.dataset.mediaAction;
|
|
var url = button.dataset.mediaUrl || '';
|
|
var mediaId = Number(button.dataset.mediaId || '0');
|
|
|
|
if (action === 'insert-editor') {
|
|
if (isPickerMode && window.parent && window.parent !== window) {
|
|
window.parent.postMessage({
|
|
type: 'netslim:media-selected',
|
|
url: url,
|
|
mediaId: mediaId,
|
|
html: buildImageHtml(url, mediaId)
|
|
}, window.location.origin);
|
|
}
|
|
return;
|
|
}
|
|
|
|
try {
|
|
if (action === 'copy-url') {
|
|
await copyToClipboard(toAbsoluteUrl(url));
|
|
flashButtonLabel(button, 'URL copiée.', false);
|
|
return;
|
|
}
|
|
|
|
if (action === 'copy-html') {
|
|
await copyToClipboard(buildImageHtml(url, mediaId));
|
|
flashButtonLabel(button, 'HTML copié.', false);
|
|
return;
|
|
}
|
|
} catch (error) {
|
|
flashButtonLabel(button, 'Copie impossible.', true);
|
|
setFeedback('Impossible de copier dans le presse-papiers.', true);
|
|
}
|
|
});
|
|
})(window, document);
|