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

Disable actions when deleting #5775

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 23 additions & 0 deletions packages/renderer/src/lib/container/ContainerActions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,26 @@ test('Expect no error and status deleting container', async () => {
expect(container.actionError).toEqual('');
expect(updateMock).toHaveBeenCalled();
});

test('Expect buttons to be disabled when deleting', async () => {
render(ContainerActions, { container });
container.state = 'DELETING';

const deleteButton = screen.getByRole('button', { name: 'Delete Container' });
expect(deleteButton).toBeDisabled();

const startButton = screen.getByRole('button', { name: 'Start Container' });
expect(startButton).toBeDisabled();

const stopButton = screen.getByRole('button', { name: 'Stop Container' });
expect(stopButton).toBeDisabled();

const generateKubeButton = screen.getByRole('button', { name: 'Generate Kube' });
expect(generateKubeButton).toBeDisabled();

const deployToKubeButton = screen.getByRole('button', { name: 'Deploy to Kubernetes' });
expect(deployToKubeButton).toBeDisabled();

const restartContainerButton = screen.getByRole('button', { name: 'Restart Container' });
expect(restartContainerButton).toBeDisabled();
});
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ if (dropdownMenu) {
hidden="{container.state === 'RUNNING' || container.state === 'STOPPING'}"
detailed="{detailed}"
inProgress="{container.actionInProgress && container.state === 'STARTING'}"
enabled="{container.state !== 'STARTING' && container.state !== 'DELETING'}"
icon="{faPlay}"
iconOffset="pl-[0.15rem]" />

Expand All @@ -141,6 +142,7 @@ if (dropdownMenu) {
hidden="{!(container.state === 'RUNNING' || container.state === 'STOPPING')}"
detailed="{detailed}"
inProgress="{container.actionInProgress && container.state === 'STOPPING'}"
enabled="{container.state !== 'STOPPING' && container.state !== 'DELETING'}"
icon="{faStop}" />

<ListItemButtonIcon
Expand All @@ -149,7 +151,8 @@ if (dropdownMenu) {
onClick="{() => deleteContainer()}"
icon="{faTrash}"
detailed="{detailed}"
inProgress="{container.actionInProgress && container.state === 'DELETING'}" />
inProgress="{container.actionInProgress && container.state === 'DELETING'}"
enabled="{container.state !== 'DELETING'}" />

<!-- If dropdownMenu is true, use it, otherwise just show the regular buttons -->
<svelte:component this="{actionsStyle}">
Expand All @@ -167,6 +170,7 @@ if (dropdownMenu) {
hidden="{!(
container.engineType === 'podman' && container.groupInfo.type === ContainerGroupInfoTypeUI.STANDALONE
)}"
enabled="{container.state !== 'DELETING'}"
detailed="{detailed}"
icon="{faFileCode}" />
{/if}
Expand All @@ -176,6 +180,7 @@ if (dropdownMenu) {
menu="{dropdownMenu}"
hidden="{!(container.engineType === 'podman' && container.groupInfo.type === ContainerGroupInfoTypeUI.STANDALONE)}"
detailed="{detailed}"
enabled="{container.state !== 'DELETING'}"
icon="{faRocket}" />
<ListItemButtonIcon
title="Open Browser"
Expand All @@ -199,6 +204,7 @@ if (dropdownMenu) {
onClick="{() => restartContainer()}"
menu="{dropdownMenu}"
detailed="{detailed}"
enabled="{container.state !== 'DELETING'}"
icon="{faArrowsRotate}" />
<ContributionActions
args="{[container]}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,11 @@ test('Expect no error and status deleting deployment', async () => {
expect(updateMock).toHaveBeenCalled();
expect(deleteMock).toHaveBeenCalled();
});

test('Expect buttons to be disabled when deleting', async () => {
render(DeploymentActions, { deployment });
deployment.status = 'DELETING';

const deleteButton = screen.getByRole('button', { name: 'Delete Deployment' });
expect(deleteButton).toBeDisabled();
});
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,6 @@ async function deleteDeployment(): Promise<void> {
confirm="{true}"
onClick="{() => deleteDeployment()}"
detailed="{detailed}"
enabled="{deployment.status !== 'DELETING'}"
inProgress="{deployment.status === 'DELETING'}"
icon="{faTrash}" />
25 changes: 25 additions & 0 deletions packages/renderer/src/lib/image/ImageActions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,3 +154,28 @@ test('Expect no dropdown when several contributions and dropdownMenu mode on', a
expect(button.lastChild?.textContent).toBe('dummy-contrib');
});
});

test('Expect buttons to be disabled when deleting', async () => {
const image: ImageInfoUI = {
name: 'dummy',
status: 'DELETING',
} as ImageInfoUI;

render(ImageActions, {
onPushImage: vi.fn(),
onRenameImage: vi.fn(),
image,
});

const runImagesButton = screen.getByRole('button', { name: 'Run Image' });
expect(runImagesButton).toBeDisabled();

const deleteButton = screen.getByRole('button', { name: 'Delete Image' });
expect(deleteButton).toBeDisabled();

const editImageButton = screen.getByRole('button', { name: 'Edit Image' });
expect(editImageButton).toBeDisabled();

const showHistoryButton = screen.getByRole('button', { name: 'Show History' });
expect(showHistoryButton).toBeDisabled();
});
10 changes: 9 additions & 1 deletion packages/renderer/src/lib/image/ImageActions.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,12 @@ function onError(error: string): void {
}
</script>

<ListItemButtonIcon title="Run Image" onClick="{() => runImage(image)}" detailed="{detailed}" icon="{faPlay}" />
<ListItemButtonIcon
title="Run Image"
onClick="{() => runImage(image)}"
detailed="{detailed}"
icon="{faPlay}"
enabled="{image.status !== 'DELETING'}" />

<ListItemButtonIcon
title="Delete Image"
Expand All @@ -115,6 +120,7 @@ function onError(error: string): void {
onClick="{() => pushImage(image)}"
menu="{dropdownMenu}"
detailed="{detailed}"
enabled="{image.status !== 'DELETING'}"
icon="{faArrowUp}" />
{/if}

Expand All @@ -123,6 +129,7 @@ function onError(error: string): void {
onClick="{() => renameImage(image)}"
menu="{dropdownMenu}"
detailed="{detailed}"
enabled="{image.status !== 'DELETING'}"
icon="{faEdit}" />

{#if !detailed}
Expand All @@ -131,6 +138,7 @@ function onError(error: string): void {
onClick="{() => showLayersImage()}"
menu="{dropdownMenu}"
detailed="{detailed}"
enabled="{image.status !== 'DELETING'}"
icon="{faLayerGroup}" />
{/if}

Expand Down
27 changes: 27 additions & 0 deletions packages/renderer/src/lib/pod/PodActions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,3 +192,30 @@ test('Expect kubernetes routes kebab menu to be displayed', async () => {
const routesDropDownMenu = await screen.findByTitle('Drop Down Menu Items');
expect(routesDropDownMenu).toBeVisible();
});

test('Expect buttons to be disabled when deleting', async () => {
const pod: PodInfoUI = {
id: 'pod',
name: 'name',
containers: [{ Id: 'pod' }],
status: 'DELETING',
kind: 'podman',
} as PodInfoUI;

render(PodActions, { pod: pod });

const startPodButton = screen.getByRole('button', { name: 'Start Pod' });
expect(startPodButton).toBeDisabled();

const stopPodButton = screen.getByRole('button', { name: 'Stop Pod' });
expect(stopPodButton).toBeDisabled();

const deletePodButton = screen.getByRole('button', { name: 'Delete Pod' });
expect(deletePodButton).toBeDisabled();

const generateKubeButton = screen.getByRole('button', { name: 'Generate Kube' });
expect(generateKubeButton).toBeDisabled();

const deployKubeButton = screen.getByRole('button', { name: 'Deploy to Kubernetes' });
expect(deployKubeButton).toBeDisabled();
});
8 changes: 7 additions & 1 deletion packages/renderer/src/lib/pod/PodActions.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ if (dropdownMenu) {
hidden="{pod.status === 'RUNNING' || pod.status === 'STOPPING'}"
detailed="{detailed}"
inProgress="{pod.actionInProgress && pod.status === 'STARTING'}"
enabled="{pod.status !== 'STARTING' && pod.status !== 'DELETING'}"
icon="{faPlay}"
iconOffset="pl-[0.15rem]" />
<ListItemButtonIcon
Expand All @@ -173,6 +174,7 @@ if (dropdownMenu) {
hidden="{!(pod.status === 'RUNNING' || pod.status === 'STOPPING')}"
detailed="{detailed}"
inProgress="{pod.actionInProgress && pod.status === 'STOPPING'}"
enabled="{pod.status !== 'STOPPING' && pod.status !== 'DELETING'}"
icon="{faStop}" />
{/if}
<ListItemButtonIcon
Expand All @@ -181,7 +183,8 @@ if (dropdownMenu) {
confirm="{true}"
icon="{faTrash}"
detailed="{detailed}"
inProgress="{pod.actionInProgress && pod.status === 'DELETING'}" />
inProgress="{pod.actionInProgress && pod.status === 'DELETING'}"
enabled="{pod.status !== 'DELETING'}" />

<!-- If dropdownMenu is true, use it, otherwise just show the regular buttons -->
<svelte:component this="{actionsStyle}">
Expand All @@ -192,13 +195,15 @@ if (dropdownMenu) {
onClick="{() => openGenerateKube()}"
menu="{dropdownMenu}"
detailed="{detailed}"
enabled="{pod.status !== 'DELETING'}"
icon="{faFileCode}" />
{/if}
<ListItemButtonIcon
title="Deploy to Kubernetes"
onClick="{() => deployToKubernetes()}"
menu="{dropdownMenu}"
detailed="{detailed}"
enabled="{pod.status !== 'DELETING'}"
icon="{faRocket}" />
{#if openingUrls.length === 0}
<ListItemButtonIcon
Expand Down Expand Up @@ -274,6 +279,7 @@ if (dropdownMenu) {
onClick="{() => restartPod()}"
menu="{dropdownMenu}"
detailed="{detailed}"
enabled="{pod.status !== 'DELETING'}"
icon="{faArrowsRotate}" />
<ContributionActions
args="{[pod]}"
Expand Down
8 changes: 8 additions & 0 deletions packages/renderer/src/lib/service/ServiceActions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,11 @@ test('Expect no error and status deleting service', async () => {
expect(updateMock).toHaveBeenCalled();
expect(deleteMock).toHaveBeenCalled();
});

test('Expect buttons to be disabled when deleting', async () => {
render(ServiceActions, { service });
service.status = 'DELETING';

const deletePodButton = screen.getByRole('button', { name: 'Delete Service' });
expect(deletePodButton).toBeDisabled();
});
1 change: 1 addition & 0 deletions packages/renderer/src/lib/service/ServiceActions.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ async function deleteService(): Promise<void> {
confirm="{true}"
onClick="{() => deleteService()}"
detailed="{detailed}"
enabled="{service.status !== 'DELETING'}"
icon="{faTrash}" />
28 changes: 28 additions & 0 deletions packages/renderer/src/lib/volume/VolumeActions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,31 @@ test('Expect prompt dialog and deletion', async () => {
expect(volume.status).toBe('DELETING');
expect(removeVolumeMock).toHaveBeenCalled();
});

test('Expect buttons to be disabled when deleting', async () => {
const volume: VolumeInfoUI = {
name: 'dummy',
status: 'DELETING',
} as VolumeInfoUI;

render(VolumeActions, {
volume,
});

const button = screen.getByTitle('Delete Volume');
expect(button).toBeDisabled();
});

test('Expect delete to be disabled when volume is being used', async () => {
const volume: VolumeInfoUI = {
name: 'dummy',
status: 'USED',
} as VolumeInfoUI;

render(VolumeActions, {
volume,
});

const button = screen.getByTitle('Delete Volume');
expect(button).toBeDisabled();
});
15 changes: 7 additions & 8 deletions packages/renderer/src/lib/volume/VolumeActions.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,10 @@ async function removeVolume(): Promise<void> {
}
</script>

{#if volume.status === 'UNUSED'}
<ListItemButtonIcon
title="Delete Volume"
confirm="{true}"
onClick="{() => removeVolume()}"
detailed="{detailed}"
icon="{faTrash}" />
{/if}
<ListItemButtonIcon
title="Delete Volume"
confirm="{true}"
onClick="{() => removeVolume()}"
detailed="{detailed}"
enabled="{volume.status === 'UNUSED'}"
icon="{faTrash}" />