Skip to content
Snippets Groups Projects
Commit 003f8836 authored by Hangzhi Yu's avatar Hangzhi Yu
Browse files

Use generic infinite scrolling component for coursebook

parent bcf33900
No related branches found
No related tags found
1 merge request!363Resolve "Add absence overview page"
Pipeline #188737 failed
<template> <template>
<c-r-u-d-iterator <infinite-scrolling-date-sorted-c-r-u-d-iterator
i18n-key="alsijil.coursebook" i18n-key="alsijil.coursebook"
:gql-query="gqlQuery" :gql-query="gqlQuery"
:gql-additional-query-args="gqlQueryArgs" :gql-additional-query-args="gqlQueryArgs"
...@@ -16,38 +16,22 @@ ...@@ -16,38 +16,22 @@
<template #additionalActions="{ attrs, on }"> <template #additionalActions="{ attrs, on }">
<coursebook-filters v-model="filters" /> <coursebook-filters v-model="filters" />
</template> </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 <template #item="{ item, lastQuery }">
:value="currentDate" <documentation-modal
@input="gotoDate" :documentation="item"
@prev="gotoPrev" :affected-query="lastQuery"
@next="gotoNext"
/> />
</template> </template>
<template #loading> <template #loading>
<coursebook-loader :number-of-days="10" :number-of-docs="5" /> <coursebook-loader :number-of-days="10" :number-of-docs="5" />
</template> </template>
<template #itemLoader>
<coursebook-loader />
</template>
<template #no-data> <template #no-data>
<CoursebookEmptyMessage icon="mdi-book-off-outline"> <CoursebookEmptyMessage icon="mdi-book-off-outline">
{{ $t("alsijil.coursebook.no_data") }} {{ $t("alsijil.coursebook.no_data") }}
...@@ -61,18 +45,17 @@ ...@@ -61,18 +45,17 @@
}} }}
</CoursebookEmptyMessage> </CoursebookEmptyMessage>
</template> </template>
</c-r-u-d-iterator> </infinite-scrolling-date-sorted-c-r-u-d-iterator>
</template> </template>
<script> <script>
import CRUDIterator from "aleksis.core/components/generic/CRUDIterator.vue"; import InfiniteScrollingDateSortedCRUDIterator from "aleksis.core/components/generic/InfiniteScrollingDateSortedCRUDIterator.vue";
import DateSelectFooter from "aleksis.core/components/generic/DateSelectFooter.vue";
import CoursebookDay from "./CoursebookDay.vue";
import { DateTime, Interval } from "luxon"; import { DateTime, Interval } from "luxon";
import { documentationsForCoursebook } from "./coursebook.graphql"; import { documentationsForCoursebook } from "./coursebook.graphql";
import CoursebookFilters from "./CoursebookFilters.vue"; import CoursebookFilters from "./CoursebookFilters.vue";
import CoursebookLoader from "./CoursebookLoader.vue"; import CoursebookLoader from "./CoursebookLoader.vue";
import CoursebookEmptyMessage from "./CoursebookEmptyMessage.vue"; import CoursebookEmptyMessage from "./CoursebookEmptyMessage.vue";
import DocumentationModal from "./documentation/DocumentationModal.vue";
export default { export default {
name: "Coursebook", name: "Coursebook",
...@@ -80,9 +63,8 @@ export default { ...@@ -80,9 +63,8 @@ export default {
CoursebookEmptyMessage, CoursebookEmptyMessage,
CoursebookFilters, CoursebookFilters,
CoursebookLoader, CoursebookLoader,
CRUDIterator, DocumentationModal,
DateSelectFooter, InfiniteScrollingDateSortedCRUDIterator,
CoursebookDay,
}, },
props: { props: {
filterType: { filterType: {
......
<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>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment