mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-09-22 13:39:35 +00:00
Fix SSH table UI user groups issues
This commit is contained in:
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user