diff options
| author | polo <ordipolo@gmx.fr> | 2025-04-27 23:58:46 +0200 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2025-04-27 23:58:46 +0200 |
| commit | 962d315ec0c99974df3dc2261bf94c54ca8cdbdd (patch) | |
| tree | 7463f74a722e759067daf8c3ef43202a60352759 /public | |
| parent | a3ba7dde60dc1c94b7170ec28266a966e5004d33 (diff) | |
| download | cms-962d315ec0c99974df3dc2261bf94c54ca8cdbdd.tar.gz cms-962d315ec0c99974df3dc2261bf94c54ca8cdbdd.tar.bz2 cms-962d315ec0c99974df3dc2261bf94c54ca8cdbdd.zip | |
page menu et chemins, partie3
Diffstat (limited to 'public')
| -rw-r--r-- | public/css/menu.css | 14 | ||||
| -rw-r--r-- | public/js/main.js | 93 | ||||
| -rw-r--r-- | public/js/menu.js | 240 |
3 files changed, 250 insertions, 97 deletions
diff --git a/public/css/menu.css b/public/css/menu.css index cce1d43..5016610 100644 --- a/public/css/menu.css +++ b/public/css/menu.css | |||
| @@ -4,11 +4,19 @@ | |||
| 4 | { | 4 | { |
| 5 | padding: 0 20px; | 5 | padding: 0 20px; |
| 6 | } | 6 | } |
| 7 | .menu_edit_entry | ||
| 8 | { | ||
| 9 | margin-left: 29px; | ||
| 10 | } | ||
| 7 | .menu img | 11 | .menu img |
| 8 | { | 12 | { |
| 9 | width: 20px; | 13 | width: 20px; |
| 10 | vertical-align: middle; | 14 | vertical-align: middle; |
| 11 | } | 15 | } |
| 16 | .menu form | ||
| 17 | { | ||
| 18 | display: inline; | ||
| 19 | } | ||
| 12 | 20 | ||
| 13 | /* explications pour l'utiisateur */ | 21 | /* explications pour l'utiisateur */ |
| 14 | .menu aside | 22 | .menu aside |
| @@ -58,6 +66,7 @@ input | |||
| 58 | { | 66 | { |
| 59 | background-color: white; | 67 | background-color: white; |
| 60 | padding: 10px; | 68 | padding: 10px; |
| 69 | margin-top: 10px; | ||
| 61 | } | 70 | } |
| 62 | .menu .new_entry_buttons p | 71 | .menu .new_entry_buttons p |
| 63 | { | 72 | { |
| @@ -65,8 +74,5 @@ input | |||
| 65 | } | 74 | } |
| 66 | 75 | ||
| 67 | @media screen and (min-width: 80rem) { | 76 | @media screen and (min-width: 80rem) { |
| 68 | i | 77 | i{} |
| 69 | { | ||
| 70 | /*display: none;*/ | ||
| 71 | } | ||
| 72 | } \ No newline at end of file | 78 | } \ No newline at end of file |
diff --git a/public/js/main.js b/public/js/main.js index f74c670..e278325 100644 --- a/public/js/main.js +++ b/public/js/main.js | |||
| @@ -202,97 +202,4 @@ function findParent(element, tag_name){ | |||
| 202 | element = element.parentElement; | 202 | element = element.parentElement; |
| 203 | } | 203 | } |
| 204 | return null; | 204 | return null; |
| 205 | } | ||
| 206 | |||
| 207 | |||
| 208 | /* page Menu et chemins */ | ||
| 209 | function moveOneLevelUp(){} | ||
| 210 | function moveOneLevelDown(){} | ||
| 211 | |||
| 212 | function switchMenuPositions(page_id, direction) | ||
| 213 | { | ||
| 214 | const nav_zone = document.getElementById("nav_zone"); // parent de <nav> | ||
| 215 | const clicked_menu_entry = document.getElementById(page_id); // div parente du bouton | ||
| 216 | var other_entry = null; | ||
| 217 | |||
| 218 | // pas bon | ||
| 219 | if(direction == 'down'){ | ||
| 220 | other_entry = clicked_menu_entry.nextElementSibling; | ||
| 221 | } | ||
| 222 | else if(direction == 'up'){ | ||
| 223 | other_entry = clicked_menu_entry.previousElementSibling; | ||
| 224 | } | ||
| 225 | |||
| 226 | if(other_entry == null){ | ||
| 227 | console.log('Inversion impossible'); | ||
| 228 | return; | ||
| 229 | } | ||
| 230 | |||
| 231 | fetch('index.php?menu_edit=switch_positions', { | ||
| 232 | method: 'POST', | ||
| 233 | headers: { | ||
| 234 | 'Content-Type': 'application/json' | ||
| 235 | }, | ||
| 236 | body: JSON.stringify({ id1: clicked_menu_entry.id, id2: other_entry.id }) | ||
| 237 | }) | ||
| 238 | .then(response => response.json()) | ||
| 239 | .then(data => { | ||
| 240 | if(data.success) | ||
| 241 | { | ||
| 242 | if(direction == 'down'){ | ||
| 243 | clicked_menu_entry.parentElement.insertBefore(other_entry, clicked_menu_entry); | ||
| 244 | console.log('Inversion réussie'); | ||
| 245 | } | ||
| 246 | else if(direction == 'up'){ | ||
| 247 | other_entry.parentElement.insertBefore(clicked_menu_entry, other_entry); | ||
| 248 | console.log('Inversion réussie'); | ||
| 249 | } | ||
| 250 | else{ | ||
| 251 | console.error('Échec de l\'inversion'); | ||
| 252 | } | ||
| 253 | |||
| 254 | nav_zone.innerHTML = ''; | ||
| 255 | nav_zone.insertAdjacentHTML('afterbegin', data.nav); | ||
| 256 | } | ||
| 257 | else { | ||
| 258 | |||
| 259 | console.error('Échec de l\'inversion'); | ||
| 260 | } | ||
| 261 | }) | ||
| 262 | .catch(error => { | ||
| 263 | console.error('Erreur:', error); | ||
| 264 | }); | ||
| 265 | } | ||
| 266 | |||
| 267 | function checkMenuEntry(page_id){ | ||
| 268 | const nav_zone = document.getElementById("nav_zone"); // parent de <nav> | ||
| 269 | const clicked_menu_entry = document.getElementById(page_id); // div parente du bouton | ||
| 270 | const checkbox = clicked_menu_entry.querySelector("input"); | ||
| 271 | let color; | ||
| 272 | |||
| 273 | fetch('index.php?menu_edit=displayInMenu', { | ||
| 274 | method: 'POST', | ||
| 275 | headers: { | ||
| 276 | 'Content-Type': 'application/json' | ||
| 277 | }, | ||
| 278 | body: JSON.stringify({ id: clicked_menu_entry.id, checked: checkbox.checked }) | ||
| 279 | }) | ||
| 280 | .then(response => response.json()) | ||
| 281 | .then(data => { | ||
| 282 | if(data.success) | ||
| 283 | { | ||
| 284 | color = checkbox.checked ? "#ff1d04" : "grey"; | ||
| 285 | clicked_menu_entry.querySelector("button").style.color = color; | ||
| 286 | |||
| 287 | nav_zone.innerHTML = ''; | ||
| 288 | nav_zone.insertAdjacentHTML('afterbegin', data.nav); | ||
| 289 | } | ||
| 290 | else { | ||
| 291 | |||
| 292 | console.error('Échec de l\'inversion'); | ||
| 293 | } | ||
| 294 | }) | ||
| 295 | .catch(error => { | ||
| 296 | console.error('Erreur:', error); | ||
| 297 | }); | ||
| 298 | } \ No newline at end of file | 205 | } \ No newline at end of file |
diff --git a/public/js/menu.js b/public/js/menu.js new file mode 100644 index 0000000..a864597 --- /dev/null +++ b/public/js/menu.js | |||
| @@ -0,0 +1,240 @@ | |||
| 1 | // flèche gauche <=: position = position du parent + 1, parent = grand-parent, recalculer les positions | ||
| 2 | function moveOneLevelUp(page_id) | ||
| 3 | { | ||
| 4 | const nav_zone = document.getElementById("nav_zone"); // parent de <nav> | ||
| 5 | const menu_edit_buttons = document.getElementById("menu_edit_buttons"); // div englobant le html généré par MenuBuilder | ||
| 6 | |||
| 7 | fetch('index.php?menu_edit=move_one_level_up', { | ||
| 8 | method: 'POST', | ||
| 9 | headers: { | ||
| 10 | 'Content-Type': 'application/json' | ||
| 11 | }, | ||
| 12 | body: JSON.stringify({ id: page_id }) | ||
| 13 | }) | ||
| 14 | .then(response => response.json()) | ||
| 15 | .then(data => { | ||
| 16 | if(data.success) | ||
| 17 | { | ||
| 18 | console.log(data); | ||
| 19 | // affichage | ||
| 20 | nav_zone.innerHTML = ''; | ||
| 21 | nav_zone.insertAdjacentHTML('afterbegin', data.nav); | ||
| 22 | menu_edit_buttons.innerHTML = ''; | ||
| 23 | menu_edit_buttons.insertAdjacentHTML('afterbegin', data.menu_buttons); | ||
| 24 | } | ||
| 25 | else { | ||
| 26 | |||
| 27 | console.error('Échec du déplacement'); | ||
| 28 | } | ||
| 29 | }) | ||
| 30 | .catch(error => { | ||
| 31 | console.error('Erreur:', error); | ||
| 32 | }); | ||
| 33 | } | ||
| 34 | |||
| 35 | // flèche droite =>: position = nombre d'éléments de la fraterie + 1, l'élément précédent devient le parent | ||
| 36 | function moveOneLevelDown(page_id) | ||
| 37 | { | ||
| 38 | const nav_zone = document.getElementById("nav_zone"); // parent de <nav> | ||
| 39 | const menu_edit_buttons = document.getElementById("menu_edit_buttons"); // div englobant le html généré par MenuBuilder | ||
| 40 | |||
| 41 | fetch('index.php?menu_edit=move_one_level_down', { | ||
| 42 | method: 'POST', | ||
| 43 | headers: { | ||
| 44 | 'Content-Type': 'application/json' | ||
| 45 | }, | ||
| 46 | body: JSON.stringify({ id: page_id }) | ||
| 47 | }) | ||
| 48 | .then(response => response.json()) | ||
| 49 | .then(data => { | ||
| 50 | if(data.success) | ||
| 51 | { | ||
| 52 | console.log(data); | ||
| 53 | // affichage | ||
| 54 | nav_zone.innerHTML = ''; | ||
| 55 | nav_zone.insertAdjacentHTML('afterbegin', data.nav); | ||
| 56 | menu_edit_buttons.innerHTML = ''; | ||
| 57 | menu_edit_buttons.insertAdjacentHTML('afterbegin', data.menu_buttons); | ||
| 58 | } | ||
| 59 | else { | ||
| 60 | console.error('Échec du déplacement'); | ||
| 61 | } | ||
| 62 | }) | ||
| 63 | .catch(error => { | ||
| 64 | console.error('Erreur:', error); | ||
| 65 | }); | ||
| 66 | |||
| 67 | /*const element = document.getElementById(page_id); // div parente du bouton cliqué | ||
| 68 | let previous_element = element.previousElementSibling; | ||
| 69 | |||
| 70 | if(previous_element != null) | ||
| 71 | { | ||
| 72 | // si l'element précédent n'a pas de chemin relatif, donc est une URL, on vérifie le précédent également | ||
| 73 | if(previous_element.querySelector(".path") == null){ | ||
| 74 | let test_previous = previous_element; | ||
| 75 | while(test_previous.querySelector(".url") != null){ | ||
| 76 | console.log(test_previous); | ||
| 77 | //if() | ||
| 78 | test_previous = test_previous.previousElementSibling; | ||
| 79 | if(test_previous == null){ | ||
| 80 | console.log("pas d'élément précédent"); | ||
| 81 | return; | ||
| 82 | } | ||
| 83 | console.log(test_previous); | ||
| 84 | } | ||
| 85 | previous_element = test_previous; | ||
| 86 | } | ||
| 87 | |||
| 88 | fetch('index.php?menu_edit=move_one_level_down', { | ||
| 89 | method: 'POST', | ||
| 90 | headers: { | ||
| 91 | 'Content-Type': 'application/json' | ||
| 92 | }, | ||
| 93 | body: JSON.stringify({ id: element.id }) | ||
| 94 | }) | ||
| 95 | .then(response => response.json()) | ||
| 96 | .then(data => { | ||
| 97 | if(data.success) | ||
| 98 | { | ||
| 99 | // | ||
| 100 | |||
| 101 | // menu régénéré | ||
| 102 | nav_zone.innerHTML = ''; | ||
| 103 | nav_zone.insertAdjacentHTML('afterbegin', data.nav); | ||
| 104 | } | ||
| 105 | else { | ||
| 106 | |||
| 107 | console.error('Échec de l\'inversion'); | ||
| 108 | } | ||
| 109 | }) | ||
| 110 | .catch(error => { | ||
| 111 | console.error('Erreur:', error); | ||
| 112 | }); | ||
| 113 | |||
| 114 | // nouveau parent | ||
| 115 | let level_div = previous_element.querySelector(".level"); | ||
| 116 | if(level_div == null){ | ||
| 117 | // créer une <div class="level"> | ||
| 118 | level_div = document.createElement("div"); | ||
| 119 | level_div.classList.add("level"); | ||
| 120 | previous_element.appendChild(level_div); | ||
| 121 | } | ||
| 122 | |||
| 123 | // déplacement | ||
| 124 | level_div.appendChild(element); | ||
| 125 | |||
| 126 | // marges | ||
| 127 | let margin_left = parseInt(element.style.marginLeft); | ||
| 128 | margin_left += 29; | ||
| 129 | element.style.marginLeft = String(margin_left) + "px"; | ||
| 130 | |||
| 131 | // MAJ des chemins affichés si c'est un chemin relatif (les liens URL ne peuvent avoir d'enfants) | ||
| 132 | const element_path = element.querySelector(".path"); | ||
| 133 | if(element_path != null){ | ||
| 134 | const previous_element_path = previous_element.querySelector(".path"); | ||
| 135 | element_path.innerHTML = previous_element_path.innerHTML + "/" + element_path.innerHTML.split("/").slice(-1); | ||
| 136 | |||
| 137 | // même chose pour tous les enfants sauf les URL vers l'extérieur | ||
| 138 | if(element.querySelector(".level") != null){ | ||
| 139 | element.querySelector(".level").querySelectorAll(".path").forEach( (one_elem) => { | ||
| 140 | const parent_elem_path = one_elem.parentNode.parentNode.parentNode.querySelector(".path"); // => div de l'élém => div class level => div du parent | ||
| 141 | const end_of_path = one_elem.innerHTML.split("/").slice(-1); | ||
| 142 | one_elem.innerHTML = parent_elem_path.innerHTML + "/" + end_of_path[0]; | ||
| 143 | }); | ||
| 144 | } | ||
| 145 | } | ||
| 146 | |||
| 147 | // dernier problème à corriger: le parent est une URL vers l'extérieur | ||
| 148 | } | ||
| 149 | else{ | ||
| 150 | // ne rien faire | ||
| 151 | console.log("pas d'élément précédent"); | ||
| 152 | }*/ | ||
| 153 | } | ||
| 154 | |||
| 155 | function switchMenuPositions(page_id, direction) | ||
| 156 | { | ||
| 157 | const nav_zone = document.getElementById("nav_zone"); // parent de <nav> | ||
| 158 | const clicked_menu_entry = document.getElementById(page_id); // div parente du bouton | ||
| 159 | let other_entry = null; | ||
| 160 | |||
| 161 | // pas bon | ||
| 162 | if(direction == 'down'){ | ||
| 163 | other_entry = clicked_menu_entry.nextElementSibling; | ||
| 164 | } | ||
| 165 | else if(direction == 'up'){ | ||
| 166 | other_entry = clicked_menu_entry.previousElementSibling; | ||
| 167 | } | ||
| 168 | |||
| 169 | if(other_entry == null){ | ||
| 170 | console.log('Inversion impossible'); | ||
| 171 | return; | ||
| 172 | } | ||
| 173 | |||
| 174 | fetch('index.php?menu_edit=switch_positions', { | ||
| 175 | method: 'POST', | ||
| 176 | headers: { | ||
| 177 | 'Content-Type': 'application/json' | ||
| 178 | }, | ||
| 179 | body: JSON.stringify({ id1: clicked_menu_entry.id, id2: other_entry.id }) | ||
| 180 | }) | ||
| 181 | .then(response => response.json()) | ||
| 182 | .then(data => { | ||
| 183 | if(data.success) | ||
| 184 | { | ||
| 185 | if(direction == 'down'){ | ||
| 186 | clicked_menu_entry.parentElement.insertBefore(other_entry, clicked_menu_entry); | ||
| 187 | } | ||
| 188 | else if(direction == 'up'){ | ||
| 189 | other_entry.parentElement.insertBefore(clicked_menu_entry, other_entry); | ||
| 190 | } | ||
| 191 | else{ | ||
| 192 | console.error('Échec de l\'inversion'); | ||
| 193 | } | ||
| 194 | |||
| 195 | // menu régénéré | ||
| 196 | nav_zone.innerHTML = ''; | ||
| 197 | nav_zone.insertAdjacentHTML('afterbegin', data.nav); | ||
| 198 | } | ||
| 199 | else { | ||
| 200 | |||
| 201 | console.error('Échec de l\'inversion'); | ||
| 202 | } | ||
| 203 | }) | ||
| 204 | .catch(error => { | ||
| 205 | console.error('Erreur:', error); | ||
| 206 | }); | ||
| 207 | } | ||
| 208 | |||
| 209 | function checkMenuEntry(page_id){ | ||
| 210 | const nav_zone = document.getElementById("nav_zone"); // parent de <nav> | ||
| 211 | const clicked_menu_entry = document.getElementById(page_id); // div parente du bouton | ||
| 212 | const checkbox = clicked_menu_entry.querySelector("input"); | ||
| 213 | let color; | ||
| 214 | |||
| 215 | fetch('index.php?menu_edit=displayInMenu', { | ||
| 216 | method: 'POST', | ||
| 217 | headers: { | ||
| 218 | 'Content-Type': 'application/json' | ||
| 219 | }, | ||
| 220 | body: JSON.stringify({ id: clicked_menu_entry.id, checked: checkbox.checked }) | ||
| 221 | }) | ||
| 222 | .then(response => response.json()) | ||
| 223 | .then(data => { | ||
| 224 | if(data.success) | ||
| 225 | { | ||
| 226 | color = checkbox.checked ? "#ff1d04" : "grey"; | ||
| 227 | clicked_menu_entry.querySelector("button").style.color = color; | ||
| 228 | |||
| 229 | nav_zone.innerHTML = ''; | ||
| 230 | nav_zone.insertAdjacentHTML('afterbegin', data.nav); | ||
| 231 | } | ||
| 232 | else { | ||
| 233 | |||
| 234 | console.error('Échec de l\'inversion'); | ||
| 235 | } | ||
| 236 | }) | ||
| 237 | .catch(error => { | ||
| 238 | console.error('Erreur:', error); | ||
| 239 | }); | ||
| 240 | } \ No newline at end of file | ||
