Skip to content

Commit

Permalink
unify behavior for hidden and managed saved objects
Browse files Browse the repository at this point in the history
  • Loading branch information
drewdaemon committed Feb 8, 2024
1 parent 37ec2c4 commit bd6527c
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ describe('DeleteConfirmModal', () => {
createObject({ managed: true }),
createObject({ managed: false }),
createObject({ managed: true }),
createObject({ hiddenType: true }),
];

const wrapper = mountWithIntl(
Expand All @@ -223,7 +224,7 @@ describe('DeleteConfirmModal', () => {
expect(callout).toHaveLength(1);

expect(callout.text()).toMatchInlineSnapshot(
`"Some objects cannot be deleted2 objects are managed by Elastic and cannot be deleted."`
`"Some objects have been excluded1 object is hidden and cannot be deleted.2 objects are managed by Elastic and cannot be deleted."`
);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import {
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n-react';
import { css } from '@emotion/react';
import type { SavedObjectWithMetadata, SavedObjectManagementTypeInfo } from '../../../../common';
import { getSavedObjectLabel } from '../../../lib';

Expand Down Expand Up @@ -94,17 +95,21 @@ export const DeleteConfirmModal: FC<DeleteConfirmModalProps> = ({
title={
<FormattedMessage
id="savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.title"
defaultMessage="Some objects cannot be deleted"
defaultMessage="Some objects have been excluded"
/>
}
iconType="warning"
color="warning"
>
{hiddenObjects.length > 0 && (
<p>
<p
css={css`
margin-block-end: 0 !important;
`}
>
<FormattedMessage
id="savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.content"
defaultMessage="{objectCount, plural, one {# object is} other {# objects are}} hidden and cannot be deleted. {objectCount, plural, one {It was} other {They were}} excluded from the table summary."
defaultMessage="{objectCount, plural, one {# object is} other {# objects are}} hidden and cannot be deleted."
values={{ objectCount: hiddenObjects.length }}
/>
</p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,9 @@ describe('Table', () => {

it(`prevents saved objects from being deleted`, () => {
const selectedSavedObjects = [
{ type: 'visualization' },
{ type: 'search' },
{ type: 'index-pattern' },
{ type: 'visualization', meta: { hiddenType: false } },
{ type: 'search', meta: { hiddenType: false } },
{ type: 'index-pattern', meta: { hiddenType: false } },
] as any;
const customizedProps = {
...defaultProps,
Expand Down Expand Up @@ -158,16 +158,33 @@ describe('Table', () => {
});

describe('managed content', () => {
it('keeps the delete button disabled when the selection only contains managed SOs', async () => {
const selectedSavedObjects = [
{ type: 'visualization', managed: true },
{ type: 'search', managed: true },
{ type: 'index-pattern', managed: true },
it('keeps the delete button disabled when the selection only contains managed and hidden SOs', async () => {
const managedSavedObjects = [
{ type: 'visualization', managed: true, meta: { hiddenType: false } },
{ type: 'search', managed: true, meta: { hiddenType: false } },
{ type: 'index-pattern', managed: true, meta: { hiddenType: false } },
] as any;

const hiddenSavedObjects = [
{ type: 'visualization', managed: false, meta: { hiddenType: true } },
{ type: 'search', managed: false, meta: { hiddenType: true } },
{ type: 'index-pattern', managed: false, meta: { hiddenType: true } },
] as any;

const { rerender } = render(
<I18nProvider>
<Table {...defaultProps} selectedSavedObjects={selectedSavedObjects} />
<Table {...defaultProps} selectedSavedObjects={managedSavedObjects} />
</I18nProvider>
);

await waitFor(() => {
expect(screen.getByTestId('savedObjectsManagementDelete')).toBeDisabled();
expect(screen.getByRole('button', { name: 'Export' })).toBeEnabled();
});

rerender(
<I18nProvider>
<Table {...defaultProps} selectedSavedObjects={hiddenSavedObjects} />
</I18nProvider>
);

Expand All @@ -180,11 +197,31 @@ describe('Table', () => {
<I18nProvider>
<Table
{...defaultProps}
selectedSavedObjects={[...selectedSavedObjects, { type: 'lens', managed: false }]}
selectedSavedObjects={[...managedSavedObjects, ...hiddenSavedObjects]}
/>
</I18nProvider>
);

await waitFor(() => {
expect(screen.getByTestId('savedObjectsManagementDelete')).toBeDisabled();
expect(screen.getByRole('button', { name: 'Export' })).toBeEnabled();
});
});

it('enables the delete button when the selection contains at least one unmanaged, non-hidden SO', async () => {
const selectedSavedObjects = [
{ type: 'visualization', managed: true, meta: { hiddenType: false } },
{ type: 'search', managed: true, meta: { hiddenType: false } },
{ type: 'index-pattern', managed: false, meta: { hiddenType: true } },
{ type: 'lens', managed: false, meta: { hiddenType: false } }, // deletable!
] as any;

render(
<I18nProvider>
<Table {...defaultProps} selectedSavedObjects={selectedSavedObjects} />
</I18nProvider>
);

await waitFor(() => {
expect(screen.getByTestId('savedObjectsManagementDelete')).toBeEnabled();
expect(screen.getByRole('button', { name: 'Export' })).toBeEnabled();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -402,8 +402,9 @@ export class Table extends PureComponent<TableProps, TableState> {
color="danger"
onClick={onDelete}
isDisabled={
selectedSavedObjects.filter(({ managed }) => !managed).length === 0 ||
!capabilities.savedObjectsManagement.delete
selectedSavedObjects.filter(
({ managed, meta: { hiddenType } }) => !managed && !hiddenType
).length === 0 || !capabilities.savedObjectsManagement.delete
}
title={
capabilities.savedObjectsManagement.delete
Expand Down

0 comments on commit bd6527c

Please sign in to comment.