import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Button, Checkbox, Combobox, Dialog, DialogActions, DialogBody, DialogContent, DialogSurface, DialogTitle, Field, Input, makeStyles, Option, shorthands, Table, TableBody, TableCell, TableHeader, TableHeaderCell, TableRow, Tooltip, } from "@fluentui/react-components"; import { AddRegular, DeleteRegular, EditRegular, OpenRegular, LinkMultiple24Regular } from "@fluentui/react-icons"; import { useState } from "react"; import { Link } from "react-router-dom"; import { portalApi } from "../api/portalApi"; import { DataState } from "../components/DataState"; import { PageHeader } from "../components/PageHeader"; import type { Domain } from "../types/portal"; const useStyles = makeStyles({ toolbar: { display: "flex", justifyContent: "flex-start", gap: "10px", marginBottom: "18px", }, form: { display: "grid", gap: "14px", }, actions: { display: "flex", gap: "4px", ...shorthands.padding("2px", "0"), }, }); type DialogMode = "add" | "edit" | null; export function DomainsPage() { const styles = useStyles(); const queryClient = useQueryClient(); const [dialogMode, setDialogMode] = useState(null); const [selectedDomain, setSelectedDomain] = useState(null); const [name, setName] = useState(""); const [fqdn, setFqdn] = useState(""); const [netBIOS, setNetBIOS] = useState(""); const [linkDomainId, setLinkDomainId] = useState(""); const [environmentId, setEnvironmentId] = useState(""); const [selectedIds, setSelectedIds] = useState([]); const { data, error, isLoading } = useQuery({ queryKey: ["domains"], queryFn: ({ signal }) => portalApi.getDomains(signal), }); const { data: environments, error: environmentsError, isLoading: environmentsLoading } = useQuery({ queryKey: ["environments"], queryFn: ({ signal }) => portalApi.getEnvironments(signal), }); const closeDialog = () => { setDialogMode(null); setSelectedDomain(null); setName(""); setFqdn(""); setNetBIOS(""); }; const openAddDialog = () => { setSelectedDomain(null); setName(""); setFqdn(""); setNetBIOS(""); setDialogMode("add"); }; const openEditDialog = (domain: Domain) => { setSelectedDomain(domain); setName(domain.name); setFqdn(domain.fqdn); setNetBIOS(domain.netBIOS); setDialogMode("edit"); }; const openLinkDialog = () => { setLinkDomainId(data?.[0]?.id ?? ""); setEnvironmentId(environments?.[0]?.id ?? ""); }; const addDomain = useMutation({ mutationFn: portalApi.addDomain, onSuccess: async () => { closeDialog(); await queryClient.invalidateQueries({ queryKey: ["domains"] }); }, }); const updateDomain = useMutation({ mutationFn: ({ id, domain }: { id: string; domain: { name: string; fqdn: string; netBIOS: string } }) => portalApi.updateDomain(id, domain), onSuccess: async () => { closeDialog(); await queryClient.invalidateQueries({ queryKey: ["domains"] }); }, }); const deleteDomain = useMutation({ mutationFn: portalApi.deleteDomain, onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: ["domains"] }); }, }); const deleteSelectedDomains = useMutation({ mutationFn: async (ids: string[]) => { await Promise.all(ids.map((id) => portalApi.deleteDomain(id))); }, onSuccess: async () => { setSelectedIds([]); await queryClient.invalidateQueries({ queryKey: ["domains"] }); }, }); const linkDomainToEnvironment = useMutation({ mutationFn: ({ domainId, environmentId: targetEnvironmentId }: { domainId: string; environmentId: string }) => portalApi.linkDomainToEnvironment(domainId, targetEnvironmentId), onSuccess: async () => { setLinkDomainId(""); setEnvironmentId(""); await queryClient.invalidateQueries({ queryKey: ["domains"] }); await queryClient.invalidateQueries({ queryKey: ["environments"] }); }, }); const submitDomain = (event: React.FormEvent) => { event.preventDefault(); const domain = { fqdn, name, netBIOS }; if (dialogMode === "edit" && selectedDomain) { updateDomain.mutate({ id: selectedDomain.id, domain }); return; } addDomain.mutate(domain); }; const formError = addDomain.error?.message ?? updateDomain.error?.message; const isSaving = addDomain.isPending || updateDomain.isPending; const allSelected = Boolean(data?.length) && data!.every((domain) => selectedIds.includes(domain.id)); const toggleSelected = (id: string, checked: boolean) => { setSelectedIds((current) => (checked ? [...new Set([...current, id])] : current.filter((entry) => entry !== id))); }; return ( <>
!data.open && closeDialog()}>
{dialogMode === "edit" ? "Domain aendern" : "Domain hinzufuegen"} setName(data.value)} /> setFqdn(data.value)} /> setNetBIOS(data.value)} />
{ if (!dialogData.open) { setLinkDomainId(""); setEnvironmentId(""); } }} > Link to Environment domain.id === linkDomainId)?.name ?? ""} onOptionSelect={(_, optionData) => setLinkDomainId(optionData.optionValue ?? "")} > {(data ?? []).map((domain) => ( ))} environment.id === environmentId)?.name ?? ""} onOptionSelect={(_, data) => setEnvironmentId(data.optionValue ?? "")} > {(environments ?? []).map((environment) => ( ))} {data && ( setSelectedIds(checkboxData.checked ? data.map((domain) => domain.id) : [])} /> Name FQDN NetBIOS Id Aktionen {data.map((domain) => ( toggleSelected(domain.id, Boolean(checkboxData.checked))} /> {domain.name} {domain.fqdn} {domain.netBIOS} {domain.id}
))}
)} ); }