import { Link } from '@mui/material'; import { Utils } from '@pega/react-sdk-components/lib/components/helpers/utils'; export const resolveReferencedPConnect = pConnect => { if (!pConnect || !pConnect.meta) return undefined; const type = pConnect?._type ?? undefined; const referencedPConnect = type === 'reference' && pConnect.getReferencedViewPConnect().getPConnect(); return referencedPConnect || pConnect; }; /** * A helper function to create an object consisting react component as per the type. * This is used by CaseSummary template. * @param {object} pConnectMeta Object containing meta information for the particular field authored * @param {Function} getPConnect PConnect function passed along to other components. * @param {string} displayMode displayMode string contains information about the layout of component in review mode. */ export function prepareComponentInCaseSummary(pConnectMeta: any, getPConnect: Function) { const { config, children } = pConnectMeta; const noValueComponent =
No Value
; const placeholder = '...'; const pConnect = getPConnect(); const caseSummaryComponentObject: any = {}; let { type } = pConnectMeta; let showAddressLabel = true; if (config && config.value === `@P .${Utils.getMappedKey('pyStatusWork')}`) { config.displayAsStatus = true; type = 'TextInput'; // force the type to be TextInput for status field. // As TextInput is loaded forcefully sometimes, TextInput component might not be available in lazy map. // Load TextInput if it is not available. if (!PCore.getComponentsRegistry().getLazyComponent(type)) { PCore.getAssetLoader().getLoader('component-loader')([type]); } } caseSummaryComponentObject.name = pConnect.resolveConfigProps({ label: config.label }).label; if (config.inheritedProps) { const labelInInheritedProp = config.inheritedProps.find(inheritedProp => inheritedProp.prop === 'label'); if (labelInInheritedProp) { labelInInheritedProp.value = pConnect.resolveConfigProps({ label: labelInInheritedProp.value }).label; } } switch (type) { case 'CaseOperator': { if (config.label.includes('Create operator')) { caseSummaryComponentObject.name = pConnect.resolveConfigProps({ createLabel: config.createLabel }).createLabel; } else if (config.label.includes('Update operator')) { caseSummaryComponentObject.name = pConnect.resolveConfigProps({ updateLabel: config.updateLabel }).updateLabel; } else { caseSummaryComponentObject.name = pConnect.resolveConfigProps({ resolveLabel: config.resolveLabel }).resolveLabel; } break; } case 'Checkbox': { caseSummaryComponentObject.name = pConnect.resolveConfigProps({ label: config.caption }).label; break; } case 'Pega_UI_PercentageWidget': { const rawValue = pConnect.resolveConfigProps({ value: config.value }).value; caseSummaryComponentObject.simpleValue = rawValue || rawValue === 0 ? `${rawValue}%` : noValueComponent; break; } case 'Address': { showAddressLabel = false; caseSummaryComponentObject.variant = 'stacked'; break; } case 'Location': case 'RichText': { const rawValue = pConnect.resolveConfigProps({ value: config.value }).value; caseSummaryComponentObject.variant = 'stacked'; caseSummaryComponentObject.simpleValue = rawValue?.length ? rawValue : noValueComponent; break; } case 'TextArea': { const rawValue = pConnect.resolveConfigProps({ value: config.value }).value; if (rawValue?.length > 22) { caseSummaryComponentObject.variant = 'stacked'; } caseSummaryComponentObject.simpleValue = rawValue?.length ? rawValue : noValueComponent; break; } case 'URL': { if (config.displayAs === 'Image') { const rawValue = pConnect.resolveConfigProps({ value: config.value }).value; caseSummaryComponentObject.variant = 'stacked'; caseSummaryComponentObject.simpleValue = rawValue?.length ? {rawValue} : noValueComponent; } break; } case 'reference': { const referencedPConnect = resolveReferencedPConnect(pConnect); const viewType = referencedPConnect?.meta?.config.type; const viewTemplate = referencedPConnect?.meta?.config.template; const isTable = ['multirecordlist'].includes(viewType); const isDataReference = viewTemplate === 'DataReference'; if (isTable || !isDataReference) { caseSummaryComponentObject.variant = 'stacked'; caseSummaryComponentObject.simpleValue = placeholder; } break; } case 'view': { caseSummaryComponentObject.variant = 'stacked'; caseSummaryComponentObject.simpleValue = placeholder; break; } default: break; } const createdComponent = pConnect.createComponent({ type, children: children ? [...children] : [], showAddressLabel, config: { ...config, // Need a unique key for each summary component which helps in creating new component based on visibility // Also a consistent key helps in rerendering summary components instead of remounting key: config } }); createdComponent.props.getPConnect().setInheritedProp('displayMode', 'DISPLAY_ONLY'); createdComponent.props.getPConnect().setInheritedProp('readOnly', true); if (type === 'Address') { createdComponent.props.getPConnect().setInheritedProp('showAddressLabel', showAddressLabel); } // Add field label for reference summary item when not Embedded data if (type === 'reference') { const isEmbeddedData = config.context && config.displayAs === 'Form'; if (!isEmbeddedData) { caseSummaryComponentObject.name = createdComponent.props.getPConnect().getInheritedProps().label; } } caseSummaryComponentObject.value = createdComponent; return caseSummaryComponentObject; } export function resolveReferenceFields( item: { [key: string]: unknown; }, hideFieldLabels: boolean, recordKey: string, pConnect: typeof PConnect ) { const presets: { children?: { children?: { config; type; }; config?; }; } = (pConnect.getRawMetadata()?.config as any).presets ?? []; const presetChildren = presets[0]?.children?.[0]?.children ?? []; const maxFields = 5; return presetChildren.slice(0, maxFields).map((preset, index) => { const fieldMeta = { meta: { ...preset, config: { ...preset.config, displayMode: 'DISPLAY_ONLY', contextName: pConnect.getContextName() } }, useCustomContext: item }; const configObj = PCore.createPConnect(fieldMeta); const meta = configObj.getPConnect().getMetadata(); const fieldInfo: { name?: string; value?: React.ReactNode; } = meta ? prepareComponentInCaseSummary(meta, configObj.getPConnect) : {}; return hideFieldLabels ? { id: `${item[recordKey]} - ${index}`, value: fieldInfo.value } : { id: `${item[recordKey]} - ${index}`, name: fieldInfo.name, value: fieldInfo.value, type: preset.type }; }); }