import { inventoryApi, inventoryKeys } from "@metis/assets/client"; import { inventoryApi as resourceApi, inventoryKeys as resourceKeys, } from "@metis/resources/client"; import { Button } from "@repo/shadcn-ui/components/button"; import { Card, CardContent } from "@repo/shadcn-ui/components/card"; import { FormDialog } from "@repo/shadcn-ui/components/form-dialog"; import { Input } from "@repo/shadcn-ui/components/input"; import { useQuery } from "@tanstack/react-query"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import type { CertificateConfigurationDTO, CompanyDTO } from "../../common"; import { profileApi, profileKeys } from "../profiles/work-profile-api"; import { certificateApi, certificateKeys } from "./certificate-api"; import { CertificateConfigurationForm } from "./certificate-configuration-form"; import { CertificateFeedback } from "./certificate-feedback"; export function CertificateConfigurationsPage({ company, csrfToken, initialProfileId, }: { company: CompanyDTO; csrfToken: string; initialProfileId?: string; }) { const { t, i18n } = useTranslation("companies"); const [editor, setEditor] = useState(); const [view, setView] = useState(); const [search, setSearch] = useState(""); const query = useQuery({ queryKey: certificateKeys.company(company.id), queryFn: () => certificateApi.get(company.id), }); const profiles = useQuery({ queryKey: profileKeys.company(company.id), queryFn: () => profileApi.get(company.id), }); const inventory = useQuery({ queryKey: inventoryKeys.company(company.id), queryFn: () => inventoryApi.get(company.id), }); const resources = useQuery({ queryKey: resourceKeys.company(company.id), queryFn: () => resourceApi.get(company.id), }); const resource = (id: string) => resources.data?.resources.find((item) => item.id === id)?.values.name ?? id; const configurations = query.data?.configurations ?? []; const asset = (id: string) => inventory.data?.assets.find((item) => item.id === id)?.values.name ?? id; const profile = (id: string) => profiles.data?.profiles.find((item) => item.id === id); const label = (id: string) => { const item = profile(id); return item ? `${item.values.name} · ${company.people.find((person) => person.id === item.values.personId)?.name ?? ""} · ${asset(item.values.assetId)}` : id; }; const filtered = configurations.filter( (item) => (!initialProfileId || item.values.profileId === initialProfileId) && `${resource(item.values.resourceId)} ${label(item.values.profileId)}` .toLocaleLowerCase() .includes(search.trim().toLocaleLowerCase()) ); const edited = configurations.find((item) => item.id === editor); const viewed = configurations.find((item) => item.id === view); const ready = [query.data, profiles.data, inventory.data, resources.data].every(Boolean); const canCreate = !initialProfileId || profile(initialProfileId)?.values.active === true; return (

{t("certificates.title")}

setSearch(event.target.value)} placeholder={t("certificates.search")} value={search} /> {(query.isPending || profiles.isPending || inventory.isPending || resources.isPending) && (

{t("loading")}

)} {(query.isError || profiles.isError || inventory.isError || resources.isError) && ( )} {ready && ( {!filtered.length && (

{t("certificates.empty")}

)} {filtered.map((item) => (

{resource(item.values.resourceId)}

{label(item.values.profileId)}

{t(`mail.${item.values.state}`)}

{item.values.location && (

{t("certificates.locationValue", { location: item.values.location })}

)} {item.expiresOn && (

{t("certificates.expiryValue", { date: new Intl.DateTimeFormat(i18n.language, { dateStyle: "medium", timeZone: "UTC", }).format(new Date(item.expiresOn)), })} {item.expired ? ` · ${t("certificates.expired")}` : ""}

)} {item.needsReview && (

{t("certificates.review")}

)}
{!["removed", "never_configured"].includes(item.values.state) && ( )}
))}
)} {editor && ( { if (!open) { setEditor(undefined); } }} open title={t(edited ? "certificates.edit" : "certificates.new")} wide > setEditor(undefined)} /> )} {viewed && ( { if (!open) { setView(undefined); } }} open title={t("mail.history")} wide > )}
); } function CertificateHistory({ configuration }: { configuration: CertificateConfigurationDTO }) { const { t, i18n } = useTranslation("companies"); return (
    {[...configuration.history].reverse().map((revision) => (
  1. {new Intl.DateTimeFormat(i18n.language, { dateStyle: "medium", timeStyle: "short", }).format(new Date(revision.recordedAt))}{" "} · {revision.actorName}

    {t(`mail.${revision.values.state}`)}

    {revision.values.location && (

    {t("certificates.locationValue", { location: revision.values.location })}

    )} {revision.values.notes && (

    {revision.values.notes}

    )}
  2. ))}
); }