From 1ac7ec49d3eedfe84c34e971bee38f104acd5923 Mon Sep 17 00:00:00 2001 From: Yuye Zhu Date: Thu, 19 Oct 2023 17:44:52 +0800 Subject: [PATCH] feature: cannot delete last admin user/group in workspace settings (#235) * feature: cannot delete last admin user/group in workspace settings Signed-off-by: yuye-aws * refactor code with useMemo Signed-off-by: yuye-aws --------- Signed-off-by: yuye-aws --- .../workspace_creator/workspace_creator.tsx | 2 +- .../workspace_creator/workspace_form.tsx | 6 +-- .../workspace_permission_setting_panel.tsx | 44 +++++++++++++++---- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/plugins/workspace/public/components/workspace_creator/workspace_creator.tsx b/src/plugins/workspace/public/components/workspace_creator/workspace_creator.tsx index d19f68b9ead7..6d475f43a659 100644 --- a/src/plugins/workspace/public/components/workspace_creator/workspace_creator.tsx +++ b/src/plugins/workspace/public/components/workspace_creator/workspace_creator.tsx @@ -78,7 +78,7 @@ export const WorkspaceCreator = () => { onSubmit={handleWorkspaceFormSubmit} opType={WORKSPACE_OP_TYPE_CREATE} permissionEnabled={isPermissionEnabled} - permissionFirstUserDeletable + permissionLastAdminItemDeletable /> )} diff --git a/src/plugins/workspace/public/components/workspace_creator/workspace_form.tsx b/src/plugins/workspace/public/components/workspace_creator/workspace_form.tsx index 6316218f2e8c..d2a540db46ba 100644 --- a/src/plugins/workspace/public/components/workspace_creator/workspace_form.tsx +++ b/src/plugins/workspace/public/components/workspace_creator/workspace_form.tsx @@ -140,7 +140,7 @@ interface WorkspaceFormProps { defaultValues?: WorkspaceFormData; opType?: string; permissionEnabled?: boolean; - permissionFirstUserDeletable?: boolean; + permissionLastAdminItemDeletable?: boolean; } export const WorkspaceForm = ({ @@ -149,7 +149,7 @@ export const WorkspaceForm = ({ defaultValues, opType, permissionEnabled, - permissionFirstUserDeletable, + permissionLastAdminItemDeletable, }: WorkspaceFormProps) => { const applications = useApplications(application); const workspaceNameReadOnly = defaultValues?.reserved; @@ -687,7 +687,7 @@ export const WorkspaceForm = ({ errors={formErrors.permissions} onChange={setPermissionSettings} permissionSettings={permissionSettings} - firstUserDeletable={permissionFirstUserDeletable} + lastAdminItemDeletable={!!permissionLastAdminItemDeletable} data-test-subj={`workspaceForm-permissionSettingPanel`} /> diff --git a/src/plugins/workspace/public/components/workspace_creator/workspace_permission_setting_panel.tsx b/src/plugins/workspace/public/components/workspace_creator/workspace_permission_setting_panel.tsx index 12ff0d21fba1..d95b062db3c4 100644 --- a/src/plugins/workspace/public/components/workspace_creator/workspace_permission_setting_panel.tsx +++ b/src/plugins/workspace/public/components/workspace_creator/workspace_permission_setting_panel.tsx @@ -112,11 +112,11 @@ interface WorkspacePermissionSettingInputProps { const WorkspacePermissionSettingInput = ({ index, - deletable, type, userId, group, modes, + deletable, onDelete, onGroupOrUserIdChange, onPermissionModesChange, @@ -201,13 +201,15 @@ const WorkspacePermissionSettingInput = ({ interface WorkspacePermissionSettingPanelProps { errors?: string[]; - firstUserDeletable?: boolean; + lastAdminItemDeletable: boolean; permissionSettings: Array>; onChange?: (value: Array>) => void; } -interface UserOrGroupSectionProps extends WorkspacePermissionSettingPanelProps { +interface UserOrGroupSectionProps + extends Omit { title: string; + nonDeletableIndex: number; type: WorkspacePermissionItemType; } @@ -217,7 +219,7 @@ const UserOrGroupSection = ({ errors, onChange, permissionSettings, - firstUserDeletable, + nonDeletableIndex, }: UserOrGroupSectionProps) => { const transformedValue = useMemo(() => { if (!permissionSettings) { @@ -315,9 +317,7 @@ const UserOrGroupSection = ({ {...item} type={type} index={index} - deletable={ - type === WorkspacePermissionItemType.Group || firstUserDeletable || index !== 0 - } + deletable={index !== nonDeletableIndex} onDelete={handleDelete} onGroupOrUserIdChange={handleGroupOrUserIdChange} onPermissionModesChange={handlePermissionModesChange} @@ -343,7 +343,7 @@ export const WorkspacePermissionSettingPanel = ({ errors, onChange, permissionSettings, - firstUserDeletable, + lastAdminItemDeletable, }: WorkspacePermissionSettingPanelProps) => { const [userPermissionSettings, setUserPermissionSettings] = useState< Array> @@ -364,6 +364,31 @@ export const WorkspacePermissionSettingPanel = ({ onChange?.([...userPermissionSettings, ...groupPermissionSettings]); }, [onChange, userPermissionSettings, groupPermissionSettings]); + const nonDeletableIndex = useMemo(() => { + let userNonDeletableIndex = -1; + let groupNonDeletableIndex = -1; + const newPermissionSettings = [...userPermissionSettings, ...groupPermissionSettings]; + if (!lastAdminItemDeletable) { + const adminPermissionSettings = newPermissionSettings.filter( + (permission) => getPermissionModeId(permission.modes ?? []) === PermissionModeId.Admin + ); + if (adminPermissionSettings.length === 1) { + if (adminPermissionSettings[0].type === WorkspacePermissionItemType.User) { + userNonDeletableIndex = userPermissionSettings.findIndex( + (permission) => getPermissionModeId(permission.modes ?? []) === PermissionModeId.Admin + ); + } else { + groupNonDeletableIndex = groupPermissionSettings.findIndex( + (permission) => getPermissionModeId(permission.modes ?? []) === PermissionModeId.Admin + ); + } + } + } + return { userNonDeletableIndex, groupNonDeletableIndex }; + }, [userPermissionSettings, groupPermissionSettings, lastAdminItemDeletable]); + + const { userNonDeletableIndex, groupNonDeletableIndex } = nonDeletableIndex; + return (
@@ -383,6 +408,7 @@ export const WorkspacePermissionSettingPanel = ({ })} errors={errors} onChange={setGroupPermissionSettings} + nonDeletableIndex={groupNonDeletableIndex} permissionSettings={groupPermissionSettings} type={WorkspacePermissionItemType.Group} />