Parse multiple user profile errors (#4217)
This commit is contained in:
parent
5db24824f3
commit
792cffc6f3
4 changed files with 41 additions and 7 deletions
|
@ -13,7 +13,11 @@ type AlertPanelProps = {
|
|||
|
||||
export function AlertPanel({ alerts, onCloseAlert }: AlertPanelProps) {
|
||||
return (
|
||||
<AlertGroup data-testid="global-alerts" isToast>
|
||||
<AlertGroup
|
||||
data-testid="global-alerts"
|
||||
isToast
|
||||
style={{ whiteSpace: "pre-wrap" }}
|
||||
>
|
||||
{alerts.map(({ id, variant, message, description }) => (
|
||||
<Alert
|
||||
key={id}
|
||||
|
|
|
@ -13,6 +13,10 @@ import { useRealm } from "../context/realm-context/RealmContext";
|
|||
import { UserProfileProvider } from "../realm-settings/user-profile/UserProfileContext";
|
||||
import { toUser } from "./routes/User";
|
||||
import { UserForm } from "./UserForm";
|
||||
import {
|
||||
isUserProfileError,
|
||||
userProfileErrorToString,
|
||||
} from "./UserProfileFields";
|
||||
|
||||
import "./user-section.css";
|
||||
|
||||
|
@ -37,7 +41,11 @@ export default function CreateUser() {
|
|||
addAlert(t("userCreated"), AlertVariant.success);
|
||||
navigate(toUser({ id: createdUser.id, realm, tab: "settings" }));
|
||||
} catch (error) {
|
||||
addError("users:userCreateError", error);
|
||||
if (isUserProfileError(error)) {
|
||||
addError(userProfileErrorToString(error), error);
|
||||
} else {
|
||||
addError("users:userCreateError", error);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -33,6 +33,10 @@ import { UserCredentials } from "./UserCredentials";
|
|||
import { BruteForced, UserForm } from "./UserForm";
|
||||
import { UserGroups } from "./UserGroups";
|
||||
import { UserIdentityProviderLinks } from "./UserIdentityProviderLinks";
|
||||
import {
|
||||
isUserProfileError,
|
||||
userProfileErrorToString,
|
||||
} from "./UserProfileFields";
|
||||
import { UserRoleMapping } from "./UserRoleMapping";
|
||||
import { UserSessions } from "./UserSessions";
|
||||
|
||||
|
@ -130,7 +134,11 @@ const EditUserForm = ({ user, bruteForced, refresh }: EditUserFormProps) => {
|
|||
addAlert(t("userSaved"), AlertVariant.success);
|
||||
refresh();
|
||||
} catch (error) {
|
||||
addError("users:userCreateError", error);
|
||||
if (isUserProfileError(error)) {
|
||||
addError(userProfileErrorToString(error), error);
|
||||
} else {
|
||||
addError("users:userCreateError", error);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -1,6 +1,3 @@
|
|||
import { Fragment } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { Controller, useFormContext } from "react-hook-form";
|
||||
import {
|
||||
Form,
|
||||
FormGroup,
|
||||
|
@ -8,13 +5,16 @@ import {
|
|||
SelectOption,
|
||||
Text,
|
||||
} from "@patternfly/react-core";
|
||||
import { Fragment } from "react";
|
||||
import { Controller, useFormContext } from "react-hook-form";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
import type {
|
||||
UserProfileAttribute,
|
||||
UserProfileAttributeRequired,
|
||||
} from "@keycloak/keycloak-admin-client/lib/defs/userProfileConfig";
|
||||
import { ScrollForm } from "../components/scroll-form/ScrollForm";
|
||||
import { KeycloakTextInput } from "../components/keycloak-text-input/KeycloakTextInput";
|
||||
import { ScrollForm } from "../components/scroll-form/ScrollForm";
|
||||
import { useUserProfile } from "../realm-settings/user-profile/UserProfileContext";
|
||||
import useToggle from "../utils/useToggle";
|
||||
|
||||
|
@ -25,6 +25,20 @@ type UserProfileFieldsProps = {
|
|||
roles?: string[];
|
||||
};
|
||||
|
||||
export type UserProfileError = {
|
||||
responseData: { errors?: { errorMessage: string }[] };
|
||||
};
|
||||
|
||||
export function isUserProfileError(error: unknown): error is UserProfileError {
|
||||
return !!(error as UserProfileError).responseData.errors;
|
||||
}
|
||||
|
||||
export function userProfileErrorToString(error: UserProfileError) {
|
||||
return (
|
||||
error.responseData["errors"]?.map((e) => e["errorMessage"]).join("\n") || ""
|
||||
);
|
||||
}
|
||||
|
||||
export const UserProfileFields = ({
|
||||
roles = ["admin"],
|
||||
}: UserProfileFieldsProps) => {
|
||||
|
|
Loading…
Reference in a new issue