From a6a22a583fd069f09343c03534f0b73f54b889cc Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Wed, 4 Dec 2024 11:31:47 +0100
Subject: [PATCH] Display tardiness in statistics page

---
 .../statistics/StatisticsForPersonPage.vue    | 25 ++++++++++++++++---
 aleksis/apps/alsijil/schema/__init__.py       |  2 +-
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/statistics/StatisticsForPersonPage.vue b/aleksis/apps/alsijil/frontend/components/coursebook/statistics/StatisticsForPersonPage.vue
index cd968ba43..a1fd5ff0e 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/statistics/StatisticsForPersonPage.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/statistics/StatisticsForPersonPage.vue
@@ -46,10 +46,10 @@
                 v-for="item in items"
                 :key="item.id"
                 ripple
-                :readonly="!item.canEdit"
+                :readonly="!showEdit(item)"
               >
                 <v-expansion-panel-header
-                  :hide-actions="!item.canEdit"
+                  :hide-actions="!showEdit(item) && !showDelete(item)"
                   disable-icon-rotate
                 >
                   <template #actions>
@@ -125,12 +125,19 @@
                       </v-list-item-content>
                     </v-col>
                     <v-col cols="12" md="6" class="pa-0">
-                      <v-list-item-action class="full-width justify-md-end">
+                      <v-list-item-action
+                        class="flex-row full-width justify-md-end ma-0 align-center fill-height"
+                      >
                         <!-- chips: absences & extraMarks -->
                         <absence-reason-chip
                           v-if="item.absenceReason"
                           :absence-reason="item.absenceReason"
                         />
+                        <tardiness-chip
+                          v-if="item.tardiness"
+                          :tardiness="item.tardiness"
+                          class="ms-1"
+                        />
                         <extra-mark-chip
                           v-if="item.extraMark"
                           :extra-mark="item.extraMark"
@@ -199,10 +206,12 @@ import {
 import ExtraMarkChip from "../../extra_marks/ExtraMarkChip.vue";
 import { MODE } from "./modes.js";
 import PersonalNoteChip from "../personal_notes/PersonalNoteChip.vue";
+import TardinessChip from "../absences/TardinessChip.vue";
 
 export default {
   name: "StatisticsForPersonPage",
   components: {
+    TardinessChip,
     PersonalNoteChip,
     ActiveSchoolTermSelect,
     ExtraMarkChip,
@@ -277,6 +286,16 @@ export default {
         },
       });
     },
+    showEdit(item) {
+      // Notes with ExtraMark cannot be edited, only deleted
+      return (
+        item.canEdit && (item.note || item.absenceReason || item.tardiness)
+      );
+    },
+    showDelete(item) {
+      // Only ExtraMarks can be deleted
+      return item.canDelete && item.extraMark;
+    },
   },
 };
 </script>
diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index 604cda6cd..284d8da2d 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -309,8 +309,8 @@ class Query(graphene.ObjectType):
         school_term = get_active_school_term(info.context)
         return graphene_django_optimizer.query(
             ParticipationStatus.objects.filter(
+                Q(absence_reason__isnull=False) | Q(tardiness__isnull=False),
                 person=person,
-                absence_reason__isnull=False,
                 datetime_start__date__gte=school_term.date_start,
                 datetime_end__date__lte=school_term.date_end,
             ).order_by("-related_documentation__datetime_start"),
-- 
GitLab