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 { WorkstationDTO } from "../common"; import { InventoryFeedback, type InventoryLookups } from "./asset-form"; import { inventoryApi, inventoryKeys } from "./inventory-api"; import { WorkstationForm } from "./workstation-form"; export function WorkstationsPage({ companyId, csrfToken, lookups, }: { companyId: string; csrfToken: string; lookups: InventoryLookups; }) { const { t, i18n } = useTranslation("assets"); const [search, setSearch] = useState(""); const [editor, setEditor] = useState(); const [view, setView] = useState(); const query = useQuery({ queryKey: inventoryKeys.company(companyId), queryFn: () => inventoryApi.get(companyId), }); const stations = query.data?.workstations ?? []; const assets = query.data?.assets ?? []; const edited = stations.find((item) => item.id === editor); const viewed = stations.find((item) => item.id === view); const personName = (id: string | null) => lookups.people.find((item) => item.id === id)?.name ?? t("noAssignment"); const siteName = (id: string | null) => lookups.sites.find((item) => item.id === id)?.name ?? t("noAssignment"); const members = (ids: readonly string[], empty = "noWorkstationAssets") => ids.map((id) => assets.find((item) => item.id === id)?.values.name ?? id).join(" · ") || t(empty); const filtered = stations.filter((item) => [item.values.name, personName(item.values.personId), siteName(item.values.siteId)].some( (value) => value.toLocaleLowerCase().includes(search.trim().toLocaleLowerCase()) ) ); const summary = (item: WorkstationDTO) => ( <>

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

{siteName(item.values.siteId)} · {personName(item.values.personId)} ·{" "} {t("workstationCount", { count: item.values.assetIds.length + item.values.sharedAssetIds.length, })}

{t("exclusiveWorkstationAssets")}: {members(item.values.assetIds)}

{t("sharedWorkstationAssets")}:{" "} {members(item.values.sharedAssetIds, "noSharedWorkstationAssets")}

); return (

{t("workstations")}

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

{t("loading")}

} {query.isError && ( )} {query.data && ( {!filtered.length && (

{t(stations.length ? "noResults" : "noWorkstations")}

)} {filtered.map((item) => (
{summary(item)}
))}
)} {editor && ( { if (!open) { setEditor(undefined); } }} open title={t(edited ? "editWorkstation" : "newWorkstation")} wide > setEditor(undefined)} workstation={edited} /> )} {viewed && ( { if (!open) { setView(undefined); } }} open title={t("workstationHistory")} wide >
    {[...viewed.history].reverse().map((revision) => (
  1. {new Intl.DateTimeFormat(i18n.language, { dateStyle: "medium", timeStyle: "short", }).format(new Date(revision.recordedAt))}{" "} · {t("recordedBy", { name: revision.actorName })}

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

    {siteName(revision.values.siteId)} · {personName(revision.values.personId)}

    {t("exclusiveWorkstationAssets")}: {members(revision.values.assetIds)}

    {t("sharedWorkstationAssets")}:{" "} {members(revision.values.sharedAssetIds, "noSharedWorkstationAssets")}

  2. ))}
)}
); }