import { inventoryApi, inventoryKeys } from "@metis/assets/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 { CompanyDTO } from "../../common"; import { accessApi, accessKeys } from "../access/access-api"; import { accessLabel } from "../access/access-labels"; import { FolderMappingsPage } from "../folders/folder-mappings-page"; import { MailConfigurationsPage } from "../mail/mail-configurations-page"; import { PrinterConfigurationsPage } from "../printers/printer-configurations-page"; import { ProfileFeedback } from "./profile-feedback"; import { profileApi, profileKeys } from "./work-profile-api"; import { WorkProfileForm } from "./work-profile-form"; export function WorkProfilesPage({ company, csrfToken, }: { company: CompanyDTO; csrfToken: string; }) { const { t, i18n } = useTranslation("companies"); const [configuration, setConfiguration] = useState<{ kind: "folders" | "mail" | "printers"; profileId: string; }>(); const [editor, setEditor] = useState(); const [view, setView] = useState(); const [search, setSearch] = useState(""); const [archived, setArchived] = useState(false); const query = 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 access = useQuery({ queryKey: accessKeys.scope(company.id), queryFn: () => accessApi.request(company.id), }); const profiles = query.data?.profiles ?? []; const edited = profiles.find((item) => item.id === editor); const viewed = profiles.find((item) => item.id === view); const person = (id: string) => company.people.find((item) => item.id === id)?.name ?? id; const asset = (id: string) => inventory.data?.assets.find((item) => item.id === id)?.values.name ?? id; const account = (id: string | null) => { const item = access.data?.items.find((item) => item.id === id); return item ? accessLabel(item, access.data?.items ?? [], company.people) : (id ?? t("profiles.noAccount")); }; const filtered = profiles.filter( (item) => (archived || item.values.active) && [item.values.name, person(item.values.personId), asset(item.values.assetId)].some((value) => value.toLocaleLowerCase().includes(search.trim().toLocaleLowerCase()) ) ); const ready = [query.data, inventory.data, access.data].every(Boolean); if (configuration) { return ( setConfiguration(undefined)} selection={configuration} /> ); } return (

{t("profiles.title")}

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

{t("loading")}

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

{t(profiles.length ? "noResults" : "profiles.empty")}

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

{item.values.name} ·{" "} {t(item.values.active ? "profiles.active" : "profiles.inactive")}

{person(item.values.personId)} · {asset(item.values.assetId)}

{account(item.values.accountId)}

{item.needsReview && (

{t("profiles.review")}

)}
))}
)} {editor && ( { if (!open) { setEditor(undefined); } }} open title={t(edited ? "profiles.edit" : "profiles.new")} wide > setEditor(undefined)} profile={edited} /> )} {viewed && ( { if (!open) { setView(undefined); } }} open title={t("profiles.history")} wide >

{person(viewed.values.personId)} · {asset(viewed.values.assetId)}

{t("profiles.account")}: {account(viewed.values.accountId)}

{viewed.needsReview &&

{t("profiles.review")}

}

{t("profiles.unknownConfiguration")}

{t("profiles.stations")}

{inventory.data?.workstations .filter( (station) => station.values.active && [...station.values.assetIds, ...station.values.sharedAssetIds].includes( viewed.values.assetId ) ) .map((station) => station.values.name) .join(" · ") || t("profiles.noStation")}

    {[...viewed.history].reverse().map((revision) => (
  1. {new Intl.DateTimeFormat(i18n.language, { dateStyle: "medium", timeStyle: "short", }).format(new Date(revision.recordedAt))}{" "} · {revision.actorName}

    {revision.values.name} ·{" "} {t(revision.values.active ? "profiles.active" : "profiles.inactive")}

    {account(revision.values.accountId)}

    {revision.values.notes && (

    {revision.values.notes}

    )}
  2. ))}
)}
); } function ProfileConfigurations({ company, csrfToken, selection, onBack, }: { company: CompanyDTO; csrfToken: string; selection: { kind: "folders" | "mail" | "printers"; profileId: string }; onBack: () => void; }) { const { t } = useTranslation("companies"); const props = { company, csrfToken, initialProfileId: selection.profileId }; return (
{selection.kind === "folders" && } {selection.kind === "mail" && } {selection.kind === "printers" && }
); }