diff options
| author | polo <ordipolo@gmx.fr> | 2025-06-18 15:10:21 +0200 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2025-06-18 15:10:21 +0200 |
| commit | 83619ac611490e8cd652a0252349704100fc5148 (patch) | |
| tree | 400151c102a75186660046c791e4a921c2e1c98d /public | |
| parent | 9db3f7c6c636eb2bc8368d83ca09b12b4bb94c7b (diff) | |
| download | cms-83619ac611490e8cd652a0252349704100fc5148.tar.gz cms-83619ac611490e8cd652a0252349704100fc5148.tar.bz2 cms-83619ac611490e8cd652a0252349704100fc5148.zip | |
collage contenu HTML dans l'éditeur
Diffstat (limited to 'public')
| -rw-r--r-- | public/js/tinymce.js | 53 |
1 files changed, 49 insertions, 4 deletions
diff --git a/public/js/tinymce.js b/public/js/tinymce.js index 307c384..55a37cc 100644 --- a/public/js/tinymce.js +++ b/public/js/tinymce.js | |||
| @@ -30,7 +30,7 @@ function openEditor(id, page = '') { | |||
| 30 | toolbar_mode: 'wrap', | 30 | toolbar_mode: 'wrap', |
| 31 | statusbar: false, | 31 | statusbar: false, |
| 32 | setup: function (editor) { | 32 | setup: function (editor) { |
| 33 | editor.on('init', function () { | 33 | editor.on('init', function (){ |
| 34 | editors[id] = editor; | 34 | editors[id] = editor; |
| 35 | 35 | ||
| 36 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" | 36 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" |
| @@ -48,6 +48,53 @@ function openEditor(id, page = '') { | |||
| 48 | document.querySelector(`#new-${id}`).classList.add('hidden'); // id = new-new-id_node | 48 | document.querySelector(`#new-${id}`).classList.add('hidden'); // id = new-new-id_node |
| 49 | } | 49 | } |
| 50 | }); | 50 | }); |
| 51 | editor.on('PastePreProcess', function (e){ // déclenchement au collage AVANT insertion dans l'éditeur | ||
| 52 | let parser = new DOMParser(); | ||
| 53 | let doc = parser.parseFromString(e.content, 'text/html'); | ||
| 54 | let images = doc.querySelectorAll('img'); | ||
| 55 | |||
| 56 | let downloads_in_progress = []; | ||
| 57 | |||
| 58 | images.forEach(img => { | ||
| 59 | if(img.src.startsWith('file://')){ // détection d'images non insérables | ||
| 60 | console.warn('Image locale non insérable dans tinymce :', img.src); | ||
| 61 | img.outerHTML = '<div style="border:1px solid red; padding:10px; margin:5px 0; background-color:#ffe6e6; color:#a94442; font-size:14px;">' + | ||
| 62 | "Image locale non insérée. Pour insérer une image depuis LibreOffice, copiez l'image seule et recoller." + | ||
| 63 | '</div>'; | ||
| 64 | } | ||
| 65 | else if(img.src.startsWith('http')){ // détection d'images web | ||
| 66 | let promise = fetch('index.php?action=upload_image_url', { // promesse d'un fichier téléchargeable sur le serveur | ||
| 67 | method: 'POST', | ||
| 68 | headers: { 'Content-Type': 'application/json' }, | ||
| 69 | body: JSON.stringify({ image_url: img.src }) | ||
| 70 | }) | ||
| 71 | .then(response => response.json()) | ||
| 72 | .then(data => { | ||
| 73 | if(data.location){ | ||
| 74 | img.src = data.location; // remplacer l'image par celle du serveur | ||
| 75 | } | ||
| 76 | }) | ||
| 77 | .catch(error => { | ||
| 78 | console.error('Erreur lors de l’upload de l’image :', error); | ||
| 79 | }); | ||
| 80 | |||
| 81 | downloads_in_progress.push(promise); | ||
| 82 | } | ||
| 83 | }); | ||
| 84 | |||
| 85 | // une image web ou plus: différer l'insertion dans l'éditeur le temps que le serveur télécharge les images | ||
| 86 | if(downloads_in_progress.length > 0){ | ||
| 87 | e.preventDefault(); | ||
| 88 | |||
| 89 | Promise.all(downloads_in_progress).then(() => { | ||
| 90 | e.content = doc.body.innerHTML; // remplacement du HTML dans l'éditeur par la copie modifiée (doc) | ||
| 91 | editor.insertContent(e.content); | ||
| 92 | }); | ||
| 93 | } | ||
| 94 | else{ | ||
| 95 | e.content = doc.body.innerHTML; // remplacement du HTML dans l'éditeur par la copie modifiée (doc) | ||
| 96 | } | ||
| 97 | }); // fin editor.on('PastePreProcess'... | ||
| 51 | }, | 98 | }, |
| 52 | // upload d'image | 99 | // upload d'image |
| 53 | images_upload_handler: (blobInfo, progress) => new Promise((resolve, reject) => { | 100 | images_upload_handler: (blobInfo, progress) => new Promise((resolve, reject) => { |
| @@ -86,9 +133,7 @@ function deleteArticle(id, page = '') { | |||
| 86 | // Envoyer une requête au serveur pour supprimer l'article | 133 | // Envoyer une requête au serveur pour supprimer l'article |
| 87 | fetch('index.php?action=delete_article', { | 134 | fetch('index.php?action=delete_article', { |
| 88 | method: 'POST', | 135 | method: 'POST', |
| 89 | headers: { | 136 | headers: {'Content-Type': 'application/json'}, |
| 90 | 'Content-Type': 'application/json' | ||
| 91 | }, | ||
| 92 | body: JSON.stringify({ id: id }) | 137 | body: JSON.stringify({ id: id }) |
| 93 | }) | 138 | }) |
| 94 | .then(response => response.json()) | 139 | .then(response => response.json()) |
