Skip to content
Open
9 changes: 9 additions & 0 deletions oas_docs/bundle.json
Original file line number Diff line number Diff line change
Expand Up @@ -48863,6 +48863,9 @@
},
"type": "object"
},
"integration_knowledge_enabled": {
"type": "boolean"
},
"output_secret_storage_requirements_met": {
"type": "boolean"
},
Expand Down Expand Up @@ -49010,6 +49013,9 @@
"deprecated": true,
"type": "boolean"
},
"integration_knowledge_enabled": {
"type": "boolean"
},
"kibana_ca_sha256": {
"deprecated": true,
"type": "string"
Expand Down Expand Up @@ -49093,6 +49099,9 @@
},
"type": "object"
},
"integration_knowledge_enabled": {
"type": "boolean"
},
"output_secret_storage_requirements_met": {
"type": "boolean"
},
Expand Down
9 changes: 9 additions & 0 deletions oas_docs/bundle.serverless.json
Original file line number Diff line number Diff line change
Expand Up @@ -48351,6 +48351,9 @@
},
"type": "object"
},
"integration_knowledge_enabled": {
"type": "boolean"
},
"output_secret_storage_requirements_met": {
"type": "boolean"
},
Expand Down Expand Up @@ -48498,6 +48501,9 @@
"deprecated": true,
"type": "boolean"
},
"integration_knowledge_enabled": {
"type": "boolean"
},
"kibana_ca_sha256": {
"deprecated": true,
"type": "string"
Expand Down Expand Up @@ -48581,6 +48587,9 @@
},
"type": "object"
},
"integration_knowledge_enabled": {
"type": "boolean"
},
"output_secret_storage_requirements_met": {
"type": "boolean"
},
Expand Down
1 change: 1 addition & 0 deletions packages/kbn-check-saved-objects-cli/current_fields.json
Original file line number Diff line number Diff line change
Expand Up @@ -805,6 +805,7 @@
"fleet_server_hosts",
"has_seen_add_data_notice",
"ilm_migration_status",
"integration_knowledge_enabled",
"output_secret_storage_requirements_met",
"prerelease_integrations_enabled",
"secret_storage_requirements_met",
Expand Down
3 changes: 3 additions & 0 deletions packages/kbn-check-saved-objects-cli/current_mappings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2660,6 +2660,9 @@
"dynamic": false,
"properties": {}
},
"integration_knowledge_enabled": {
"type": "boolean"
},
"output_secret_storage_requirements_met": {
"type": "boolean"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const _allowedExperimentalValues = {
enableOtelIntegrations: true,
enableAgentStatusAlerting: true,
enableAgentPrivilegeLevelChange: false,
installIntegrationsKnowledge: false,
installIntegrationsKnowledge: true,
enableFleetPolicyRevisionsCleanupTask: true,
agentlessPoliciesAPI: true, // When enabled, agentless policies API will be enabled.
useAgentlessAPIInUI: true, // When enabled, Fleet UI will use agentless policies API to create agentless policies.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export interface BaseSettings {
metrics?: 'success' | null;
synthetics?: 'success' | null;
};
integration_knowledge_enabled?: boolean;
}

export interface Settings extends BaseSettings {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,17 @@ import { useInstalledIntegrationsActions } from '../hooks/use_installed_integrat
import { ExperimentalFeaturesService } from '../../../../../services';
import { useLicense } from '../../../../../hooks';

import { IntegrationKnowledgeFlyout } from './integration_knowledge_flyout';

export const InstalledIntegrationsActionMenu: React.FunctionComponent<{
selectedItems: InstalledPackageUIPackageListItem[];
}> = ({ selectedItems }) => {
const [isOpen, setIsOpen] = useState(false);
const [showIntegrationKnowledgeFlyout, setShowIntegrationKnowledgeFlyout] = useState(false);
const { enablePackageRollback } = ExperimentalFeaturesService.get();
const licenseService = useLicense();
const button = (
<EuiButton
iconType="arrowDown"
disabled={selectedItems.length === 0}
iconSide="right"
onClick={() => setIsOpen((s) => !s)}
>
<EuiButton iconType="arrowDown" iconSide="right" onClick={() => setIsOpen((s) => !s)}>
<FormattedMessage
id="xpack.fleet.epmInstalledIntegrations.actionButton"
defaultMessage="Actions"
Expand Down Expand Up @@ -63,6 +61,11 @@ export const InstalledIntegrationsActionMenu: React.FunctionComponent<{
return bulkRollbackIntegrationsWithConfirmModal(selectedItems);
}, [selectedItems, bulkRollbackIntegrationsWithConfirmModal]);

const openManageIntegrationKnowledgeFlyout = useCallback(() => {
setIsOpen(false);
setShowIntegrationKnowledgeFlyout(true);
}, []);

const items = useMemo(() => {
const hasUpgreadableIntegrations = selectedItems.some(
(item) =>
Expand All @@ -80,97 +83,124 @@ export const InstalledIntegrationsActionMenu: React.FunctionComponent<{
!!item.installationInfo?.previous_version && !item.installationInfo?.is_rollback_ttl_expired
);

return [
const menuItems = [
<EuiContextMenuItem
key="upgrade"
icon="refresh"
disabled={!hasUpgreadableIntegrations}
onClick={openUpgradeModal}
key="integrationKnowledge"
icon="gear"
onClick={openManageIntegrationKnowledgeFlyout}
>
<FormattedMessage
id="xpack.fleet.epmInstalledIntegrations.bulkUpgradeButton"
defaultMessage={'Upgrade {count, plural, one {# integration} other {# integrations}}'}
values={{
count: selectedItems.length,
}}
id="xpack.fleet.epmInstalledIntegrations.manageIntegrationKnowledgeButton"
defaultMessage={'Manage integration knowledge'}
/>
</EuiContextMenuItem>,
<EuiContextMenuItem
key="uninstall"
icon="trash"
disabled={hasUninstallableIntegrations}
onClick={openUninstallModal}
>
{hasUninstallableIntegrations ? (
<EuiToolTip
position="right"
content={
<FormattedMessage
id="xpack.fleet.epmInstalledIntegrations.uninstallDisabledTooltip"
defaultMessage="Can't uninstall integrations that are attached to agent policies"
/>
}
];

if (selectedItems.length > 0) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Previously the Actions button was disabled if there were no integrations selected.
Now the new Manage integration knowledge is available even if there are no selected items.

menuItems.push(
...[
<EuiContextMenuItem
key="upgrade"
icon="refresh"
disabled={!hasUpgreadableIntegrations}
onClick={openUpgradeModal}
>
<FormattedMessage
id="xpack.fleet.epmInstalledIntegrations.bulkUninstallButton"
defaultMessage={
'Uninstall {count, plural, one {# integration} other {# integrations}}'
}
id="xpack.fleet.epmInstalledIntegrations.bulkUpgradeButton"
defaultMessage={'Upgrade {count, plural, one {# integration} other {# integrations}}'}
values={{
count: selectedItems.length,
}}
/>
</EuiToolTip>
) : (
<FormattedMessage
id="xpack.fleet.epmInstalledIntegrations.bulkUninstallButton"
defaultMessage={'Uninstall {count, plural, one {# integration} other {# integrations}}'}
values={{
count: selectedItems.length,
}}
/>
)}
</EuiContextMenuItem>,
...(enablePackageRollback
? [
<EuiContextMenuItem
key="rollback"
icon="returnKey"
disabled={!hasRollbackableIntegrations || !licenseService.isEnterprise()}
onClick={openRollbackModal}
>
</EuiContextMenuItem>,
<EuiContextMenuItem
key="uninstall"
icon="trash"
disabled={hasUninstallableIntegrations}
onClick={openUninstallModal}
>
{hasUninstallableIntegrations ? (
<EuiToolTip
position="right"
content={
<FormattedMessage
id="xpack.fleet.epmInstalledIntegrations.uninstallDisabledTooltip"
defaultMessage="Can't uninstall integrations that are attached to agent policies"
/>
}
>
<FormattedMessage
id="xpack.fleet.epmInstalledIntegrations.bulkUninstallButton"
defaultMessage={
'Uninstall {count, plural, one {# integration} other {# integrations}}'
}
values={{
count: selectedItems.length,
}}
/>
</EuiToolTip>
) : (
<FormattedMessage
id="xpack.fleet.epmInstalledIntegrations.bulkRollbackButton"
id="xpack.fleet.epmInstalledIntegrations.bulkUninstallButton"
defaultMessage={
'Rollback {count, plural, one {# integration} other {# integrations}}'
'Uninstall {count, plural, one {# integration} other {# integrations}}'
}
values={{
count: selectedItems.length,
}}
/>
</EuiContextMenuItem>,
]
: []),
];
)}
</EuiContextMenuItem>,
...(enablePackageRollback
? [
<EuiContextMenuItem
key="rollback"
icon="returnKey"
disabled={!hasRollbackableIntegrations || !licenseService.isEnterprise()}
onClick={openRollbackModal}
>
<FormattedMessage
id="xpack.fleet.epmInstalledIntegrations.bulkRollbackButton"
defaultMessage={
'Rollback {count, plural, one {# integration} other {# integrations}}'
}
values={{
count: selectedItems.length,
}}
/>
</EuiContextMenuItem>,
]
: []),
]
);
}

return menuItems;
}, [
selectedItems,
openUninstallModal,
openUpgradeModal,
openRollbackModal,
enablePackageRollback,
licenseService,
openManageIntegrationKnowledgeFlyout,
]);

return (
<EuiPopover
id="fleet.epmInstalledIntegrations.bulkActionPopover"
button={button}
isOpen={isOpen}
closePopover={() => setIsOpen(false)}
panelPaddingSize="none"
anchorPosition="downLeft"
>
<EuiContextMenuPanel size="s" items={items} />
</EuiPopover>
<>
<EuiPopover
id="fleet.epmInstalledIntegrations.bulkActionPopover"
button={button}
isOpen={isOpen}
closePopover={() => setIsOpen(false)}
panelPaddingSize="none"
anchorPosition="downLeft"
>
<EuiContextMenuPanel size="s" items={items} />
</EuiPopover>
{showIntegrationKnowledgeFlyout && (
<IntegrationKnowledgeFlyout onClose={() => setShowIntegrationKnowledgeFlyout(false)} />
)}
</>
);
};
Loading