diff options
| author | polo <ordipolo@gmx.fr> | 2025-07-19 13:15:12 +0200 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2025-07-19 13:15:12 +0200 |
| commit | 976eaa544322be18c9feb1a165b9645533af4538 (patch) | |
| tree | 39ce8d68222b1b116390276f5b4751b7913b42e8 | |
| parent | 8338cbe662018eb7b7ec01cbbd21531aca1d9b31 (diff) | |
| download | cms-976eaa544322be18c9feb1a165b9645533af4538.tar.gz cms-976eaa544322be18c9feb1a165b9645533af4538.tar.bz2 cms-976eaa544322be18c9feb1a165b9645533af4538.zip | |
amélioration calendrier écran tactile, selection sans touché prolongé, versionedFileURL() dispo de partout
| -rw-r--r-- | public/css/calendar.css | 23 | ||||
| -rw-r--r-- | public/js/calendar.js | 18 | ||||
| -rw-r--r-- | public/js/calendar_admin.js | 2 | ||||
| -rw-r--r-- | src/view/HeadBuilder.php | 16 | ||||
| -rw-r--r-- | src/view/templates/calendar.php | 4 |
5 files changed, 44 insertions, 19 deletions
diff --git a/public/css/calendar.css b/public/css/calendar.css index 1cfb0fd..314a5ad 100644 --- a/public/css/calendar.css +++ b/public/css/calendar.css | |||
| @@ -1,7 +1,10 @@ | |||
| 1 | /* !important est nécessaire pour écraser le CSS inséré par le javascript de fullcalendar */ | ||
| 2 | |||
| 1 | .event{ | 3 | .event{ |
| 2 | border: 2px double; | 4 | border: 2px double; |
| 3 | border-radius: 5px; | 5 | border-radius: 5px; |
| 4 | width: max-content; | 6 | width: max-content; |
| 7 | max-width: 250px; | ||
| 5 | padding: 5px; | 8 | padding: 5px; |
| 6 | } | 9 | } |
| 7 | #calendar_zone{ | 10 | #calendar_zone{ |
| @@ -13,16 +16,17 @@ | |||
| 13 | #calendar{ | 16 | #calendar{ |
| 14 | width: 1165px; /* on enlève le "gap" */ | 17 | width: 1165px; /* on enlève le "gap" */ |
| 15 | } | 18 | } |
| 19 | #event_modal{} | ||
| 16 | .event_title_box{ | 20 | .event_title_box{ |
| 17 | display: flex; | 21 | display: flex; |
| 18 | align-items: center; | 22 | align-items: center; |
| 19 | justify-content: space-between; | 23 | justify-content: space-between; |
| 20 | } | 24 | } |
| 21 | .event_close_button{ | 25 | .event_close_button{ |
| 22 | height: fit-content; | 26 | /*height: fit-content;*/ |
| 23 | } | 27 | } |
| 24 | .fc-toolbar-title{ | 28 | .fc-toolbar-title{ |
| 25 | font-size: x-large !important; | 29 | /*font-size: x-large !important;*/ |
| 26 | } | 30 | } |
| 27 | .fc-button{ | 31 | .fc-button{ |
| 28 | padding: 0.2em 0.4em !important; | 32 | padding: 0.2em 0.4em !important; |
| @@ -60,12 +64,21 @@ td .fc-timegrid-axis{ | |||
| 60 | padding: 0; | 64 | padding: 0; |
| 61 | } | 65 | } |
| 62 | .fc-toolbar-title{ | 66 | .fc-toolbar-title{ |
| 63 | font-size: large !important; | 67 | /*font-size: large !important;*/ |
| 68 | } | ||
| 69 | .fc-header-toolbar{ | ||
| 70 | font-size: smaller; | ||
| 71 | } | ||
| 72 | h3, p, .event > button{ | ||
| 73 | font-size: smaller; | ||
| 64 | } | 74 | } |
| 65 | } | 75 | } |
| 66 | @media screen and (max-width: 650px){ | 76 | @media screen and (max-width: 650px){ |
| 67 | .fc-toolbar-chunk{ | 77 | .fc-header-toolbar{ |
| 68 | font-size: smaller; | 78 | font-size: small; |
| 79 | } | ||
| 80 | .fc-toolbar-title{ | ||
| 81 | font-size: 1.5em !important; /* au lieu de 1.75em */ | ||
| 69 | } | 82 | } |
| 70 | } | 83 | } |
| 71 | @media screen and (max-width: 550px){ | 84 | @media screen and (max-width: 550px){ |
diff --git a/public/js/calendar.js b/public/js/calendar.js index 7450a91..2275c10 100644 --- a/public/js/calendar.js +++ b/public/js/calendar.js | |||
| @@ -29,6 +29,8 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 29 | stickyHeaderDates: true, // garder les en-tête de colonnes lors du scroll | 29 | stickyHeaderDates: true, // garder les en-tête de colonnes lors du scroll |
| 30 | fixedWeekCount: false, // avec false, affiche 4, 5 ou 6 semaines selon le mois | 30 | fixedWeekCount: false, // avec false, affiche 4, 5 ou 6 semaines selon le mois |
| 31 | selectable: true, // sélection de jours multiples | 31 | selectable: true, // sélection de jours multiples |
| 32 | longPressDelay: 0, /* par défaut sur mobile, select est déclenché avec un appui d'une seconde, | ||
| 33 | chatgpt déconseille 0 par risque de conflit entre selection et scrolling, mettre plutôt 200 ou 300ms */ | ||
| 32 | navLinks: true, // numéros de jour et de semaines clicables | 34 | navLinks: true, // numéros de jour et de semaines clicables |
| 33 | 35 | ||
| 34 | // vue semaine | 36 | // vue semaine |
| @@ -43,6 +45,14 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 43 | selected_start_string = info.startStr; // variable "globale" | 45 | selected_start_string = info.startStr; // variable "globale" |
| 44 | hideModal(); | 46 | hideModal(); |
| 45 | }, | 47 | }, |
| 48 | // méthode alternative à longPressDelay: 0 pour obtenir une sélection d'un simple "tap" sur écran tactile (mettre le if inverse dans select) | ||
| 49 | /*dateClick: function(info) { | ||
| 50 | if (window.matchMedia('(pointer: coarse)').matches) { | ||
| 51 | // utile sur mobile/tablette : déclenche sur un tap | ||
| 52 | console.log('dateClick', info.dateStr); | ||
| 53 | calendar.select(info.date, info.date); // hack permettant de sélectionner une journée seule uniquement | ||
| 54 | } | ||
| 55 | },*/ | ||
| 46 | //unselect: function(event, view){}, | 56 | //unselect: function(event, view){}, |
| 47 | 57 | ||
| 48 | eventClick: function(info){ | 58 | eventClick: function(info){ |
| @@ -72,14 +82,14 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 72 | <h3>` + info.event.title + `</h3> | 82 | <h3>` + info.event.title + `</h3> |
| 73 | <p><i>` + info.event.extendedProps.description + `</i></p>`; | 83 | <p><i>` + info.event.extendedProps.description + `</i></p>`; |
| 74 | if(checked && (formated_start === formated_end)){ // affichage simplifié évènement d'un jour | 84 | if(checked && (formated_start === formated_end)){ // affichage simplifié évènement d'un jour |
| 75 | aside_content = aside_content + `<p>le ` + formated_start + `</p> | 85 | aside_content = aside_content + `<p>le ` + formated_start + `</p>`; |
| 76 | </div>`; | ||
| 77 | } | 86 | } |
| 78 | else{ | 87 | else{ |
| 79 | aside_content = aside_content + `<p>du ` + formated_start + `</p> | 88 | aside_content = aside_content + `<p>du ` + formated_start + `</p> |
| 80 | <p>au ` + formated_end + `</p> | 89 | <p>au ` + formated_end + `</p>`; |
| 81 | </div>`; | ||
| 82 | } | 90 | } |
| 91 | aside_content += `<button class="event_close_button">Fermer</button> | ||
| 92 | </div>`; | ||
| 83 | 93 | ||
| 84 | aside.innerHTML = aside_content; | 94 | aside.innerHTML = aside_content; |
| 85 | calendar.updateSize(); | 95 | calendar.updateSize(); |
diff --git a/public/js/calendar_admin.js b/public/js/calendar_admin.js index 76a1ce9..7f167a4 100644 --- a/public/js/calendar_admin.js +++ b/public/js/calendar_admin.js | |||
| @@ -30,6 +30,8 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 30 | stickyHeaderDates: true, // garder les en-tête de colonnes lors du scroll | 30 | stickyHeaderDates: true, // garder les en-tête de colonnes lors du scroll |
| 31 | fixedWeekCount: false, // avec false, affiche 4, 5 ou 6 semaines selon le mois | 31 | fixedWeekCount: false, // avec false, affiche 4, 5 ou 6 semaines selon le mois |
| 32 | selectable: true, // sélection de jours multiples | 32 | selectable: true, // sélection de jours multiples |
| 33 | longPressDelay: 0, /* par défaut sur mobile, select est déclenché avec un appui d'une seconde, | ||
| 34 | chatgpt déconseille 0 par risque de conflit entre selection et scrolling, mettre plutôt 200 ou 300ms */ | ||
| 33 | navLinks: true, // numéros de jour et de semaines clicables | 35 | navLinks: true, // numéros de jour et de semaines clicables |
| 34 | 36 | ||
| 35 | // vue semaine | 37 | // vue semaine |
diff --git a/src/view/HeadBuilder.php b/src/view/HeadBuilder.php index f1f41ba..06a1301 100644 --- a/src/view/HeadBuilder.php +++ b/src/view/HeadBuilder.php | |||
| @@ -26,25 +26,25 @@ class HeadBuilder extends AbstractBuilder | |||
| 26 | $css = ''; | 26 | $css = ''; |
| 27 | foreach($css_array as $name) | 27 | foreach($css_array as $name) |
| 28 | { | 28 | { |
| 29 | $css .= '<link rel="stylesheet" href="' . $this->versionedFileURL('css', $name) . '">' . "\n"; | 29 | $css .= '<link rel="stylesheet" href="' . self::versionedFileURL('css', $name) . '">' . "\n"; |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | $js = ''; | 32 | $js = ''; |
| 33 | foreach($js_array as $name) | 33 | foreach($js_array as $name) |
| 34 | { | 34 | { |
| 35 | $js .= '<script src="' . $this->versionedFileURL('js', $name) . '"></script>' . "\n"; | 35 | $js .= '<script src="' . self::versionedFileURL('js', $name) . '"></script>' . "\n"; |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | if(MainBuilder::$modif_mode){ | 38 | if(MainBuilder::$modif_mode){ |
| 39 | $css .= '<link rel="stylesheet" href="' . $this->versionedFileURL('css', 'modif_page') . '">' . "\n"; | 39 | $css .= '<link rel="stylesheet" href="' . self::versionedFileURL('css', 'modif_page') . '">' . "\n"; |
| 40 | $js .= '<script src="' . $this->versionedFileURL('js', 'modif_page') . '"></script>' . "\n"; | 40 | $js .= '<script src="' . self::versionedFileURL('js', 'modif_page') . '"></script>' . "\n"; |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | // tinymce, nécéssite un script de copie dans composer.json | 43 | // tinymce, nécéssite un script de copie dans composer.json |
| 44 | if($_SESSION['admin']){ | 44 | if($_SESSION['admin']){ |
| 45 | $css .= '<link rel="stylesheet" href="' . $this->versionedFileURL('css', 'tinymce') . '">' . "\n"; | 45 | $css .= '<link rel="stylesheet" href="' . self::versionedFileURL('css', 'tinymce') . '">' . "\n"; |
| 46 | $js .= '<script src="' . $this->versionedFileURL('js', 'tinymce/tinymce.min') . '"></script>' . "\n"; // pour js/tinymce/tinymce.min.js | 46 | $js .= '<script src="' . self::versionedFileURL('js', 'tinymce/tinymce.min') . '"></script>' . "\n"; // pour js/tinymce/tinymce.min.js |
| 47 | $js .= '<script src="' . $this->versionedFileURL('js', 'tinymce') . '"></script>' . "\n"; | 47 | $js .= '<script src="' . self::versionedFileURL('js', 'tinymce') . '"></script>' . "\n"; |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | // titre | 50 | // titre |
| @@ -77,7 +77,7 @@ class HeadBuilder extends AbstractBuilder | |||
| 77 | return $this->stop; | 77 | return $this->stop; |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | private function versionedFileURL(string $type, string $filename): string | 80 | static public function versionedFileURL(string $type, string $filename): string |
| 81 | { | 81 | { |
| 82 | $path = $type . '/' . $filename . '.' . $type; | 82 | $path = $type . '/' . $filename . '.' . $type; |
| 83 | 83 | ||
diff --git a/src/view/templates/calendar.php b/src/view/templates/calendar.php index 144df00..e45f631 100644 --- a/src/view/templates/calendar.php +++ b/src/view/templates/calendar.php | |||
| @@ -8,10 +8,10 @@ | |||
| 8 | <script src='js/fullcalendar/packages/core/locales/fr.global.min.js'></script> | 8 | <script src='js/fullcalendar/packages/core/locales/fr.global.min.js'></script> |
| 9 | <?php | 9 | <?php |
| 10 | if($_SESSION['admin'] === true){ | 10 | if($_SESSION['admin'] === true){ |
| 11 | echo '<script src="js/calendar_admin.js"></script>' . "\n"; | 11 | echo '<script src="' . HeadBuilder::versionedFileURL('js', 'calendar_admin') . '"></script>' . "\n"; |
| 12 | } | 12 | } |
| 13 | else{ | 13 | else{ |
| 14 | echo '<script src="js/calendar.js"></script>' . "\n"; | 14 | echo '<script src="' . HeadBuilder::versionedFileURL('js', 'calendar') . '"></script>' . "\n"; |
| 15 | } | 15 | } |
| 16 | ?> | 16 | ?> |
| 17 | <h3><?= $title ?></h3> | 17 | <h3><?= $title ?></h3> |
