Made breadcrumbs reactive
This commit is contained in:
parent
7b1ce9cb23
commit
a7f75868cf
6 changed files with 55 additions and 6 deletions
|
|
@ -7,17 +7,26 @@ import {
|
||||||
BreadcrumbPage,
|
BreadcrumbPage,
|
||||||
BreadcrumbSeparator,
|
BreadcrumbSeparator,
|
||||||
} from "~/components/ui/breadcrumb";
|
} from "~/components/ui/breadcrumb";
|
||||||
|
|
||||||
|
import { useBreadcrumbStore } from "~/stores/breadcrumbs";
|
||||||
|
const breadcrumbStore = useBreadcrumbStore();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Breadcrumb>
|
<Breadcrumb>
|
||||||
<BreadcrumbList>
|
<BreadcrumbList>
|
||||||
<BreadcrumbItem class="hidden md:block">
|
<template v-for="i in breadcrumbStore.items.length - 1" :key="i">
|
||||||
<BreadcrumbLink href="#"> Building Your Application </BreadcrumbLink>
|
<BreadcrumbItem class="hidden md:block">
|
||||||
</BreadcrumbItem>
|
<BreadcrumbLink :href="breadcrumbStore.items[i - 1]?.to || ''">
|
||||||
<BreadcrumbSeparator class="hidden md:block" />
|
{{ breadcrumbStore.items[i - 1]?.label || "Home" }}
|
||||||
|
</BreadcrumbLink>
|
||||||
|
</BreadcrumbItem>
|
||||||
|
<BreadcrumbSeparator class="hidden md:block" />
|
||||||
|
</template>
|
||||||
<BreadcrumbItem>
|
<BreadcrumbItem>
|
||||||
<BreadcrumbPage>Data Fetching</BreadcrumbPage>
|
<BreadcrumbPage>
|
||||||
|
{{ breadcrumbStore.items[breadcrumbStore.items.length - 1]?.label || "Home" }}
|
||||||
|
</BreadcrumbPage>
|
||||||
</BreadcrumbItem>
|
</BreadcrumbItem>
|
||||||
</BreadcrumbList>
|
</BreadcrumbList>
|
||||||
</Breadcrumb>
|
</Breadcrumb>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,9 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { useBreadcrumbStore } from "~/stores/breadcrumbs";
|
||||||
import SignupForm from "@/components/SignupForm.vue";
|
import SignupForm from "@/components/SignupForm.vue";
|
||||||
|
|
||||||
|
const breadcrumbStore = useBreadcrumbStore();
|
||||||
|
breadcrumbStore.setBreadcrumbs([{ label: "Auth" }, { label: "Create Account", to: "/auth/create-account" }]);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,9 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import LoginForm from "@/components/LoginForm.vue";
|
import { useBreadcrumbStore } from "~/stores/breadcrumbs";
|
||||||
|
import LoginForm from "~/components/LoginForm.vue";
|
||||||
|
|
||||||
|
const breadcrumbStore = useBreadcrumbStore();
|
||||||
|
breadcrumbStore.setBreadcrumbs([{ label: "Auth" }, { label: "Login", to: "/auth/login" }]);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,13 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/com
|
||||||
import { Field, FieldDescription } from "@/components/ui/field";
|
import { Field, FieldDescription } from "@/components/ui/field";
|
||||||
|
|
||||||
import { useAuthStore } from "~/stores/auth";
|
import { useAuthStore } from "~/stores/auth";
|
||||||
|
import { useBreadcrumbStore } from "~/stores/breadcrumbs";
|
||||||
|
|
||||||
const authStore = useAuthStore();
|
const authStore = useAuthStore();
|
||||||
await authStore.init();
|
await authStore.init();
|
||||||
|
|
||||||
|
const breadcrumbStore = useBreadcrumbStore();
|
||||||
|
breadcrumbStore.setBreadcrumbs([{ label: "Auth" }, { label: "Logout", to: "/auth/logout" }]);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
|
import { useBreadcrumbStore } from "~/stores/breadcrumbs";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
|
|
||||||
const lastClicked = ref<string>("None");
|
const lastClicked = ref<string>("None");
|
||||||
|
|
@ -7,6 +8,9 @@ const lastClicked = ref<string>("None");
|
||||||
const buttonClicked = (variant: string) => {
|
const buttonClicked = (variant: string) => {
|
||||||
lastClicked.value = variant;
|
lastClicked.value = variant;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const breadcrumbStore = useBreadcrumbStore();
|
||||||
|
breadcrumbStore.setBreadcrumbs([{ label: "Homepage", to: "/" }]);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
|
||||||
24
app/stores/breadcrumbs.ts
Normal file
24
app/stores/breadcrumbs.ts
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
import { defineStore } from "pinia";
|
||||||
|
|
||||||
|
export interface BreadcrumbItem {
|
||||||
|
label: string;
|
||||||
|
to?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useBreadcrumbStore = defineStore("breadcrumb", {
|
||||||
|
state: () => ({
|
||||||
|
items: [] as BreadcrumbItem[],
|
||||||
|
}),
|
||||||
|
|
||||||
|
actions: {
|
||||||
|
setBreadcrumbs(items: BreadcrumbItem[]) {
|
||||||
|
this.items = items;
|
||||||
|
},
|
||||||
|
addBreadcrumb(item: BreadcrumbItem) {
|
||||||
|
this.items.push(item);
|
||||||
|
},
|
||||||
|
clear() {
|
||||||
|
this.items = [];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
Loading…
Add table
Add a link
Reference in a new issue