diff --git a/client/src/components/header/SelectedCourseSession.vue b/client/src/components/header/SelectedCourseSession.vue
new file mode 100644
index 00000000..9f082564
--- /dev/null
+++ b/client/src/components/header/SelectedCourseSession.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+ {{ selectedCourseSessionTitle }}
+
+
+
+
+
+
+
+
+
Durchführung
+
+
+
+
+
+
diff --git a/client/src/components/header/SubNavItem.vue b/client/src/components/header/SubNavItem.vue
new file mode 100644
index 00000000..cb38f36b
--- /dev/null
+++ b/client/src/components/header/SubNavItem.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/src/components/header/SubNavigation.vue b/client/src/components/header/SubNavigation.vue
new file mode 100644
index 00000000..4fecf8b7
--- /dev/null
+++ b/client/src/components/header/SubNavigation.vue
@@ -0,0 +1,116 @@
+
+
+
+
diff --git a/client/src/locales/de/translation.json b/client/src/locales/de/translation.json
index 2b59d0a2..b6e8936d 100644
--- a/client/src/locales/de/translation.json
+++ b/client/src/locales/de/translation.json
@@ -70,6 +70,7 @@
"a.Damit du myVBV nutzen kannst, brauchst du ein Konto.": "Damit du myVBV nutzen kannst, brauchst du ein Konto.",
"a.Das muss ich nochmals anschauen": "Das muss ich nochmals anschauen",
"a.Das wurde mit dir geteilt": "Das wurde mit dir geteilt",
+ "a.Dashboard": "Dashboard",
"a.Datei auswählen": "Datei auswählen",
"a.Datei hochladen": "Datei hochladen",
"a.Datei kann nicht gespeichert werden.": "Datei kann nicht gespeichert werden.",
@@ -104,6 +105,7 @@
"a.E-Mail Adresse": "E-Mail Adresse",
"a.Einladung": "Einladung",
"a.Einladung abschicken": "Einladung abschicken",
+ "a.Einstellungen": "Einstellungen",
"a.Elemente zu erledigen": "Elemente zu erledigen",
"a.Email": "Email",
"a.Entfernen": "Entfernen",
diff --git a/client/src/locales/fr/translation.json b/client/src/locales/fr/translation.json
index 20556c94..872cdbc9 100644
--- a/client/src/locales/fr/translation.json
+++ b/client/src/locales/fr/translation.json
@@ -70,6 +70,7 @@
"a.Damit du myVBV nutzen kannst, brauchst du ein Konto.": "Pour utiliser myVBV, vous devez créer un compte.",
"a.Das muss ich nochmals anschauen": "Il faut que je regarde cela encore une fois de plus près",
"a.Das wurde mit dir geteilt": "Cela a été partagé avec toi",
+ "a.Dashboard": "Dashboard",
"a.Datei auswählen": "Sélectionner le fichier",
"a.Datei hochladen": "Télécharger le fichier",
"a.Datei kann nicht gespeichert werden.": "Impossible d'enregistrer le fichier.",
@@ -104,6 +105,7 @@
"a.E-Mail Adresse": "Adresse e-mail",
"a.Einladung": "Invitation",
"a.Einladung abschicken": "Envoyer l'invitation",
+ "a.Einstellungen": "Paramètres",
"a.Elemente zu erledigen": "Eléments à faire",
"a.Email": "Email",
"a.Entfernen": "Supprimer",
diff --git a/client/src/locales/it/translation.json b/client/src/locales/it/translation.json
index c1a205cd..c056d074 100644
--- a/client/src/locales/it/translation.json
+++ b/client/src/locales/it/translation.json
@@ -70,6 +70,7 @@
"a.Damit du myVBV nutzen kannst, brauchst du ein Konto.": "Per utilizzare myVBV, hai bisogno di un account.",
"a.Das muss ich nochmals anschauen": "Devo riguardarlo ancora una volta",
"a.Das wurde mit dir geteilt": "Questo è stato condiviso con te",
+ "a.Dashboard": "Dashboard",
"a.Datei auswählen": "Selezionare il file",
"a.Datei hochladen": "Carica il file",
"a.Datei kann nicht gespeichert werden.": "Impossibile salvare il file.",
@@ -104,6 +105,7 @@
"a.E-Mail Adresse": "Indirizzo e-mail",
"a.Einladung": "Invito",
"a.Einladung abschicken": "Inviare l'invito",
+ "a.Einstellungen": "Impostazioni",
"a.Elemente zu erledigen": "Elementi da completare",
"a.Email": "E-mail",
"a.Entfernen": "Rimuovere",
diff --git a/client/src/pages/competence/CompetenceParentPage.vue b/client/src/pages/competence/CompetenceParentPage.vue
index aeffbddf..8c13cb37 100644
--- a/client/src/pages/competence/CompetenceParentPage.vue
+++ b/client/src/pages/competence/CompetenceParentPage.vue
@@ -1,101 +1,78 @@
-
+
diff --git a/client/src/router/index.ts b/client/src/router/index.ts
index 291e1b53..a2118426 100644
--- a/client/src/router/index.ts
+++ b/client/src/router/index.ts
@@ -13,6 +13,13 @@ import {
import { addToHistory, setLastNavigationWasPush } from "@/router/history";
import { onboardingRedirect } from "@/router/onboarding";
import { createRouter, createWebHistory } from "vue-router";
+import {
+ CERTIFICATES_ROUTE,
+ COMPETENCE_ROUTE,
+ COMPETENCES_ROUTE,
+ SELF_EVALUATION_ROUTE,
+ SETTINGS_ROUTE,
+} from "./names";
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
@@ -107,10 +114,12 @@ const router = createRouter({
{
path: "",
props: true,
+ name: COMPETENCE_ROUTE,
component: () => import("@/pages/competence/CompetenceIndexPage.vue"),
},
{
path: "certificates",
+ name: CERTIFICATES_ROUTE,
props: true,
component: () =>
import("@/pages/competence/CompetenceCertificateListPage.vue"),
@@ -122,7 +131,7 @@ const router = createRouter({
import("@/pages/competence/CompetenceCertificateDetailPage.vue"),
},
{
- name: "selfEvaluationAndFeedback",
+ name: SELF_EVALUATION_ROUTE,
path: "self-evaluation-and-feedback",
props: true,
component: () =>
@@ -130,6 +139,7 @@ const router = createRouter({
},
{
path: "competences",
+ name: COMPETENCES_ROUTE,
props: true,
component: () => import("@/pages/competence/ActionCompetenceListPage.vue"),
},
@@ -393,6 +403,7 @@ const router = createRouter({
},
{
path: "/settings",
+ name: SETTINGS_ROUTE,
component: () => import("@/pages/SettingsPage.vue"),
},
{
diff --git a/client/src/router/names.ts b/client/src/router/names.ts
new file mode 100644
index 00000000..a8f5d4f3
--- /dev/null
+++ b/client/src/router/names.ts
@@ -0,0 +1,5 @@
+export const COMPETENCE_ROUTE = "competence";
+export const CERTIFICATES_ROUTE = "certificates";
+export const SELF_EVALUATION_ROUTE = "selfEvaluationAndFeedback";
+export const COMPETENCES_ROUTE = "competences";
+export const SETTINGS_ROUTE = "settings";
diff --git a/client/src/utils/navigation.ts b/client/src/utils/navigation.ts
index 5c8cd323..d0cbf59d 100644
--- a/client/src/utils/navigation.ts
+++ b/client/src/utils/navigation.ts
@@ -1,6 +1,7 @@
import { useCourseSessionsStore } from "@/stores/courseSessions";
import { useUserStore } from "@/stores/user";
import { computed } from "vue";
+import type { RouteLocationRaw } from "vue-router";
import { useRouteLookups } from "./route";
export function useNavigationAttributes() {
@@ -77,3 +78,7 @@ export function useNavigationAttributes() {
hasSessionTitle,
};
}
+
+export const isExternalLink = (route: string | RouteLocationRaw) => {
+ return typeof route === "string" && route.startsWith("https");
+};
diff --git a/client/src/utils/route.ts b/client/src/utils/route.ts
index 0b0c9e26..c0b632cf 100644
--- a/client/src/utils/route.ts
+++ b/client/src/utils/route.ts
@@ -1,3 +1,4 @@
+import { computed } from "vue";
import { useRoute } from "vue-router";
export function useRouteLookups() {
@@ -7,11 +8,15 @@ export function useRouteLookups() {
return route.path.startsWith("/course/");
}
+ const isInCourse = computed(() => inCourse());
+
function inCockpit() {
const regex = new RegExp("/course/[^/]+/cockpit($|/)");
return regex.test(route.path);
}
+ const isInCockpit = computed(() => inCockpit());
+
function inLearningPath() {
const regex = new RegExp("/course/[^/]+/learn($|/)");
return regex.test(route.path);
@@ -39,7 +44,9 @@ export function useRouteLookups() {
return {
inMediaLibrary,
+ isInCourse,
inCockpit,
+ isInCockpit,
inLearningPath,
inCompetenceProfile,
inLearningMentor,
diff --git a/client/tailwind.css b/client/tailwind.css
index 9e4d5e07..afd59494 100644
--- a/client/tailwind.css
+++ b/client/tailwind.css
@@ -176,8 +176,12 @@ textarea {
@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 {
- @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 {