diff --git a/js/apps/admin-ui/cypress/e2e/identity_providers_test.spec.ts b/js/apps/admin-ui/cypress/e2e/identity_providers_test.spec.ts index 5662d0f1da7..34538723f9a 100644 --- a/js/apps/admin-ui/cypress/e2e/identity_providers_test.spec.ts +++ b/js/apps/admin-ui/cypress/e2e/identity_providers_test.spec.ts @@ -124,8 +124,10 @@ describe("Identity provider test", () => { } const instance = getSocialIdpClassInstance($idp.testName); instance - .typeDisplayOrder("0") - .clickAdd() + .typeClientId("1") + .typeClientId("") + .typeClientSecret("1") + .typeClientSecret("") .assertRequiredFieldsErrorsExist() .fillData($idp.testName) .clickAdd() @@ -139,10 +141,7 @@ describe("Identity provider test", () => { createProviderPage.checkGitHubCardVisible().clickGitHubCard(); createProviderPage.checkAddButtonDisabled(); - createProviderPage - .fill(identityProviderName) - .clickAdd() - .checkClientIdRequiredMessage(true); + createProviderPage.fill(identityProviderName).checkAddButtonDisabled(); createProviderPage.fill(identityProviderName, "123").clickAdd(); masthead.checkNotificationMessage(createSuccessMsg, true); @@ -298,9 +297,8 @@ describe("Identity provider test", () => { createProviderPage.checkAddButtonDisabled(); createProviderPage .fill(identityProviderName) - .clickAdd() - .checkClientIdRequiredMessage(true); - createProviderPage.fill(identityProviderName, "123").clickAdd(); + .fill(identityProviderName, "123") + .clickAdd(); masthead.checkNotificationMessage(createSuccessMsg, true); sidebarPage.goToIdentityProviders(); diff --git a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/identity_providers/CreateProviderPage.ts b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/identity_providers/CreateProviderPage.ts index fd81a94f0ce..f56ff2b67a7 100644 --- a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/identity_providers/CreateProviderPage.ts +++ b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/identity_providers/CreateProviderPage.ts @@ -1,8 +1,8 @@ export default class CreateProviderPage { #github = "github"; #clientIdField = "clientId"; - #clientIdError = "#kc-client-secret-helper"; - #clientSecretField = "clientSecret"; + #clientIdError = "#config\\.clientSecret-helper"; + #clientSecretField = "config.clientSecret"; #displayName = "displayName"; #discoveryEndpoint = "discoveryEndpoint"; #authorizationUrl = "config.authorizationUrl"; diff --git a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/identity_providers/ProviderBaseGeneralSettingsPage.ts b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/identity_providers/ProviderBaseGeneralSettingsPage.ts index 8839d7e52a6..0ff04cac379 100644 --- a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/identity_providers/ProviderBaseGeneralSettingsPage.ts +++ b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/identity_providers/ProviderBaseGeneralSettingsPage.ts @@ -6,7 +6,7 @@ const masthead = new Masthead(); export default class ProviderBaseGeneralSettingsPage extends PageObject { #redirectUriGroup = ".pf-c-clipboard-copy__group"; protected clientIdInput = "#kc-client-id"; - protected clientSecretInput = "#kc-client-secret"; + protected clientSecretInput = "config.clientSecret"; #displayOrderInput = "#kc-display-order"; #addBtn = "createProvider"; #cancelBtn = "cancel"; @@ -22,12 +22,20 @@ export default class ProviderBaseGeneralSettingsPage extends PageObject { }; public typeClientId(clientId: string) { - cy.get(this.clientIdInput).type(clientId).blur(); + if (clientId) { + cy.get(this.clientIdInput).type(clientId); + } else { + cy.get(this.clientIdInput).clear(); + } return this; } public typeClientSecret(clientSecret: string) { - cy.get(this.clientSecretInput).type(clientSecret).blur(); + if (clientSecret) { + cy.findByTestId(this.clientSecretInput).type(clientSecret); + } else { + cy.findByTestId(this.clientSecretInput).clear(); + } return this; } @@ -38,7 +46,7 @@ export default class ProviderBaseGeneralSettingsPage extends PageObject { } public clickShowPassword() { - cy.get(this.clientSecretInput).parent().find("button").click(); + cy.findByTestId(this.clientSecretInput).parent().find("button").click(); return this; } @@ -68,12 +76,12 @@ export default class ProviderBaseGeneralSettingsPage extends PageObject { } public assertClientSecretInputEqual(text: string) { - cy.get(this.clientSecretInput).should("have.text", text); + cy.findByTestId(this.clientSecretInput).should("have.text", text); return this; } public assertDisplayOrderInputEqual(text: string) { - cy.get(this.clientSecretInput).should("have.text", text); + cy.findByTestId(this.clientSecretInput).should("have.text", text); return this; } @@ -124,7 +132,7 @@ export default class ProviderBaseGeneralSettingsPage extends PageObject { "have.value", this.testData["ClientId"] + idpName, ); - cy.get(this.clientSecretInput).should("contain.value", "****"); + cy.findByTestId(this.clientSecretInput).should("contain.value", "****"); cy.get(this.#displayOrderInput).should( "have.value", this.testData["DisplayOrder"], diff --git a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/providers/ProviderPage.ts b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/providers/ProviderPage.ts index 369c90234c5..f7a779edf3d 100644 --- a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/providers/ProviderPage.ts +++ b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/providers/ProviderPage.ts @@ -18,7 +18,7 @@ export default class ProviderPage { bindTypeInput = "#kc-bind-type"; #bindTypeList = "#kc-bind-type + ul"; bindDnInput = "config.bindDn.0"; - bindCredsInput = "ldap-bind-credentials"; + bindCredsInput = "config.bindCredential.0"; #testConnectionBtn = "test-connection-button"; #testAuthBtn = "test-auth-button"; diff --git a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/realm_settings/RealmSettingsPage.ts b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/realm_settings/RealmSettingsPage.ts index 560536a1926..404a8ed0ecf 100644 --- a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/realm_settings/RealmSettingsPage.ts +++ b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/realm_settings/RealmSettingsPage.ts @@ -222,7 +222,7 @@ export default class RealmSettingsPage extends CommonPage { #eventListenersSaveBtn = "saveEventListenerBtn"; #eventListenersRevertBtn = "revertEventListenerBtn"; #eventListenersInputFld = ".pf-c-form-control.pf-c-select__toggle-typeahead"; - #eventListenersDrpDwnOption = ".pf-c-select__menu-item"; + #eventListenersDrpDwnOption = ".pf-c-select__menu"; #eventListenersDrwDwnSelect = ".pf-c-button.pf-c-select__toggle-button.pf-m-plain"; #eventListenerRemove = '[data-ouia-component-id="Remove"]'; diff --git a/js/apps/admin-ui/src/clients/credentials/ClientSecret.tsx b/js/apps/admin-ui/src/clients/credentials/ClientSecret.tsx index 1d3b8ed1f33..be7d01ad3f5 100644 --- a/js/apps/admin-ui/src/clients/credentials/ClientSecret.tsx +++ b/js/apps/admin-ui/src/clients/credentials/ClientSecret.tsx @@ -10,11 +10,10 @@ import { import { useState } from "react"; import { useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; - +import { PasswordInput } from "ui-shared"; import { adminClient } from "../../admin-client"; import { useAlerts } from "../../components/alert/Alerts"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; -import { PasswordInput } from "../../components/password-input/PasswordInput"; import { useAccess } from "../../context/access/Access"; import useFormatDate from "../../utils/useFormatDate"; import { CopyToClipboardButton } from "../scopes/CopyToClipboardButton"; diff --git a/js/apps/admin-ui/src/clients/keys/StoreSettings.tsx b/js/apps/admin-ui/src/clients/keys/StoreSettings.tsx index 2e2dae2ed92..d4eeda0d472 100644 --- a/js/apps/admin-ui/src/clients/keys/StoreSettings.tsx +++ b/js/apps/admin-ui/src/clients/keys/StoreSettings.tsx @@ -1,9 +1,5 @@ -import type KeyStoreConfig from "@keycloak/keycloak-admin-client/lib/defs/keystoreConfig"; -import { FormGroup } from "@patternfly/react-core"; -import { useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; -import { HelpItem, TextControl } from "ui-shared"; -import { PasswordInput } from "../../components/password-input/PasswordInput"; +import { PasswordControl, TextControl } from "ui-shared"; export const StoreSettings = ({ hidePassword = false, @@ -13,10 +9,6 @@ export const StoreSettings = ({ isSaml?: boolean; }) => { const { t } = useTranslation(); - const { - register, - formState: { errors }, - } = useFormContext(); return ( <> @@ -29,26 +21,14 @@ export const StoreSettings = ({ }} /> {!hidePassword && ( - - } - helperTextInvalid={t("required")} - validated={errors.keyPassword ? "error" : "default"} - > - - + labelIcon={t("keyPasswordHelp")} + rules={{ + required: t("required"), + }} + /> )} {isSaml && ( )} - - } - helperTextInvalid={t("required")} - validated={errors.storePassword ? "error" : "default"} - > - - + labelIcon={t("storePasswordHelp")} + rules={{ + required: t("required"), + }} + /> ); }; diff --git a/js/apps/admin-ui/src/components/dynamic/PasswordComponent.tsx b/js/apps/admin-ui/src/components/dynamic/PasswordComponent.tsx index 96d7cfbb701..3f0de1b9aec 100644 --- a/js/apps/admin-ui/src/components/dynamic/PasswordComponent.tsx +++ b/js/apps/admin-ui/src/components/dynamic/PasswordComponent.tsx @@ -1,11 +1,7 @@ -import { FormGroup } from "@patternfly/react-core"; -import { useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; - -import { HelpItem } from "ui-shared"; -import { PasswordInput } from "../password-input/PasswordInput"; -import type { ComponentProps } from "./components"; +import { PasswordControl } from "ui-shared"; import { convertToName } from "./DynamicComponents"; +import type { ComponentProps } from "./components"; export const PasswordComponent = ({ name, @@ -16,22 +12,17 @@ export const PasswordComponent = ({ isDisabled = false, }: ComponentProps) => { const { t } = useTranslation(); - const { register } = useFormContext(); return ( - } - fieldId={name!} - isRequired={required} - > - - + labelIcon={t(helpText!)} + isDisabled={isDisabled} + defaultValue={defaultValue?.toString()} + rules={{ + required: { value: !!required, message: t("required") }, + }} + /> ); }; diff --git a/js/apps/admin-ui/src/identity-providers/add/AddIdentityProvider.tsx b/js/apps/admin-ui/src/identity-providers/add/AddIdentityProvider.tsx index 4ed6a87bce9..f3c217c08f1 100644 --- a/js/apps/admin-ui/src/identity-providers/add/AddIdentityProvider.tsx +++ b/js/apps/admin-ui/src/identity-providers/add/AddIdentityProvider.tsx @@ -26,7 +26,7 @@ import { GeneralSettings } from "./GeneralSettings"; export default function AddIdentityProvider() { const { t } = useTranslation(); const { providerId } = useParams(); - const form = useForm(); + const form = useForm({ mode: "onChange" }); const serverInfo = useServerInfo(); const providerInfo = useMemo(() => { @@ -48,7 +48,7 @@ export default function AddIdentityProvider() { const { handleSubmit, - formState: { isDirty }, + formState: { isValid }, } = form; const { addAlert, addError } = useAlerts(); @@ -100,7 +100,7 @@ export default function AddIdentityProvider() {