diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/documentation/index.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/documentation/index.tsx index f5cb8ec9a8cf3..c44982a261147 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/documentation/index.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/documentation/index.tsx @@ -16,6 +16,7 @@ import { EuiSpacer, EuiText, EuiLink, + EuiCallOut, } from '@elastic/eui'; import type { EuiInMemoryTableProps } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -34,8 +35,38 @@ interface Props { integration?: string | null; } +const getInputs = ({ packageInfo, integration }: Props) => { + return packageInfo.policy_templates?.reduce((acc, policyTemplate) => { + if (integration && policyTemplate.name !== integration) { + return acc; + } + if ('inputs' in policyTemplate && policyTemplate.inputs) { + return [ + ...acc, + ...policyTemplate.inputs.map((input) => ({ + key: `${policyTemplate.name}-${input.type}`, + ...input, + streams: getStreamsForInputType(input.type, packageInfo, []), + })), + ]; + } + return acc; + }, [] as RegistryInputWithStreams[]); +}; + +export const hasDocumentation = ({ packageInfo, integration }: Props) => { + if (packageInfo.vars && packageInfo.vars.length > 0) { + return true; + } + + if ((getInputs({ packageInfo, integration }) || []).length > 0) { + return true; + } +}; + export const DocumentationPage: React.FunctionComponent = ({ packageInfo, integration }) => { const { docLinks } = useStartServices(); + const showDocumentation = hasDocumentation({ packageInfo, integration }); const content = ( <> @@ -47,7 +78,7 @@ export const DocumentationPage: React.FunctionComponent = ({ packageInfo, defaultMessage="This documents all the inputs, streams, and variables available to use this integration programmatically via the Fleet Kibana API. {learnMore}" values={{ learnMore: ( - + = ({ packageInfo, - - - + {showDocumentation ? ( + <> + + + + ) : ( + + } + /> + )} ); @@ -127,26 +170,7 @@ const Inputs: React.FunctionComponent<{ packageInfo: PackageInfo; integration?: string | null; }> = ({ packageInfo, integration }) => { - const inputs = useMemo( - () => - packageInfo.policy_templates?.reduce((acc, policyTemplate) => { - if (integration && policyTemplate.name !== integration) { - return acc; - } - if ('inputs' in policyTemplate && policyTemplate.inputs) { - return [ - ...acc, - ...policyTemplate.inputs.map((input) => ({ - key: `${policyTemplate.name}-${input.type}`, - ...input, - streams: getStreamsForInputType(input.type, packageInfo, []), - })), - ]; - } - return acc; - }, [] as RegistryInputWithStreams[]), - [packageInfo, integration] - ); + const inputs = useMemo(() => getInputs({ packageInfo, integration }), [packageInfo, integration]); return ( <> diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx index 0a2fc69a69366..bc9ae4ebe164c 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx @@ -32,6 +32,7 @@ import { getPackageReleaseLabel, isPackagePrerelease, splitPkgKey, + packageToPackagePolicyInputs, } from '../../../../../../../common/services'; import { HIDDEN_API_REFERENCE_PACKAGES } from '../../../../../../../common/constants'; @@ -82,7 +83,7 @@ import { OverviewPage } from './overview'; import { PackagePoliciesPage } from './policies'; import { SettingsPage } from './settings'; import { CustomViewPage } from './custom'; -import { DocumentationPage } from './documentation'; +import { DocumentationPage, hasDocumentation } from './documentation'; import { Configs } from './configs'; import './index.scss'; @@ -266,6 +267,15 @@ export function Detail() { const showCustomTab = useUIExtension(packageInfoData?.item?.name ?? '', 'package-detail-custom') !== undefined; + // Only show config tab if package has `inputs` + const showConfigTab = packageInfo ? packageToPackagePolicyInputs(packageInfo).length > 0 : false; + + // Only show API references tab if it is allowed & has documentation to show + const showDocumentationTab = + !HIDDEN_API_REFERENCE_PACKAGES.includes(pkgName) && + packageInfo && + hasDocumentation({ packageInfo, integration }); + // Track install status state useEffect(() => { if (packageInfoIsFetchedAfterMount && packageInfoData?.item) { @@ -637,7 +647,7 @@ export function Detail() { }); } - if (canReadPackageSettings) { + if (canReadPackageSettings && showConfigTab) { tabs.push({ id: 'configs', name: ( @@ -673,7 +683,7 @@ export function Detail() { }); } - if (!HIDDEN_API_REFERENCE_PACKAGES.includes(packageInfo.name)) { + if (showDocumentationTab) { tabs.push({ id: 'api-reference', name: ( @@ -698,11 +708,13 @@ export function Detail() { getHref, integration, canReadIntegrationPolicies, - numOfDeferredInstallations, isInstalled, CustomAssets, canReadPackageSettings, + showConfigTab, showCustomTab, + showDocumentationTab, + numOfDeferredInstallations, ]); const securityCallout = missingSecurityConfiguration ? (