From 349747d555be404f1a52d37c74a838cdbe593051 Mon Sep 17 00:00:00 2001 From: Rainnny7 Date: Sun, 21 Apr 2024 18:14:16 -0400 Subject: [PATCH] Add searching to the docs --- Frontend/bun.lockb | Bin 337808 -> 339104 bytes Frontend/docs/home.md | 136 ++++++++++++++-- Frontend/docs/server/query.md | 8 + Frontend/package.json | 2 + .../src/app/(pages)/docs/[[...slug]]/page.tsx | 2 +- Frontend/src/app/(pages)/mojang/page.tsx | 2 +- .../app/(pages)/player/[[...slug]]/page.tsx | 2 +- .../app/(pages)/server/[[...slug]]/page.tsx | 2 +- Frontend/src/app/api/docs/search/route.ts | 30 ++++ Frontend/src/app/common/search.ts | 14 ++ Frontend/src/app/components/counter.tsx | 1 + .../components/docs/search/search-dialog.tsx | 146 ++++++++++++++++++ .../components/docs/search/search-input.tsx | 37 +++++ Frontend/src/app/components/docs/sidebar.tsx | 15 +- Frontend/src/app/components/footer.tsx | 4 +- Frontend/src/app/components/landing/hero.tsx | 2 +- .../components/landing/statistic-counters.tsx | 2 +- Frontend/src/app/components/ui/dialog.tsx | 122 +++++++++++++++ Frontend/src/app/not-found.tsx | 2 +- 19 files changed, 499 insertions(+), 30 deletions(-) create mode 100644 Frontend/docs/server/query.md create mode 100644 Frontend/src/app/api/docs/search/route.ts create mode 100644 Frontend/src/app/common/search.ts create mode 100644 Frontend/src/app/components/docs/search/search-dialog.tsx create mode 100644 Frontend/src/app/components/docs/search/search-input.tsx create mode 100644 Frontend/src/app/components/ui/dialog.tsx diff --git a/Frontend/bun.lockb b/Frontend/bun.lockb index cafcd5c6b29dcae8aa8dc8240258cd07450f88b8..f936f112c84b5e54d95713d44c5f6fe4205cf4bf 100644 GIT binary patch delta 59349 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®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 diff --git a/Frontend/docs/home.md b/Frontend/docs/home.md index cd15e51..0d680ad 100644 --- a/Frontend/docs/home.md +++ b/Frontend/docs/home.md @@ -4,17 +4,131 @@ published: '04-19-2024' summary: 'Get started with RESTfulMC! duis numquam himenaeos lectus quisque assueverit aperiri' --- -# Get started with RESTfulMC! -Welcome to the RESTfulMC documentation! feugait pertinax duis laudem vix integer tempus conubia graece interpretaris +[//]: # (# Get started with RESTfulMC!) -## Table of Contents -- [Get started with RESTfulMC!](#get-started-with-restfulmc) - - [Features](#features) +[//]: # (Welcome to the RESTfulMC documentation! feugait pertinax duis laudem vix integer tempus conubia graece interpretaris) -## Features -Some of the core features of RESTfulMC include: +[//]: # () +[//]: # (## Table of Contents) -| Feature | Description | -|-------------------------:|------------------------------------------------------------------:| -| [Player Lookup](/player) | praesent omittam mollis maximus has pretium mediocritatem eripuit | -| [Server Lookup](/server) | sapien faucibus numquam ponderum utamur himenaeos menandri tation | \ No newline at end of file +[//]: # (- [Get started with RESTfulMC!](#get-started-with-restfulmc)) + +[//]: # ( - [Features](#features)) + +[//]: # () +[//]: # (## Features) + +[//]: # (Some of the core features of RESTfulMC include:) + +[//]: # () +[//]: # (| Feature | Description |) + +[//]: # (|-------------------------:|------------------------------------------------------------------:|) + +[//]: # (| [Player Lookup](/player) | praesent omittam mollis maximus has pretium mediocritatem eripuit |) + +[//]: # (| [Server Lookup](/server) | sapien faucibus numquam ponderum utamur himenaeos menandri tation |) +# Heading level 1 +I really like using Markdown. + +```typescript +"use client"; + +import { ThemeProvider as NextThemesProvider } from "next-themes"; +import { type ThemeProviderProps } from "next-themes/dist/types"; + +/** + * The provider of themes!! + */ +const ThemeProvider = ({ children, ...props }: ThemeProviderProps) => ( + {children} +); +export default ThemeProvider; +``` + + +I think I'll use it to format all of my documents from now on. + +## Heading level 2 +### Heading level 3 +#### Heading level 4 +##### Heading level 5 +###### Heading level 6 + +Heading level 1 +=============== + +Heading level 2 +--------------- + +I just love **bold text**. +I just love __bold text__. + +This text is ***really important***. +This text is ___really important___. +This text is __*really important*__. +This text is **_really important_**. +This is really***very***important text. + +> Dorothy followed her through many of the beautiful rooms in her castle. +> +> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood. + +> Dorothy followed her through many of the beautiful rooms in her castle. +> +>> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood. + +> #### The quarterly results look great! +> +> - Revenue was off the chart. +> - Profits were higher than ever. + > + > *Everything* is going according to **plan**. + +1. First item +2. Second item +3. Third item +4. Fourth item + +1. First item +2. Second item +3. Third item + 1. Indented item + 2. Indented item +4. Fourth item + +- First item +- Second item +- Third item +- Fourth item + +* First item +* Second item +* Third item +* Fourth item + ++ First item ++ Second item ++ Third item ++ Fourth item + +- First item +- Second item +- Third item + - Indented item + - Indented item +- Fourth item + +At the command prompt, type `nano`. + +``Use `code` in your Markdown file.`` + + + +*** + +--- + +_________________ + +My favorite search engine is [Duck Duck Go](https://duckduckgo.com). \ No newline at end of file diff --git a/Frontend/docs/server/query.md b/Frontend/docs/server/query.md new file mode 100644 index 0000000..122a865 --- /dev/null +++ b/Frontend/docs/server/query.md @@ -0,0 +1,8 @@ +--- +title: 'Query a server' +published: '04-19-2024' +summary: 'utinam delicata nominavi ornare eirmod pharetra decore interesset necessitatibus.' +--- + +# bob +HELLO JOHN \ No newline at end of file diff --git a/Frontend/package.json b/Frontend/package.json index b177c09..57beb3f 100644 --- a/Frontend/package.json +++ b/Frontend/package.json @@ -24,6 +24,7 @@ "@mdx-js/react": "^3.0.1", "@next/mdx": "^14.2.2", "@radix-ui/react-context-menu": "^2.1.5", + "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-navigation-menu": "^1.1.4", "@radix-ui/react-scroll-area": "^1.0.5", @@ -36,6 +37,7 @@ "class-variance-authority": "^0.7.0", "clipboard-copy": "^4.0.1", "clsx": "^2.1.0", + "fuse.js": "^7.0.0", "lucide-react": "^0.372.0", "moment": "^2.30.1", "next": "14.2.2", diff --git a/Frontend/src/app/(pages)/docs/[[...slug]]/page.tsx b/Frontend/src/app/(pages)/docs/[[...slug]]/page.tsx index f3ebee7..de220b2 100644 --- a/Frontend/src/app/(pages)/docs/[[...slug]]/page.tsx +++ b/Frontend/src/app/(pages)/docs/[[...slug]]/page.tsx @@ -71,7 +71,7 @@ const ContentPage = ({ params }: PageProps): ReactElement => { {/* Publish Date */} -

+

Published on{" "} {moment(content.published, "MM-DD-YYYY").format( "MMMM Do YYYY" diff --git a/Frontend/src/app/(pages)/mojang/page.tsx b/Frontend/src/app/(pages)/mojang/page.tsx index dca65c2..773fe6d 100644 --- a/Frontend/src/app/(pages)/mojang/page.tsx +++ b/Frontend/src/app/(pages)/mojang/page.tsx @@ -38,7 +38,7 @@ const MojangStatusPage = async (): Promise => { {/* Header */}

diff --git a/Frontend/src/app/(pages)/player/[[...slug]]/page.tsx b/Frontend/src/app/(pages)/player/[[...slug]]/page.tsx index 4c76079..2facfcb 100644 --- a/Frontend/src/app/(pages)/player/[[...slug]]/page.tsx +++ b/Frontend/src/app/(pages)/player/[[...slug]]/page.tsx @@ -33,7 +33,7 @@ const PlayerPage = async ({ params }: PageProps): Promise => {

diff --git a/Frontend/src/app/(pages)/server/[[...slug]]/page.tsx b/Frontend/src/app/(pages)/server/[[...slug]]/page.tsx index bcdf55e..292f67a 100644 --- a/Frontend/src/app/(pages)/server/[[...slug]]/page.tsx +++ b/Frontend/src/app/(pages)/server/[[...slug]]/page.tsx @@ -47,7 +47,7 @@ const ServerPage = async ({ params }: PageProps): Promise => {

diff --git a/Frontend/src/app/api/docs/search/route.ts b/Frontend/src/app/api/docs/search/route.ts new file mode 100644 index 0000000..f33b9a4 --- /dev/null +++ b/Frontend/src/app/api/docs/search/route.ts @@ -0,0 +1,30 @@ +import { NextRequest, NextResponse } from "next/server"; +import { DOCS_SEARCH_INDEX } from "@/lib/search"; +import { FuseResult } from "fuse.js"; + +export const GET = async (request: NextRequest): Promise => { + const query: string | null = request.nextUrl.searchParams.get("query"); // The query to search for + + // Ensure the query is valid + if (!query || query.length < 3 || query.length > 64) { + return new NextResponse( + JSON.stringify({ error: "Invalid query given" }), + { status: 400 } + ); + } + + // Return the results of the search + return new NextResponse( + JSON.stringify( + DOCS_SEARCH_INDEX.search(query, { limit: 5 }).map( + (result: FuseResult) => { + return { + slug: result.item.slug, + title: result.item.title, + summary: result.item.summary, + }; + } + ) + ) + ); +}; diff --git a/Frontend/src/app/common/search.ts b/Frontend/src/app/common/search.ts new file mode 100644 index 0000000..180abec --- /dev/null +++ b/Frontend/src/app/common/search.ts @@ -0,0 +1,14 @@ +import Fuse from "fuse.js"; +import { getDocsContent } from "@/lib/mdxUtils"; + +/** + * The fuse index for searching the docs. + */ +export const DOCS_SEARCH_INDEX: Fuse = new Fuse( + getDocsContent(), + { + keys: ["title", "summary"], + includeScore: true, + threshold: 0.5, + } +); diff --git a/Frontend/src/app/components/counter.tsx b/Frontend/src/app/components/counter.tsx index 8914f49..d14751a 100644 --- a/Frontend/src/app/components/counter.tsx +++ b/Frontend/src/app/components/counter.tsx @@ -31,6 +31,7 @@ type CounterProps = { /** * A counter component. * + * @param name the name of the counter * @param amount the amount to count up to * @param duration the optional duration of the count up * @returns the counter jsx diff --git a/Frontend/src/app/components/docs/search/search-dialog.tsx b/Frontend/src/app/components/docs/search/search-dialog.tsx new file mode 100644 index 0000000..1fe3c58 --- /dev/null +++ b/Frontend/src/app/components/docs/search/search-dialog.tsx @@ -0,0 +1,146 @@ +"use client"; + +import { + AnchorHTMLAttributes, + ChangeEvent, + HTMLAttributes, + ReactElement, + useState, +} from "react"; +import { + DialogClose, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { Label } from "@/components/ui/label"; +import Link from "next/link"; + +/** + * Content for the search dialog. + * + * @return the content jsx + */ +const SearchDialogContent = (): ReactElement => { + const [label, setLabel] = useState(undefined); + const [results, setResults] = useState( + undefined + ); // The search results + + /** + * Search the docs with the given query. + */ + const search = async ( + event: ChangeEvent + ): Promise => { + const query: string = event.target.value; // Get the query to search for + const tooShort: boolean = query.length < 3; + + // No query or too short + if (!query || tooShort || query.length > 64) { + // Display warning + if (query) { + setLabel( + tooShort + ? "Please enter at least 3 characters" + : "Your input is too long" + ); + } + setResults(undefined); + return; + } + const response: Response = await fetch( + `/api/docs/search?query=${query}` + ); // Search the docs + setLabel(undefined); // Clear the label + setResults((await response.json()) as DocsContentMetadata[]); + }; + + // Render the contents + return ( + <> + {/* Header */} + + Quick Search + + Quickly find the documentation you're looking for by + typing in a few terms. + + + {/* Query Input */} +
+ + +
+
+ + {/* Results */} +
+ {results?.length === 0 && ( +

No Results

+ )} + {results?.map( + ( + result: DocsContentMetadata, + index: number + ): ReactElement => ( + + ) + )} +
+ + {/* Footer */} + + + + + + + ); +}; + +/** + * The props for a search result entry. + */ +type SearchResultEntryProps = { + /** + * The search result to display. + */ + result: DocsContentMetadata; +}; + +/** + * A search result entry. + * + * @param result the result to display + * @param props the additional props + * @return the result jsx + */ +const SearchResultEntry = ({ + result, + ...props +}: AnchorHTMLAttributes & + SearchResultEntryProps): ReactElement => ( + +

{result.title}

+

{result.summary}

+ +); + +export default SearchDialogContent; diff --git a/Frontend/src/app/components/docs/search/search-input.tsx b/Frontend/src/app/components/docs/search/search-input.tsx new file mode 100644 index 0000000..9257cff --- /dev/null +++ b/Frontend/src/app/components/docs/search/search-input.tsx @@ -0,0 +1,37 @@ +import { ReactElement } from "react"; +import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; +import { Input } from "@/components/ui/input"; +import { MagnifyingGlassIcon } from "@heroicons/react/24/outline"; +import SearchDialogContent from "@/components/docs/search/search-dialog"; + +/** + * The quick search component. + * + * @return the search jsx + */ +const QuickSearch = (): ReactElement => ( + + + {/* Button to open search */} +
+ +
+ + +
+ + + +
+); +export default QuickSearch; diff --git a/Frontend/src/app/components/docs/sidebar.tsx b/Frontend/src/app/components/docs/sidebar.tsx index dbdef87..88a194f 100644 --- a/Frontend/src/app/components/docs/sidebar.tsx +++ b/Frontend/src/app/components/docs/sidebar.tsx @@ -1,10 +1,10 @@ import { ReactElement } from "react"; -import { Input } from "@/components/ui/input"; -import { getDocsContent } from "@/lib/mdxUtils"; import Link from "next/link"; import { cn } from "@/lib/utils"; import { capitalize } from "@/lib/stringUtils"; import { minecrafter } from "@/font/fonts"; +import { getDocsContent } from "@/lib/mdxUtils"; +import QuickSearch from "@/components/docs/search/search-input"; /** * The sidebar for the docs page. @@ -23,13 +23,8 @@ const Sidebar = ({ activeSlug }: { activeSlug: string }): ReactElement => { return (
- {/* Search */} - + {/* Quick Search */} + {/* Links */}
@@ -45,7 +40,7 @@ const Sidebar = ({ activeSlug }: { activeSlug: string }): ReactElement => { {/* Category */}

diff --git a/Frontend/src/app/components/footer.tsx b/Frontend/src/app/components/footer.tsx index d7aec28..7c21505 100644 --- a/Frontend/src/app/components/footer.tsx +++ b/Frontend/src/app/components/footer.tsx @@ -21,7 +21,7 @@ const Footer = (): ReactElement => ( >
{/* Branding */} -
+
{/* Logo & Site Name */}
( {/* Header */}

diff --git a/Frontend/src/app/components/landing/hero.tsx b/Frontend/src/app/components/landing/hero.tsx index a2af413..1521b4d 100644 --- a/Frontend/src/app/components/landing/hero.tsx +++ b/Frontend/src/app/components/landing/hero.tsx @@ -13,7 +13,7 @@ import { ReactElement } from "react"; */ const Hero = (): ReactElement => (
-
+
{/* Title */}

(
-
+
diff --git a/Frontend/src/app/components/ui/dialog.tsx b/Frontend/src/app/components/ui/dialog.tsx new file mode 100644 index 0000000..51abff2 --- /dev/null +++ b/Frontend/src/app/components/ui/dialog.tsx @@ -0,0 +1,122 @@ +"use client"; + +import * as React from "react"; +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { X } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const Dialog = DialogPrimitive.Root; + +const DialogTrigger = DialogPrimitive.Trigger; + +const DialogPortal = DialogPrimitive.Portal; + +const DialogClose = DialogPrimitive.Close; + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +DialogContent.displayName = DialogPrimitive.Content.displayName; + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DialogHeader.displayName = "DialogHeader"; + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DialogFooter.displayName = "DialogFooter"; + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogTitle.displayName = DialogPrimitive.Title.displayName; + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogDescription.displayName = DialogPrimitive.Description.displayName; + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +}; diff --git a/Frontend/src/app/not-found.tsx b/Frontend/src/app/not-found.tsx index e5b3efc..1c71da9 100644 --- a/Frontend/src/app/not-found.tsx +++ b/Frontend/src/app/not-found.tsx @@ -9,7 +9,7 @@ import { ReactElement } from "react"; * @returns the page jsx */ const NotFoundPage = (): ReactElement => ( -
+
{/* Creeper */}