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/tinymce.js | |
download | cms-df3612ed7e6691530503f79483d2fdbc032d01b8.zip |
mise en ligne github
Diffstat (limited to 'public/js/tinymce.js')
-rw-r--r-- | public/js/tinymce.js | 164 |
1 files changed, 164 insertions, 0 deletions
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 | ||