Skip to content

Commit

Permalink
feature: cannot delete last admin user/group in workspace settings (o…
Browse files Browse the repository at this point in the history
…pensearch-project#235)

* feature: cannot delete last admin user/group in workspace settings

Signed-off-by: yuye-aws <[email protected]>

* refactor code with useMemo

Signed-off-by: yuye-aws <[email protected]>

---------

Signed-off-by: yuye-aws <[email protected]>
  • Loading branch information
yuye-aws authored Oct 19, 2023
1 parent f00cb3c commit 1ac7ec4
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ export const WorkspaceCreator = () => {
onSubmit={handleWorkspaceFormSubmit}
opType={WORKSPACE_OP_TYPE_CREATE}
permissionEnabled={isPermissionEnabled}
permissionFirstUserDeletable
permissionLastAdminItemDeletable
/>
)}
</EuiPageContent>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ interface WorkspaceFormProps {
defaultValues?: WorkspaceFormData;
opType?: string;
permissionEnabled?: boolean;
permissionFirstUserDeletable?: boolean;
permissionLastAdminItemDeletable?: boolean;
}

export const WorkspaceForm = ({
Expand All @@ -149,7 +149,7 @@ export const WorkspaceForm = ({
defaultValues,
opType,
permissionEnabled,
permissionFirstUserDeletable,
permissionLastAdminItemDeletable,
}: WorkspaceFormProps) => {
const applications = useApplications(application);
const workspaceNameReadOnly = defaultValues?.reserved;
Expand Down Expand Up @@ -687,7 +687,7 @@ export const WorkspaceForm = ({
errors={formErrors.permissions}
onChange={setPermissionSettings}
permissionSettings={permissionSettings}
firstUserDeletable={permissionFirstUserDeletable}
lastAdminItemDeletable={!!permissionLastAdminItemDeletable}
data-test-subj={`workspaceForm-permissionSettingPanel`}
/>
</EuiPanel>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,11 @@ interface WorkspacePermissionSettingInputProps {

const WorkspacePermissionSettingInput = ({
index,
deletable,
type,
userId,
group,
modes,
deletable,
onDelete,
onGroupOrUserIdChange,
onPermissionModesChange,
Expand Down Expand Up @@ -201,13 +201,15 @@ const WorkspacePermissionSettingInput = ({

interface WorkspacePermissionSettingPanelProps {
errors?: string[];
firstUserDeletable?: boolean;
lastAdminItemDeletable: boolean;
permissionSettings: Array<Partial<WorkspacePermissionSetting>>;
onChange?: (value: Array<Partial<WorkspacePermissionSetting>>) => void;
}

interface UserOrGroupSectionProps extends WorkspacePermissionSettingPanelProps {
interface UserOrGroupSectionProps
extends Omit<WorkspacePermissionSettingPanelProps, 'lastAdminItemDeletable'> {
title: string;
nonDeletableIndex: number;
type: WorkspacePermissionItemType;
}

Expand All @@ -217,7 +219,7 @@ const UserOrGroupSection = ({
errors,
onChange,
permissionSettings,
firstUserDeletable,
nonDeletableIndex,
}: UserOrGroupSectionProps) => {
const transformedValue = useMemo(() => {
if (!permissionSettings) {
Expand Down Expand Up @@ -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}
Expand All @@ -343,7 +343,7 @@ export const WorkspacePermissionSettingPanel = ({
errors,
onChange,
permissionSettings,
firstUserDeletable,
lastAdminItemDeletable,
}: WorkspacePermissionSettingPanelProps) => {
const [userPermissionSettings, setUserPermissionSettings] = useState<
Array<Partial<WorkspacePermissionSetting>>
Expand All @@ -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 (
<div>
<UserOrGroupSection
Expand All @@ -372,8 +397,8 @@ export const WorkspacePermissionSettingPanel = ({
})}
errors={errors}
onChange={setUserPermissionSettings}
nonDeletableIndex={userNonDeletableIndex}
permissionSettings={userPermissionSettings}
firstUserDeletable={firstUserDeletable}
type={WorkspacePermissionItemType.User}
/>
<EuiSpacer size="s" />
Expand All @@ -383,6 +408,7 @@ export const WorkspacePermissionSettingPanel = ({
})}
errors={errors}
onChange={setGroupPermissionSettings}
nonDeletableIndex={groupNonDeletableIndex}
permissionSettings={groupPermissionSettings}
type={WorkspacePermissionItemType.Group}
/>
Expand Down

0 comments on commit 1ac7ec4

Please sign in to comment.