import { useTranslation } from "react-i18next"; import type { ResourceDTO, ResourceInput, ResourceReferenceDTO } from "../common/inventory"; export function ResourceDetail({ resource, references = [], }: { resource: ResourceDTO; references?: readonly ResourceReferenceDTO[]; }) { const { t, i18n } = useTranslation("resources"); const display = (value: string | number | boolean | undefined) => value === undefined ? t("noValue") : typeof value === "boolean" ? t(value ? "yes" : "no") : String(value); return (

{t("snapshotNotice")}

{t("template")}
{resource.specification.templateName}
{t("status")}
{t(resource.values.active ? "active" : "inactive")}
{resource.specification.fields.map((field) => (
{field.name} {field.unit ? ` (${field.unit})` : ""}
{display(resource.values.characteristics[field.fieldId])}
))}
{resource.values.notes && (

{resource.values.notes}

)}

{t("history")} ({resource.history.length})

    {[...resource.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")}

    {resource.specification.fields.map((field) => (
    {field.name}
    {display(revision.values.characteristics[field.fieldId])}
    ))}
    {revision.values.notes && (

    {revision.values.notes}

    )}
  2. ))}
); } function IntegrationSummary({ integration, references, }: { integration: ResourceInput["integration"]; references: readonly ResourceReferenceDTO[]; }) { const { t } = useTranslation("resources"); if (!integration) { return null; } const entries = integration.kind === "mailbox" ? [ { label: t("mailboxKind"), value: t(integration.mailboxKind) }, { label: t("relatedAccount"), value: referenceName(integration.accountId, references, t("noValue")), }, ] : (["resourceTypeId", "systemId", "environmentId"] as const).map((key) => ({ label: t(key), value: referenceName(integration[key], references, t("noValue")), })); return (
{entries.map((entry) => (
{entry.label}
{entry.value}
))}
); } function referenceName( id: string | null, references: readonly ResourceReferenceDTO[], missing: string ) { return id ? (references.find((item) => item.id === id)?.name ?? id) : missing; }