import { MagnifyingGlassIcon } from "@heroicons/react/20/solid"; import { Form } from "@remix-run/react"; import { typedjson, useTypedLoaderData } from "remix-typedjson"; import { useState } from "react"; import { z } from "zod"; import { FeatureFlagsDialog } from "~/components/admin/FeatureFlagsDialog"; import { Button, LinkButton } from "~/components/primitives/Buttons"; import { CopyableText } from "~/components/primitives/CopyableText"; import { Input } from "~/components/primitives/Input"; import { PaginationControls } from "~/components/primitives/Pagination"; import { Paragraph } from "~/components/primitives/Paragraph"; import { Table, TableBlankRow, TableBody, TableCell, TableHeader, TableHeaderCell, TableRow, } from "~/components/primitives/Table"; import { adminGetOrganizations } from "~/models/admin.server"; import { dashboardLoader } from "~/services/routeBuilders/dashboardBuilder"; import { createSearchParams } from "~/utils/searchParams"; export const SearchParams = z.object({ page: z.coerce.number().optional(), search: z.string().optional(), }); export type SearchParams = z.infer; export const loader = dashboardLoader( { authorization: { requireSuper: true } }, async ({ user, request }) => { const searchParams = createSearchParams(request.url, SearchParams); if (!searchParams.success) { throw new Error(searchParams.error); } const result = await adminGetOrganizations(user.id, searchParams.params.getAll()); return typedjson(result); } ); export default function AdminDashboardRoute() { const { organizations, filters, page, pageCount } = useTypedLoaderData(); const [flagsOrgId, setFlagsOrgId] = useState(null); const [flagsOpen, setFlagsOpen] = useState(false); const flagsOrgTitle = organizations.find((o) => o.id === flagsOrgId)?.title ?? ""; const openFlagsDialog = (orgId: string) => { setFlagsOrgId(orgId); setFlagsOpen(true); }; return (
Name Slug Members id Deleted? Back office Actions {organizations.length === 0 ? ( No orgs found for search ) : ( organizations.map((org) => { return ( {org.members.map((member) => ( ))} {org.deletedAt ? "☠️" : ""} Open
Impersonate
); }) )}
); }