import { useRef } from 'react';
import { buildMetaForListView, getContext } from '@pega/react-sdk-components/lib/components/helpers/simpleTableHelpers';
import { getComponentFromMap } from '@pega/react-sdk-components/lib/bridge/helpers/sdk_component_map';
import type { PConnProps } from '@pega/react-sdk-components/lib/types/PConnProps';
// Can't use SimpleTableProps until getComponentConfig() and getFieldMetadata() are NOT private
interface SimpleTableProps extends PConnProps {
// If any, enter additional props that only exist on this component
multiRecordDisplayAs: string;
allowTableEdit: boolean;
contextClass: any;
label: string;
propertyLabel?: string;
displayMode?: string;
fieldMetadata?: any;
hideLabel?: boolean;
parameters?: any;
isDataObject?: boolean;
type?: string;
ruleClass?: string;
authorContext?: string;
name?: string;
}
export default function SimpleTable(props: SimpleTableProps) {
// Get emitted components from map (so we can get any override that may exist)
const ListView = getComponentFromMap('ListView');
const FieldGroupTemplate = getComponentFromMap('FieldGroupTemplate');
const SimpleTableManual = getComponentFromMap('SimpleTableManual');
const {
getPConnect,
multiRecordDisplayAs,
allowTableEdit,
label: labelProp,
propertyLabel,
displayMode,
fieldMetadata,
hideLabel,
parameters,
isDataObject,
type,
ruleClass,
authorContext,
name
} = props;
let { contextClass } = props;
if (!contextClass) {
let listName = getPConnect().getComponentConfig().referenceList;
listName = PCore.getAnnotationUtils().getPropertyName(listName);
// was... contextClass = getPConnect().getFieldMetadata(listName)?.pageClass;
const theFieldMetadata = getPConnect().getFieldMetadata(listName);
if (theFieldMetadata) {
contextClass = theFieldMetadata.pageClass;
} else {
contextClass = undefined;
}
}
if (multiRecordDisplayAs === 'fieldGroup') {
const fieldGroupProps = { ...props, contextClass };
return ;
}
const label = labelProp || propertyLabel;
const propsToUse = { label, ...getPConnect().getInheritedProps() };
const isDisplayModeEnabled = displayMode === 'DISPLAY_ONLY';
if (fieldMetadata && fieldMetadata.type === 'Page List' && fieldMetadata.dataRetrievalType === 'refer') {
const {
children: [{ children: rawFields }],
parameters: rawParams
} = (getPConnect().getRawMetadata() as any).config;
if (isDisplayModeEnabled && hideLabel) {
propsToUse.label = '';
}
const metaForListView = buildMetaForListView(
fieldMetadata,
rawFields,
type,
ruleClass,
name,
propsToUse.label,
isDataObject,
parameters // resolved params
);
const metaForPConnect = JSON.parse(JSON.stringify(metaForListView));
// @ts-expect-error - PCore.getMetadataUtils().getPropertyMetadata - An argument for 'currentClassID' was not provided.
metaForPConnect.config.parameters = rawParams ?? PCore.getMetadataUtils().getPropertyMetadata(name)?.datasource?.parameters;
const { referenceListStr: referenceList } = getContext(getPConnect());
let requiredContextForQueryInDisplayMode = {};
if (isDisplayModeEnabled) {
requiredContextForQueryInDisplayMode = {
referenceList
};
}
const options = {
context: getPConnect().getContextName(),
pageReference: getPConnect().getPageReference(),
...requiredContextForQueryInDisplayMode
};
const refToPConnect = useRef(PCore.createPConnect({ meta: metaForPConnect, options }).getPConnect).current; // getPConnect should be created only once.
/* BUG-637178 : need to send context */
const listViewProps = {
...metaForListView.config,
getPConnect: refToPConnect,
displayMode,
fieldName: authorContext,
bInForm: true
};
return ;
}
const simpleTableManualProps: any = { ...props, contextClass };
if (allowTableEdit === false) {
simpleTableManualProps.hideAddRow = true;
simpleTableManualProps.hideDeleteRow = true;
simpleTableManualProps.disableDragDrop = true;
}
return ;
}