Skip to content

Commit

Permalink
Change CTS flyout to use SpacesContext
Browse files Browse the repository at this point in the history
Thought this would decrease the page load bundle size, but it only
shaved off a few hundred bytes. At any rate, this change cleans up
the code a bit, and will be needed when we eventually expose this
as a reusable component for outside consumers.
  • Loading branch information
jportner committed Feb 22, 2021
1 parent c922c54 commit b8d93b0
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ import { act } from '@testing-library/react';
import React from 'react';

import { findTestSubject, mountWithIntl, nextTick } from '@kbn/test/jest';
import type { ToastsApi } from 'src/core/public';
import { coreMock } from 'src/core/public/mocks';
import type { Space } from 'src/plugins/spaces_oss/common';

import type { SpacesManager } from '../../spaces_manager';
import { getSpacesContextWrapper } from '../../spaces_context';
import { spacesManagerMock } from '../../spaces_manager/mocks';
import type { SavedObjectTarget } from '../types';
import { CopyModeControl } from './copy_mode_control';
import { CopyToSpaceFlyoutInternal } from './copy_to_space_flyout_internal';
import { getCopyToSpaceFlyoutComponent } from './copy_to_space_flyout';
import { CopyToSpaceForm } from './copy_to_space_form';
import { ProcessingCopyToSpace } from './processing_copy_to_space';
import { SelectableSpacesControl } from './selectable_spaces_control';
Expand Down Expand Up @@ -64,10 +64,15 @@ const setup = async (opts: SetupOpts = {}) => {
]
);

const mockToastNotifications = {
addError: jest.fn(),
addSuccess: jest.fn(),
const { getStartServices } = coreMock.createSetup();
const startServices = coreMock.createStart();
startServices.application.capabilities = {
...startServices.application.capabilities,
spaces: { manage: true },
};
const mockToastNotifications = startServices.notifications.toasts;
getStartServices.mockResolvedValue([startServices, , ,]);

const savedObjectToCopy = {
type: 'dashboard',
id: 'my-dash',
Expand All @@ -76,21 +81,30 @@ const setup = async (opts: SetupOpts = {}) => {
title: 'foo',
} as SavedObjectTarget;

const SpacesContext = await getSpacesContextWrapper({
getStartServices,
spacesManager: mockSpacesManager,
});
const CopyToSpaceFlyout = await getCopyToSpaceFlyoutComponent();

const wrapper = mountWithIntl(
<CopyToSpaceFlyoutInternal
savedObjectTarget={savedObjectToCopy}
spacesManager={(mockSpacesManager as unknown) as SpacesManager}
toastNotifications={(mockToastNotifications as unknown) as ToastsApi}
onClose={onClose}
/>
<SpacesContext>
<CopyToSpaceFlyout savedObjectTarget={savedObjectToCopy} onClose={onClose} />
</SpacesContext>
);

// wait for context wrapper to rerender
await act(async () => {
await nextTick();
wrapper.update();
});

if (!opts.returnBeforeSpacesLoad) {
// Wait for spaces manager to complete and flyout to rerender
await act(async () => {
await nextTick();
wrapper.update();
});
wrapper.update();
}

return { wrapper, onClose, mockSpacesManager, mockToastNotifications, savedObjectToCopy };
Expand All @@ -104,10 +118,7 @@ describe('CopyToSpaceFlyout', () => {
expect(wrapper.find(EuiEmptyPrompt)).toHaveLength(0);
expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(1);

await act(async () => {
await nextTick();
wrapper.update();
});
wrapper.update();

expect(wrapper.find(CopyToSpaceForm)).toHaveLength(1);
expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,30 +24,31 @@ import React, { useEffect, useMemo, useState } from 'react';

import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import type { ToastsStart } from 'src/core/public';
import type { ProcessedImportResponse } from 'src/plugins/saved_objects_management/public';
import type { Space } from 'src/plugins/spaces_oss/common';

import { processImportResponse } from '../../../../../../src/plugins/saved_objects_management/public';
import type { SpacesManager } from '../../spaces_manager';
import type { CopyOptions, ImportRetry, SavedObjectTarget } from '../types';
import { CopyToSpaceFlyoutFooter } from './copy_to_space_flyout_footer';
import { CopyToSpaceForm } from './copy_to_space_form';
import { ProcessingCopyToSpace } from './processing_copy_to_space';
import { useSpaces } from '../../spaces_context';

export interface CopyToSpaceFlyoutProps {
onClose: () => void;
savedObjectTarget: SavedObjectTarget;
spacesManager: SpacesManager;
toastNotifications: ToastsStart;
}

const INCLUDE_RELATED_DEFAULT = true;
const CREATE_NEW_COPIES_DEFAULT = true;
const OVERWRITE_ALL_DEFAULT = true;

export const CopyToSpaceFlyoutInternal = (props: CopyToSpaceFlyoutProps) => {
const { onClose, savedObjectTarget: object, spacesManager, toastNotifications } = props;
const { spacesManager, services } = useSpaces();
const { notifications } = services;
const toastNotifications = notifications!.toasts;

const { onClose, savedObjectTarget: object } = props;
const savedObjectTarget = useMemo(
() => ({
type: object.type,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,9 @@ import { EuiLoadingSpinner } from '@elastic/eui';
import React from 'react';

import { i18n } from '@kbn/i18n';
import type { NotificationsStart } from 'src/core/public';
import type { SavedObjectsManagementRecord } from 'src/plugins/saved_objects_management/public';

import { SavedObjectsManagementAction } from '../../../../../src/plugins/saved_objects_management/public';
import type { SpacesManager } from '../spaces_manager';
import type { CopyToSpaceFlyoutProps } from './components';
import { getCopyToSpaceFlyoutComponent } from './components';

Expand Down Expand Up @@ -49,10 +47,7 @@ export class CopyToSpaceSavedObjectsManagementAction extends SavedObjectsManagem
},
};

constructor(
private readonly spacesManager: SpacesManager,
private readonly notifications: NotificationsStart
) {
constructor() {
super();
}

Expand All @@ -69,14 +64,7 @@ export class CopyToSpaceSavedObjectsManagementAction extends SavedObjectsManagem
icon: this.record.meta.icon,
};

return (
<Wrapper
onClose={this.onClose}
savedObjectTarget={savedObjectTarget}
spacesManager={this.spacesManager}
toastNotifications={this.notifications.toasts}
/>
);
return <Wrapper onClose={this.onClose} savedObjectTarget={savedObjectTarget} />;
};

private onClose = () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,15 @@
* 2.0.
*/

import { notificationServiceMock } from 'src/core/public/mocks';
import { savedObjectsManagementPluginMock } from 'src/plugins/saved_objects_management/public/mocks';

import { spacesManagerMock } from '../spaces_manager/mocks';
import { CopyToSpaceSavedObjectsManagementAction } from './copy_saved_objects_to_space_action';
import { CopySavedObjectsToSpaceService } from './copy_saved_objects_to_space_service';

describe('CopySavedObjectsToSpaceService', () => {
describe('#setup', () => {
it('registers the CopyToSpaceSavedObjectsManagementAction', () => {
const deps = {
spacesManager: spacesManagerMock.create(),
notificationsSetup: notificationServiceMock.createSetupContract(),
savedObjectsManagementSetup: savedObjectsManagementPluginMock.createSetupContract(),
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,17 @@
* 2.0.
*/

import type { NotificationsSetup } from 'src/core/public';
import type { SavedObjectsManagementPluginSetup } from 'src/plugins/saved_objects_management/public';

import type { SpacesManager } from '../spaces_manager';
import { CopyToSpaceSavedObjectsManagementAction } from './copy_saved_objects_to_space_action';

interface SetupDeps {
spacesManager: SpacesManager;
savedObjectsManagementSetup: SavedObjectsManagementPluginSetup;
notificationsSetup: NotificationsSetup;
}

export class CopySavedObjectsToSpaceService {
public setup({ spacesManager, savedObjectsManagementSetup, notificationsSetup }: SetupDeps) {
const action = new CopyToSpaceSavedObjectsManagementAction(spacesManager, notificationsSetup);
public setup({ savedObjectsManagementSetup }: SetupDeps) {
const action = new CopyToSpaceSavedObjectsManagementAction();
savedObjectsManagementSetup.actions.register(action);
}
}
2 changes: 0 additions & 2 deletions x-pack/plugins/spaces/public/plugin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,6 @@ export class SpacesPlugin implements Plugin<SpacesPluginSetup, SpacesPluginStart
});
const copySavedObjectsToSpaceService = new CopySavedObjectsToSpaceService();
copySavedObjectsToSpaceService.setup({
spacesManager: this.spacesManager,
notificationsSetup: core.notifications,
savedObjectsManagementSetup: plugins.savedObjectsManagement,
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,12 +276,7 @@ export const ShareToSpaceFlyoutInternal = (props: ShareToSpaceFlyoutProps) => {

return (
<React.Suspense fallback={<EuiLoadingSpinner />}>
<LazyCopyToSpaceFlyout
onClose={onClose}
savedObjectTarget={savedObjectTarget}
spacesManager={spacesManager}
toastNotifications={toastNotifications}
/>
<LazyCopyToSpaceFlyout onClose={onClose} savedObjectTarget={savedObjectTarget} />
</React.Suspense>
);
}
Expand Down

0 comments on commit b8d93b0

Please sign in to comment.