import React, {FC, lazy, Suspense} from "react"; import {InclusionValueValidatorOptions} from "./cards/InclusionValueValidator"; import {Tab, Tabs, TabsProps} from "./fields/tabs"; import {__, CouponsPlus} from "../globals"; import {FieldItem, FieldRow, FieldType} from "./fields"; import {merge} from "lodash"; import {MultiSelectProps} from "./fields/MultiSelect"; import {PartialDeep} from "type-fest"; import {ComponentMeta} from "./ComponentsMeta"; import {CardType} from "./cards"; import classNames from "classnames"; // Lazy load to break circular dependency const SingleFieldRenderer = lazy(() => import('../Fields').then(module => ({default: module.SingleFieldRenderer})) ); export type InclusionValueValidatorFieldsProps = { type: ComponentMeta['type'], id: ComponentMeta['id'], selectExtraFieldProps?: FieldItem>, InclusionValueValidatorOptions>['fieldProps'], expectedValuesKey: string, selectExtraFieldOptions: Record, supportedComponents?: { inclusionType?: boolean, expectedValues?: boolean, }, //...... options: InclusionValueValidatorOptions, onUpdate?: (data) => void, componentRuntimeData?: unknown } const inclusionTypeTabs: Tab[] = [ { id: 'allowed', label: __('Eligible'), }, { id: 'forbidden', label: __('Not Eligible'), } ] /** * Custom fields for the inclusion value validator because it's a tightly coupled boxed of specific fields with a specific style not obtainable though separate means. */ export const InclusionValueValidatorFields: FC = ({ type,id, selectExtraFieldProps, selectExtraFieldOptions, supportedComponents, options, onUpdate, expectedValuesKey = 'expectedValues', componentRuntimeData }) => { supportedComponents = merge({inclusionType: true, expectedValues: true}, supportedComponents); // Lazy getter function to avoid circular dependency const getComponentMetaData = () => { return CouponsPlus.components[type][id] as CardType; }; const getInclusionTypeField = () => { const componentMetaData = getComponentMetaData(); // @ts-ignore return componentMetaData?.fields?.['inclusionType']?.meta?.extraLabels as PartialDeep<{ allowed: { placeholder: string, aboveList: string }, forbidden: { placeholder: string, aboveList: string } }>; }; const getExcludedSubsetValuesField = () => { const componentMetaData = getComponentMetaData(); return componentMetaData?.fields?.['excludedSubsetValues']?.meta?.extraLabels as PartialDeep<{ allowed: { placeholder: string, aboveList: string }, }>; }; const getSupportsExcludingSubset = () => { const componentMetaData = getComponentMetaData(); const meta = componentMetaData?.fields?.['excludedSubsetValues']?.meta; // @ts-ignore return meta?.supportsExcludingSubset || false; }; return
{supportedComponents.inclusionType && } {supportedComponents.expectedValues &&
}>
{ const inclusionTypeField = getInclusionTypeField(); return merge({ SelectSearchProps: { placeholder: () => { if (options.inclusionType === 'allowed') { return inclusionTypeField?.allowed?.placeholder || __('Search items to include...') } return inclusionTypeField?.forbidden?.placeholder || __('Search items to exclude...') }, }, SelectStateProps: { labels: { above: inclusionTypeField?.[options.inclusionType]?.aboveList }, defaultItemOptions: { beforeLabel(): React.ReactNode { if (options.inclusionType === 'forbidden') { return } return } }, } }, (typeof selectExtraFieldProps === 'function' ? selectExtraFieldProps(options) : selectExtraFieldProps) || {} ); }, fieldOptions: selectExtraFieldOptions } as FieldItem, InclusionValueValidatorOptions> }/>
} }