restructure and add chooser when adding new

This commit is contained in:
mfrances 2021-04-07 10:50:55 -04:00
parent 9e5104b668
commit 56a1b233d4
13 changed files with 1161 additions and 1118 deletions

View file

@ -226,6 +226,12 @@ export const routes: RoutesFn = (t: TFunction) => [
breadcrumb: null, breadcrumb: null,
access: "view-realm", access: "view-realm",
}, },
{
path: "/:realm/user-federation/ldap/new",
component: UserFederationLdapSettings,
breadcrumb: t("common:settings"),
access: "view-realm",
},
{ {
path: "/:realm/user-federation/ldap/:id/:tab?", path: "/:realm/user-federation/ldap/:id/:tab?",
component: UserFederationLdapSettings, component: UserFederationLdapSettings,
@ -238,12 +244,6 @@ export const routes: RoutesFn = (t: TFunction) => [
breadcrumb: t("common:mappingDetails"), breadcrumb: t("common:mappingDetails"),
access: "view-realm", access: "view-realm",
}, },
{
path: "/:realm/user-federation/ldap/new",
component: UserFederationLdapSettings,
breadcrumb: t("common:settings"),
access: "view-realm",
},
{ {
path: "/:realm/", path: "/:realm/",
component: DashboardSection, component: DashboardSection,

View file

@ -2,9 +2,7 @@ import { FormGroup, Switch, TextInput } from "@patternfly/react-core";
import React from "react"; import React from "react";
import { HelpItem } from "../../../components/help-enabler/HelpItem"; import { HelpItem } from "../../../components/help-enabler/HelpItem";
import { Controller, UseFormMethods } from "react-hook-form"; import { Controller, UseFormMethods } from "react-hook-form";
import { FormAccess } from "../../../components/form-access/FormAccess";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { LdapMapperGeneral } from "./shared/LdapMapperGeneral";
export type LdapMapperFullNameAttributeProps = { export type LdapMapperFullNameAttributeProps = {
form: UseFormMethods; form: UseFormMethods;
@ -18,87 +16,83 @@ export const LdapMapperFullNameAttribute = ({
return ( return (
<> <>
<FormAccess role="manage-realm" isHorizontal> <FormGroup
<LdapMapperGeneral form={form} /> label={t("ldapFullNameAttribute")}
labelIcon={
<FormGroup <HelpItem
label={t("ldapFullNameAttribute")} helpText={helpText("ldapFullNameAttributeHelp")}
labelIcon={ forLabel={t("ldapFullNameAttribute")}
<HelpItem forID="kc-full-name-attribute"
helpText={helpText("ldapFullNameAttributeHelp")}
forLabel={t("ldapFullNameAttribute")}
forID="kc-full-name-attribute"
/>
}
fieldId="kc-full-name-attribute"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-full-name-attribute"
data-testid="full-name-attribute"
name="config.ldap-full-name-attribute"
ref={form.register}
/> />
</FormGroup> }
<FormGroup fieldId="kc-full-name-attribute"
label={t("readOnly")} isRequired
labelIcon={ >
<HelpItem <TextInput
helpText={helpText("readOnlyHelp")} isRequired
forLabel={t("readOnly")} type="text"
forID="kc-read-only" id="kc-full-name-attribute"
data-testid="full-name-attribute"
name="config.ldap-full-name-attribute"
ref={form.register}
/>
</FormGroup>
<FormGroup
label={t("readOnly")}
labelIcon={
<HelpItem
helpText={helpText("readOnlyHelp")}
forLabel={t("readOnly")}
forID="kc-read-only"
/>
}
fieldId="kc-read-only"
hasNoPaddingTop
>
<Controller
name="config.read-only"
defaultValue={["false"]}
control={form.control}
render={({ onChange, value }) => (
<Switch
id={"kc-read-only"}
isDisabled={false}
onChange={(value) => onChange([`${value}`])}
isChecked={value[0] === "true"}
label={t("common:on")}
labelOff={t("common:off")}
/> />
} )}
fieldId="kc-read-only" ></Controller>
hasNoPaddingTop </FormGroup>
> <FormGroup
<Controller label={t("writeOnly")}
name="config.read-only" labelIcon={
defaultValue={["false"]} <HelpItem
control={form.control} helpText={helpText("writeOnlyHelp")}
render={({ onChange, value }) => ( forLabel={t("writeOnly")}
<Switch forID="kc-write-only"
id={"kc-read-only"} />
isDisabled={false} }
onChange={(value) => onChange([`${value}`])} fieldId="kc-read-only"
isChecked={value[0] === "true"} hasNoPaddingTop
label={t("common:on")} >
labelOff={t("common:off")} <Controller
/> name="config.write-only"
)} defaultValue={["false"]}
></Controller> control={form.control}
</FormGroup> render={({ onChange, value }) => (
<FormGroup <Switch
label={t("writeOnly")} id={"kc-write-only"}
labelIcon={ isDisabled={false}
<HelpItem onChange={(value) => onChange([`${value}`])}
helpText={helpText("writeOnlyHelp")} isChecked={value[0] === "true"}
forLabel={t("writeOnly")} label={t("common:on")}
forID="kc-write-only" labelOff={t("common:off")}
/> />
} )}
fieldId="kc-read-only" ></Controller>
hasNoPaddingTop </FormGroup>
>
<Controller
name="config.write-only"
defaultValue={["false"]}
control={form.control}
render={({ onChange, value }) => (
<Switch
id={"kc-write-only"}
isDisabled={false}
onChange={(value) => onChange([`${value}`])}
isChecked={value[0] === "true"}
label={t("common:on")}
labelOff={t("common:off")}
/>
)}
></Controller>
</FormGroup>
</FormAccess>
</> </>
); );
}; };

View file

@ -2,9 +2,7 @@ import { FormGroup, TextInput } from "@patternfly/react-core";
import React from "react"; import React from "react";
import { HelpItem } from "../../../components/help-enabler/HelpItem"; import { HelpItem } from "../../../components/help-enabler/HelpItem";
import { UseFormMethods } from "react-hook-form"; import { UseFormMethods } from "react-hook-form";
import { FormAccess } from "../../../components/form-access/FormAccess";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { LdapMapperGeneral } from "./shared/LdapMapperGeneral";
export type LdapMapperHardcodedAttributeProps = { export type LdapMapperHardcodedAttributeProps = {
form: UseFormMethods; form: UseFormMethods;
@ -18,51 +16,48 @@ export const LdapMapperHardcodedAttribute = ({
return ( return (
<> <>
<FormAccess role="manage-realm" isHorizontal> <FormGroup
<LdapMapperGeneral form={form} /> label={t("userModelAttributeName")}
<FormGroup labelIcon={
label={t("userModelAttributeName")} <HelpItem
labelIcon={ helpText={helpText("userModelAttributeNameHelp")}
<HelpItem forLabel={t("userModelAttributeName")}
helpText={helpText("userModelAttributeNameHelp")} forID="kc-user-model-attribute"
forLabel={t("userModelAttributeName")}
forID="kc-user-model-attribute"
/>
}
fieldId="kc-user-model-attribute"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-user-model-attribute"
data-testid="user-model-attribute"
name="config.user-model-attribute"
ref={form.register}
/> />
</FormGroup> }
<FormGroup fieldId="kc-user-model-attribute"
label={t("attributeValue")} isRequired
labelIcon={ >
<HelpItem <TextInput
helpText={helpText("attributeValueHelp")}
forLabel={t("attributeValue")}
forID="kc-attribute-value"
/>
}
fieldId="kc-attribute-value"
isRequired isRequired
> type="text"
<TextInput id="kc-user-model-attribute"
isRequired data-testid="user-model-attribute"
type="text" name="config.user-model-attribute"
id="kc-attribute-value" ref={form.register}
data-testid="attribute-value" />
name="config.attribute-value" </FormGroup>
ref={form.register} <FormGroup
label={t("attributeValue")}
labelIcon={
<HelpItem
helpText={helpText("attributeValueHelp")}
forLabel={t("attributeValue")}
forID="kc-attribute-value"
/> />
</FormGroup> }
</FormAccess> fieldId="kc-attribute-value"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-attribute-value"
data-testid="attribute-value"
name="config.attribute-value"
ref={form.register}
/>
</FormGroup>
</> </>
); );
}; };

View file

@ -2,9 +2,7 @@ import { FormGroup, TextInput } from "@patternfly/react-core";
import React from "react"; import React from "react";
import { HelpItem } from "../../../components/help-enabler/HelpItem"; import { HelpItem } from "../../../components/help-enabler/HelpItem";
import { UseFormMethods } from "react-hook-form"; import { UseFormMethods } from "react-hook-form";
import { FormAccess } from "../../../components/form-access/FormAccess";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { LdapMapperGeneral } from "./shared/LdapMapperGeneral";
export type LdapMapperHardcodedLdapAttributeProps = { export type LdapMapperHardcodedLdapAttributeProps = {
form: UseFormMethods; form: UseFormMethods;
@ -18,52 +16,48 @@ export const LdapMapperHardcodedLdapAttribute = ({
return ( return (
<> <>
<FormAccess role="manage-realm" isHorizontal> <FormGroup
<LdapMapperGeneral form={form} /> label={t("ldapAttributeName")}
labelIcon={
<FormGroup <HelpItem
label={t("ldapAttributeName")} helpText={helpText("ldapAttributeNameHelp")}
labelIcon={ forLabel={t("ldapAttributeName")}
<HelpItem forID="kc-ldap-attribute-name"
helpText={helpText("ldapAttributeNameHelp")}
forLabel={t("ldapAttributeName")}
forID="kc-ldap-attribute-name"
/>
}
fieldId="kc-ldap-attribute-name"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-ldap-attribute-name"
data-testid="ldap-attribute-name"
name="config.ldap-attribute-name"
ref={form.register}
/> />
</FormGroup> }
<FormGroup fieldId="kc-ldap-attribute-name"
label={t("ldapAttributeValue")} isRequired
labelIcon={ >
<HelpItem <TextInput
helpText={helpText("ldapAttributeValueHelp")}
forLabel={t("ldapAttributeValue")}
forID="kc-ldap-attribute-value"
/>
}
fieldId="kc-ldap-attribute-value"
isRequired isRequired
> type="text"
<TextInput id="kc-ldap-attribute-name"
isRequired data-testid="ldap-attribute-name"
type="text" name="config.ldap-attribute-name"
id="kc-ldap-attribute-value" ref={form.register}
data-testid="ldap-attribute-value" />
name="config.ldap-attribute-value" </FormGroup>
ref={form.register} <FormGroup
label={t("ldapAttributeValue")}
labelIcon={
<HelpItem
helpText={helpText("ldapAttributeValueHelp")}
forLabel={t("ldapAttributeValue")}
forID="kc-ldap-attribute-value"
/> />
</FormGroup> }
</FormAccess> fieldId="kc-ldap-attribute-value"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-ldap-attribute-value"
data-testid="ldap-attribute-value"
name="config.ldap-attribute-value"
ref={form.register}
/>
</FormGroup>
</> </>
); );
}; };

View file

@ -2,9 +2,7 @@ import { FormGroup, TextInput } from "@patternfly/react-core";
import React from "react"; import React from "react";
import { HelpItem } from "../../../components/help-enabler/HelpItem"; import { HelpItem } from "../../../components/help-enabler/HelpItem";
import { UseFormMethods } from "react-hook-form"; import { UseFormMethods } from "react-hook-form";
import { FormAccess } from "../../../components/form-access/FormAccess";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { LdapMapperGeneral } from "./shared/LdapMapperGeneral";
export type LdapMapperHardcodedLdapGroupProps = { export type LdapMapperHardcodedLdapGroupProps = {
form: UseFormMethods; form: UseFormMethods;
@ -18,30 +16,27 @@ export const LdapMapperHardcodedLdapGroup = ({
return ( return (
<> <>
<FormAccess role="manage-realm" isHorizontal> <FormGroup
<LdapMapperGeneral form={form} /> label={t("group")}
<FormGroup labelIcon={
label={t("group")} <HelpItem
labelIcon={ helpText={helpText("groupHelp")}
<HelpItem forLabel={t("group")}
helpText={helpText("groupHelp")} forID="kc-group"
forLabel={t("group")}
forID="kc-group"
/>
}
fieldId="kc-group"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-group"
data-testid="group"
name="config.group"
ref={form.register}
/> />
</FormGroup> }
</FormAccess> fieldId="kc-group"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-group"
data-testid="group"
name="config.group"
ref={form.register}
/>
</FormGroup>
</> </>
); );
}; };

View file

@ -2,9 +2,7 @@ import { FormGroup, TextInput } from "@patternfly/react-core";
import React from "react"; import React from "react";
import { HelpItem } from "../../../components/help-enabler/HelpItem"; import { HelpItem } from "../../../components/help-enabler/HelpItem";
import { UseFormMethods } from "react-hook-form"; import { UseFormMethods } from "react-hook-form";
import { FormAccess } from "../../../components/form-access/FormAccess";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { LdapMapperGeneral } from "./shared/LdapMapperGeneral";
export type LdapMapperHardcodedLdapRoleProps = { export type LdapMapperHardcodedLdapRoleProps = {
form: UseFormMethods; form: UseFormMethods;
@ -18,30 +16,27 @@ export const LdapMapperHardcodedLdapRole = ({
return ( return (
<> <>
<FormAccess role="manage-realm" isHorizontal> <FormGroup
<LdapMapperGeneral form={form} /> label={t("common:role")}
<FormGroup labelIcon={
label={t("common:role")} <HelpItem
labelIcon={ helpText={helpText("roleHelp")}
<HelpItem forLabel={t("common:role")}
helpText={helpText("roleHelp")} forID="kc-role"
forLabel={t("common:role")}
forID="kc-role"
/>
}
fieldId="kc-role"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-role"
data-testid="role"
name="config.role"
ref={form.register}
/> />
</FormGroup> }
</FormAccess> fieldId="kc-role"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-role"
data-testid="role"
name="config.role"
ref={form.register}
/>
</FormGroup>
</> </>
); );
}; };

View file

@ -10,20 +10,17 @@ import {
useAdminClient, useAdminClient,
asyncStateFetch, asyncStateFetch,
} from "../../../context/auth/AdminClient"; } from "../../../context/auth/AdminClient";
import { Link, useParams, useRouteMatch } from "react-router-dom"; import { Link, useHistory, useParams, useRouteMatch } from "react-router-dom";
export const LdapMapperList = () => { export const LdapMapperList = () => {
const [mappers, setMappers] = useState<ComponentRepresentation[]>(); const [mappers, setMappers] = useState<ComponentRepresentation[]>();
const history = useHistory();
const { t } = useTranslation("user-federation"); const { t } = useTranslation("user-federation");
const adminClient = useAdminClient(); const adminClient = useAdminClient();
const { addAlert } = useAlerts(); const { addAlert } = useAlerts();
const { url } = useRouteMatch(); const { url } = useRouteMatch();
const handleError = useErrorHandler(); const handleError = useErrorHandler();
const [key, setKey] = useState(0); const [key, setKey] = useState(0);
const { id } = useParams<{ id: string }>(); const { id } = useParams<{ id: string }>();
useEffect(() => { useEffect(() => {
@ -95,13 +92,7 @@ export const LdapMapperList = () => {
<Button <Button
data-testid="createMapperBtn" data-testid="createMapperBtn"
variant="primary" variant="primary"
// onClick={handleModalToggle} onClick={() => history.push(`${url}/new`)}
onClick={() =>
addAlert(
t("Add functionality not implemented yet!"),
AlertVariant.success
)
}
> >
{t("common:addMapper")} {t("common:addMapper")}
</Button> </Button>

View file

@ -1,20 +0,0 @@
import React from "react";
import { UseFormMethods } from "react-hook-form";
import { FormAccess } from "../../../components/form-access/FormAccess";
import { LdapMapperGeneral } from "./shared/LdapMapperGeneral";
export type LdapMapperMsadLdsUserAccountProps = {
form: UseFormMethods;
};
export const LdapMapperMsadLdsUserAccount = ({
form,
}: LdapMapperMsadLdsUserAccountProps) => {
return (
<>
<FormAccess role="manage-realm" isHorizontal>
<LdapMapperGeneral form={form} />
</FormAccess>
</>
);
};

View file

@ -2,9 +2,7 @@ import { FormGroup, Switch } from "@patternfly/react-core";
import React from "react"; import React from "react";
import { HelpItem } from "../../../components/help-enabler/HelpItem"; import { HelpItem } from "../../../components/help-enabler/HelpItem";
import { Controller, UseFormMethods } from "react-hook-form"; import { Controller, UseFormMethods } from "react-hook-form";
import { FormAccess } from "../../../components/form-access/FormAccess";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { LdapMapperGeneral } from "./shared/LdapMapperGeneral";
export type LdapMapperMsadUserAccountProps = { export type LdapMapperMsadUserAccountProps = {
form: UseFormMethods; form: UseFormMethods;
@ -18,37 +16,34 @@ export const LdapMapperMsadUserAccount = ({
return ( return (
<> <>
<FormAccess role="manage-realm" isHorizontal> <FormGroup
<LdapMapperGeneral form={form} /> label={t("passwordPolicyHintsEnabled")}
<FormGroup labelIcon={
label={t("passwordPolicyHintsEnabled")} <HelpItem
labelIcon={ helpText={helpText("passwordPolicyHintsEnabledHelp")}
<HelpItem forLabel={t("passwordPolicyHintsEnabled")}
helpText={helpText("passwordPolicyHintsEnabledHelp")} forID="kc-pw-policy-hints-enabled"
forLabel={t("passwordPolicyHintsEnabled")} />
forID="kc-pw-policy-hints-enabled" }
fieldId="kc-der-formatted"
hasNoPaddingTop
>
<Controller
name="config.ldap-password-policy-hints-enabled"
defaultValue={["false"]}
control={form.control}
render={({ onChange, value }) => (
<Switch
id={"kc-pw-policy-hints-enabled"}
isDisabled={false}
onChange={(value) => onChange([`${value}`])}
isChecked={value[0] === "true"}
label={t("common:on")}
labelOff={t("common:off")}
/> />
} )}
fieldId="kc-der-formatted" ></Controller>
hasNoPaddingTop </FormGroup>
>
<Controller
name="config.ldap-password-policy-hints-enabled"
defaultValue={["false"]}
control={form.control}
render={({ onChange, value }) => (
<Switch
id={"kc-pw-policy-hints-enabled"}
isDisabled={false}
onChange={(value) => onChange([`${value}`])}
isChecked={value[0] === "true"}
label={t("common:on")}
labelOff={t("common:off")}
/>
)}
></Controller>
</FormGroup>
</FormAccess>
</> </>
); );
}; };

File diff suppressed because it is too large Load diff

View file

@ -2,9 +2,7 @@ import { FormGroup, Switch, TextInput } from "@patternfly/react-core";
import React from "react"; import React from "react";
import { HelpItem } from "../../../components/help-enabler/HelpItem"; import { HelpItem } from "../../../components/help-enabler/HelpItem";
import { Controller, UseFormMethods } from "react-hook-form"; import { Controller, UseFormMethods } from "react-hook-form";
import { FormAccess } from "../../../components/form-access/FormAccess";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { LdapMapperGeneral } from "./shared/LdapMapperGeneral";
export type LdapMapperUserAttributeProps = { export type LdapMapperUserAttributeProps = {
form: UseFormMethods; form: UseFormMethods;
@ -20,197 +18,194 @@ export const LdapMapperUserAttribute = ({
return ( return (
<> <>
<FormAccess role="manage-realm" isHorizontal> <FormGroup
<LdapMapperGeneral form={form} /> label={t("userModelAttribute")}
<FormGroup labelIcon={
label={t("userModelAttribute")} <HelpItem
labelIcon={ helpText={helpText("userModelAttributeHelp")}
<HelpItem forLabel={t("userModelAttribute")}
helpText={helpText("userModelAttributeHelp")} forID="kc-user-model-attribute"
forLabel={t("userModelAttribute")}
forID="kc-user-model-attribute"
/>
}
fieldId="kc-user-model-attribute"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-user-model-attribute"
data-testid="user-model-attribute"
name="config.user-model-attribute"
ref={form.register}
/> />
</FormGroup> }
<FormGroup fieldId="kc-user-model-attribute"
label={t("ldapAttribute")} isRequired
labelIcon={ >
<HelpItem <TextInput
helpText={helpText("ldapAttributeHelp")}
forLabel={t("ldapAttribute")}
forID="kc-ldap-attribute"
/>
}
fieldId="kc-ldap-attribute"
isRequired isRequired
> type="text"
<TextInput id="kc-user-model-attribute"
isRequired data-testid="user-model-attribute"
type="text" name="config.user-model-attribute"
id="kc-ldap-attribute" ref={form.register}
data-testid="ldap-attribute" />
name="config.ldap-attribute" </FormGroup>
ref={form.register} <FormGroup
label={t("ldapAttribute")}
labelIcon={
<HelpItem
helpText={helpText("ldapAttributeHelp")}
forLabel={t("ldapAttribute")}
forID="kc-ldap-attribute"
/> />
</FormGroup> }
<FormGroup fieldId="kc-ldap-attribute"
label={t("readOnly")} isRequired
labelIcon={ >
<HelpItem <TextInput
helpText={helpText("readOnlyHelp")} isRequired
forLabel={t("readOnly")} type="text"
forID="kc-read-only" id="kc-ldap-attribute"
data-testid="ldap-attribute"
name="config.ldap-attribute"
ref={form.register}
/>
</FormGroup>
<FormGroup
label={t("readOnly")}
labelIcon={
<HelpItem
helpText={helpText("readOnlyHelp")}
forLabel={t("readOnly")}
forID="kc-read-only"
/>
}
fieldId="kc-read-only"
hasNoPaddingTop
>
<Controller
name="config.read-only"
defaultValue={["false"]}
control={form.control}
render={({ onChange, value }) => (
<Switch
id={"kc-read-only"}
isDisabled={false}
onChange={(value) => onChange([`${value}`])}
isChecked={value[0] === "true"}
label={t("common:on")}
labelOff={t("common:off")}
/> />
} )}
fieldId="kc-read-only" ></Controller>
hasNoPaddingTop </FormGroup>
> <FormGroup
<Controller label={t("alwaysReadValueFromLdap")}
name="config.read-only" labelIcon={
defaultValue={["false"]} <HelpItem
control={form.control} helpText={helpText("alwaysReadValueFromLdapHelp")}
render={({ onChange, value }) => ( forLabel={t("alwaysReadValueFromLdap")}
<Switch forID="kc-always-read-value"
id={"kc-read-only"} />
isDisabled={false} }
onChange={(value) => onChange([`${value}`])} fieldId="kc-always-read-value"
isChecked={value[0] === "true"} hasNoPaddingTop
label={t("common:on")} >
labelOff={t("common:off")} <Controller
/> name="config.always-read-value-from-ldap"
)} defaultValue={["false"]}
></Controller> control={form.control}
</FormGroup> render={({ onChange, value }) => (
<FormGroup <Switch
label={t("alwaysReadValueFromLdap")} id={"kc-always-read-value"}
labelIcon={ isDisabled={false}
<HelpItem onChange={(value) => onChange([`${value}`])}
helpText={helpText("alwaysReadValueFromLdapHelp")} isChecked={value[0] === "true"}
forLabel={t("alwaysReadValueFromLdap")} label={t("common:on")}
forID="kc-always-read-value" labelOff={t("common:off")}
/> />
} )}
fieldId="kc-always-read-value" ></Controller>
hasNoPaddingTop </FormGroup>
> <FormGroup
<Controller label={t("isMandatoryInLdap")}
name="config.always-read-value-from-ldap" labelIcon={
defaultValue={["false"]} <HelpItem
control={form.control} helpText={helpText("isMandatoryInLdapHelp")}
render={({ onChange, value }) => ( forLabel={t("isMandatoryInLdap")}
<Switch forID="kc-is-mandatory"
id={"kc-always-read-value"} />
isDisabled={false} }
onChange={(value) => onChange([`${value}`])} fieldId="kc-is-mandatory"
isChecked={value[0] === "true"} hasNoPaddingTop
label={t("common:on")} >
labelOff={t("common:off")} <Controller
/> name="config.is-mandatory-in-ldap"
)} defaultValue={["false"]}
></Controller> control={form.control}
</FormGroup> render={({ onChange, value }) => (
<FormGroup <Switch
label={t("isMandatoryInLdap")} id={"kc-is-mandatory"}
labelIcon={ isDisabled={false}
<HelpItem onChange={(value) => onChange([`${value}`])}
helpText={helpText("isMandatoryInLdapHelp")} isChecked={value[0] === "true"}
forLabel={t("isMandatoryInLdap")} label={t("common:on")}
forID="kc-is-mandatory" labelOff={t("common:off")}
/> />
} )}
fieldId="kc-is-mandatory" ></Controller>
hasNoPaddingTop </FormGroup>
> <FormGroup
<Controller label={t("isBinaryAttribute")}
name="config.is-mandatory-in-ldap" labelIcon={
defaultValue={["false"]} <HelpItem
control={form.control} helpText={helpText("isBinaryAttributeHelp")}
render={({ onChange, value }) => ( forLabel={t("isBinaryAttribute")}
<Switch forID="kc-is-binary"
id={"kc-is-mandatory"} />
isDisabled={false} }
onChange={(value) => onChange([`${value}`])} fieldId="kc-is-binary"
isChecked={value[0] === "true"} hasNoPaddingTop
label={t("common:on")} >
labelOff={t("common:off")} <Controller
/> name="config.is-binary-attribute"
)} defaultValue={["false"]}
></Controller> control={form.control}
</FormGroup> render={({ onChange, value }) => (
<FormGroup <Switch
label={t("isBinaryAttribute")} id={"kc-is-binary"}
labelIcon={ isDisabled={false}
<HelpItem onChange={(value) => onChange([`${value}`])}
helpText={helpText("isBinaryAttributeHelp")} isChecked={value[0] === "true"}
forLabel={t("isBinaryAttribute")} label={t("common:on")}
forID="kc-is-binary" labelOff={t("common:off")}
/> />
} )}
fieldId="kc-is-binary" ></Controller>
hasNoPaddingTop </FormGroup>
> {mapperType === "certificate-ldap-mapper" ? (
<Controller <>
name="config.is-binary-attribute" <FormGroup
defaultValue={["false"]} label={t("derFormatted")}
control={form.control} labelIcon={
render={({ onChange, value }) => ( <HelpItem
<Switch helpText={helpText("derFormattedHelp")}
id={"kc-is-binary"} forLabel={t("derFormatted")}
isDisabled={false} forID="kc-der-formatted"
onChange={(value) => onChange([`${value}`])}
isChecked={value[0] === "true"}
label={t("common:on")}
labelOff={t("common:off")}
/> />
)} }
></Controller> fieldId="kc-der-formatted"
</FormGroup> hasNoPaddingTop
{mapperType === "certificate-ldap-mapper" ? ( >
<> <Controller
<FormGroup name="config.is-der-formatted"
label={t("derFormatted")} defaultValue={["false"]}
labelIcon={ control={form.control}
<HelpItem render={({ onChange, value }) => (
helpText={helpText("derFormattedHelp")} <Switch
forLabel={t("derFormatted")} id={"kc-der-formatted"}
forID="kc-der-formatted" isDisabled={false}
onChange={(value) => onChange([`${value}`])}
isChecked={value[0] === "true"}
label={t("common:on")}
labelOff={t("common:off")}
/> />
} )}
fieldId="kc-der-formatted" ></Controller>
hasNoPaddingTop </FormGroup>
> </>
<Controller ) : (
name="config.is-der-formatted" <></>
defaultValue={["false"]} )}
control={form.control}
render={({ onChange, value }) => (
<Switch
id={"kc-der-formatted"}
isDisabled={false}
onChange={(value) => onChange([`${value}`])}
isChecked={value[0] === "true"}
label={t("common:on")}
labelOff={t("common:off")}
/>
)}
></Controller>
</FormGroup>
</>
) : (
<></>
)}
</FormAccess>
</> </>
); );
}; };

View file

@ -4,20 +4,26 @@ import {
AlertVariant, AlertVariant,
Button, Button,
Form, Form,
FormGroup,
PageSection, PageSection,
Select,
SelectOption,
SelectVariant,
TextInput,
} from "@patternfly/react-core"; } from "@patternfly/react-core";
import { convertToFormValues } from "../../../util"; import { convertToFormValues } from "../../../util";
import ComponentRepresentation from "keycloak-admin/lib/defs/componentRepresentation"; import ComponentRepresentation from "keycloak-admin/lib/defs/componentRepresentation";
import { useAdminClient } from "../../../context/auth/AdminClient"; import { useAdminClient } from "../../../context/auth/AdminClient";
import { ViewHeader } from "../../../components/view-header/ViewHeader"; import { ViewHeader } from "../../../components/view-header/ViewHeader";
import { useHistory, useParams } from "react-router-dom"; import { useHistory, useParams } from "react-router-dom";
import { useForm } from "react-hook-form"; import { Controller, useForm, useWatch } from "react-hook-form";
import { useAlerts } from "../../../components/alert/Alerts"; import { useAlerts } from "../../../components/alert/Alerts";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { HelpItem } from "../../../components/help-enabler/HelpItem";
import { FormAccess } from "../../../components/form-access/FormAccess";
import { LdapMapperUserAttribute } from "./LdapMapperUserAttribute"; import { LdapMapperUserAttribute } from "./LdapMapperUserAttribute";
import { LdapMapperMsadUserAccount } from "./LdapMapperMsadUserAccount"; import { LdapMapperMsadUserAccount } from "./LdapMapperMsadUserAccount";
import { LdapMapperMsadLdsUserAccount } from "./LdapMapperMsadLdsUserAccount";
import { LdapMapperFullNameAttribute } from "./LdapMapperFullNameAttribute"; import { LdapMapperFullNameAttribute } from "./LdapMapperFullNameAttribute";
import { LdapMapperHardcodedLdapRole } from "./LdapMapperHardcodedLdapRole"; import { LdapMapperHardcodedLdapRole } from "./LdapMapperHardcodedLdapRole";
@ -26,7 +32,6 @@ import { LdapMapperHardcodedLdapAttribute } from "./LdapMapperHardcodedLdapAttri
import { LdapMapperHardcodedAttribute } from "./LdapMapperHardcodedAttribute"; import { LdapMapperHardcodedAttribute } from "./LdapMapperHardcodedAttribute";
import { LdapMapperRoleGroup } from "./LdapMapperRoleGroup"; import { LdapMapperRoleGroup } from "./LdapMapperRoleGroup";
import { useRealm } from "../../../context/realm-context/RealmContext"; import { useRealm } from "../../../context/realm-context/RealmContext";
export const LdapMappingDetails = () => { export const LdapMappingDetails = () => {
@ -40,20 +45,25 @@ export const LdapMappingDetails = () => {
const { realm } = useRealm(); const { realm } = useRealm();
const id = mapperId; const id = mapperId;
const { t } = useTranslation("user-federation"); const { t } = useTranslation("user-federation");
const helpText = useTranslation("user-federation-help").t;
const { addAlert } = useAlerts(); const { addAlert } = useAlerts();
const [isMapperDropdownOpen, setIsMapperDropdownOpen] = useState(false);
useEffect(() => { useEffect(() => {
(async () => { (async () => {
if (mapperId) { if (mapperId !== "new") {
const fetchedMapper = await adminClient.components.findOne({ id }); if (mapperId) {
if (fetchedMapper) { const fetchedMapper = await adminClient.components.findOne({ id });
// TODO: remove after adding all mapper types if (fetchedMapper) {
console.log("LdapMappingDetails: id used in findOne(id) call::"); // TODO: remove after adding all mapper types
console.log(id); console.log("LdapMappingDetails: id used in findOne(id) call::");
console.log("LdapMappingDetails: data returned from findOne(id):"); console.log(id);
console.log(fetchedMapper); console.log("LdapMappingDetails: data returned from findOne(id):");
setMapper(fetchedMapper); console.log(fetchedMapper);
setupForm(fetchedMapper); setMapper(fetchedMapper);
setupForm(fetchedMapper);
}
} }
} }
})(); })();
@ -78,63 +88,240 @@ export const LdapMappingDetails = () => {
), ),
AlertVariant.success AlertVariant.success
); );
history.push(`/${realm}/user-federation`); history.push(`/${realm}/user-federation/ldap/${mapper!.parentId}/mappers`);
}; };
const mapperType = useWatch({
control: form.control,
name: "choose-mapper-type",
});
const isNew = mapperId === "new";
return ( return (
<> <>
<ViewHeader titleKey={mapper ? mapper.name! : ""} subKey="" /> <ViewHeader
titleKey={mapper ? mapper.name! : "Create new mapper"}
subKey=""
/>
<PageSection variant="light" isFilled> <PageSection variant="light" isFilled>
{mapper <FormAccess role="manage-realm" isHorizontal>
? (mapper.providerId! === "certificate-ldap-mapper" || {!isNew && (
mapper.providerId! === "user-attribute-ldap-mapper") && ( <FormGroup label={t("common:id")} fieldId="kc-ldap-mapper-id">
<LdapMapperUserAttribute <TextInput
form={form} isDisabled
mapperType={mapper?.providerId} type="text"
id="kc-ldap-mapper-id"
data-testid="ldap-mapper-id"
name="id"
ref={form.register}
/> />
) </FormGroup>
: ""} )}
{mapper <FormGroup
? mapper.providerId! === "msad-user-account-control-mapper" && ( label={t("common:name")}
<LdapMapperMsadUserAccount form={form} /> labelIcon={
) <HelpItem
: ""} helpText={helpText("nameHelp")}
{mapper forLabel={t("common:name")}
? mapper.providerId! === "msad-lds-user-account-control-mapper" && ( forID="kc-ldap-mapper-name"
<LdapMapperMsadLdsUserAccount form={form} /> />
) }
: ""} fieldId="kc-ldap-mapper-name"
{mapper isRequired
? mapper.providerId! === "full-name-ldap-mapper" && ( >
<LdapMapperFullNameAttribute form={form} /> <TextInput
) isDisabled={!isNew}
: ""} isRequired
{mapper type="text"
? mapper.providerId! === "hardcoded-ldap-role-mapper" && ( id="kc-ldap-mapper-name"
<LdapMapperHardcodedLdapRole form={form} /> data-testid="ldap-mapper-name"
) name="name"
: ""} ref={form.register}
{mapper />
? mapper.providerId! === "hardcoded-ldap-group-mapper" && ( </FormGroup>
<LdapMapperHardcodedLdapGroup form={form} /> {!isNew ? (
) <FormGroup
: ""} label={t("common:mapperType")}
{mapper labelIcon={
? mapper.providerId! === "hardcoded-ldap-attribute-mapper" && ( <HelpItem
<LdapMapperHardcodedLdapAttribute form={form} /> helpText={helpText("mapperTypeHelp")}
) forLabel={t("common:mapperType")}
: ""} forID="kc-ldap-mapper-type"
{mapper />
? mapper.providerId! === "hardcoded-attribute-mapper" && ( }
<LdapMapperHardcodedAttribute form={form} /> fieldId="kc-ldap-mapper-type"
) isRequired
: ""} >
{mapper <TextInput
? (mapper.providerId! === "role-ldap-mapper" || isDisabled={!isNew}
mapper.providerId! === "group-ldap-mapper") && ( isRequired
<LdapMapperRoleGroup form={form} type={mapper.providerId} /> type="text"
) id="kc-ldap-mapper-type"
: ""} data-testid="ldap-mapper-type"
name="providerId"
ref={form.register}
/>
</FormGroup>
) : (
<FormGroup
label={t("common:mapperType")}
labelIcon={
<HelpItem
helpText={helpText("mapperTypeHelp")}
forLabel={t("common:mapperType")}
forID="kc-choose-mapper-type"
/>
}
fieldId="kc-choose-mapper-type"
isRequired
>
<Controller
name="choose-mapper-type"
defaultValue=" "
control={form.control}
render={({ onChange, value }) => (
<Select
toggleId="kc-choose-mapper-type"
required
onToggle={() =>
setIsMapperDropdownOpen(!isMapperDropdownOpen)
}
isOpen={isMapperDropdownOpen}
onSelect={(_, value) => {
onChange(value as string);
setIsMapperDropdownOpen(false);
}}
selections={value}
variant={SelectVariant.single}
// data-testid="choose-mapper-type"
>
<SelectOption
key={0}
value="msad-user-account-control-mapper"
/>
<SelectOption
key={1}
value="msda-lds-user-account-control-mapper"
/>
<SelectOption key={2} value="group-ldap-mapper" />
<SelectOption key={3} value="user-attribute-ldap-mapper" />
<SelectOption key={4} value="role-ldap-mapper" />
<SelectOption key={5} value="hardcoded-attribute-mapper" />
<SelectOption key={6} value="hardcoded-ldap-role-mapper" />
<SelectOption key={7} value="certificate-ldap-mapper" />
<SelectOption key={8} value="full-name-ldap-mapper" />
<SelectOption key={9} value="hardcoded-ldap-group-mapper" />
<SelectOption
key={10}
value="hardcoded-ldap-attribute-mapper"
/>
</Select>
)}
></Controller>
</FormGroup>
)}
{/* When loading existing mappers, load forms based on providerId aka mapper type */}
{mapper
? (mapper.providerId! === "certificate-ldap-mapper" ||
mapper.providerId! === "user-attribute-ldap-mapper") && (
<LdapMapperUserAttribute
form={form}
mapperType={mapper?.providerId}
/>
)
: ""}
{mapper
? mapper.providerId! === "msad-user-account-control-mapper" && (
<LdapMapperMsadUserAccount form={form} />
)
: ""}
{/* msad-lds-user-account-control-mapper does not need a component
because it is just id, name, and mapper type*/}
{mapper
? mapper.providerId! === "full-name-ldap-mapper" && (
<LdapMapperFullNameAttribute form={form} />
)
: ""}
{mapper
? mapper.providerId! === "hardcoded-ldap-role-mapper" && (
<LdapMapperHardcodedLdapRole form={form} />
)
: ""}
{mapper
? mapper.providerId! === "hardcoded-ldap-group-mapper" && (
<LdapMapperHardcodedLdapGroup form={form} />
)
: ""}
{mapper
? mapper.providerId! === "hardcoded-ldap-attribute-mapper" && (
<LdapMapperHardcodedLdapAttribute form={form} />
)
: ""}
{mapper
? mapper.providerId! === "hardcoded-attribute-mapper" && (
<LdapMapperHardcodedAttribute form={form} />
)
: ""}
{mapper
? (mapper.providerId! === "role-ldap-mapper" ||
mapper.providerId! === "group-ldap-mapper") && (
<LdapMapperRoleGroup form={form} type={mapper.providerId} />
)
: ""}
{/* When creating new mappers, load forms based on dropdown selection */}
{mapperType
? mapperType === "certificate-ldap-mapper" && (
<LdapMapperUserAttribute form={form} mapperType={mapperType} />
)
: ""}
{mapperType
? mapperType === "user-attribute-ldap-mapper" && (
<LdapMapperUserAttribute form={form} mapperType={mapperType} />
)
: ""}
{mapperType
? mapperType === "msad-user-account-control-mapper" && (
<LdapMapperMsadUserAccount form={form} />
)
: ""}
{mapperType
? mapperType === "full-name-ldap-mapper" && (
<LdapMapperFullNameAttribute form={form} />
)
: ""}
{mapperType
? mapperType === "hardcoded-ldap-role-mapper" && (
<LdapMapperHardcodedLdapRole form={form} />
)
: ""}
{mapperType
? mapperType === "hardcoded-ldap-group-mapper" && (
<LdapMapperHardcodedLdapGroup form={form} />
)
: ""}
{mapperType
? mapperType === "hardcoded-ldap-attribute-mapper" && (
<LdapMapperHardcodedLdapAttribute form={form} />
)
: ""}
{mapperType
? mapperType === "hardcoded-attribute-mapper" && (
<LdapMapperHardcodedAttribute form={form} />
)
: ""}
{mapperType
? mapperType === "role-ldap-mapper" && (
<LdapMapperRoleGroup form={form} type={mapperType} />
)
: ""}
{mapperType
? mapperType === "group-ldap-mapper" && (
<LdapMapperRoleGroup form={form} type={mapperType} />
)
: ""}
</FormAccess>
<Form onSubmit={form.handleSubmit(save)}> <Form onSubmit={form.handleSubmit(save)}>
<ActionGroup> <ActionGroup>
<Button <Button

View file

@ -1,71 +0,0 @@
import { FormGroup, TextInput } from "@patternfly/react-core";
import React from "react";
import { HelpItem } from "../../../../components/help-enabler/HelpItem";
import { UseFormMethods } from "react-hook-form";
import { useTranslation } from "react-i18next";
export type LdapMapperGeneralProps = {
form: UseFormMethods;
};
export const LdapMapperGeneral = ({ form }: LdapMapperGeneralProps) => {
const { t } = useTranslation("user-federation");
const helpText = useTranslation("user-federation-help").t;
return (
<>
<FormGroup label={t("common:id")} fieldId="kc-ldap-mapper-id">
<TextInput
isRequired
type="text"
id="kc-ldap-mapper-id"
data-testid="ldap-mapper-id"
name="id"
ref={form.register}
/>
</FormGroup>
<FormGroup
label={t("common:name")}
labelIcon={
<HelpItem
helpText={helpText("nameHelp")}
forLabel={t("common:name")}
forID="kc-ldap-mapper-name"
/>
}
fieldId="kc-ldap-mapper-name"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-ldap-mapper-name"
data-testid="ldap-mapper-name"
name="name"
ref={form.register}
/>
</FormGroup>
<FormGroup
label={t("common:mapperType")}
labelIcon={
<HelpItem
helpText={helpText("mapperTypeHelp")}
forLabel={t("common:mapperType")}
forID="kc-ldap-mapper-type"
/>
}
fieldId="kc-ldap-mapper-type"
isRequired
>
<TextInput
isRequired
type="text"
id="kc-ldap-mapper-type"
data-testid="ldap-mapper-type"
name="providerId"
ref={form.register}
/>
</FormGroup>
</>
);
};