From b82c28430859977dc923b5691fbd6f66766a6f75 Mon Sep 17 00:00:00 2001
From: Michael Bauer <michael-bauer@posteo.de>
Date: Fri, 12 Apr 2024 21:19:28 +0200
Subject: [PATCH] Focus intial day

Each day is now a component with a focus method.
The magic number: scrollMarginTop: '145px
Is the height of both headers & should be accessible in
script/template; but isn't.
---
 .../components/coursebook/Coursebook.vue      | 37 ++++------
 .../components/coursebook/CoursebookDay.vue   | 69 +++++++++++++++++++
 2 files changed, 81 insertions(+), 25 deletions(-)
 create 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 65ab99a56..26a76b71c 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
@@ -17,7 +17,7 @@
       <coursebook-filters v-model="filters" />
     </template>
     <template #default="{ items }">
-      <v-list-item
+      <coursebook-day
         v-for="{ date, docs, idx, lastIdx } in groupDocsByDay(items)"
         v-intersect="{
             handler: intersectHandler(date, idx, lastIdx),
@@ -25,27 +25,11 @@
               threshold: [0, 1],
             },
           }"
-        two-line
-        :key="'day-' + date"
-        :id="'documentation_' + date.toISODate()"
-      >
-        <v-list-item-content>
-          <v-subheader class="text-h6">{{
-            $d(day[0], "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>
+        :date="date"
+        :docs="docs"
+        :lastQuery="lastQuery"
+        :focus-on-mount="gotoDate.toMillis() === date.toMillis()"
+        />
 
       <date-select-footer :value="$route.hash.substring(1)" />
     </template>
@@ -72,7 +56,7 @@
 <script>
 import CRUDIterator from "aleksis.core/components/generic/CRUDIterator.vue";
 import DateSelectFooter from "aleksis.core/components/generic/DateSelectFooter.vue";
-import DocumentationModal from "./documentation/DocumentationModal.vue";
+import CoursebookDay from "./CoursebookDay.vue";
 import { DateTime, Interval } from "luxon";
 import { documentationsForCoursebook } from "./coursebook.graphql";
 import CoursebookFilters from "./CoursebookFilters.vue";
@@ -87,7 +71,7 @@ export default {
     CoursebookLoader,
     CRUDIterator,
     DateSelectFooter,
-    DocumentationModal,
+    CoursebookDay,
   },
   props: {
     filterType: {
@@ -116,7 +100,9 @@ export default {
       courses: [],
       incomplete: false,
       // TODO: Start with false until main query finished
-      ready: true,
+      ready: false,
+      gotoDate: false,
+      // TODO: Who sets ready true & gotoDate false?
     };
   },
   computed: {
@@ -181,6 +167,7 @@ export default {
       } 
 
       const date = DateTime.fromISO(this.$route.hash.substring(1));
+      this.gotoDate = date;
       this.dateStart = date.minus({ days: 3 }).toISODate();
       this.dateEnd = date.plus({ days: 4 }).toISODate();
     },
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
new file mode 100644
index 000000000..4c6171c81
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
@@ -0,0 +1,69 @@
+<template>
+  <v-list-item
+    :style="{ scrollMarginTop: '145px' }"
+    two-line
+    :key="'day-' + date"
+  >
+    <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,
+    },
+  },
+  methods: {
+    focus(how) {
+      this.$el.scrollIntoView({
+        behavior: how,
+        block: "start",
+        inline: "nearest"
+      });
+    },
+  },
+  mounted() {
+    console.log('mounted ', this.date.toISODate(), this.focusOnMount);
+    if (this.focusOnMount) {
+      this.$nextTick(this.focus("instant"));
+      console.log('focused @', this.date.toISODate());
+    }
+  },
+};
+</script>
-- 
GitLab