Move course session switcher to top navigation

This commit is contained in:
Ramon Wenger 2024-11-07 15:38:34 +01:00
parent f560531df2
commit 9b89177db5
5 changed files with 55 additions and 36 deletions

View File

@ -1,29 +1,16 @@
<template> <template>
<AccountMenuContent <AccountMenuContent :user="userStore" @logout="logout" @close="emit('close')" />
:course-sessions="courseSessionsStore.allCurrentCourseSessions"
:selected-course-session="courseSessionsStore.currentCourseSession?.id"
:user="userStore"
@logout="logout"
@select-course-session="selectCourseSession"
@close="emit('close')"
/>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import AccountMenuContent from "@/components/header/AccountMenuContent.vue"; import AccountMenuContent from "@/components/header/AccountMenuContent.vue";
import { useCourseSessionsStore } from "@/stores/courseSessions";
import { useUserStore } from "@/stores/user"; import { useUserStore } from "@/stores/user";
import type { CourseSession } from "@/types";
const emit = defineEmits(["close"]); const emit = defineEmits(["close"]);
const logout = () => { const logout = () => {
userStore.handleLogout(); userStore.handleLogout();
}; };
const selectCourseSession = (courseSession: CourseSession) => {
courseSessionsStore.switchCourseSessionById(courseSession.id);
};
const courseSessionsStore = useCourseSessionsStore();
const userStore = useUserStore(); const userStore = useUserStore();
</script> </script>

View File

@ -1,23 +1,14 @@
<script setup lang="ts"> <script setup lang="ts">
import CourseSessionsMenu from "@/components/header/CourseSessionsMenu.vue";
import type { User } from "@/stores/user"; import type { User } from "@/stores/user";
import type { CourseSession } from "@/types";
import { useRouteLookups } from "@/utils/route";
import { computed } from "vue";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
const props = defineProps<{ defineProps<{
courseSessions: CourseSession[];
user: User; user: User;
selectedCourseSession?: string;
}>(); }>();
const emit = defineEmits(["selectCourseSession", "logout", "close"]); const emit = defineEmits(["logout", "close"]);
const router = useRouter(); const router = useRouter();
const { inCourse } = useRouteLookups();
const showCourseSessionMenu = computed(() => inCourse() && props.courseSessions.length);
async function navigate(routeName: string) { async function navigate(routeName: string) {
await router.push({ name: routeName }); await router.push({ name: routeName });
@ -46,14 +37,6 @@ async function navigate(routeName: string) {
</div> </div>
</div> </div>
<div v-if="showCourseSessionMenu" class="border-b py-4">
<CourseSessionsMenu
:items="courseSessions"
:selected="selectedCourseSession"
@select="emit('selectCourseSession', $event)"
/>
</div>
<button <button
type="button" type="button"
class="mt-6 flex items-center" class="mt-6 flex items-center"

View File

@ -36,6 +36,7 @@ const mentorTabTitle = computed(() =>
class="flex space-x-8 px-2 lg:px-10" class="flex space-x-8 px-2 lg:px-10"
> >
<SelectedCourseSession /> <SelectedCourseSession />
<router-link <router-link
v-if="hasCockpitMenu" v-if="hasCockpitMenu"
data-cy="navigation-cockpit-link" data-cy="navigation-cockpit-link"

View File

@ -1,19 +1,63 @@
<script setup lang="ts"> <script setup lang="ts">
import { useCourseSessionsStore } from "@/stores/courseSessions"; import { useCourseSessionsStore } from "@/stores/courseSessions";
import type { CourseSession } from "@/types";
import { useNavigationAttributes } from "@/utils/navigation"; import { useNavigationAttributes } from "@/utils/navigation";
import { useRouteLookups } from "@/utils/route";
import { Popover, PopoverButton, PopoverPanel } from "@headlessui/vue";
import { computed } from "vue"; import { computed } from "vue";
import CourseSessionsMenu from "./CourseSessionsMenu.vue";
const { isInCourse } = useRouteLookups();
const courseSessionsStore = useCourseSessionsStore(); const courseSessionsStore = useCourseSessionsStore();
const { hasSessionTitle } = useNavigationAttributes(); const { hasSessionTitle } = useNavigationAttributes();
const selectedCourseSessionTitle = computed(() => { const selectedCourseSessionTitle = computed(() => {
return courseSessionsStore.currentCourseSession?.title; return courseSessionsStore.currentCourseSession?.title;
}); });
const selectedCourseSession = computed(() => {
return courseSessionsStore.currentCourseSession;
});
const selectCourseSession = (courseSession: CourseSession) => {
courseSessionsStore.switchCourseSessionById(courseSession.id);
};
const courseSessions = computed(() => {
return courseSessionsStore.allCourseSessions;
});
const showCourseSessionMenu = computed(
() => isInCourse.value && courseSessions.value.length
);
</script> </script>
<template> <template>
<div v-if="hasSessionTitle" class="nav-item inline-flex items-center lg:inline-flex"> <div
<div class="" data-cy="current-course-session-title"> v-if="hasSessionTitle"
class="nav-item-base inline-flex items-center lg:inline-flex"
>
<div data-cy="current-course-session-title">
{{ selectedCourseSessionTitle }} {{ selectedCourseSessionTitle }}
</div> </div>
<Popover v-if="showCourseSessionMenu" class="relative">
<PopoverButton
class="group flex items-center rounded-md bg-transparent px-3 text-base focus:outline-none"
>
<it-icon-arrow-down class="h-6 w-6" />
</PopoverButton>
<PopoverPanel class="absolute left-0 z-10 mt-3 w-64 px-1 sm:px-0 lg:max-w-3xl">
<div
class="flex flex-col rounded-lg bg-white p-4 shadow-lg ring-1 ring-black/5"
>
<h3 class="fond-bold mb-2 text-base text-black">Durchführung</h3>
<CourseSessionsMenu
:items="courseSessions"
:selected="selectedCourseSession?.id"
@select="selectCourseSession"
/>
</div>
</PopoverPanel>
</Popover>
</div> </div>
</template> </template>

View File

@ -176,8 +176,12 @@ textarea {
@apply rounded-full bg-blue-900 px-4 py-2 font-semibold text-white; @apply rounded-full bg-blue-900 px-4 py-2 font-semibold text-white;
} }
.nav-item-base {
@apply inline-flex items-center border-b-4 border-transparent px-1 pt-1 text-white;
}
.nav-item { .nav-item {
@apply inline-flex items-center border-b-4 border-transparent px-1 pt-1 text-white hover:text-sky-500; @apply nav-item-base hover:text-sky-500;
} }
.nav-item-no-mobile { .nav-item-no-mobile {