From 003f88369e617510a0da6fe2182e7b27a65a1449 Mon Sep 17 00:00:00 2001
From: Hangzhi Yu <hangzhi@protonmail.com>
Date: Thu, 6 Jun 2024 18:13:58 +0200
Subject: [PATCH] Use generic infinite scrolling component for coursebook

---
 .../components/coursebook/Coursebook.vue      | 48 +++++---------
 .../components/coursebook/CoursebookDay.vue   | 66 -------------------
 2 files changed, 15 insertions(+), 99 deletions(-)
 delete mode 100644 aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue

diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
index 4e673db88..4a072b2b5 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
@@ -1,5 +1,5 @@
 <template>
-  <c-r-u-d-iterator
+  <infinite-scrolling-date-sorted-c-r-u-d-iterator
     i18n-key="alsijil.coursebook"
     :gql-query="gqlQuery"
     :gql-additional-query-args="gqlQueryArgs"
@@ -16,38 +16,22 @@
     <template #additionalActions="{ attrs, on }">
       <coursebook-filters v-model="filters" />
     </template>
-    <template #default="{ items }">
-      <coursebook-loader />
-      <coursebook-day
-        v-for="{ date, docs, first, last } in groupDocsByDay(items)"
-        v-intersect="{
-          handler: intersectHandler(date, first, last),
-          options: {
-            rootMargin: '-' + topMargin + 'px 0px 0px 0px',
-            threshold: [0, 1],
-          },
-        }"
-        :date="date"
-        :docs="docs"
-        :lastQuery="lastQuery"
-        :focus-on-mount="initDate && initDate.toMillis() === date.toMillis()"
-        @init="transition"
-        :key="'day-' + date"
-        ref="days"
-      />
-      <coursebook-loader />
 
-      <date-select-footer
-        :value="currentDate"
-        @input="gotoDate"
-        @prev="gotoPrev"
-        @next="gotoNext"
+    <template #item="{ item, lastQuery }">
+      <documentation-modal
+        :documentation="item"
+        :affected-query="lastQuery"
       />
     </template>
+
     <template #loading>
       <coursebook-loader :number-of-days="10" :number-of-docs="5" />
     </template>
 
+    <template #itemLoader>
+      <coursebook-loader />
+    </template>
+
     <template #no-data>
       <CoursebookEmptyMessage icon="mdi-book-off-outline">
         {{ $t("alsijil.coursebook.no_data") }}
@@ -61,18 +45,17 @@
         }}
       </CoursebookEmptyMessage>
     </template>
-  </c-r-u-d-iterator>
+  </infinite-scrolling-date-sorted-c-r-u-d-iterator>
 </template>
 
 <script>
-import CRUDIterator from "aleksis.core/components/generic/CRUDIterator.vue";
-import DateSelectFooter from "aleksis.core/components/generic/DateSelectFooter.vue";
-import CoursebookDay from "./CoursebookDay.vue";
+import InfiniteScrollingDateSortedCRUDIterator from "aleksis.core/components/generic/InfiniteScrollingDateSortedCRUDIterator.vue";
 import { DateTime, Interval } from "luxon";
 import { documentationsForCoursebook } from "./coursebook.graphql";
 import CoursebookFilters from "./CoursebookFilters.vue";
 import CoursebookLoader from "./CoursebookLoader.vue";
 import CoursebookEmptyMessage from "./CoursebookEmptyMessage.vue";
+import DocumentationModal from "./documentation/DocumentationModal.vue";
 
 export default {
   name: "Coursebook",
@@ -80,9 +63,8 @@ export default {
     CoursebookEmptyMessage,
     CoursebookFilters,
     CoursebookLoader,
-    CRUDIterator,
-    DateSelectFooter,
-    CoursebookDay,
+    DocumentationModal,
+    InfiniteScrollingDateSortedCRUDIterator,
   },
   props: {
     filterType: {
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
deleted file mode 100644
index 14411e9ce..000000000
--- a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
+++ /dev/null
@@ -1,66 +0,0 @@
-<template>
-  <v-list-item :style="{ scrollMarginTop: '145px' }" two-line>
-    <v-list-item-content>
-      <v-subheader class="text-h6">{{
-        $d(date, "dateWithWeekday")
-      }}</v-subheader>
-      <v-list max-width="100%" class="pt-0 mt-n1">
-        <v-list-item
-          v-for="doc in docs"
-          :key="'documentation-' + (doc.oldId || doc.id)"
-        >
-          <documentation-modal
-            :documentation="doc"
-            :affected-query="lastQuery"
-          />
-        </v-list-item>
-      </v-list>
-    </v-list-item-content>
-  </v-list-item>
-</template>
-
-<script>
-import DocumentationModal from "./documentation/DocumentationModal.vue";
-export default {
-  name: "CoursebookDay",
-  components: {
-    DocumentationModal,
-  },
-  props: {
-    date: {
-      type: Object,
-      required: true,
-    },
-    docs: {
-      type: Array,
-      required: true,
-    },
-    lastQuery: {
-      type: Object,
-      required: true,
-    },
-    focusOnMount: {
-      type: Boolean,
-      required: false,
-      default: false,
-    },
-  },
-  emits: ["init"],
-  methods: {
-    focus(how) {
-      this.$el.scrollIntoView({
-        behavior: how,
-        block: "start",
-        inline: "nearest",
-      });
-      console.log("focused @", this.date.toISODate());
-    },
-  },
-  mounted() {
-    if (this.focusOnMount) {
-      this.$nextTick(this.focus("instant"));
-      this.$emit("init");
-    }
-  },
-};
-</script>
-- 
GitLab