- 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.
56 lines
1.8 KiB
TypeScript
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>
|
|
);
|
|
}
|