import { useEffect, useState, useRef } from 'react'; import { Input, FieldValueList, Text, EmailDisplay, PhoneDisplay, URLDisplay, withConfiguration } from '@pega/cosmos-react-core'; import type { PConnFieldProps } from './PConnProps'; import './create-nonce'; // include in bundle import handleEvent from "./event-utils"; import StatusWorkRenderer from "./StatusWork"; import { suggestionsHandler } from './suggestions-handler'; import StyledPegaDxilMyTextInputWrapper from './styles'; // interface for props interface PegaDxilMyTextInputProps extends PConnFieldProps { // If any, enter additional props that only exist on TextInput here displayAsStatus?: boolean; isTableFormatter?: boolean; hasSuggestions?: boolean; variant?: any; formatter: string; } // interface for StateProps object interface StateProps { value: string; hasSuggestions: boolean; } export const formatExists = (formatterVal: string) => { const formatterValues = [ "TextInput", "WorkStatus", "RichText", "Email", "Phone", "URL", "Operator" ]; let isformatter = false; if (formatterValues.includes(formatterVal)) { isformatter = true; } return isformatter; }; export const textFormatter = (formatter: string, value: string) => { let displayComponent: any = null; switch(formatter){ case "TextInput" : { displayComponent = value; break; } case "Email" : { displayComponent = (); break; } case "Phone" : { displayComponent = (); break; } case "URL" : { displayComponent = (); break; } // no default } return displayComponent; }; // Duplicated runtime code from Constellation Design System Component // props passed in combination of props from property panel (config.json) and run time props from Constellation // any default values in config.pros should be set in defaultProps at bottom of this file function PegaDxilMyTextInput(props: PegaDxilMyTextInputProps) { const { getPConnect, placeholder, validatemessage, label, hideLabel = false, helperText, testId, fieldMetadata = {}, additionalProps = {}, displayMode, displayAsStatus, variant = 'inline', hasSuggestions = false, isTableFormatter = false } = props; const { formatter } = props; const pConn = getPConnect(); const actions = pConn.getActionsApi(); const stateProps = pConn.getStateProps() as StateProps; const propName: string = stateProps.value; const maxLength = fieldMetadata?.maxLength; const hasValueChange = useRef(false); let { value, readOnly = false, required = false, disabled = false } = props; [readOnly, required, disabled] = [readOnly, required, disabled].map( (prop) => prop === true || (typeof prop === 'string' && prop === 'true') ); const [inputValue, setInputValue] = useState(value); const [status, setStatus] = useState(hasSuggestions ? 'pending' : undefined); // cast status let myStatus: 'success' | 'warning' | 'error' | 'pending'; // eslint-disable-next-line prefer-const myStatus = status as 'success' | 'warning' | 'error' | 'pending'; useEffect(() => setInputValue(value), [value]); useEffect(() => { if (validatemessage !== '') { setStatus('error'); } if (hasSuggestions) { setStatus('pending'); } else if (!hasSuggestions && myStatus !== 'success') { setStatus(validatemessage !== '' ? 'error' : undefined); } }, [validatemessage, hasSuggestions, myStatus]); const onResolveSuggestionHandler = (accepted: boolean) => { suggestionsHandler(accepted, pConn, setStatus); }; // Override the value to render as status work when prop passed to display as status if (displayAsStatus) { value = StatusWorkRenderer({ value }); // Fall into this scenario for case summary, default to stacked status if (!displayMode) { return ; } } if (displayMode === 'LABELS_LEFT' || displayMode === 'DISPLAY_ONLY') { let displayComp = value || ; if (isTableFormatter && formatExists(formatter)) { displayComp = textFormatter(formatter, value); } return displayMode === 'DISPLAY_ONLY' ? ( {displayComp} ) : ( ); } if (displayMode === 'STACKED_LARGE_VAL') { const isValDefined = typeof value !== 'undefined' && value !== ''; const val = isValDefined ? ( {value} ) : ( '' ); return ( ); } const handleChange = (event: any) => { if (hasSuggestions) { setStatus(undefined); } setInputValue(event.target.value); if (value !== event.target.value) { handleEvent(actions, 'change', propName, event.target.value); hasValueChange.current = true; } }; const handleBlur = (event: any) => { if ((!value || hasValueChange.current) && !readOnly) { handleEvent(actions, 'blur', propName, event.target.value); if (hasSuggestions) { pConn.ignoreSuggestion(''); } hasValueChange.current = false; } }; return ( ); } export default withConfiguration(PegaDxilMyTextInput);