metis-desk/modules/resources/src/web/global-applications/shared/ui/global-application-coincidences.tsx
David d2bf856c97 feat(global-operating-systems): implement global operating systems management features
- Add softwareReferenceHref helper function for generating resource links.
- Create useGlobalResourceEditor hook for managing global application resources.
- Implement useGlobalResourceForm hook for handling global resource forms.
- Introduce GlobalSoftwareCatalogProvider for context management of global applications.
- Develop GlobalOperatingSystemsPage to render global operating systems using the existing GlobalApplicationsPage.
- Add operating system form identity helpers for managing OS-specific fields.
- Create operating system specification labels for better localization.
- Implement OperatingSystemIdentityReview component for reviewing OS identities.
- Add OperatingSystemProductFields component for displaying OS product details.
- Write tests for resource characteristic control to ensure proper translation and value handling.
- Create a Python script for auditing global operating systems UI interactions.
- Add tests for expanded workstation profiles to ensure proper functionality and responsiveness.
2026-10-25 20:39:06 +01:00

56 lines
1.8 KiB
TypeScript

import { BrowserLink } from "@metis/core/client";
import { useQuery } from "@tanstack/react-query";
import { useTranslation } from "react-i18next";
import { useGlobalSoftwareCatalog } from "../global-software-catalog-context";
import { GlobalApplicationFeedback } from "./global-application-feedback";
export function GlobalApplicationCoincidences({ name }: { name: string }) {
const {
api: globalApplicationsApi,
keys: globalApplicationKeys,
text,
} = useGlobalSoftwareCatalog();
const { t } = useTranslation("resources");
const queryData = { search: name.trim(), sort: "name", direction: "asc", pageSize: 10 } as const;
const query = useQuery({
queryKey: globalApplicationKeys.list(queryData),
queryFn: () => globalApplicationsApi.list(queryData),
enabled: queryData.search.length > 0,
retry: false,
});
return (
<div className="space-y-2 text-sm">
<GlobalApplicationFeedback error={query.error} />
{query.isFetching && <p role="status">{t(`${text}.duplicateLoading`)}</p>}
{query.data && query.data.items.length > 0 && (
<>
<p>{t(`${text}.duplicates`)}</p>
<ul className="list-inside list-disc">
{query.data.items.map((item) => (
<li key={item.id}>
<BrowserLink
href={`/catalogs/global-applications/${item.id}`}
rel="noopener noreferrer"
target="_blank"
>
{item.name} · {item.provider ?? "—"}
</BrowserLink>
</li>
))}
</ul>
</>
)}
<BrowserLink
href={`/catalogs/global-applications?q=${encodeURIComponent(queryData.search)}`}
rel="noopener noreferrer"
target="_blank"
>
{t(`${text}.reviewCatalog`)}
</BrowserLink>
</div>
);
}