Move course session switcher to top navigation
This commit is contained in:
parent
f560531df2
commit
9b89177db5
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue