![Erik Jan de Wit](/assets/img/avatar_default.png)
* initial screen Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * more screens Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * added members tab Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * added the backend Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * added member add / invite models Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * initial version of the identity provider section Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * add link and unlink providers Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * small fix Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * PR comments Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * Do not validate broker domain when the domain is an empty string Closes #29759 Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * added filter and value Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * added test Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * added first name last name Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * refresh menu when realm organization is changed Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * changed to record Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * changed to form data Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * fixed lint error Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * Changing name of invitation parameters Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * Chancing name of parameters on the client Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * Enable organization at the realm before running tests Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * Domain help message Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * Handling model validation errors when creating organizations Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * Message key for organizationDetails Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * Do not change kc.org attribute on group Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * add realm into the context Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * tests Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * Changing button in invitation model to use Send instead of Save Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * Better message when validating the organization domain Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * Fixing compilation error after rebase Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * fixed test Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * removed wait as it no longer required and skip flacky test Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * skip tests that are flaky Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> * stabilize user create test Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> --------- Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com> Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com> Co-authored-by: Pedro Igor <pigor.craveiro@gmail.com>
93 lines
3 KiB
TypeScript
93 lines
3 KiB
TypeScript
import type GroupRepresentation from "@keycloak/keycloak-admin-client/lib/defs/groupRepresentation";
|
|
import type { UserProfileMetadata } from "@keycloak/keycloak-admin-client/lib/defs/userProfileMetadata";
|
|
import {
|
|
isUserProfileError,
|
|
setUserProfileServerError,
|
|
} from "@keycloak/keycloak-ui-shared";
|
|
import { AlertVariant, PageSection } from "@patternfly/react-core";
|
|
import { TFunction } from "i18next";
|
|
import { useState } from "react";
|
|
import { useForm } from "react-hook-form";
|
|
import { useTranslation } from "react-i18next";
|
|
import { useNavigate } from "react-router-dom";
|
|
import { useAdminClient } from "../admin-client";
|
|
import { useAlerts } from "../components/alert/Alerts";
|
|
import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner";
|
|
import { ViewHeader } from "../components/view-header/ViewHeader";
|
|
import { useRealm } from "../context/realm-context/RealmContext";
|
|
import { useFetch } from "../utils/useFetch";
|
|
import { UserForm } from "./UserForm";
|
|
import { UserFormFields, toUserRepresentation } from "./form-state";
|
|
import { toUser } from "./routes/User";
|
|
|
|
import "./user-section.css";
|
|
|
|
export default function CreateUser() {
|
|
const { adminClient } = useAdminClient();
|
|
|
|
const { t } = useTranslation();
|
|
const { addAlert, addError } = useAlerts();
|
|
const navigate = useNavigate();
|
|
const { realm: realmName, realmRepresentation: realm } = useRealm();
|
|
const form = useForm<UserFormFields>({ mode: "onChange" });
|
|
const [addedGroups, setAddedGroups] = useState<GroupRepresentation[]>([]);
|
|
const [userProfileMetadata, setUserProfileMetadata] =
|
|
useState<UserProfileMetadata>();
|
|
|
|
useFetch(
|
|
() => adminClient.users.getProfileMetadata({ realm: realmName }),
|
|
(userProfileMetadata) => {
|
|
if (!realm) {
|
|
throw new Error(t("notFound"));
|
|
}
|
|
|
|
form.setValue("attributes.locale", realm.defaultLocale || "");
|
|
setUserProfileMetadata(userProfileMetadata);
|
|
},
|
|
[],
|
|
);
|
|
|
|
const save = async (data: UserFormFields) => {
|
|
try {
|
|
const createdUser = await adminClient.users.create({
|
|
...toUserRepresentation(data),
|
|
groups: addedGroups.map((group) => group.path!),
|
|
enabled: true,
|
|
});
|
|
|
|
addAlert(t("userCreated"), AlertVariant.success);
|
|
navigate(
|
|
toUser({ id: createdUser.id, realm: realmName, tab: "settings" }),
|
|
);
|
|
} catch (error) {
|
|
if (isUserProfileError(error)) {
|
|
setUserProfileServerError(error, form.setError, ((key, param) =>
|
|
t(key as string, param as any)) as TFunction);
|
|
} else {
|
|
addError("userCreateError", error);
|
|
}
|
|
}
|
|
};
|
|
|
|
if (!realm) {
|
|
return <KeycloakSpinner />;
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<ViewHeader
|
|
titleKey={t("createUser")}
|
|
className="kc-username-view-header"
|
|
/>
|
|
<PageSection variant="light">
|
|
<UserForm
|
|
form={form}
|
|
realm={realm}
|
|
userProfileMetadata={userProfileMetadata}
|
|
onGroupsUpdate={setAddedGroups}
|
|
save={save}
|
|
/>
|
|
</PageSection>
|
|
</>
|
|
);
|
|
}
|