Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a warning callout when deleting managed assets #207329

Merged
merged 21 commits into from
Jan 28, 2025
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
0e701ac
Create package for warning about deleting managed assets
sabarasaba Jan 21, 2025
83abdb7
Implement delete assets warning callout
sabarasaba Jan 21, 2025
d1aeece
Implement for index templates too
sabarasaba Jan 21, 2025
bc80a9c
Fix linter issues
sabarasaba Jan 21, 2025
ed76761
commit with @elastic email
sabarasaba Jan 21, 2025
a08d467
[CI] Auto-commit changed files from 'node scripts/generate codeowners'
kibanamachine Jan 21, 2025
ef3de02
[CI] Auto-commit changed files from 'node scripts/yarn_deduplicate'
kibanamachine Jan 21, 2025
833df70
Add functional tests
sabarasaba Jan 21, 2025
70cf792
Ignore doc page
sabarasaba Jan 21, 2025
c7bc35f
Refactor duped name
sabarasaba Jan 21, 2025
5ed0763
Update src/platform/packages/shared/kbn-management/delete_managed_ass…
sabarasaba Jan 21, 2025
263384f
Update src/platform/packages/shared/kbn-management/delete_managed_ass…
sabarasaba Jan 21, 2025
070c4bd
Update src/platform/packages/shared/kbn-management/delete_managed_ass…
sabarasaba Jan 21, 2025
c199126
Update src/platform/packages/shared/kbn-management/delete_managed_ass…
sabarasaba Jan 21, 2025
2ea886b
Fix tests
sabarasaba Jan 21, 2025
20a3eb5
Should be lowercase
sabarasaba Jan 21, 2025
1e636d2
Merge branch 'main' into delete_managed_assets_callout
elasticmachine Jan 22, 2025
e1959bc
Address copy review
sabarasaba Jan 22, 2025
7b5e01d
Add missing schema param
sabarasaba Jan 27, 2025
524eaa8
Remove unused prop
sabarasaba Jan 27, 2025
dbc949a
Merge branch 'main' into delete_managed_assets_callout
sabarasaba Jan 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,7 @@ src/platform/packages/shared/kbn-lens-embeddable-utils @elastic/obs-ux-infra_ser
src/platform/packages/shared/kbn-logging @elastic/kibana-core
src/platform/packages/shared/kbn-logging-mocks @elastic/kibana-core
src/platform/packages/shared/kbn-management/cards_navigation @elastic/kibana-management
src/platform/packages/shared/kbn-management/delete_managed_assets_callout @elastic/kibana-management
src/platform/packages/shared/kbn-management/settings/components/field_input @elastic/kibana-management
src/platform/packages/shared/kbn-management/settings/components/field_row @elastic/kibana-management
src/platform/packages/shared/kbn-management/settings/field_definition @elastic/kibana-management
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,7 @@
"@kbn/default-nav-devtools": "link:src/platform/packages/private/default-nav/devtools",
"@kbn/default-nav-management": "link:src/platform/packages/private/default-nav/management",
"@kbn/default-nav-ml": "link:src/platform/packages/private/default-nav/ml",
"@kbn/delete-managed-asset-callout": "link:src/platform/packages/shared/kbn-management/delete_managed_assets_callout",
"@kbn/dev-tools-plugin": "link:src/platform/plugins/shared/dev_tools",
"@kbn/developer-examples-plugin": "link:examples/developer_examples",
"@kbn/discover-contextual-components": "link:src/platform/packages/shared/kbn-discover-contextual-components",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
id: kbn-management/components/DeleteManagedAssetsCallout
slug: /kbn-management/components/delete_managed_assets_callout
title: Delete Managed Assets Callout
description: A callout component that displays a warning message for when a user is about to delete a managed asset.
tags: ['management', 'component']
date: 2025-01-20
---

This component is used to display a warning callout when a user is about to delete a managed asset.


```typescript
<DeleteManagedAssetsCallout assetName="ingest pipeline" />
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

export type { DeleteManagedAssetsCalloutProps } from './src/callout';
export { DeleteManagedAssetsCallout } from './src/callout';
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "shared-common",
"id": "@kbn/delete-managed-asset-callout",
"owner": "@elastic/kibana-management",
"group": "platform",
"visibility": "shared"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"name": "@kbn/delete-managed-asset-callout",
"private": true,
"version": "1.0.0",
"license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import React from 'react';

import { DeleteManagedAssetsCallout as Component } from './callout';

export default {
title: 'Developer/Delete Managed Assets Callout',
description: '',
};

export const DeleteManagedAssetsCallout = () => {
return <Component assetName="ingest pipeline" />;
};

export const ErrorDeleteManagedAssetsCallout = () => {
return <Component assetName="ingest pipeline" color="danger" iconType="trash" />;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import React from 'react';
import { i18n } from '@kbn/i18n';
import type { EuiCallOutProps } from '@elastic/eui';
import { EuiCallOut } from '@elastic/eui';

export interface DeleteManagedAssetsCalloutProps extends EuiCallOutProps {
assetName: string;
overrideTitle?: string;
overrideBody?: string;
}

export const DeleteManagedAssetsCallout = ({
assetName,
overrideTitle,
sabarasaba marked this conversation as resolved.
Show resolved Hide resolved
overrideBody,
...overrideCalloutProps
}: DeleteManagedAssetsCalloutProps) => {
return (
<EuiCallOut
color="warning"
iconType="warning"
data-test-subj="deleteManagedAssetsCallout"
{...overrideCalloutProps}
>
<p>
{overrideBody ??
i18n.translate('management.deleteManagedAssetsCallout.body', {
defaultMessage: `Elasticsearch automatically re-creates any missing managed {assetName}. If you delete a managed {assetName}, the deletion appears as successful but the {assetName} is immediately re-created and reappears.`,
values: { assetName },
})}
</p>
</EuiCallOut>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"extends": "../../../../../../tsconfig.base.json",
"compilerOptions": {
"outDir": "target/types",
"types": [
"jest",
"node",
"react"
]
},
"include": [
"**/*.ts",
"**/*.tsx"
],
"exclude": [
"target/**/*"
],
"kbn_references": [
"@kbn/i18n",
]
}
2 changes: 2 additions & 0 deletions tsconfig.base.json
Original file line number Diff line number Diff line change
Expand Up @@ -754,6 +754,8 @@
"@kbn/default-nav-management/*": ["src/platform/packages/private/default-nav/management/*"],
"@kbn/default-nav-ml": ["src/platform/packages/private/default-nav/ml"],
"@kbn/default-nav-ml/*": ["src/platform/packages/private/default-nav/ml/*"],
"@kbn/delete-managed-asset-callout": ["src/platform/packages/shared/kbn-management/delete_managed_assets_callout"],
"@kbn/delete-managed-asset-callout/*": ["src/platform/packages/shared/kbn-management/delete_managed_assets_callout/*"],
"@kbn/dependency-ownership": ["packages/kbn-dependency-ownership"],
"@kbn/dependency-ownership/*": ["packages/kbn-dependency-ownership/*"],
"@kbn/dependency-usage": ["packages/kbn-dependency-usage"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,7 @@ describe('Index Templates tab', () => {
`${API_BASE_PATH}/delete_index_templates`,
expect.objectContaining({
body: JSON.stringify({
templates: [{ name: templates[0].name, isLegacy }],
templates: [{ name: templates[0].name, isLegacy, type: 'default' }],
}),
})
);
Expand Down Expand Up @@ -518,7 +518,7 @@ describe('Index Templates tab', () => {
`${API_BASE_PATH}/delete_index_templates`,
expect.objectContaining({
body: JSON.stringify({
templates: [{ name: templates[0].name, isLegacy: false }],
templates: [{ name: templates[0].name, isLegacy: false, type: 'default' }],
}),
})
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,29 @@
*/

import React, { Fragment, useState } from 'react';
import { EuiConfirmModal, EuiCallOut, EuiCheckbox, EuiBadge } from '@elastic/eui';
import { EuiConfirmModal, EuiCallOut, EuiCheckbox, EuiBadge, EuiSpacer } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n-react';

import { DeleteManagedAssetsCallout } from '@kbn/delete-managed-asset-callout';
import { deleteTemplates } from '../services/api';
import { notificationService } from '../services/notification';

export const TemplateDeleteModal = ({
templatesToDelete,
callback,
}: {
templatesToDelete: Array<{ name: string; isLegacy?: boolean }>;
templatesToDelete: Array<{ name: string; isLegacy?: boolean; type?: string }>;
callback: (data?: { hasDeletedTemplates: boolean }) => void;
}) => {
const [isDeleteConfirmed, setIsDeleteConfirmed] = useState<boolean>(false);

const numTemplatesToDelete = templatesToDelete.length;

const hasSystemTemplate = Boolean(templatesToDelete.find(({ name }) => name.startsWith('.')));
const managedTemplatesToDelete = templatesToDelete.filter(
({ type }) => type === 'managed'
).length;

const handleDeleteTemplates = () => {
deleteTemplates(templatesToDelete).then(({ data: { templatesDeleted, errors }, error }) => {
Expand Down Expand Up @@ -109,6 +113,17 @@ export const TemplateDeleteModal = ({
confirmButtonDisabled={hasSystemTemplate ? !isDeleteConfirmed : false}
>
<Fragment>
{managedTemplatesToDelete > 0 && (
<>
<DeleteManagedAssetsCallout
assetName={i18n.translate('xpack.idxMgmt.deleteTemplatesModal.assetName', {
defaultMessage: 'Index Template',
})}
/>

<EuiSpacer size="m" />
</>
)}
<p>
<FormattedMessage
id="xpack.idxMgmt.deleteTemplatesModal.deleteDescription"
Expand All @@ -118,9 +133,20 @@ export const TemplateDeleteModal = ({
</p>

<ul>
{templatesToDelete.map(({ name }) => (
{templatesToDelete.map(({ name, type }) => (
<li key={name}>
{name}
{type === 'managed' && (
<>
{' '}
<EuiBadge color="hollow">
<FormattedMessage
id="xpack.idxMgmt.deleteTemplatesModal.managedTemplateLabel"
defaultMessage="Managed"
/>
</EuiBadge>
</>
)}
{name.startsWith('.') ? (
<Fragment>
{' '}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ const tabToUiMetricMap: { [key: string]: string } = {
};

export interface Props {
template: { name: string; isLegacy?: boolean };
template: { name: string; isLegacy?: boolean; type?: string };
onClose: () => void;
editTemplate: (name: string, isLegacy?: boolean) => void;
cloneTemplate: (name: string, isLegacy?: boolean) => void;
Expand All @@ -106,8 +106,9 @@ export const TemplateDetailsContent = ({
const { uiMetricService } = useServices();
const { error, data: templateDetails, isLoading } = useLoadIndexTemplate(templateName, isLegacy);
const isCloudManaged = templateDetails?._kbnMeta.type === 'cloudManaged';
const templateType = templateDetails?._kbnMeta.type;
const [templateToDelete, setTemplateToDelete] = useState<
Array<{ name: string; isLegacy?: boolean }>
Array<{ name: string; isLegacy?: boolean; type?: string }>
>([]);
const [activeTab, setActiveTab] = useState<string>(SUMMARY_TAB_ID);
const [isPopoverOpen, setIsPopOverOpen] = useState<boolean>(false);
Expand Down Expand Up @@ -306,7 +307,11 @@ export const TemplateDetailsContent = ({
defaultMessage: 'Delete',
}),
icon: 'trash',
onClick: () => setTemplateToDelete([{ name: templateName, isLegacy }]),
onClick: () =>
setTemplateToDelete([
{ name: templateName, isLegacy, type: templateType },
]),
'data-test-subj': 'deleteIndexTemplateButton',
disabled: isCloudManaged,
},
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export const TemplateTable: React.FunctionComponent<Props> = ({
const { uiMetricService } = useServices();
const [selection, setSelection] = useState<TemplateListItem[]>([]);
const [templatesToDelete, setTemplatesToDelete] = useState<
Array<{ name: string; isLegacy?: boolean }>
Array<{ name: string; isLegacy?: boolean; type?: string }>
>([]);

const columns: Array<EuiBasicTableColumn<TemplateListItem>> = [
Expand Down Expand Up @@ -182,8 +182,8 @@ export const TemplateTable: React.FunctionComponent<Props> = ({
icon: 'trash',
color: 'danger',
type: 'icon',
onClick: ({ name, _kbnMeta: { isLegacy } }: TemplateListItem) => {
setTemplatesToDelete([{ name, isLegacy }]);
onClick: ({ name, _kbnMeta: { isLegacy, type } }: TemplateListItem) => {
setTemplatesToDelete([{ name, isLegacy, type }]);
},
isPrimary: true,
enabled: ({ _kbnMeta: { type } }: TemplateListItem) => type !== 'cloudManaged',
Expand Down Expand Up @@ -233,9 +233,10 @@ export const TemplateTable: React.FunctionComponent<Props> = ({
data-test-subj="deleteTemplatesButton"
onClick={() =>
setTemplatesToDelete(
selection.map(({ name, _kbnMeta: { isLegacy } }: TemplateListItem) => ({
selection.map(({ name, _kbnMeta: { isLegacy, type } }: TemplateListItem) => ({
name,
isLegacy,
type,
}))
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
"@kbn/unsaved-changes-prompt",
"@kbn/shared-ux-table-persist",
"@kbn/core-application-browser",
"@kbn/delete-managed-asset-callout",
],
"exclude": ["target/**/*"]
}
Loading