forked from administration/panel
feat: various common elements incl. navigation
parent
b45973482d
commit
d2021a5a9c
|
@ -0,0 +1,33 @@
|
|||
"use client";
|
||||
|
||||
import { FC, useState } from "react";
|
||||
import { Button } from "../ui/button";
|
||||
|
||||
export function ListCompactor<T>({
|
||||
data,
|
||||
Component,
|
||||
}: {
|
||||
data: T[];
|
||||
Component: FC<{ item: T }>;
|
||||
}) {
|
||||
const [limit, setLimit] = useState(5);
|
||||
|
||||
return (
|
||||
<>
|
||||
{data.length === 0 && (
|
||||
<h2 className="text-sm text-center pb-2 text-gray-400">Empty List</h2>
|
||||
)}
|
||||
{data.slice(0, limit).map((item, index) => (
|
||||
<Component key={index} item={item} />
|
||||
))}
|
||||
{limit < data.length && (
|
||||
<Button
|
||||
variant="secondary"
|
||||
onClick={() => setLimit((limit) => limit + 5)}
|
||||
>
|
||||
Show more
|
||||
</Button>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
}
|
|
@ -7,7 +7,7 @@ export function NavigateBack() {
|
|||
const router = useRouter();
|
||||
|
||||
return (
|
||||
<Button variant="secondary" onClick={() => router.back()}>
|
||||
<Button variant="outline" onClick={() => router.back()}>
|
||||
Go back
|
||||
</Button>
|
||||
);
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
import Link from "next/link";
|
||||
import { buttonVariants } from "../ui/button";
|
||||
import {
|
||||
Eye,
|
||||
Globe2,
|
||||
Home,
|
||||
ScrollText,
|
||||
Search,
|
||||
Siren,
|
||||
Sparkles,
|
||||
TrendingUp,
|
||||
} from "lucide-react";
|
||||
|
||||
export function NavigationLinks() {
|
||||
return (
|
||||
<>
|
||||
<Link
|
||||
className={buttonVariants({ variant: "outline", size: "icon" })}
|
||||
href="/panel"
|
||||
>
|
||||
<Home className="h-4 w-4" />
|
||||
</Link>
|
||||
<Link
|
||||
className={buttonVariants({ variant: "outline", size: "icon" })}
|
||||
href="/panel/search"
|
||||
>
|
||||
<Search className="h-4 w-4" />
|
||||
</Link>
|
||||
<Link
|
||||
className={buttonVariants({ variant: "outline", size: "icon" })}
|
||||
href="/panel/inspect"
|
||||
>
|
||||
<Eye className="h-4 w-4" />
|
||||
</Link>
|
||||
<Link
|
||||
className={buttonVariants({ variant: "outline", size: "icon" })}
|
||||
href="/panel/reports"
|
||||
>
|
||||
<Siren className="h-4 w-4" />
|
||||
</Link>
|
||||
<Link
|
||||
className={buttonVariants({ variant: "outline", size: "icon" })}
|
||||
href="/panel/discover"
|
||||
>
|
||||
<Globe2 className="h-4 w-4" />
|
||||
</Link>
|
||||
<Link
|
||||
className={buttonVariants({ variant: "outline", size: "icon" })}
|
||||
href="/panel/audit"
|
||||
>
|
||||
<ScrollText className="h-4 w-4" />
|
||||
</Link>
|
||||
<a
|
||||
target="_blank"
|
||||
className={buttonVariants({ variant: "outline", size: "icon" })}
|
||||
href="https://monitor.revolt.chat/d/fb0383b2-86c8-4c9c-b401-0af8ce9869af/global-stats?orgId=1"
|
||||
>
|
||||
<TrendingUp className="h-4 w-4" />
|
||||
</a>
|
||||
<Link
|
||||
className={buttonVariants({ variant: "outline", size: "icon" })}
|
||||
href="/panel/sparkle"
|
||||
>
|
||||
<Sparkles className="h-4 w-4" />
|
||||
</Link>
|
||||
</>
|
||||
);
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
"use client";
|
||||
|
||||
import { useRouter } from "next/navigation";
|
||||
import { Button } from "../ui/button";
|
||||
import { ArrowLeft, Star } from "lucide-react";
|
||||
import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover";
|
||||
import { Label } from "../ui/label";
|
||||
import { Input } from "../ui/input";
|
||||
|
||||
export function NavigationToolbar({ children }: { children: string }) {
|
||||
const router = useRouter();
|
||||
const savedAsBookmark = false;
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-2">
|
||||
<Button variant="outline" size="icon" onClick={() => router.back()}>
|
||||
<ArrowLeft className="h-4 w-4" />
|
||||
</Button>
|
||||
<Popover>
|
||||
<PopoverTrigger asChild>
|
||||
<Button variant="outline" size="icon">
|
||||
<Star
|
||||
className="h-4 w-4"
|
||||
fill={savedAsBookmark ? "black" : "transparent"}
|
||||
/>
|
||||
</Button>
|
||||
</PopoverTrigger>
|
||||
<PopoverContent className="w-80">
|
||||
<div className="grid gap-4">
|
||||
<div className="space-y-2">
|
||||
<h4 className="font-medium leading-none">Bookmark</h4>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
You've saved this page for later.
|
||||
</p>
|
||||
</div>
|
||||
<div className="grid gap-2">
|
||||
<div className="grid grid-cols-3 items-center gap-4">
|
||||
<Label htmlFor="description">Description</Label>
|
||||
<Input id="description" className="col-span-2 h-8" />
|
||||
</div>
|
||||
{savedAsBookmark ? (
|
||||
<>
|
||||
<Button variant="secondary">Update</Button>
|
||||
<Button variant="destructive">Remove</Button>
|
||||
</>
|
||||
) : (
|
||||
<Button variant="secondary">Save</Button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</PopoverContent>
|
||||
</Popover>
|
||||
<h2 className="text-2xl">{children}</h2>
|
||||
</div>
|
||||
);
|
||||
}
|
Loading…
Reference in New Issue