import { useState, useEffect, useRef } from 'react'; import { TextArea as CosmosTextArea, FieldValueList, ParagraphDisplay, Text, EmailDisplay, PhoneDisplay, URLDisplay, withConfiguration } from '@pega/cosmos-react-core'; import type { PConnFieldProps } from './PConnProps'; import './create-nonce'; // includes in bundle import { suggestionsHandler } from './suggestions-handler'; import handleEvent from "./event-utils"; import StyledPegaDxilMyParagraphWrapper from './styles'; // interface for props interface PegaDxilMyParagraphProps 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: any) => { 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 PegaDxilMyParagraph(props: PegaDxilMyParagraphProps) { const { getPConnect, value, hideLabel = false, placeholder, validatemessage, label, helperText, testId, fieldMetadata = {}, displayMode, additionalProps = {}, variant = 'inline', isTableFormatter = false, hasSuggestions = 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); // BUG-547602: Temporary type coercion for 8.5 until DXAPIs are enhanced to pass original pxViewMetadata JSON, respecting boolean primitives let { 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); useEffect(() => setInputValue(value), [value]); useEffect(() => { if (validatemessage !== '') { setStatus('error'); } if (hasSuggestions) { setStatus('pending'); } else if (!hasSuggestions && status !== 'success') { setStatus(validatemessage !== '' ? 'error' : undefined); } }, [validatemessage, hasSuggestions, status]); if (displayMode === 'LABELS_LEFT' || displayMode === 'DISPLAY_ONLY') { let displayComp = ; if (isTableFormatter && formatExists(formatter) && formatter !== 'TextInput') { 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 onResolveSuggestionHandler = (accepted: boolean) => { suggestionsHandler(accepted, pConn, setStatus); }; return ( { if (hasSuggestions) { setStatus(''); } setInputValue(event.target.value); if (value !== event.target.value) { // @ts-ignore handleEvent(actions, 'change', propName, event.target.value); hasValueChange.current = true; } }} onBlur={(event: any) => { if (!value || hasValueChange.current) { // @ts-ignore handleEvent(actions, 'blur', propName, event.target.value); if (hasSuggestions) { pConn.ignoreSuggestion(''); } hasValueChange.current = false; } }} onResolveSuggestion={onResolveSuggestionHandler} /> ); } export default withConfiguration(PegaDxilMyParagraph);