/* eslint-disable */ // @ts-nocheck import type { UserProfileConfig } from "@keycloak/keycloak-admin-client/lib/defs/userProfileMetadata"; import { KeycloakSelect, label, SelectVariant, useAlerts, } from "../../../shared/keycloak-ui-shared"; import { ActionGroup, Alert, AlertVariant, Button, ButtonVariant, Checkbox, InputGroup, InputGroupItem, SelectOption, Text, TextContent, TextInput, TextVariants, } from "../../../shared/@patternfly/react-core"; import { CheckIcon } from "../../../shared/@patternfly/react-icons"; import { ReactNode, useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Form } from "react-router-dom"; import { UserAttribute, UserFilter } from "./UserDataTable"; type UserDataTableAttributeSearchFormProps = { activeFilters: UserFilter; setActiveFilters: (filters: UserFilter) => void; profile: UserProfileConfig; createAttributeSearchChips: () => ReactNode; searchUserWithAttributes: () => void; clearAllFilters: () => void; }; type UserFilterForm = UserAttribute & { exact: boolean }; export function UserDataTableAttributeSearchForm({ activeFilters, setActiveFilters, profile, createAttributeSearchChips, searchUserWithAttributes, clearAllFilters, }: UserDataTableAttributeSearchFormProps) { const { t } = useTranslation(); const { addAlert } = useAlerts(); const [selectAttributeKeyOpen, setSelectAttributeKeyOpen] = useState(false); const defaultValues: UserAttribute = { name: "", displayName: "", value: "", }; const { getValues, register, reset, formState: { errors }, setValue, setError, clearErrors, } = useForm({ mode: "onChange", defaultValues, }); const isAttributeKeyDuplicate = () => { return activeFilters.userAttribute.some( (filter) => filter.name === getValues().name, ); }; const isAttributeNameValid = () => { let valid = false; if (!getValues().name.length) { setError("name", { type: "empty", message: t("searchUserByAttributeMissingKeyError"), }); } else if ( activeFilters.userAttribute.some( (filter) => filter.name === getValues().name, ) ) { setError("name", { type: "conflict", message: t("searchUserByAttributeKeyAlreadyInUseError"), }); } else { valid = true; } return valid; }; const isAttributeValueValid = () => { let valid = false; if (!getValues().value.length) { setError("value", { type: "empty", message: t("searchUserByAttributeMissingValueError"), }); } else { valid = true; } return valid; }; const isAttributeValid = () => isAttributeNameValid() && isAttributeValueValid(); const addToFilter = () => { if (isAttributeValid()) { setActiveFilters({ ...activeFilters, userAttribute: [...activeFilters.userAttribute, { ...getValues() }], }); reset(defaultValues); } else { if (errors.name?.message) { addAlert(errors.name.message, AlertVariant.danger); } if (errors.value?.message) { addAlert(errors.value.message, AlertVariant.danger); } } }; const clearActiveFilters = () => { const filtered = [...activeFilters.userAttribute].filter( (chip) => chip.name !== chip.name, ); setActiveFilters({ ...activeFilters, userAttribute: filtered }); clearAllFilters(); }; const createAttributeKeyInputField = () => { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- may be undefined at runtime despite the type if (profile) { return ( setSelectAttributeKeyOpen(isOpen)} selections={getValues().displayName} onSelect={(selectedValue) => { setValue("displayName", selectedValue.toString()); if (isAttributeKeyDuplicate()) { setError("name", { type: "conflict" }); } else { clearErrors("name"); } }} isOpen={selectAttributeKeyOpen} placeholderText={t("selectAttribute")} validated={errors.name && "error"} maxHeight={300} {...register("displayName", { required: true, validate: isAttributeNameValid, })} > {profile.attributes?.map((option) => ( { e.stopPropagation(); setSelectAttributeKeyOpen(false); setValue("name", option.name!); }} > {label(t, option.displayName!, option.name)} ))} ); } else { return ( e.key === "Enter" && addToFilter()} {...register("name", { required: true, validate: isAttributeNameValid, })} /> ); } }; return (
{t("selectAttributes")}
{t("key")}
{t("value")}
{createAttributeKeyInputField()}
{ if (e.key === "Enter") { e.preventDefault(); addToFilter(); } }} {...register("value", { required: true, validate: isAttributeValueValid, })} />
{createAttributeSearchChips()}
{ setActiveFilters({ ...activeFilters, exact: value, }); }} />
); }