From 60057c666df04725425ec6cf4bd1f3db676939de Mon Sep 17 00:00:00 2001 From: Himself65 Date: Fri, 26 May 2023 13:04:20 +0800 Subject: [PATCH] fix: cannot delete last workspace (#2537) --- .../workspace-setting-detail/index.css.ts | 7 +++++++ .../panel/general/index.tsx | 13 ++++++++++++ packages/i18n/src/resources/en.json | 1 + .../local-first-delete-workspace.spec.ts | 21 +++---------------- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/apps/web/src/components/affine/workspace-setting-detail/index.css.ts b/apps/web/src/components/affine/workspace-setting-detail/index.css.ts index 0dbcfb2bff..6774b89f8d 100644 --- a/apps/web/src/components/affine/workspace-setting-detail/index.css.ts +++ b/apps/web/src/components/affine/workspace-setting-detail/index.css.ts @@ -108,6 +108,13 @@ export const settingItemLabelHint = style({ marginTop: '4px', }); +export const settingsCannotDelete = style([ + settingItemLabelHint, + { + color: 'var(--affine-warning-color)', + }, +]); + export const row = style({ padding: '40px 0', display: 'flex', diff --git a/apps/web/src/components/affine/workspace-setting-detail/panel/general/index.tsx b/apps/web/src/components/affine/workspace-setting-detail/panel/general/index.tsx index ce2a311039..110495cc9c 100644 --- a/apps/web/src/components/affine/workspace-setting-detail/panel/general/index.tsx +++ b/apps/web/src/components/affine/workspace-setting-detail/panel/general/index.tsx @@ -1,6 +1,7 @@ import { Button, toast } from '@affine/component'; import { WorkspaceAvatar } from '@affine/component/workspace-avatar'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; +import { rootWorkspacesMetadataAtom } from '@affine/workspace/atom'; import { ArrowRightSmallIcon, DeleteIcon, @@ -11,6 +12,7 @@ import { import { useBlockSuiteWorkspaceAvatarUrl } from '@toeverything/hooks/use-block-suite-workspace-avatar-url'; import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name'; import clsx from 'clsx'; +import { useAtomValue } from 'jotai'; import type React from 'react'; import { useEffect, useState } from 'react'; @@ -89,6 +91,8 @@ export const GeneralPanel: React.FC = ({ const [, update] = useBlockSuiteWorkspaceAvatarUrl( workspace.blockSuiteWorkspace ); + + const isLastWorkspace = useAtomValue(rootWorkspacesMetadataAtom).length === 1; return ( <>
@@ -225,6 +229,14 @@ export const GeneralPanel: React.FC = ({
{t['Delete Workspace Label Hint']()}
+ {isOwner && isLastWorkspace && ( +
+ {t['com.affine.workspace.cannot-delete']()} +
+ )}
@@ -235,6 +247,7 @@ export const GeneralPanel: React.FC = ({ type="warning" data-testid="delete-workspace-button" size="middle" + disabled={isLastWorkspace} icon={} onClick={() => { setShowDelete(true); diff --git a/packages/i18n/src/resources/en.json b/packages/i18n/src/resources/en.json index e6b9876862..7576dae42a 100644 --- a/packages/i18n/src/resources/en.json +++ b/packages/i18n/src/resources/en.json @@ -279,6 +279,7 @@ "com.affine.updater.update-available": "Update available", "com.affine.updater.open-download-page": "Open download page", "com.affine.updater.restart-to-update": "Restart to install update", + "com.affine.workspace.cannot-delete": "You cannot delete the last workspace", "FILE_ALREADY_EXISTS": "File already exists", "others": "Others", "Update Available": "Update available", diff --git a/tests/parallels/local-first-delete-workspace.spec.ts b/tests/parallels/local-first-delete-workspace.spec.ts index a34384b588..c6fe2e4b44 100644 --- a/tests/parallels/local-first-delete-workspace.spec.ts +++ b/tests/parallels/local-first-delete-workspace.spec.ts @@ -51,23 +51,8 @@ test('Should not delete the last one workspace', async ({ page }) => { await openHomePage(page); await waitMarkdownImported(page); await clickSideBarSettingButton(page); - await page.getByTestId('delete-workspace-button').click(); - const workspaceNameDom = await page.getByTestId('workspace-name'); - const currentWorkspaceName = await workspaceNameDom.evaluate( - node => node.textContent - ); - await page - .getByTestId('delete-workspace-input') - .type(currentWorkspaceName as string); - const promise = page - .getByTestId('affine-toast') - .waitFor({ state: 'attached' }); - await page.getByTestId('delete-workspace-confirm-button').click(); - await promise; - await page.reload(); - await page.waitForSelector('[data-testid="workspace-name"]'); - expect(await page.getByTestId('workspace-name').textContent()).toBe( - 'Demo Workspace' - ); + await expect( + page.getByTestId('warn-cannot-delete-last-workspace').isVisible() + ).toBeTruthy(); await assertCurrentWorkspaceFlavour('local', page); });