Fix SSH table UI user groups issues

This commit is contained in:
carlosmonastyrski
2025-05-06 08:37:19 -03:00
parent b9070a8fa3
commit bf85df7e36
2 changed files with 81 additions and 82 deletions

View File

@@ -351,88 +351,86 @@ export const SshHostGroupModal = ({ popUp, handlePopUpToggle }: Props) => {
name={`loginMappings.${i}.allowedPrincipals`} name={`loginMappings.${i}.allowedPrincipals`}
render={({ field: { value = [], onChange }, fieldState: { error } }) => ( render={({ field: { value = [], onChange }, fieldState: { error } }) => (
<div className="flex flex-col space-y-2"> <div className="flex flex-col space-y-2">
{(value.length === 0 ? [{ type: "user", value: "" }] : value).map( {value.map((principal, principalIndex) => (
(principal, principalIndex) => ( <div
<div key={`principal-${i + 1}-${principalIndex + 1}-${principal.type}`}
key={`principal-${i + 1}-${principalIndex + 1}-${principal.type}`} className="flex items-center space-x-2"
className="flex items-center space-x-2" >
> <div className="mr-2">
<div className="mr-2"> <Select
<Select className="w-24"
className="w-24" value={principal.type}
value={principal.type} onValueChange={(newType) => {
onValueChange={(newType) => { const newPrincipals = [...value];
const newPrincipals = [...value]; newPrincipals[principalIndex] = {
newPrincipals[principalIndex] = { type: newType as "user" | "group",
type: newType as "user" | "group", value: ""
value: "" };
}; onChange(newPrincipals);
onChange(newPrincipals); }}
}} >
> <SelectItem value="user">User</SelectItem>
<SelectItem value="user">User</SelectItem> <SelectItem value="group">Group</SelectItem>
<SelectItem value="group">Group</SelectItem> </Select>
</Select>
</div>
<div className="flex-1">
<Select
value={principal.value}
onValueChange={(newValue) => {
if (isPrincipalDuplicate(i, principal.type, newValue)) {
createNotification({
text: `This ${principal.type} is already added`,
type: "error"
});
return;
}
const newPrincipals = [...value];
newPrincipals[principalIndex] = {
type: principal.type as "user" | "group",
value: newValue
};
onChange(newPrincipals);
}}
placeholder={`Select a ${principal.type}`}
className="w-full"
>
{principal.type === "user"
? members.map((member) => (
<SelectItem
key={member.user.id}
value={member.user.username}
>
{member.user.username}
</SelectItem>
))
: groups.map((group) => (
<SelectItem
key={group.group.slug}
value={group.group.slug}
>
{group.group.slug}
</SelectItem>
))}
</Select>
</div>
<div className="flex w-10 justify-center">
<IconButton
size="sm"
ariaLabel="delete principal"
variant="plain"
className="h-9"
onClick={() => {
const newPrincipals = value.filter(
(_, idx) => idx !== principalIndex
);
onChange(newPrincipals.length ? newPrincipals : []);
}}
>
<FontAwesomeIcon icon={faTrash} />
</IconButton>
</div>
</div> </div>
) <div className="flex-1">
)} <Select
value={principal.value}
onValueChange={(newValue) => {
if (isPrincipalDuplicate(i, principal.type, newValue)) {
createNotification({
text: `This ${principal.type} is already added`,
type: "error"
});
return;
}
const newPrincipals = [...value];
newPrincipals[principalIndex] = {
type: principal.type as "user" | "group",
value: newValue
};
onChange(newPrincipals);
}}
placeholder={`Select a ${principal.type}`}
className="w-full"
>
{principal.type === "user"
? members.map((member) => (
<SelectItem
key={member.user.id}
value={member.user.username}
>
{member.user.username}
</SelectItem>
))
: groups.map((group) => (
<SelectItem
key={group.group.slug}
value={group.group.slug}
>
{group.group.slug}
</SelectItem>
))}
</Select>
</div>
<div className="flex w-10 justify-center">
<IconButton
size="sm"
ariaLabel="delete principal"
variant="plain"
className="h-9"
onClick={() => {
const newPrincipals = value.filter(
(_, idx) => idx !== principalIndex
);
onChange(newPrincipals.length ? newPrincipals : []);
}}
>
<FontAwesomeIcon icon={faTrash} />
</IconButton>
</div>
</div>
))}
{error && <span className="text-sm text-red-500">{error.message}</span>} {error && <span className="text-sm text-red-500">{error.message}</span>}
</div> </div>
)} )}

View File

@@ -131,7 +131,8 @@ export const SshHostsTable = ({ handlePopUpOpen }: Props) => {
const filteredGroups = allowedPrincipals.groups?.filter( const filteredGroups = allowedPrincipals.groups?.filter(
(g) => !existing.groups?.has(g) (g) => !existing.groups?.has(g)
); );
return (filteredGroups?.length ?? 0) > 0 return ((filteredGroups?.length || filteredUsernames?.length) ?? 0) >
0
? { ? {
loginUser, loginUser,
source: LoginMappingSource.HOST_GROUP, source: LoginMappingSource.HOST_GROUP,