/** * Copyright (c) 2019, WSO2 LLC. (https://www.wso2.com). * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except * in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import classNames from "classnames"; import React, { ReactElement } from "react"; // eslint-disable-next-line no-restricted-imports import { Button, Divider, Form, Icon, Popup, Radio } from "semantic-ui-react"; import { MetaFilePicker } from "./meta-file-picker"; import { Password } from "./password"; import { QueryParameters } from "./query-parameters"; import { Scopes } from "./scopes"; import { isButtonField, isCheckBoxField, isCustomField, isDivider, isDropdownField, isFilePickerField, isPasswordField, isQueryParamsField, isRadioField, isResetField, isScopesField, isSubmitField, isTextField, isToggleField } from "../helpers"; import { FormField, FormValue, RadioChild } from "../models"; import { filterPassedProps } from "../utils"; /** * The enter key. */ const ENTER_KEY = "Enter"; /** * prop types for the Field component */ interface InnerFieldPropsInterface { passedProps: any; formProps: { checkError: (inputField: FormField) => { isError: boolean; errorMessages: string[] }; handleBlur: (event: React.KeyboardEvent, name: string) => void; handleChange: (value: string, name: string) => void; handleToggle: (name: string) => void; handleChangeCheckBox: (value: string, name: string) => void; handleReset: (event: React.MouseEvent) => void; form: Map; }; } /** * This produces a InnerField component. * * @param props - The props for the InnerField component. */ export const InnerField = React.forwardRef((props: InnerFieldPropsInterface, ref: React.Ref): JSX.Element => { const { passedProps, formProps } = props; const formField: FormField = { ...passedProps }; const filteredProps = filterPassedProps({ ...passedProps }); const { checkError, handleBlur, handleChange, handleToggle, handleChangeCheckBox, handleReset, form } = formProps; const formFieldClasses = classNames({ hidden: formField.hidden, [ "read-only" ]: formField.readOnly }, formField.className); /** * Generates a semantic Form element. * * @param inputField - The input field to be generated to a semantic Form element. */ const formFieldGenerator = (inputField: FormField): JSX.Element => { const { isError, errorMessages } = checkError(inputField); if (isTextField(inputField)) { if (isPasswordField(inputField)) { return ( { return

{ errorMessage }

; }) } : false } type={ inputField.type } placeholder={ inputField.placeholder } name={ inputField.name } value={ (form.get(inputField.name) as string) || "" } onBlur={ (event: React.KeyboardEvent) => { handleBlur(event, inputField.name); } } onChange={ (event: React.ChangeEvent) => { handleChange(event.currentTarget.value, inputField.name); } } showPassword={ inputField.showPassword } hidePassword={ inputField.hidePassword } autoFocus={ inputField.autoFocus || false } readOnly={ inputField.readOnly } disabled={ inputField.disabled } required={ inputField.label ? inputField.required : false } onKeyPress={ (event: React.KeyboardEvent) => { event.key === ENTER_KEY && handleBlur(event, inputField.name); } } /> ); } else if (inputField.type === "textarea") { return ( { return

{ errorMessage }

; }) } : false } type={ inputField.type } placeholder={ inputField.placeholder } name={ inputField.name } value={ form.get(inputField.name)?.toString() || "" } onBlur={ (event: React.KeyboardEvent) => { handleBlur(event, inputField.name); } } onChange={ (event: React.ChangeEvent) => { handleChange(event.target.value, inputField.name); } } autoFocus={ inputField.autoFocus || false } readOnly={ inputField.readOnly } disabled={ inputField.disabled } required={ inputField.label ? inputField.required : false } onKeyPress={ (event: React.KeyboardEvent) => { event.key === ENTER_KEY && handleBlur(event, inputField.name); } } /> ); } else { return ( { return

{ errorMessage }

; }) } : false } type={ inputField.type } placeholder={ inputField.placeholder } name={ inputField.name } value={ form.get(inputField.name) || "" } onBlur={ (event: React.KeyboardEvent) => { handleBlur(event, inputField.name); } } onChange={ (event: React.ChangeEvent) => { handleChange(event.target.value, inputField.name); } } autoFocus={ inputField.autoFocus || false } readOnly={ inputField.readOnly } disabled={ inputField.disabled } required={ inputField.label ? inputField.required : false } onKeyPress={ (event: React.KeyboardEvent) => { event.key === ENTER_KEY && handleBlur(event, inputField.name); } } onKeyDown={ inputField.type === "number" ? ((event: React.KeyboardEvent) => { const isNumber = /^[0-9]$/i.test(event.key); const isAllowed = ((event.key === "a" || event.key === "v" || event.key === "c" || event.key === "x") && (event.ctrlKey === true || event.metaKey === true)) || (event.key === "ArrowRight" || event.key == "ArrowLeft") || (event.key === "Delete" || event.key === "Backspace"); !isNumber && !isAllowed && event.preventDefault(); }) : (): void => { return; } } onPaste={ inputField.type === "number" ? ((event: React.ClipboardEvent) => { const data = event.clipboardData.getData("Text") ; const isNumber = /^[0-9]+$/i.test(data); !isNumber && event.preventDefault(); }) : (): void => { return; } } /> ); } } else if (isRadioField(inputField)) { return ( { inputField.label !== "" ? : null } { inputField.hint && } { inputField.children.map((radio: RadioChild, index: number) => { const { hint, label, value, ...rest } = radio; const field = ( , { value }) => { if (inputField?.onBefore && !inputField.onBefore(event, value)) { return; } handleChange(value.toString(), inputField.name); } } onBlur={ (event: React.KeyboardEvent) => { handleBlur(event, inputField.name); } } autoFocus={ inputField.autoFocus || false } readOnly={ inputField.readOnly } disabled={ inputField.disabled } onKeyPress={ (event: React.KeyboardEvent) => { event.key === ENTER_KEY && handleBlur(event, inputField.name); } } { ...rest } /> ); if (hint && hint.content) { return ( } /> ); } else { return field; } }) } ); } else if (isDropdownField(inputField)) { return ( , { value }) => { handleChange(value.toString(), inputField.name); } } onBlur={ (event: React.KeyboardEvent) => { handleBlur(event, inputField.name); } } error={ isError ? { content: errorMessages.map((errorMessage: string, index: number) => { return

{ errorMessage }

; }) } : false } autoFocus={ inputField.autoFocus || false } disabled={ inputField.disabled } required={ inputField.label ? inputField.required : false } onKeyPress={ (event: React.KeyboardEvent) => { event.key === ENTER_KEY && handleBlur(event, inputField.name); } } /> ); } else if (isCheckBoxField(inputField)) { return ( { inputField.label && inputField.required ? (
) : (
) } { inputField.hint && } { inputField.children.map((checkbox, index) => { const field = ( , { value }) => { handleChangeCheckBox(value.toString(), inputField.name); } } onBlur={ (event: React.KeyboardEvent) => { handleBlur(event, inputField.name); } } error={ index === 0 ? isError ? { content: errorMessages.map( (errorMessage: string, indexError: number) => { return

{ errorMessage }

; } ), pointing: "left" } : false : isError } autoFocus={ inputField.autoFocus || false } readOnly={ inputField.readOnly || checkbox.readOnly } disabled={ checkbox.disabled ?? inputField.disabled } defaultChecked={ inputField.defaultChecked } onKeyPress={ (event: React.KeyboardEvent) => { event.key === ENTER_KEY && handleBlur(event, inputField.name); } } />
); if (checkbox.hint && checkbox.hint.content) { return ( } /> ); } else { return field; } }) }
); } else if (isScopesField(inputField)) { return ( { handleBlur(event, inputField.name); } } onChange={ (event: React.ChangeEvent) => { handleChange(event.target.value, inputField.name); } } /> ); } else if (isQueryParamsField(inputField)) { return ( ) => { handleChange(event.target.value, inputField.name); } } /> ); } else if (isFilePickerField(inputField)) { return ( ) => { handleChange(event.target.value, inputField.name); } } /> ); } else if (isToggleField(inputField)) { return ( { handleToggle(inputField.name); } } onBlur={ (event: React.KeyboardEvent) => { handleBlur(event, inputField.name); } } error={ isError ? { content: errorMessages.map( (errorMessage: string, indexError: number) => { return

{ errorMessage }

; } ), pointing: "left" } : false } autoFocus={ inputField.autoFocus || false } readOnly={ inputField.readOnly } disabled={ inputField.disabled } defaultChecked={ inputField.defaultChecked } onKeyPress={ (event: React.KeyboardEvent) => { event.key === ENTER_KEY && handleBlur(event, inputField.name); } } /> ); } else if (isSubmitField(inputField)) { return ( ); } else if (isResetField(inputField)) { return ( ); } else if (isButtonField(inputField)) { return ( ); } else if (isDivider(inputField)) { return