-
- {loginUser}
- {source === LoginMappingSource.HOST_GROUP && (
-
- (inherited from host group)
-
- )}
-
- {allowedPrincipals.usernames.map((username) => (
-
- └─ {username}
+ {} as Record
>
+ );
+
+ const entriesFromHost = hostMappings.map(({ loginUser, allowedPrincipals }) => ({
+ loginUser,
+ source: LoginMappingSource.HOST,
+ usernames: allowedPrincipals.usernames
+ }));
+
+ const entriesFromGroup = groupMappings
+ .map(({ loginUser, allowedPrincipals }) => {
+ const existing = hostLoginUserToPrincipals[loginUser] || new Set();
+ const filteredUsernames = allowedPrincipals.usernames.filter((u) => !existing.has(u));
+ return filteredUsernames.length > 0
+ ? {
+ loginUser,
+ source: LoginMappingSource.HOST_GROUP,
+ usernames: filteredUsernames
+ }
+ : null;
+ })
+ .filter(Boolean) as {
+ loginUser: string;
+ source: LoginMappingSource;
+ usernames: string[];
+ }[];
+
+ return [...entriesFromHost, ...entriesFromGroup]
+ .sort((a, b) => a.loginUser.localeCompare(b.loginUser))
+ .map(({ loginUser, usernames, source }) => (
+
+
+ {loginUser}
+ {source === LoginMappingSource.HOST_GROUP && (
+
+ (inherited from host group)
+
+ )}
- ))}
-
- ))
+ {usernames.map((username) => (
+
+ └─ {username}
+
+ ))}
+
+ ));
+ })()
)}
@@ -198,4 +233,8 @@ export const SshHostsTable = ({ handlePopUpOpen }: Props) => {
);
+};
+
+
+ );
};
|