From d4a3ea897a030c77fada9638612ed06d240056e5 Mon Sep 17 00:00:00 2001 From: Bram Suurd <78373894+BramSuurdje@users.noreply.github.com> Date: Fri, 3 May 2024 20:10:09 +0200 Subject: [PATCH] removed home page. fixed searching. added "/" shortcut to start searching. made it so that the whole accordion fits on screen. --- app/globals.css | 10 ++- app/new/page.tsx | 2 +- app/page.tsx | 146 ++++++++++++++++++++++++++++++++++-- components/ui/accordion.tsx | 2 +- 4 files changed, 152 insertions(+), 8 deletions(-) diff --git a/app/globals.css b/app/globals.css index 3b887a0..bf6b031 100644 --- a/app/globals.css +++ b/app/globals.css @@ -54,4 +54,12 @@ body { @apply bg-background text-foreground; } - } \ No newline at end of file + } + + [data-state="open"] .accordioncontent { + display: block; + } + + [data-state="closed"] .accordioncontent { + display: none; + } \ No newline at end of file diff --git a/app/new/page.tsx b/app/new/page.tsx index 0c5688e..ab4b8d1 100644 --- a/app/new/page.tsx +++ b/app/new/page.tsx @@ -116,7 +116,7 @@ function Page() {
setSelectedItem(item.id)} >
diff --git a/app/page.tsx b/app/page.tsx index b474dd3..c092818 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,11 +1,147 @@ -import LandingPage from "@/components/LandingPage"; +"use client"; +import React, { useEffect, useState, useRef } from "react"; +import { + Accordion, + AccordionItem, + AccordionTrigger, + AccordionContent, +} from "@/components/ui/accordion"; +import { Input } from "@/components/ui/input"; +import ScriptItem from "@/components/Script"; +import { pb } from "@/lib/pocketbase"; + +interface Script { + title: string; + scriptID: string; +} + +interface Category { + id: string; + Catagory_Title: string; + Items: Script[]; +} + +type Scripts = { + id: string; + title: string; + logo: string; +}; + +export default function Page() { + const [selectedItem, setSelectedItem] = useState(""); + const [items, setItems] = useState([]); + const [links, setLinks] = useState([]); + const [searchTerm, setSearchTerm] = useState(""); + const [accordionExpanded, setAccordionExpanded] = useState(false); + const inputRef = useRef(); + + useEffect(() => { + const handleKeyDown = (event: any) => { + if (event.key === "/") { + inputRef.current.focus(); + event.preventDefault(); + } + }; + + const fetchData = async () => { + try { + const data = await getLinks(); + const items = await getItems(); + setLinks(data); + setItems(items); + } catch (error) { + console.error("Error fetching links:", error); + } + }; + fetchData(); + + document.addEventListener("keydown", handleKeyDown); + + return () => { + document.removeEventListener("keydown", handleKeyDown); + }; + }, []); + + const getLinks = async () => { + const res = await fetch( + `${process.env.NEXT_PUBLIC_POCKETBASE_URL}/api/collections/proxmox_items/records`, + ); + const data = await res.json(); + return data.items as Category[]; + }; + + const getItems = async () => { + const records = await pb.collection("proxmox_scripts").getFullList({ + sort: "-created", + }); + return records as unknown as Scripts[]; + }; + + const handleSearch = (value: string) => { + setSearchTerm(value); + setAccordionExpanded(true); // Expand the accordion when searching + }; + + const filteredLinks = searchTerm + ? links + .map((category) => ({ + ...category, + Items: category.Items.filter((script) => + script.title.toLowerCase().includes(searchTerm.toLowerCase()), + ), + })) + .filter((category) => category.Items.length > 0) + : links; -function page() { return ( <> - +
+
+

Scripts

+ handleSearch(e.target.value)} + ref={inputRef} + /> + + {filteredLinks.map((category) => ( + + {category.Catagory_Title} + + {category.Items.map((script, index) => ( +

setSelectedItem(script.scriptID)} + key={index} + > + {script.title} +

+ ))} +
+
+ ))} +
+
+
+
+ +
+
+
); } - -export default page; diff --git a/components/ui/accordion.tsx b/components/ui/accordion.tsx index 24c788c..9bbed7b 100644 --- a/components/ui/accordion.tsx +++ b/components/ui/accordion.tsx @@ -28,7 +28,7 @@ const AccordionTrigger = React.forwardRef< svg]:rotate-180", + "flex flex-1 items-center justify-between py-1 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180", className )} {...props}