diff --git a/web/package-lock.json b/web/package-lock.json
index f43461d95..770bede35 100644
Binary files a/web/package-lock.json and b/web/package-lock.json differ
diff --git a/web/package.json b/web/package.json
index f496d8a56..ffbb140b9 100644
--- a/web/package.json
+++ b/web/package.json
@@ -11,6 +11,7 @@
"dependencies": {
"@azure/monitor-opentelemetry": "^1.11.1",
"@opentelemetry/exporter-jaeger": "^2.0.1",
+ "@radix-ui/react-dialog": "^1.1.14",
"@radix-ui/react-dropdown-menu": "^2.1.15",
"@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-tooltip": "^1.2.7",
diff --git a/web/src/app/@sheet/(.)lists/[listId]/page.tsx b/web/src/app/@sheet/(.)lists/[listId]/page.tsx
new file mode 100644
index 000000000..9f505ccf1
--- /dev/null
+++ b/web/src/app/@sheet/(.)lists/[listId]/page.tsx
@@ -0,0 +1,17 @@
+import {
+ getFilterListDetails,
+ FilterListDetails,
+} from "@/services/get-filterlist-details";
+import { SheetContentRenderer } from "@/components/sheet-content-renderer";
+
+export default async function InterceptedListDetailsPage({
+ params,
+}: {
+ params: Promise<{ listId: string }>;
+}) {
+ const { listId: rawListId } = await params;
+ const listId = parseInt(rawListId, 10);
+ const list: FilterListDetails = await getFilterListDetails(listId);
+
+ return ;
+}
diff --git a/web/src/app/@sheet/default.tsx b/web/src/app/@sheet/default.tsx
new file mode 100644
index 000000000..6ddf1b76f
--- /dev/null
+++ b/web/src/app/@sheet/default.tsx
@@ -0,0 +1,3 @@
+export default function Default() {
+ return null;
+}
diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx
index b0eb9be14..dbb94f558 100644
--- a/web/src/app/layout.tsx
+++ b/web/src/app/layout.tsx
@@ -17,8 +17,10 @@ const geistMono = Geist_Mono({
export default function RootLayout({
children,
+ sheet,
}: Readonly<{
children: React.ReactNode;
+ sheet: React.ReactNode;
}>) {
return (
@@ -37,6 +39,7 @@ export default function RootLayout({
>
{children}
+ {sheet}
diff --git a/web/src/app/lists/[listId]/page.tsx b/web/src/app/lists/[listId]/page.tsx
new file mode 100644
index 000000000..f2966411b
--- /dev/null
+++ b/web/src/app/lists/[listId]/page.tsx
@@ -0,0 +1,26 @@
+import {
+ getFilterListDetails,
+ FilterListDetails,
+} from "@/services/get-filterlist-details";
+
+export default async function ListDetailsPage({
+ params,
+}: {
+ params: Promise<{ listId: string }>;
+}) {
+ const { listId: rawListId } = await params;
+ const listId = parseInt(rawListId, 10);
+ const list: FilterListDetails = await getFilterListDetails(listId);
+
+ return (
+
+
{list.name}
+
{list.description}
+
+
Maintainers: {list.maintainerIds?.join(", ")}
+
Syntaxes: {list.syntaxIds?.join(", ")}
+
Languages: {list.languageIds?.join(", ")}
+
License: {list.licenseId}
+
+ );
+}
diff --git a/web/src/components/filterlist-table/columns.tsx b/web/src/components/filterlist-table/columns.tsx
index f436794b3..9d3910672 100644
--- a/web/src/components/filterlist-table/columns.tsx
+++ b/web/src/components/filterlist-table/columns.tsx
@@ -6,6 +6,7 @@ import { BadgeCloud } from "@/components/badge-cloud";
import { FilterList } from "@/services/get-filterlists";
import { ArrowUpDown, ArrowUp, ArrowDown } from "lucide-react";
import { Button } from "@/components/ui/button";
+import Link from "next/link";
const SortableHeader = ({
column,
@@ -37,7 +38,9 @@ export const columns = [
Name
),
cell: (info) => (
- {info.getValue()}
+
+ {info.getValue()}
+
),
enableSorting: true,
size: 200,
@@ -45,7 +48,9 @@ export const columns = [
columnHelper.accessor((row) => row.description, {
header: "Description",
cell: (info) => (
- {info.getValue()}
+
+ {info.getValue()}
+
),
size: 400,
}),
@@ -172,4 +177,14 @@ export const columns = [
},
size: 200,
}),
+ columnHelper.display({
+ id: "actions",
+ cell: ({ row }) => {
+ return (
+
+
+
+ );
+ },
+ }),
];
diff --git a/web/src/components/sheet-content-renderer.tsx b/web/src/components/sheet-content-renderer.tsx
new file mode 100644
index 000000000..2d1a49da4
--- /dev/null
+++ b/web/src/components/sheet-content-renderer.tsx
@@ -0,0 +1,42 @@
+"use client";
+
+import { useRouter } from "next/navigation";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+} from "@/components/ui/sheet";
+import { FilterListDetails } from "@/services/get-filterlist-details";
+
+export function SheetContentRenderer({
+ list,
+}: {
+ list: FilterListDetails | null;
+}) {
+ const router = useRouter();
+
+ const handleOpenChange = (isOpen: boolean) => {
+ if (!isOpen) {
+ router.back();
+ }
+ };
+
+ return (
+
+
+
+ {list?.name}
+
+ {list ? (
+
+
{list.description}
+ {/* Render more details as needed */}
+
+ ) : (
+ Loading...
+ )}
+
+
+ );
+}
diff --git a/web/src/components/ui/sheet.tsx b/web/src/components/ui/sheet.tsx
new file mode 100644
index 000000000..d30779f4f
--- /dev/null
+++ b/web/src/components/ui/sheet.tsx
@@ -0,0 +1,139 @@
+"use client";
+
+import * as React from "react";
+import * as SheetPrimitive from "@radix-ui/react-dialog";
+import { XIcon } from "lucide-react";
+
+import { cn } from "@/lib/utils";
+
+function Sheet({ ...props }: React.ComponentProps) {
+ return ;
+}
+
+function SheetTrigger({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function SheetClose({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function SheetPortal({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function SheetOverlay({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function SheetContent({
+ className,
+ children,
+ side = "right",
+ ...props
+}: React.ComponentProps & {
+ side?: "top" | "right" | "bottom" | "left";
+}) {
+ return (
+
+
+
+ {children}
+
+
+ Close
+
+
+
+ );
+}
+
+function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function SheetTitle({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function SheetDescription({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+export {
+ Sheet,
+ SheetTrigger,
+ SheetClose,
+ SheetContent,
+ SheetHeader,
+ SheetFooter,
+ SheetTitle,
+ SheetDescription,
+};