Enhance ObjectProperty component to support conditional input rendering

- Added `useFormItem` prop to control input rendering behavior.
- Refactored input rendering logic to streamline component structure and improve maintainability.
- Updated various input types to utilize the new `inputProps` for consistent handling of properties.
This commit is contained in:
Tom Butcher 2025-12-28 01:09:02 +00:00
parent aa6fe3c839
commit cefe77bc0e

View File

@ -85,6 +85,7 @@ const ObjectProperty = ({
minimal = false, minimal = false,
previewOpen = false, previewOpen = false,
showPreview = true, showPreview = true,
useFormItem = true,
options = [], options = [],
roundNumber = false, roundNumber = false,
fixedNumber = false, fixedNumber = false,
@ -613,254 +614,218 @@ const ObjectProperty = ({
mergedFormItemProps.onChange = onChange mergedFormItemProps.onChange = onChange
} }
switch (type) { const inputProps = useFormItem
case 'netGross': ? {}
return ( : {
<Form.Item name={formItemName} {...mergedFormItemProps}> value,
onChange,
disabled
}
const renderInput = () => {
switch (type) {
case 'netGross':
return (
<NetGrossInput <NetGrossInput
difference={difference} difference={difference}
prefix={prefix} prefix={prefix}
suffix={suffix} suffix={suffix}
{...inputProps}
/> />
</Form.Item> )
) case 'secret':
case 'secret': return (
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<Input.Password <Input.Password
placeholder={label} placeholder={label}
disabled={disabled}
{...mergedFormItemProps}
iconRender={(visible) => iconRender={(visible) =>
visible ? <EyeSlashIcon /> : <EyeIcon /> visible ? <EyeSlashIcon /> : <EyeIcon />
} }
{...mergedFormItemProps}
{...inputProps}
/> />
</Form.Item> )
) case 'wsprotocol':
case 'wsprotocol': return (
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<Select <Select
defaultValue='ws' defaultValue='ws'
disabled={disabled}
options={[ options={[
{ value: 'ws', label: 'Websocket' }, { value: 'ws', label: 'Websocket' },
{ value: 'wss', label: 'Websocket Secure' } { value: 'wss', label: 'Websocket Secure' }
]} ]}
{...inputProps}
/> />
</Form.Item> )
) case 'select':
case 'select': return (
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<CustomSelect <CustomSelect
placeholder={'Select a ' + label.toLowerCase() + '...'} placeholder={'Select a ' + label.toLowerCase() + '...'}
disabled={disabled}
options={Array.isArray(options) ? options : []} options={Array.isArray(options) ? options : []}
{...inputProps}
/> />
</Form.Item> )
) case 'priceMode':
case 'priceMode': return (
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<Select <Select
defaultValue='margin' defaultValue='margin'
disabled={disabled}
options={[ options={[
{ value: 'margin', label: 'Margin %' }, { value: 'margin', label: 'Margin %' },
{ value: 'amount', label: '£ Amount' } { value: 'amount', label: '£ Amount' }
]} ]}
{...inputProps}
/> />
</Form.Item> )
) case 'bool':
case 'bool': return (
return ( <Switch
<Form.Item {...inputProps}
name={formItemName} {...(useFormItem ? {} : { checked: value })}
{...mergedFormItemProps} />
valuePropName='checked' )
> case 'dateTime':
<Switch disabled={disabled} /> return (
</Form.Item>
)
case 'dateTime':
return (
<Form.Item
name={formItemName}
{...mergedFormItemProps}
getValueProps={(v) => ({ value: v ? dayjs(v) : null })}
>
<DatePicker <DatePicker
showTime showTime
style={{ width: '100%' }} style={{ width: '100%' }}
disabled={disabled} {...inputProps}
{...(useFormItem ? {} : { value: value ? dayjs(value) : null })}
/> />
</Form.Item> )
) case 'country':
case 'country': return <CountrySelect {...inputProps} />
return ( case 'color':
<Form.Item name={formItemName} {...mergedFormItemProps}> return (
<CountrySelect disabled={disabled} /> <ColorSelector
</Form.Item> required={required}
) {...inputProps}
case 'color': {...(useFormItem ? {} : { value })}
return ( />
<Form.Item )
name={formItemName} case 'weight':
{...mergedFormItemProps} return (
valuePropName='value'
getValueFromEvent={(v) => v}
>
<ColorSelector required={required} disabled={disabled} />
</Form.Item>
)
case 'weight':
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<InputNumber <InputNumber
suffix='g' suffix='g'
style={{ width: '100%' }} style={{ width: '100%' }}
placeholder={label} placeholder={label}
disabled={disabled} {...inputProps}
/> />
</Form.Item> )
) case 'number':
case 'number': return (
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<InputNumber <InputNumber
placeholder={label} placeholder={label}
disabled={disabled}
prefix={prefix} prefix={prefix}
suffix={suffix} suffix={suffix}
min={min} min={min}
max={max} max={max}
step={step} step={step}
{...mergedFormItemProps}
style={{ width: '100%' }} style={{ width: '100%' }}
{...inputProps}
/> />
</Form.Item> )
) case 'text':
case 'text': return <Input placeholder={label} {...inputProps} />
return ( case 'codeBlock':
<Form.Item name={formItemName} {...mergedFormItemProps}> return (
<Input
placeholder={label}
{...mergedFormItemProps}
disabled={disabled}
/>
</Form.Item>
)
case 'codeBlock':
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<CodeBlockEditor <CodeBlockEditor
code={value} code={value}
language={language} language={language}
disabled={disabled}
height={height} height={height}
minimal={minimal} minimal={minimal}
{...inputProps}
/> />
</Form.Item> )
) case 'markdown':
case 'markdown': return <MarkdownInput {...inputProps} />
return ( case 'material':
<Form.Item name={formItemName} {...mergedFormItemProps}> return (
<MarkdownInput value={value} />
</Form.Item>
)
case 'material':
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<Select <Select
options={MATERIAL_OPTIONS} options={MATERIAL_OPTIONS}
placeholder={label} placeholder={label}
disabled={disabled} {...inputProps}
/> />
</Form.Item>
)
case 'id':
// id is not editable, just show view mode
if (value) {
return <IdDisplay id={value} type={objectType} {...rest} />
} else {
return (
<Text type='secondary' {...textParams}>
n/a
</Text>
) )
} case 'id':
case 'object': // id is not editable, just show view mode
return ( if (value) {
<Form.Item name={formItemName} {...mergedFormItemProps}> return <IdDisplay id={value} type={objectType} {...rest} />
} else {
return (
<Text type='secondary' {...textParams}>
n/a
</Text>
)
}
case 'object':
return (
<ObjectSelect <ObjectSelect
type={objectType} type={objectType}
disabled={disabled}
masterFilter={masterFilter} masterFilter={masterFilter}
{...inputProps}
/> />
</Form.Item> )
) case 'objectType':
case 'objectType': return (
return ( <ObjectTypeSelect masterFilter={masterFilter} {...inputProps} />
<Form.Item name={formItemName} {...mergedFormItemProps}> )
<ObjectTypeSelect disabled={disabled} masterFilter={masterFilter} /> case 'objectList':
</Form.Item> return <ObjectSelect type={objectType} multiple {...inputProps} />
) case 'tags':
case 'objectList': return <TagsInput {...inputProps} />
return ( case 'file':
<Form.Item name={formItemName} {...mergedFormItemProps}> return (
<ObjectSelect type={objectType} multiple disabled={disabled} />
</Form.Item>
)
case 'tags':
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<TagsInput />
</Form.Item>
)
case 'file':
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<FileUpload <FileUpload
value={value}
multiple={false} multiple={false}
defaultPreviewOpen={previewOpen} defaultPreviewOpen={previewOpen}
showPreview={showPreview} showPreview={showPreview}
showInfo={showHyperlink} showInfo={showHyperlink}
{...inputProps}
/> />
</Form.Item> )
) case 'fileList':
case 'fileList': return (
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<FileUpload <FileUpload
value={value}
multiple={true} multiple={true}
defaultPreviewOpen={previewOpen} defaultPreviewOpen={previewOpen}
showPreview={showPreview} showPreview={showPreview}
showInfo={showHyperlink} showInfo={showHyperlink}
{...inputProps}
/> />
</Form.Item> )
) case 'objectChildren': {
case 'objectChildren': { return (
return ( <ObjectChildTable
<ObjectChildTable properties={properties}
value={value} objectData={objectData}
properties={properties} isEditing={true}
objectData={objectData} rollups={rollups}
isEditing={true} {...inputProps}
formListName={formItemName} />
rollups={rollups} )
/> }
) default:
return <Input placeholder={label} {...inputProps} />
} }
default:
return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<Input placeholder={label} {...mergedFormItemProps} />
</Form.Item>
)
} }
if (!useFormItem) {
return renderInput()
}
return (
<Form.Item
name={formItemName}
{...mergedFormItemProps}
{...(type === 'bool' ? { valuePropName: 'checked' } : {})}
{...(type === 'color'
? { valuePropName: 'value', getValueFromEvent: (v) => v }
: {})}
{...(type === 'dateTime'
? { getValueProps: (v) => ({ value: v ? dayjs(v) : null }) }
: {})}
>
{renderInput()}
</Form.Item>
)
} }
const property = renderProperty() const property = renderProperty()
@ -892,6 +857,7 @@ ObjectProperty.propTypes = {
height: PropTypes.string, height: PropTypes.string,
previewOpen: PropTypes.bool, previewOpen: PropTypes.bool,
showPreview: PropTypes.bool, showPreview: PropTypes.bool,
useFormItem: PropTypes.bool,
showHyperlink: PropTypes.bool, showHyperlink: PropTypes.bool,
options: PropTypes.array, options: PropTypes.array,
showSince: PropTypes.bool, showSince: PropTypes.bool,