diff options
| author | polo <ordipolo@gmx.fr> | 2025-04-02 00:00:35 +0200 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2025-04-02 00:00:35 +0200 |
| commit | e4a325c9d5c07f09bc18b7e366ffb82b82c43502 (patch) | |
| tree | b30c9c91106ebdbeef988c2c1ebd955b62051be2 /public | |
| parent | e91841c4e678f955e1a44bf0fa0839e84f0aacd0 (diff) | |
| download | cms-e4a325c9d5c07f09bc18b7e366ffb82b82c43502.tar.gz cms-e4a325c9d5c07f09bc18b7e366ffb82b82c43502.tar.bz2 cms-e4a325c9d5c07f09bc18b7e366ffb82b82c43502.zip | |
modification des titres, aperçus et dates des news
Diffstat (limited to 'public')
| -rw-r--r-- | public/css/main.css | 29 | ||||
| -rw-r--r-- | public/js/main.js | 85 | ||||
| -rw-r--r-- | public/js/tinymce.js | 75 |
3 files changed, 145 insertions, 44 deletions
diff --git a/public/css/main.css b/public/css/main.css index a75b8cd..50c2173 100644 --- a/public/css/main.css +++ b/public/css/main.css | |||
| @@ -56,22 +56,39 @@ article .logo2 | |||
| 56 | overflow: hidden; | 56 | overflow: hidden; |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | article .action_icon | 59 | .action_icon |
| 60 | { | 60 | { |
| 61 | width: 24px; | 61 | width: 24px; |
| 62 | vertical-align: middle; | 62 | vertical-align: bottom; |
| 63 | border: white 2px solid; /* invisible */ | 63 | border: white 2px solid; /* invisible */ |
| 64 | } | 64 | } |
| 65 | article .action_icon:hover | 65 | button .action_icon |
| 66 | { | ||
| 67 | border: none; | ||
| 68 | } | ||
| 69 | .action_icon:hover | ||
| 66 | { | 70 | { |
| 67 | background-color: #ffff00; | 71 | background-color: #ffff00; |
| 68 | border-radius: 4px; | 72 | border-radius: 4px; |
| 69 | border: lightgrey 2px outset; | 73 | border: lightgrey 2px outset; |
| 70 | } | 74 | } |
| 71 | .article_title_zone | 75 | button .action_icon:hover |
| 76 | { | ||
| 77 | border: none; | ||
| 78 | } | ||
| 79 | |||
| 80 | .button_zone | ||
| 72 | { | 81 | { |
| 73 | display: flex; | 82 | display: flex; |
| 74 | justify-content: space-between; | 83 | } |
| 84 | |||
| 85 | .share | ||
| 86 | { | ||
| 87 | float: right; | ||
| 88 | } | ||
| 89 | .article_title_zone | ||
| 90 | { | ||
| 91 | padding: 10px; | ||
| 75 | } | 92 | } |
| 76 | .under_an_article | 93 | .under_an_article |
| 77 | { | 94 | { |
| @@ -82,8 +99,8 @@ article .action_icon:hover | |||
| 82 | .under_an_article img | 99 | .under_an_article img |
| 83 | { | 100 | { |
| 84 | width: 24px; | 101 | width: 24px; |
| 85 | vertical-align: middle; | ||
| 86 | margin-right: 5px; | 102 | margin-right: 5px; |
| 103 | vertical-align: middle; | ||
| 87 | } | 104 | } |
| 88 | .article_admin_zone | 105 | .article_admin_zone |
| 89 | { | 106 | { |
diff --git a/public/js/main.js b/public/js/main.js index d985b71..1351fea 100644 --- a/public/js/main.js +++ b/public/js/main.js | |||
| @@ -63,12 +63,93 @@ function switchPositions(articleId, direction) | |||
| 63 | console.log('Inversion réussie'); | 63 | console.log('Inversion réussie'); |
| 64 | } | 64 | } |
| 65 | else{ | 65 | else{ |
| 66 | console.log('Échec de l\'inversion'); | 66 | console.error('Échec de l\'inversion'); |
| 67 | } | 67 | } |
| 68 | } | 68 | } |
| 69 | else { | 69 | else { |
| 70 | 70 | ||
| 71 | console.log('Échec de l\'inversion'); | 71 | console.error('Échec de l\'inversion'); |
| 72 | } | ||
| 73 | }) | ||
| 74 | .catch(error => { | ||
| 75 | console.error('Erreur:', error); | ||
| 76 | }); | ||
| 77 | } | ||
| 78 | |||
| 79 | function changeDate(id_date) | ||
| 80 | { | ||
| 81 | const real_id = 'i' + id_date.slice(1); | ||
| 82 | const date_span = document.getElementById(id_date); // = <span> | ||
| 83 | var old_date = date_span.innerHTML; | ||
| 84 | |||
| 85 | // changer "le 28-12-2024 à 23h14" en "2024-12-28T23:14" | ||
| 86 | let values = old_date.split(" à "); // 2 parties: date et heure | ||
| 87 | values[1] = values[1].replace('h', ':'); | ||
| 88 | values[0] = values[0].replace("le ", ""); | ||
| 89 | let date = values[0].split("-"); // tableau jj-mm-aaaa | ||
| 90 | old_date = date[2] + '-' + date[1] + "-" + date[0] + "T" + values[1]; | ||
| 91 | |||
| 92 | var label = document.createElement('label'); | ||
| 93 | label.textContent = 'Choisir une date: '; | ||
| 94 | label.id = 'label-' + id_date; | ||
| 95 | |||
| 96 | var input = document.createElement('input'); | ||
| 97 | input.type = 'datetime-local'; | ||
| 98 | input.value = old_date; | ||
| 99 | input.id = 'input-' + id_date; | ||
| 100 | |||
| 101 | var parent = date_span.parentElement; | ||
| 102 | parent.appendChild(label) | ||
| 103 | parent.appendChild(input); | ||
| 104 | |||
| 105 | date_span.classList.add('hidden'); | ||
| 106 | document.querySelector(`#edit-${id_date}`).classList.add('hidden'); | ||
| 107 | document.querySelector(`#cancel-${id_date}`).classList.remove('hidden'); | ||
| 108 | document.querySelector(`#submit-${id_date}`).classList.remove('hidden'); | ||
| 109 | } | ||
| 110 | |||
| 111 | function closeInput(id) | ||
| 112 | { | ||
| 113 | const date_span = document.getElementById(id); | ||
| 114 | const date_input = document.getElementById('input-' + id); | ||
| 115 | const date_label = document.getElementById('label-' + id); | ||
| 116 | |||
| 117 | date_span.classList.remove('hidden'); | ||
| 118 | date_input.remove(); | ||
| 119 | date_label.remove(); | ||
| 120 | document.querySelector(`#edit-${id}`).classList.remove('hidden'); | ||
| 121 | document.querySelector(`#cancel-${id}`).classList.add('hidden'); | ||
| 122 | document.querySelector(`#submit-${id}`).classList.add('hidden'); | ||
| 123 | } | ||
| 124 | |||
| 125 | function submitDate(id_date) | ||
| 126 | { | ||
| 127 | const date_input = document.getElementById('input-' + id_date); | ||
| 128 | |||
| 129 | fetch('index.php?action=date_submit', { | ||
| 130 | method: 'POST', | ||
| 131 | headers: { | ||
| 132 | 'Content-Type': 'application/json' | ||
| 133 | }, | ||
| 134 | body: JSON.stringify({id: id_date, date: date_input.value}) | ||
| 135 | }) | ||
| 136 | .then(response => response.json()) | ||
| 137 | .then(data => { | ||
| 138 | if (data.success) { | ||
| 139 | // modifier la date dans le <span> caché | ||
| 140 | const date_span = document.getElementById(id_date); | ||
| 141 | let date = new Date(date_input.value); | ||
| 142 | date_span.innerHTML = | ||
| 143 | 'le ' + String(date.getDate()).padStart(2, '0') + '-' + | ||
| 144 | String(date.getMonth() + 1).padStart(2, '0') + '-' + | ||
| 145 | String(date.getFullYear()).padStart(4, '0') + ' à ' + | ||
| 146 | String(date.getHours()).padStart(2, '0') + 'h' + | ||
| 147 | String(date.getMinutes()).padStart(2, '0'); | ||
| 148 | |||
| 149 | closeInput(id_date); | ||
| 150 | } | ||
| 151 | else { | ||
| 152 | console.error('Erreur lors de la sauvegarde de la date.'); | ||
| 72 | } | 153 | } |
| 73 | }) | 154 | }) |
| 74 | .catch(error => { | 155 | .catch(error => { |
diff --git a/public/js/tinymce.js b/public/js/tinymce.js index 8aeaac8..d3c9739 100644 --- a/public/js/tinymce.js +++ b/public/js/tinymce.js | |||
| @@ -1,12 +1,14 @@ | |||
| 1 | let editors = {}; | 1 | let editors = {}; |
| 2 | 2 | ||
| 3 | function openEditor(articleId, page = '') { | 3 | function openEditor(id, page = '') { |
| 4 | const real_id = 'i' + id.slice(1); | ||
| 5 | |||
| 4 | // Récupérer et sauvegarder le contenu d'origine de l'article | 6 | // Récupérer et sauvegarder le contenu d'origine de l'article |
| 5 | const articleContent = document.getElementById(articleId).innerHTML; | 7 | const articleContent = document.getElementById(id).innerHTML; |
| 6 | document.getElementById(articleId).setAttribute('data-original-content', articleContent); | 8 | document.getElementById(id).setAttribute('data-original-content', articleContent); |
| 7 | 9 | ||
| 8 | tinymce.init({ | 10 | tinymce.init({ |
| 9 | selector: `#${articleId}`, | 11 | selector: `#${id}`, |
| 10 | language: 'fr_FR', // télécharger des paquets de langue ici: https://www.tiny.cloud/get-tiny/language-packages/ | 12 | 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 | 13 | language_url: 'js/tinymce-langs/fr_FR.js', // ou installer tweeb/tinymce-i18n avec composer |
| 12 | license_key: 'gpl', | 14 | license_key: 'gpl', |
| @@ -18,19 +20,18 @@ function openEditor(articleId, page = '') { | |||
| 18 | statusbar: false, | 20 | statusbar: false, |
| 19 | setup: function (editor) { | 21 | setup: function (editor) { |
| 20 | editor.on('init', function () { | 22 | editor.on('init', function () { |
| 21 | editors[articleId] = editor; | 23 | editors[id] = editor; |
| 22 | 24 | ||
| 23 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" | 25 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" |
| 24 | document.querySelector(`#edit-${articleId}`).classList.add('hidden'); | 26 | document.querySelector(`#edit-${id}`).classList.add('hidden'); |
| 25 | document.querySelector(`#delete-${articleId}`).classList.add('hidden'); | 27 | document.querySelector(`#cancel-${id}`).classList.remove('hidden'); |
| 28 | document.querySelector(`#submit-${id}`).classList.remove('hidden'); | ||
| 29 | document.querySelector(`#delete-${real_id}`).classList.add('hidden'); | ||
| 26 | // boutons absents page article | 30 | // boutons absents page article |
| 27 | if(page != 'article'){ | 31 | if(page != 'article'){ |
| 28 | document.querySelector(`#position_up-${articleId}`).classList.add('hidden'); | 32 | document.querySelector(`#position_up-${id}`).classList.add('hidden'); |
| 29 | document.querySelector(`#position_down-${articleId}`).classList.add('hidden'); | 33 | document.querySelector(`#position_down-${id}`).classList.add('hidden'); |
| 30 | } | 34 | } |
| 31 | document.querySelector(`#cancel-${articleId}`).classList.remove('hidden'); | ||
| 32 | document.querySelector(`#submit-${articleId}`).classList.remove('hidden'); | ||
| 33 | |||
| 34 | }); | 35 | }); |
| 35 | }, | 36 | }, |
| 36 | // upload d'image | 37 | // upload d'image |
| @@ -59,10 +60,10 @@ function openEditor(articleId, page = '') { | |||
| 59 | }); | 60 | }); |
| 60 | 61 | ||
| 61 | // Remplacer le contenu de l'article par l'éditeur | 62 | // Remplacer le contenu de l'article par l'éditeur |
| 62 | document.getElementById(articleId).innerHTML = articleContent; | 63 | document.getElementById(id).innerHTML = articleContent; |
| 63 | } | 64 | } |
| 64 | 65 | ||
| 65 | function deleteArticle(articleId, page = '') { | 66 | function deleteArticle(id, page = '') { |
| 66 | if (confirm('Voulez-vous vraiment supprimer cet article ?')) | 67 | if (confirm('Voulez-vous vraiment supprimer cet article ?')) |
| 67 | { | 68 | { |
| 68 | // Envoyer une requête au serveur pour supprimer l'article | 69 | // Envoyer une requête au serveur pour supprimer l'article |
| @@ -71,7 +72,7 @@ function deleteArticle(articleId, page = '') { | |||
| 71 | headers: { | 72 | headers: { |
| 72 | 'Content-Type': 'application/json' | 73 | 'Content-Type': 'application/json' |
| 73 | }, | 74 | }, |
| 74 | body: JSON.stringify({ id: articleId }) | 75 | body: JSON.stringify({ id: id }) |
| 75 | }) | 76 | }) |
| 76 | .then(response => response.json()) | 77 | .then(response => response.json()) |
| 77 | .then(data => { | 78 | .then(data => { |
| @@ -85,7 +86,7 @@ function deleteArticle(articleId, page = '') { | |||
| 85 | } | 86 | } |
| 86 | else{ | 87 | else{ |
| 87 | // Supprimer l'article du DOM | 88 | // Supprimer l'article du DOM |
| 88 | const articleElement = document.getElementById(articleId); | 89 | const articleElement = document.getElementById(id); |
| 89 | articleElement.parentElement.parentElement.remove(); // <article> est deux niveau au dessus | 90 | articleElement.parentElement.parentElement.remove(); // <article> est deux niveau au dessus |
| 90 | } | 91 | } |
| 91 | } | 92 | } |
| @@ -99,40 +100,42 @@ function deleteArticle(articleId, page = '') { | |||
| 99 | } | 100 | } |
| 100 | } | 101 | } |
| 101 | 102 | ||
| 102 | function closeEditor(articleId, page = '', display_old = true) | 103 | function closeEditor(id, page = '', display_old = true) |
| 103 | { | 104 | { |
| 105 | const real_id = 'i' + id.slice(1); | ||
| 106 | |||
| 104 | // Fermer l'éditeur | 107 | // Fermer l'éditeur |
| 105 | tinymce.remove(`#${articleId}`); | 108 | tinymce.remove(`#${id}`); |
| 106 | delete editors[articleId]; | 109 | delete editors[id]; |
| 107 | 110 | ||
| 108 | // Restaurer le contenu d'origine de l'article | 111 | // Restaurer le contenu d'origine de l'article |
| 109 | if(display_old){ | 112 | if(display_old){ |
| 110 | const originalContent = document.getElementById(articleId).getAttribute('data-original-content'); | 113 | const originalContent = document.getElementById(id).getAttribute('data-original-content'); |
| 111 | document.getElementById(articleId).innerHTML = originalContent; | 114 | document.getElementById(id).innerHTML = originalContent; |
| 112 | } | 115 | } |
| 113 | 116 | ||
| 114 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" | 117 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" |
| 115 | document.querySelector(`#edit-${articleId}`).classList.remove('hidden'); | 118 | document.querySelector(`#edit-${id}`).classList.remove('hidden'); |
| 116 | document.querySelector(`#delete-${articleId}`).classList.remove('hidden'); | 119 | document.querySelector(`#cancel-${id}`).classList.add('hidden'); |
| 120 | document.querySelector(`#submit-${id}`).classList.add('hidden'); | ||
| 121 | document.querySelector(`#delete-${real_id}`).classList.remove('hidden'); | ||
| 117 | // boutons absents page article | 122 | // boutons absents page article |
| 118 | if(page != 'article'){ | 123 | if(page != 'article'){ |
| 119 | document.querySelector(`#position_up-${articleId}`).classList.remove('hidden'); | 124 | document.querySelector(`#position_up-${id}`).classList.remove('hidden'); |
| 120 | document.querySelector(`#position_down-${articleId}`).classList.remove('hidden'); | 125 | document.querySelector(`#position_down-${id}`).classList.remove('hidden'); |
| 121 | } | 126 | } |
| 122 | document.querySelector(`#cancel-${articleId}`).classList.add('hidden'); | ||
| 123 | document.querySelector(`#submit-${articleId}`).classList.add('hidden'); | ||
| 124 | } | 127 | } |
| 125 | 128 | ||
| 126 | function submitArticle(articleId, page = '') { | 129 | function submitArticle(id, page = '') { |
| 127 | // Récupérer l'éditeur correspondant à l'article | 130 | // Récupérer l'éditeur correspondant à l'article |
| 128 | const editor = editors[articleId]; | 131 | const editor = editors[id]; |
| 129 | if (!editor) { | 132 | if(!editor) { |
| 130 | console.error('Éditeur non trouvé pour l\'article:', articleId); | 133 | console.error('Éditeur non trouvé pour l\'article:', id); |
| 131 | return; | 134 | return; |
| 132 | } | 135 | } |
| 133 | 136 | ||
| 134 | // Récupérer le contenu de l'éditeur | 137 | // Récupérer le contenu de l'éditeur |
| 135 | const newContent = editor.getContent(); | 138 | const html = editor.getContent(); |
| 136 | 139 | ||
| 137 | // Envoi AJAX au serveur | 140 | // Envoi AJAX au serveur |
| 138 | fetch('index.php?action=editor_submit', { | 141 | fetch('index.php?action=editor_submit', { |
| @@ -140,14 +143,14 @@ function submitArticle(articleId, page = '') { | |||
| 140 | headers: { | 143 | headers: { |
| 141 | 'Content-Type': 'application/json' | 144 | 'Content-Type': 'application/json' |
| 142 | }, | 145 | }, |
| 143 | body: JSON.stringify({id: articleId, content: newContent}) | 146 | body: JSON.stringify({id: id, content: html}) |
| 144 | }) | 147 | }) |
| 145 | .then(response => response.json()) | 148 | .then(response => response.json()) |
| 146 | .then(data => { | 149 | .then(data => { |
| 147 | if (data.success) { | 150 | if (data.success) { |
| 148 | // Fermer l'éditeur et mettre à jour le contenu de l'article | 151 | // Fermer l'éditeur et mettre à jour le contenu de l'article |
| 149 | closeEditor(articleId, page, false); | 152 | closeEditor(id, page, false); |
| 150 | document.getElementById(articleId).innerHTML = newContent; | 153 | document.getElementById(id).innerHTML = html; |
| 151 | } | 154 | } |
| 152 | else { | 155 | else { |
| 153 | alert('Erreur lors de la sauvegarde de l\'article.'); | 156 | alert('Erreur lors de la sauvegarde de l\'article.'); |
