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";
|
2026-10-25 19:39:06 +00:00
|
|
|
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;
|
|
|
|
|
}) {
|
2026-10-25 19:39:06 +00:00
|
|
|
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} />
|
2026-10-25 19:39:06 +00:00
|
|
|
{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">
|
2026-10-25 19:39:06 +00:00
|
|
|
{t(`${text}.retry`)}
|
2026-10-24 23:19:17 +00:00
|
|
|
</Button>
|
|
|
|
|
)}
|
|
|
|
|
{resource && (
|
|
|
|
|
<>
|
|
|
|
|
<EntityListHeader
|
2026-10-25 19:39:06 +00:00
|
|
|
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">
|
2026-10-25 19:39:06 +00:00
|
|
|
<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>
|
2026-10-25 19:39:06 +00:00
|
|
|
{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>
|
|
|
|
|
);
|
|
|
|
|
}
|