keycloak-scim/src/realm-settings/RSAModal.tsx
Jenny 9ad9d6c314
parent a03c8fc79b (#729)
author jenny-s51 <jshandel@redhat.com> 1624022352 -0400
committer jenny-s51 <jshandel@redhat.com> 1625159705 -0400

wip provider details

provider details wip

move files wip

wip

wip all provider details

remove controllers

save and update working

address console warnings

remove log stmt

update test

keep aes only

remove comments

remove unused hook and function

remove unused props

revert ldap logs

fix conflict and remove duplicate function

format and cypress test

Partial import phase 2 (#702)

* Process the JSON and present user options

* Finish checkboxes.  Refactor.

* Add tests

* Refactor after rebase

* Add more test data for manual testing.

* Fix linting errors

* Put JsonFileUpload back the way it was.

* Clean up comments

* Update src/realm-settings/PartialImport.tsx

Remove comment

Co-authored-by: Jenny <32821331+jenny-s51@users.noreply.github.com>

Co-authored-by: Jenny <32821331+jenny-s51@users.noreply.github.com>

Localization tab (#685)

* localization wip

wip localization

return key value data as array

localization table

css

lint

lint

clean up log stmts

clean up log stmts

* PR feedback from Erik

* fix logic for supported locales

* update empty state text

* set default value

* fix cypress test

* Update src/realm-settings/RealmSettingsSection.tsx

Co-authored-by: Erik Jan de Wit <erikjan.dewit@gmail.com>

* fix rsa-generated delete bug; PR feedback frog Erik

* revert locale abbreviation

* remove log stmts

* PR feedback from Erik, fix undefined

* fix loader w Erik

Co-authored-by: Erik Jan de Wit <erikjan.dewit@gmail.com>

add divider on section

Prepare for first alpha release (#711)

use typeahead for mapper list

fix test

Default roles: UI Changes from KEYCLOAK-14846 (#693)

* defaultRoles wip

default role changes done

clean up log stmts

update snapshot

fix masthead test

* fix cypress test

* fix tabs

Comment out Realm role CRUD test (#712)

* Bogus change

* Bogus change

* Comment out Realm role CRUD test

Bump postcss-cli from 7.1.1 to 8.3.1 (#718)

Bumps [postcss-cli](https://github.com/postcss/postcss-cli) from 7.1.1 to 8.3.1.
- [Release notes](https://github.com/postcss/postcss-cli/releases)
- [Changelog](https://github.com/postcss/postcss-cli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss-cli/compare/7.1.1...8.3.1)

---
updated-dependencies:
- dependency-name: postcss-cli
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

Bump @testing-library/jest-dom from 5.12.0 to 5.14.1 (#717)

Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 5.12.0 to 5.14.1.
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v5.12.0...v5.14.1)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

fixing issue (#709)

* fixing issue

fixing: #680

* added kebab on row

* added more clear group seperation

Bump cypress from 7.4.0 to 7.5.0 (#715)

Bump @babel/preset-typescript from 7.13.0 to 7.14.5 (#714)

Bumps [@babel/preset-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-typescript) from 7.13.0 to 7.14.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.14.5/packages/babel-preset-typescript)

---
updated-dependencies:
- dependency-name: "@babel/preset-typescript"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

Bump @testing-library/react from 10.4.6 to 11.2.7 (#716)

Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 10.4.6 to 11.2.7.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v10.4.6...v11.2.7)

---
updated-dependencies:
- dependency-name: "@testing-library/react"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

inherited roles disabled instead of non selectable

more style fixes

fixed size

change title of tab

add unassign kebab on row

added help item on enable switch

test email working, modal wip

email connection done

remove comment

fix cypress test

revert test file

fdisable email prompting when user email entered

prettier

update cypress tests

fix lint

try fix cypress test

try longer wait

save and test connection

make wait longer

increase wait

fix test

disable test connection button if form fields not entered

lint

afix username/password fields

fix test

mark suggested change

add modal button and input functions

fixed default value warning

fixing issue

fixing: #650

remove provider form

add delete cleanup function

AESproviderDetails extend wait for video

update test

test wait after

rebase

remove comments

remove log

format

format

PR feedback from Jon

Apply suggestions from Jon's code review

Co-authored-by: Jon Koops <jonkoops@gmail.com>

remove duplicate form

form

use array desctructuring

Apply suggestions from code review

Co-authored-by: Jon Koops <jonkoops@gmail.com>

update useroutematch

format

format

back to async

pretty

cypress test

remove email verification switch toggle

fix add provider on non-master realm

cleaning up

fix save

fix save for other providers

fix fetch

fix runtime error

remove unused import

Apply suggestions from code review

suggested changes for non-null assertions

Co-authored-by: Jon Koops <jonkoops@gmail.com>

make props required

make provider type required

use realm-settings file for translation

format and roll back route changes
2021-07-12 14:19:50 -04:00

327 lines
9.7 KiB
TypeScript

import React, { useState } from "react";
import {
AlertVariant,
Button,
ButtonVariant,
FileUpload,
Form,
FormGroup,
Modal,
ModalVariant,
Select,
SelectOption,
SelectVariant,
Switch,
TextInput,
} from "@patternfly/react-core";
import { useTranslation } from "react-i18next";
import { Controller, useForm } from "react-hook-form";
import { useAdminClient } from "../context/auth/AdminClient";
import { useAlerts } from "../components/alert/Alerts";
import type ComponentRepresentation from "keycloak-admin/lib/defs/componentRepresentation";
import { HelpItem } from "../components/help-enabler/HelpItem";
import { useServerInfo } from "../context/server-info/ServerInfoProvider";
import { useParams } from "react-router-dom";
type RSAModalProps = {
providerType: string;
handleModalToggle: () => void;
refresh: () => void;
open: boolean;
};
export const RSAModal = ({
providerType,
handleModalToggle,
open,
refresh,
}: RSAModalProps) => {
const { t } = useTranslation("realm-settings");
const serverInfo = useServerInfo();
const adminClient = useAdminClient();
const { addAlert } = useAlerts();
const { handleSubmit, control } = useForm({});
const [isRSAalgDropdownOpen, setIsRSAalgDropdownOpen] = useState(false);
const { id } = useParams<{ id: string }>();
const [keyFileName, setKeyFileName] = useState("");
const [certificateFileName, setCertificateFileName] = useState("");
const allComponentTypes =
serverInfo.componentTypes?.["org.keycloak.keys.KeyProvider"] ?? [];
const save = async (component: ComponentRepresentation) => {
try {
if (id) {
await adminClient.components.update(
{ id },
{
...component,
parentId: component.parentId,
providerId: providerType,
providerType: "org.keycloak.keys.KeyProvider",
}
);
addAlert(t("saveProviderSuccess"), AlertVariant.success);
} else {
await adminClient.components.create({
...component,
parentId: component.parentId,
providerId: providerType,
providerType: "org.keycloak.keys.KeyProvider",
});
handleModalToggle();
addAlert(t("saveProviderSuccess"), AlertVariant.success);
refresh();
}
} catch (error) {
addAlert(
t("saveProviderError", {
error: error.response?.data?.errorMessage || error,
}),
AlertVariant.danger
);
}
};
return (
<Modal
className="add-provider-modal"
variant={ModalVariant.medium}
title={t("addProvider")}
isOpen={open}
onClose={handleModalToggle}
actions={[
<Button
data-testid="add-provider-button"
key="confirm"
variant="primary"
type="submit"
form="add-provider"
>
{t("common:Add")}
</Button>,
<Button
id="modal-cancel"
key="cancel"
variant={ButtonVariant.link}
onClick={() => {
handleModalToggle!();
}}
>
{t("common:cancel")}
</Button>,
]}
>
<Form
isHorizontal
id="add-provider"
className="pf-u-mt-lg"
onSubmit={handleSubmit(save!)}
>
<FormGroup
label={t("consoleDisplayName")}
fieldId="kc-console-display-name"
labelIcon={
<HelpItem
helpText="realm-settings-help:displayName"
forLabel={t("loginTheme")}
forID="kc-console-display-name"
/>
}
>
<Controller
name="name"
control={control}
defaultValue={providerType}
render={({ onChange }) => (
<TextInput
aria-label={t("consoleDisplayName")}
defaultValue={providerType}
onChange={(value) => {
onChange(value);
}}
data-testid="display-name-input"
></TextInput>
)}
/>
</FormGroup>
<FormGroup
label={t("common:enabled")}
fieldId="kc-enabled"
labelIcon={
<HelpItem
helpText={t("realm-settings-help:enabled")}
forLabel={t("enabled")}
forID="kc-enabled"
/>
}
>
<Controller
name="config.enabled"
control={control}
defaultValue={["true"]}
render={({ onChange, value }) => (
<Switch
id="kc-enabled"
label={t("common:on")}
labelOff={t("common:off")}
isChecked={value[0] === "true"}
data-testid={
value[0] === "true"
? "internationalization-enabled"
: "internationalization-disabled"
}
onChange={(value) => {
onChange([value + ""]);
}}
/>
)}
/>
</FormGroup>
<FormGroup
label={t("active")}
fieldId="kc-active"
labelIcon={
<HelpItem
helpText="realm-settings-help:active"
forLabel={t("active")}
forID="kc-active"
/>
}
>
<Controller
name="config.active"
control={control}
defaultValue={["true"]}
render={({ onChange, value }) => (
<Switch
id="kc-active"
label={t("common:on")}
labelOff={t("common:off")}
isChecked={value[0] === "true"}
data-testid={
value[0] === "true"
? "internationalization-enabled"
: "internationalization-disabled"
}
onChange={(value) => {
onChange([value + ""]);
}}
/>
)}
/>
</FormGroup>
{providerType === "rsa" && (
<>
<FormGroup
label={t("algorithm")}
fieldId="kc-algorithm"
labelIcon={
<HelpItem
helpText="realm-settings-help:algorithm"
forLabel={t("algorithm")}
forID="kc-algorithm"
/>
}
>
<Controller
name="algorithm"
defaultValue=""
render={({ onChange, value }) => (
<Select
toggleId="kc-rsa-algorithm"
onToggle={() =>
setIsRSAalgDropdownOpen(!isRSAalgDropdownOpen)
}
onSelect={(_, value) => {
onChange(value as string);
setIsRSAalgDropdownOpen(false);
}}
selections={[value + ""]}
variant={SelectVariant.single}
aria-label={t("algorithm")}
isOpen={isRSAalgDropdownOpen}
data-testid="select-rsa-algorithm"
>
{allComponentTypes[4].properties[3].options!.map(
(p, idx) => (
<SelectOption
selected={p === value}
key={`rsa-algorithm-${idx}`}
value={p}
></SelectOption>
)
)}
</Select>
)}
/>
</FormGroup>
<FormGroup
label={t("privateRSAKey")}
fieldId="kc-private-rsa-key"
labelIcon={
<HelpItem
helpText="realm-settings-help:privateRSAKey"
forLabel={t("privateRSAKey")}
forID="kc-rsa-key"
/>
}
>
<Controller
name="config.privateKey"
control={control}
defaultValue={[]}
render={({ onChange, value }) => (
<FileUpload
id="importPrivateKey"
type="text"
value={value[0]}
filenamePlaceholder="Upload a PEM file or paste key below"
filename={keyFileName}
onChange={(value, fileName) => {
setKeyFileName(fileName);
onChange([value]);
}}
/>
)}
/>
</FormGroup>
<FormGroup
label={t("x509Certificate")}
fieldId="kc-aes-keysize"
labelIcon={
<HelpItem
helpText="realm-settings-help:x509Certificate"
forLabel={t("x509Certificate")}
forID="kc-x509-certificatw"
/>
}
>
<Controller
name="config.certificate"
control={control}
defaultValue={[]}
render={({ onChange, value }) => (
<FileUpload
id="importCertificate"
type="text"
value={value[0]}
filenamePlaceholder="Upload a PEM file or paste key below"
filename={certificateFileName}
onChange={(value, fileName) => {
setCertificateFileName(fileName);
onChange([value]);
}}
/>
)}
/>
</FormGroup>
</>
)}
</Form>
</Modal>
);
};