diff --git a/app/models/assiduites.py b/app/models/assiduites.py
index f645f5c5acbb58e13365cd4b079aae1d0c7d5755..241e44aa636f1c34c6ed8d754477f02fa454d489 100644
--- a/app/models/assiduites.py
+++ b/app/models/assiduites.py
@@ -353,12 +353,12 @@ class Assiduite(ScoDocModel):
 
         elif self.external_data is not None and "module" in self.external_data:
             return (
-                "Tout module"
+                "Autre module (pas dans la liste)"
                 if self.external_data["module"] == "Autre"
                 else self.external_data["module"]
             )
 
-        return "Non spécifié" if traduire else None
+        return "Module non spécifié" if traduire else None
 
     def get_saisie(self) -> str:
         """
diff --git a/app/static/js/assiduites.js b/app/static/js/assiduites.js
index c9fd3fb9dc9f90f0f482e833ff6d28b4b36548a5..e22764b5eb34923efcb585d55a7914d53d8d20dd 100644
--- a/app/static/js/assiduites.js
+++ b/app/static/js/assiduites.js
@@ -401,7 +401,7 @@ async function creerTousLesEtudiants(etuds) {
  * @returns {String}
  */
 async function getModuleImpl(assiduite) {
-  if (assiduite == null) return "Pas de module";
+  if (assiduite == null) return "Module non spécifié";
   const id = assiduite.moduleimpl_id;
 
   if (id == null || id == undefined) {
@@ -414,7 +414,7 @@ async function getModuleImpl(assiduite) {
         ? "Autre module (pas dans la liste)"
         : assiduite.external_data.module;
     } else {
-      return "Pas de module";
+      return "Module non spécifié";
     }
   }
 
@@ -890,6 +890,11 @@ function setupAssiduiteBubble(el, assiduite) {
   actionsDiv.appendChild(infos);
   bubble.appendChild(actionsDiv);
 
+  const stateDiv = document.createElement("div");
+  stateDiv.className = "assiduite-state";
+  stateDiv.textContent = `État: ${assiduite.etat.capitalize()}`;
+  bubble.appendChild(stateDiv);
+
   const idDiv = document.createElement("div");
   idDiv.className = "assiduite-id";
   getModuleImpl(assiduite).then((modImpl) => {
@@ -897,26 +902,32 @@ function setupAssiduiteBubble(el, assiduite) {
   });
   bubble.appendChild(idDiv);
 
-  const periodDivDeb = document.createElement("div");
-  periodDivDeb.className = "assiduite-period";
-  periodDivDeb.textContent = `${formatDateModal(assiduite.date_debut)}`;
-  bubble.appendChild(periodDivDeb);
-  const periodDivFin = document.createElement("div");
-  periodDivFin.className = "assiduite-period";
-  periodDivFin.textContent = `${formatDateModal(assiduite.date_fin)}`;
-  bubble.appendChild(periodDivFin);
+  // Affichage des dates
+  // si les jours sont les mêmes, on affiche "jour hh:mm - hh:mm"
+  // sinon on affiche "jour hh:mm - jour hh:mm"
+  const periodDiv = document.createElement("div");
+  periodDiv.className = "assiduite-period";
+  const dateDeb = new Date(Date.removeUTC(assiduite.date_debut));
+  const dateFin = new Date(Date.removeUTC(assiduite.date_fin));
+  if (dateDeb.isSame(dateFin, "day")) {
+    const jour = dateDeb.format("DD/MM/YYYY");
+    const deb = dateDeb.format("HH:mm");
+    const fin = dateFin.format("HH:mm");
+    periodDiv.textContent = `${jour} de ${deb} à ${fin}`;
+  } else {
+    const jourDeb = dateDeb.format("DD/MM/YYYY");
+    const jourFin = dateFin.format("DD/MM/YYYY");
+    periodDiv.textContent = `du ${jourDeb} au ${jourFin}`;
+  }
 
-  const stateDiv = document.createElement("div");
-  stateDiv.className = "assiduite-state";
-  stateDiv.textContent = `État: ${assiduite.etat.capitalize()}`;
-  bubble.appendChild(stateDiv);
+  bubble.appendChild(periodDiv);
 
   const motifDiv = document.createElement("div");
-  stateDiv.className = "assiduite-why";
+  motifDiv.className = "assiduite-why";
   const motif = ["", null, undefined].includes(assiduite.desc)
-    ? "Pas de motif"
+    ? "Non spécifié"
     : assiduite.desc.capitalize();
-  stateDiv.textContent = `Motif: ${motif}`;
+  motifDiv.textContent = `Motif: ${motif}`;
   bubble.appendChild(motifDiv);
 
   const userIdDiv = document.createElement("div");
diff --git a/app/templates/assiduites/widgets/assiduite_bubble.j2 b/app/templates/assiduites/widgets/assiduite_bubble.j2
index 23004a866489623b3bbb516e3a6b507c1065672a..546bd9a6abcb5d5b55c82dba40585f109b69bff5 100644
--- a/app/templates/assiduites/widgets/assiduite_bubble.j2
+++ b/app/templates/assiduites/widgets/assiduite_bubble.j2
@@ -1,8 +1,7 @@
 <div class="assiduite-bubble {{etat}}">
-    <div class="assiduite-id">{{moduleimpl}}</div>
-    <div class="assiduite-period">{{date_debut}}</div>
-    <div class="assiduite-period">{{date_fin}}</div>
     <div class="assiduite-state">État: {{etat}}</div>
+    <div class="assiduite-id">{{moduleimpl}}</div>
+    <div class="assiduite-period">{{date}}</div>
     <div class="assiduite-why">Motif: {{motif}}</div>
     <div class="assiduite-user_id">{{saisie}}</div>
 </div>
\ No newline at end of file
diff --git a/app/views/assiduites.py b/app/views/assiduites.py
index b9020dec470cd8fcd9079dd9fa66eaa0d87505a9..f5ffe223fd5b33c9a8462ff4576a334117dc8e8b 100644
--- a/app/views/assiduites.py
+++ b/app/views/assiduites.py
@@ -2581,14 +2581,26 @@ def _generate_assiduite_bubble(assiduite: Assiduite) -> str:
     # Récupérer informations saisie
     saisie: str = assiduite.get_saisie()
 
-    motif: str = assiduite.description if assiduite.description else ""
+    motif: str = assiduite.description or "Non spécifié"
+
+    # Récupérer date
+
+    if assiduite.date_debut.date() == assiduite.date_fin.date():
+        jour = assiduite.date_debut.strftime("%d/%m/%Y")
+        heure_deb: str = assiduite.date_debut.strftime("%H:%M")
+        heure_fin: str = assiduite.date_fin.strftime("%H:%M")
+        date: str = f"{jour} de {heure_deb} à {heure_fin}"
+    else:
+        date: str = (
+            f"du {assiduite.date_debut.strftime('%d/%m/%Y')} "
+            + f"au {assiduite.date_fin.strftime('%d/%m/%Y')}"
+        )
 
     return render_template(
         "assiduites/widgets/assiduite_bubble.j2",
         moduleimpl=moduleimpl_infos,
         etat=scu.EtatAssiduite(assiduite.etat).name.lower(),
-        date_debut=assiduite.date_debut.strftime("%d/%m/%Y %H:%M"),
-        date_fin=assiduite.date_fin.strftime("%d/%m/%Y %H:%M"),
+        date=date,
         saisie=saisie,
         motif=motif,
     )