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) => (
-
{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}
)}
))}
);
}
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;
}