metis-desk/modules/resources/src/web/global-applications/detail/ui/global-application-detail.tsx

75 lines
2.7 KiB
TypeScript
Raw Normal View History

2026-10-24 23:19:17 +00:00
import { DetailField } from "@repo/rdx-ui/components/detail-field";
import { EntityListHeader, EntityStatus } from "@repo/rdx-ui/components/entity-list";
import { LayersIcon } from "@repo/rdx-ui/lib/icons";
import { Button } from "@repo/shadcn-ui/components/button";
import { useQuery } from "@tanstack/react-query";
import { useTranslation } from "react-i18next";
import type { GlobalApplicationCapabilitiesDTO } from "../../../../common";
import { OperatingSystemProductFields } from "../../../global-operating-systems/shared/ui/operating-system-product-fields";
import { useGlobalSoftwareCatalog } from "../../shared/global-software-catalog-context";
2026-10-24 23:19:17 +00:00
import { GlobalApplicationFeedback } from "../../shared/ui/global-application-feedback";
import { GlobalApplicationAdministration } from "./global-application-administration";
export function GlobalApplicationDetail({
id,
access,
onEdit,
}: {
id: string;
access: GlobalApplicationCapabilitiesDTO | undefined;
onEdit: (id: string) => void;
}) {
const {
api: globalApplicationsApi,
keys: globalApplicationKeys,
text,
} = useGlobalSoftwareCatalog();
2026-10-24 23:19:17 +00:00
const { t } = useTranslation("resources");
const query = useQuery({
queryKey: globalApplicationKeys.detail(id),
queryFn: () => globalApplicationsApi.detail(id),
retry: false,
});
const resource = query.data?.resource;
return (
<div className="space-y-6">
<GlobalApplicationFeedback error={query.error} />
{query.isPending && <p role="status">{t(`${text}.loading`)}</p>}
2026-10-24 23:19:17 +00:00
{query.isError && (
<Button onClick={() => query.refetch()} variant="outline">
{t(`${text}.retry`)}
2026-10-24 23:19:17 +00:00
</Button>
)}
{resource && (
<>
<EntityListHeader
description={t(`${text}.detailDescription`)}
2026-10-24 23:19:17 +00:00
icon={<LayersIcon />}
title={resource.name}
/>
{access?.canManage ? (
<GlobalApplicationAdministration access={access} id={id} onEdit={onEdit} />
) : (
<div className="grid gap-4 sm:grid-cols-2">
<DetailField label={t(`${text}.provider`)}>{resource.provider ?? "—"}</DetailField>
2026-10-24 23:19:17 +00:00
<DetailField label={t("status")}>
<EntityStatus active={resource.active}>
{t(resource.active ? "active" : "inactive")}
</EntityStatus>
</DetailField>
{resource.kind === "os" && <OperatingSystemProductFields product={resource} />}
<DetailField label={t(`${text}.url`)}>{resource.url ?? "—"}</DetailField>
<DetailField label={t(`${text}.productDescription`)}>
2026-10-24 23:19:17 +00:00
{resource.description ?? "—"}
</DetailField>
</div>
)}
</>
)}
</div>
);
}