metis-desk/modules/companies/src/web/resources/detail/ui/company-resource-related-content.tsx
2026-10-25 01:19:17 +02:00

89 lines
3.1 KiB
TypeScript

import { DomainDirectoryMemberships, NetworkSharePublications } from "@metis/assets/client";
import { BrowserLink } from "@metis/core/client";
import { catalogApi, catalogKeys, companyApplicationEligible } from "@metis/resources/client";
import type { ResourceDTO } from "@metis/resources/common";
import { DetailPanel } from "@repo/rdx-ui/components/detail-panel";
import { KeyRoundIcon } from "@repo/rdx-ui/lib/icons";
import { useQuery } from "@tanstack/react-query";
import { useTranslation } from "react-i18next";
import type { CompanyDTO } from "../../../../common";
import { MailboxRelations } from "../../../mailboxes";
import { ApplicationResourceUsage } from "./application-resource-usage";
export function CompanyResourceRelatedContent({
company,
resource,
}: {
company: CompanyDTO;
resource: ResourceDTO;
}) {
const { t } = useTranslation("companies");
const directory = resource.directory;
const catalog = useQuery({
queryKey: catalogKeys.scope(company.id),
queryFn: () => catalogApi.get(company.id),
});
if (companyApplicationEligible(resource, catalog.data?.items ?? [])) {
return <ApplicationResourceUsage companyId={company.id} resourceId={resource.id} />;
}
if (resource.networkShare?.capability === "network:smb-share") {
return (
<div className="flex min-w-0 flex-col gap-5">
<NetworkSharePublications
anchor={{ type: "resources:resource", id: resource.id }}
canPublish={resource.values.active}
companyId={company.id}
key={resource.id}
/>
<DetailPanel icon={<KeyRoundIcon />} title={t("smb.access")}>
<div className="flex flex-wrap gap-3">
{(["need", "grant", "permission", "account", "group"] as const).map((kind) => (
<BrowserLink
href={`/companies/${company.id}/access?kind=${kind}&resourceId=${resource.id}`}
key={kind}
>
{t(`smb.${kind}`)}
</BrowserLink>
))}
</div>
<p className="mt-3 text-sm text-muted-foreground">{t("smb.documentary")}</p>
</DetailPanel>
</div>
);
}
if (directory?.capability === "directory:domain") {
return (
<div className="min-w-0 space-y-5">
<DomainDirectoryMemberships
companyId={company.id}
domainId={resource.id}
key={resource.id}
/>
<DetailPanel icon={<KeyRoundIcon />} title={t("windowsDomain.accountsAndGroups")}>
<div className="flex flex-wrap gap-3">
<BrowserLink
href={`/companies/${company.id}/access?kind=account&environmentId=${directory.environmentId}`}
>
{t("windowsDomain.accounts")}
</BrowserLink>
<BrowserLink
href={`/companies/${company.id}/access?kind=group&environmentId=${directory.environmentId}`}
>
{t("windowsDomain.groups")}
</BrowserLink>
</div>
</DetailPanel>
</div>
);
}
return resource.values.integration?.kind === "mailbox" ? (
<MailboxRelations company={company} mailboxId={resource.id} />
) : null;
}