[Closes #10] Reactive breadcrumbs
This commit is contained in:
parent
6d3cdb560d
commit
a1708317ec
19 changed files with 200 additions and 33 deletions
|
|
@ -43,7 +43,7 @@ const doLogin = async () => {
|
|||
<Button type="submit">Login</Button>
|
||||
<FieldDescription class="text-center">
|
||||
Don't have an account?
|
||||
<NuxtLink to="/member/auth/create-account">
|
||||
<NuxtLink to="/auth/create-account">
|
||||
<Button variant="link">Create account</Button>
|
||||
</NuxtLink>
|
||||
</FieldDescription>
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ const createAccount = async () => {
|
|||
<Button type="submit">Create Account</Button>
|
||||
<FieldDescription class="text-center">
|
||||
Already have an account?
|
||||
<NuxtLink to="/member/auth/login">
|
||||
<NuxtLink to="/auth/login">
|
||||
<Button variant="link">Log in</Button>
|
||||
</NuxtLink>
|
||||
</FieldDescription>
|
||||
|
|
|
|||
|
|
@ -1,18 +1,11 @@
|
|||
<script setup lang="ts">
|
||||
import { useAuthStore } from "~/stores/auth";
|
||||
|
||||
import DefaultSidebar from "~/layouts/default/Sidebar.vue";
|
||||
import DefaultBreadcrumb from "~/layouts/default/Breadcrumb.vue";
|
||||
|
||||
import { SidebarInset, SidebarProvider, SidebarTrigger } from "~/components/ui/sidebar";
|
||||
|
||||
import {
|
||||
Breadcrumb,
|
||||
BreadcrumbItem,
|
||||
BreadcrumbLink,
|
||||
BreadcrumbList,
|
||||
BreadcrumbPage,
|
||||
BreadcrumbSeparator,
|
||||
} from "~/components/ui/breadcrumb";
|
||||
|
||||
import { Separator } from "~/components/ui/separator";
|
||||
|
||||
import { useRuntimeConfig } from "#app";
|
||||
|
|
@ -32,17 +25,7 @@ await authStore.init();
|
|||
<header class="flex h-12 shrink-0 items-center gap-2 border-b px-4">
|
||||
<SidebarTrigger class="-ml-1" />
|
||||
<Separator orientation="vertical" class="mr-2 data-[orientation=vertical]:h-4" />
|
||||
<Breadcrumb>
|
||||
<BreadcrumbList>
|
||||
<BreadcrumbItem class="hidden md:block">
|
||||
<BreadcrumbLink href="#"> Building Your Application </BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
<BreadcrumbSeparator class="hidden md:block" />
|
||||
<BreadcrumbItem>
|
||||
<BreadcrumbPage>Data Fetching</BreadcrumbPage>
|
||||
</BreadcrumbItem>
|
||||
</BreadcrumbList>
|
||||
</Breadcrumb>
|
||||
<DefaultBreadcrumb />
|
||||
</header>
|
||||
<main class="flex flex-1 flex-col gap-4 p-4">
|
||||
<slot />
|
||||
|
|
|
|||
35
app/layouts/default/Breadcrumb.vue
Normal file
35
app/layouts/default/Breadcrumb.vue
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
<script setup lang="ts">
|
||||
import {
|
||||
Breadcrumb,
|
||||
BreadcrumbItem,
|
||||
BreadcrumbLink,
|
||||
BreadcrumbList,
|
||||
BreadcrumbPage,
|
||||
BreadcrumbSeparator,
|
||||
} from "~/components/ui/breadcrumb";
|
||||
|
||||
import { useBreadcrumbStore } from "~/stores/breadcrumbs";
|
||||
const breadcrumbStore = useBreadcrumbStore();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ClientOnly>
|
||||
<Breadcrumb>
|
||||
<BreadcrumbList>
|
||||
<template v-for="i in breadcrumbStore.items.length - 1" :key="i">
|
||||
<BreadcrumbItem class="hidden md:block">
|
||||
<BreadcrumbLink :href="breadcrumbStore.items[i - 1]?.to || ''">
|
||||
{{ breadcrumbStore.items[i - 1]?.label }}
|
||||
</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
<BreadcrumbSeparator class="hidden md:block" />
|
||||
</template>
|
||||
<BreadcrumbItem>
|
||||
<BreadcrumbPage>
|
||||
{{ breadcrumbStore.items[breadcrumbStore.items.length - 1]?.label }}
|
||||
</BreadcrumbPage>
|
||||
</BreadcrumbItem>
|
||||
</BreadcrumbList>
|
||||
</Breadcrumb>
|
||||
</ClientOnly>
|
||||
</template>
|
||||
|
|
@ -29,11 +29,11 @@ const userInititials = computed(() => {
|
|||
});
|
||||
|
||||
const handleLogout = () => {
|
||||
navigateTo("/member/auth/logout");
|
||||
navigateTo("/auth/logout");
|
||||
};
|
||||
|
||||
const handleLogin = () => {
|
||||
navigateTo("/member/auth/login");
|
||||
navigateTo("/auth/login");
|
||||
};
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
<script setup lang="ts">
|
||||
import { useBreadcrumbStore } from "~/stores/breadcrumbs";
|
||||
import SignupForm from "@/components/SignupForm.vue";
|
||||
|
||||
const breadcrumbStore = useBreadcrumbStore();
|
||||
breadcrumbStore.setBreadcrumbs([{ label: "Auth" }, { label: "Create Account", to: "/auth/create-account" }]);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
@ -1,5 +1,9 @@
|
|||
<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>
|
||||
|
||||
<template>
|
||||
|
|
@ -4,9 +4,13 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/com
|
|||
import { Field, FieldDescription } from "@/components/ui/field";
|
||||
|
||||
import { useAuthStore } from "~/stores/auth";
|
||||
import { useBreadcrumbStore } from "~/stores/breadcrumbs";
|
||||
|
||||
const authStore = useAuthStore();
|
||||
await authStore.init();
|
||||
|
||||
const breadcrumbStore = useBreadcrumbStore();
|
||||
breadcrumbStore.setBreadcrumbs([{ label: "Auth" }, { label: "Logout", to: "/auth/logout" }]);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
<script setup lang="ts">
|
||||
import { ref } from "vue";
|
||||
import { useBreadcrumbStore } from "~/stores/breadcrumbs";
|
||||
import { Button } from "@/components/ui/button";
|
||||
|
||||
const lastClicked = ref<string>("None");
|
||||
|
|
@ -7,6 +8,9 @@ const lastClicked = ref<string>("None");
|
|||
const buttonClicked = (variant: string) => {
|
||||
lastClicked.value = variant;
|
||||
};
|
||||
|
||||
const breadcrumbStore = useBreadcrumbStore();
|
||||
breadcrumbStore.setBreadcrumbs([{ label: "Homepage", to: "/" }]);
|
||||
</script>
|
||||
|
||||
<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