diff options
| author | polo-pc-greta <ordipolo@gmx.fr> | 2025-03-27 10:13:03 +0100 |
|---|---|---|
| committer | polo-pc-greta <ordipolo@gmx.fr> | 2025-03-27 10:13:03 +0100 |
| commit | df3612ed7e6691530503f79483d2fdbc032d01b8 (patch) | |
| tree | 56d1c68fdc8625f5dad1937a654299d45142c79a /public/js | |
| download | cms-df3612ed7e6691530503f79483d2fdbc032d01b8.tar.gz cms-df3612ed7e6691530503f79483d2fdbc032d01b8.tar.bz2 cms-df3612ed7e6691530503f79483d2fdbc032d01b8.zip | |
mise en ligne github
Diffstat (limited to 'public/js')
| -rw-r--r-- | public/js/galery.js | 4 | ||||
| -rw-r--r-- | public/js/main.js | 30 | ||||
| -rw-r--r-- | public/js/tinymce.js | 164 |
3 files changed, 198 insertions, 0 deletions
diff --git a/public/js/galery.js b/public/js/galery.js new file mode 100644 index 0000000..0be63a4 --- /dev/null +++ b/public/js/galery.js | |||
| @@ -0,0 +1,4 @@ | |||
| 1 | function enableGaleryScroller(){ | ||
| 2 | // lancer photoswipe | ||
| 3 | // https://photoswipe.com/ | ||
| 4 | } \ No newline at end of file | ||
diff --git a/public/js/main.js b/public/js/main.js new file mode 100644 index 0000000..c86ec51 --- /dev/null +++ b/public/js/main.js | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | function newPassword(page, id = ''){ | ||
| 2 | if(id != ''){ | ||
| 3 | id = '&id=' + id; | ||
| 4 | } | ||
| 5 | alert('Le mot de passe a été modifié.'); | ||
| 6 | window.setTimeout(function(){ | ||
| 7 | location.href = "index.php?page=" + page + "&message=nouveau_mdp" + id; | ||
| 8 | }, 0); | ||
| 9 | } | ||
| 10 | |||
| 11 | function copyInClipBoard(link){ | ||
| 12 | // une balise <input> avec des attributs | ||
| 13 | var element = document.createElement("input"); | ||
| 14 | element.setAttribute("id", "copyMe"); | ||
| 15 | element.setAttribute("value", link); | ||
| 16 | |||
| 17 | // placement dans la page (= le "document") | ||
| 18 | document.body.appendChild(element); | ||
| 19 | var cible = document.getElementById('copyMe'); | ||
| 20 | |||
| 21 | // selection comme on le ferait à la souris | ||
| 22 | cible.select(); | ||
| 23 | // copie (= Ctrl + C) | ||
| 24 | document.execCommand("copy"); | ||
| 25 | |||
| 26 | // nettoyage | ||
| 27 | element.parentNode.removeChild(element); | ||
| 28 | |||
| 29 | alert('Cette adresse a été copiée dans le presse-papier:\n\n' + link); | ||
| 30 | } \ No newline at end of file | ||
diff --git a/public/js/tinymce.js b/public/js/tinymce.js new file mode 100644 index 0000000..8aa9368 --- /dev/null +++ b/public/js/tinymce.js | |||
| @@ -0,0 +1,164 @@ | |||
| 1 | let editors = {}; | ||
| 2 | |||
| 3 | function openEditor(articleId) { | ||
| 4 | // Récupérer et sauvegarder le contenu d'origine de l'article | ||
| 5 | const articleContent = document.getElementById(articleId).innerHTML; | ||
| 6 | document.getElementById(articleId).setAttribute('data-original-content', articleContent); | ||
| 7 | |||
| 8 | tinymce.init({ | ||
| 9 | selector: `#${articleId}`, | ||
| 10 | language: 'fr_FR', // télécharger des paquets de langue ici: https://www.tiny.cloud/get-tiny/language-packages/ | ||
| 11 | language_url: 'js/tinymce-langs/fr_FR.js', // ou installer tweeb/tinymce-i18n avec composer | ||
| 12 | license_key: 'gpl', | ||
| 13 | branding: false, | ||
| 14 | plugins: 'lists link autolink table image media autoresize help', | ||
| 15 | toolbar: 'undo redo newdocument print selectall styles bold italic underline strikethrough fontsizeinput forecolor backcolor fontfamily align numlist bullist outdent indent table link image media help', | ||
| 16 | menubar: false, | ||
| 17 | toolbar_mode: 'wrap', | ||
| 18 | statusbar: false, | ||
| 19 | setup: function (editor) { | ||
| 20 | editor.on('init', function () { | ||
| 21 | editors[articleId] = editor; | ||
| 22 | |||
| 23 | // Masquer le bouton "Modifier" et afficher les boutons "Annuler" et "Soumettre" | ||
| 24 | if(articleId != 'new') | ||
| 25 | { | ||
| 26 | document.querySelector(`#edit-${articleId}`).classList.add('hidden'); | ||
| 27 | document.querySelector(`#delete-${articleId}`).classList.add('hidden'); | ||
| 28 | document.querySelector(`#position_up-${articleId}`).classList.add('hidden'); | ||
| 29 | document.querySelector(`#position_down-${articleId}`).classList.add('hidden'); | ||
| 30 | } | ||
| 31 | else{ | ||
| 32 | document.querySelector(`#new-${articleId}`).classList.add('hidden'); | ||
| 33 | } | ||
| 34 | document.querySelector(`#cancel-${articleId}`).classList.remove('hidden'); | ||
| 35 | document.querySelector(`#submit-${articleId}`).classList.remove('hidden'); | ||
| 36 | |||
| 37 | }); | ||
| 38 | }, | ||
| 39 | // upload d'image | ||
| 40 | images_upload_handler: (blobInfo, progress) => new Promise((resolve, reject) => { | ||
| 41 | const formData = new FormData(); | ||
| 42 | formData.append("file", blobInfo.blob()); | ||
| 43 | |||
| 44 | fetch("index.php?action=upload_image", { | ||
| 45 | method: "POST", | ||
| 46 | body: formData | ||
| 47 | }) | ||
| 48 | .then(response => response.json()) | ||
| 49 | .then(data => { | ||
| 50 | if (data.location) { | ||
| 51 | resolve(data.location); | ||
| 52 | } | ||
| 53 | else { | ||
| 54 | reject("Erreur: Chemin d'image invalide"); | ||
| 55 | } | ||
| 56 | }) | ||
| 57 | .catch(error => { | ||
| 58 | reject("Erreur lors de l'upload"); | ||
| 59 | }); | ||
| 60 | }), | ||
| 61 | image_caption: true | ||
| 62 | }); | ||
| 63 | |||
| 64 | // Remplacer le contenu de l'article par l'éditeur | ||
| 65 | document.getElementById(articleId).innerHTML = articleContent; | ||
| 66 | } | ||
| 67 | |||
| 68 | function deleteArticle(articleId, page = '') { | ||
| 69 | if (confirm('Voulez-vous vraiment supprimer cet article ?')) | ||
| 70 | { | ||
| 71 | // Envoyer une requête au serveur pour supprimer l'article | ||
| 72 | fetch('index.php?action=delete_article', { | ||
| 73 | method: 'POST', | ||
| 74 | headers: { | ||
| 75 | 'Content-Type': 'application/json' | ||
| 76 | }, | ||
| 77 | body: JSON.stringify({ id: articleId }) | ||
| 78 | }) | ||
| 79 | .then(response => response.json()) | ||
| 80 | .then(data => { | ||
| 81 | if (data.success) | ||
| 82 | { | ||
| 83 | if(page == 'article'){ | ||
| 84 | // redirection vers la page d'accueil | ||
| 85 | window.setTimeout(function(){ | ||
| 86 | location.href = "index.php?page=accueil"; | ||
| 87 | }, 0); | ||
| 88 | } | ||
| 89 | else{ | ||
| 90 | // Supprimer l'article du DOM | ||
| 91 | const articleElement = document.getElementById(articleId); | ||
| 92 | articleElement.parentElement.parentElement.remove(); // <article> est deux niveau au dessus | ||
| 93 | } | ||
| 94 | } | ||
| 95 | else { | ||
| 96 | alert('Erreur lors de la suppression de l\'article.'); | ||
| 97 | } | ||
| 98 | }) | ||
| 99 | .catch(error => { | ||
| 100 | console.error('Erreur:', error); | ||
| 101 | }); | ||
| 102 | } | ||
| 103 | } | ||
| 104 | |||
| 105 | function closeEditor(articleId, display_old = true) | ||
| 106 | { | ||
| 107 | // Fermer l'éditeur | ||
| 108 | tinymce.remove(`#${articleId}`); | ||
| 109 | delete editors[articleId]; | ||
| 110 | |||
| 111 | // Restaurer le contenu d'origine de l'article | ||
| 112 | if(display_old){ | ||
| 113 | const originalContent = document.getElementById(articleId).getAttribute('data-original-content'); | ||
| 114 | document.getElementById(articleId).innerHTML = originalContent; | ||
| 115 | } | ||
| 116 | |||
| 117 | // Afficher le bouton "Modifier" et masquer les boutons "Annuler" et "Soumettre" | ||
| 118 | if(articleId != 'new'){ | ||
| 119 | document.querySelector(`#edit-${articleId}`).classList.remove('hidden'); | ||
| 120 | document.querySelector(`#delete-${articleId}`).classList.remove('hidden'); | ||
| 121 | document.querySelector(`#position_up-${articleId}`).classList.remove('hidden'); | ||
| 122 | document.querySelector(`#position_down-${articleId}`).classList.remove('hidden'); | ||
| 123 | } | ||
| 124 | else{ | ||
| 125 | document.querySelector(`#new-${articleId}`).classList.remove('hidden'); | ||
| 126 | } | ||
| 127 | document.querySelector(`#cancel-${articleId}`).classList.add('hidden'); | ||
| 128 | document.querySelector(`#submit-${articleId}`).classList.add('hidden'); | ||
| 129 | } | ||
| 130 | |||
| 131 | function submitArticle(articleId) { | ||
| 132 | // Récupérer l'éditeur correspondant à l'article | ||
| 133 | const editor = editors[articleId]; | ||
| 134 | if (!editor) { | ||
| 135 | console.error('Éditeur non trouvé pour l\'article:', articleId); | ||
| 136 | return; | ||
| 137 | } | ||
| 138 | |||
| 139 | // Récupérer le contenu de l'éditeur | ||
| 140 | const newContent = editor.getContent(); | ||
| 141 | |||
| 142 | // Envoi AJAX au serveur | ||
| 143 | fetch('index.php?action=editor_submit', { | ||
| 144 | method: 'POST', | ||
| 145 | headers: { | ||
| 146 | 'Content-Type': 'application/json' | ||
| 147 | }, | ||
| 148 | body: JSON.stringify({id: articleId, content: newContent}) | ||
| 149 | }) | ||
| 150 | .then(response => response.json()) | ||
| 151 | .then(data => { | ||
| 152 | if (data.success) { | ||
| 153 | // Fermer l'éditeur et mettre à jour le contenu de l'article | ||
| 154 | closeEditor(articleId, false); | ||
| 155 | document.getElementById(articleId).innerHTML = newContent; | ||
| 156 | } | ||
| 157 | else { | ||
| 158 | alert('Erreur lors de la sauvegarde de l\'article.'); | ||
| 159 | } | ||
| 160 | }) | ||
| 161 | .catch(error => { | ||
| 162 | console.error('Erreur:', error); | ||
| 163 | }); | ||
| 164 | } \ No newline at end of file | ||
