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,171 +614,135 @@ const ObjectProperty = ({
mergedFormItemProps.onChange = onChange mergedFormItemProps.onChange = onChange
} }
const inputProps = useFormItem
? {}
: {
value,
onChange,
disabled
}
const renderInput = () => {
switch (type) { switch (type) {
case 'netGross': case 'netGross':
return ( return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<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 (
<Form.Item <Switch
name={formItemName} {...inputProps}
{...mergedFormItemProps} {...(useFormItem ? {} : { checked: value })}
valuePropName='checked' />
>
<Switch disabled={disabled} />
</Form.Item>
) )
case 'dateTime': case 'dateTime':
return ( 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 ( return <CountrySelect {...inputProps} />
<Form.Item name={formItemName} {...mergedFormItemProps}>
<CountrySelect disabled={disabled} />
</Form.Item>
)
case 'color': case 'color':
return ( return (
<Form.Item <ColorSelector
name={formItemName} required={required}
{...mergedFormItemProps} {...inputProps}
valuePropName='value' {...(useFormItem ? {} : { value })}
getValueFromEvent={(v) => v} />
>
<ColorSelector required={required} disabled={disabled} />
</Form.Item>
) )
case 'weight': case 'weight':
return ( 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 ( return <Input placeholder={label} {...inputProps} />
<Form.Item name={formItemName} {...mergedFormItemProps}>
<Input
placeholder={label}
{...mergedFormItemProps}
disabled={disabled}
/>
</Form.Item>
)
case 'codeBlock': case 'codeBlock':
return ( 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 ( return <MarkdownInput {...inputProps} />
<Form.Item name={formItemName} {...mergedFormItemProps}>
<MarkdownInput value={value} />
</Form.Item>
)
case 'material': case 'material':
return ( 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': case 'id':
// id is not editable, just show view mode // id is not editable, just show view mode
@ -792,76 +757,76 @@ const ObjectProperty = ({
} }
case 'object': case 'object':
return ( return (
<Form.Item name={formItemName} {...mergedFormItemProps}>
<ObjectSelect <ObjectSelect
type={objectType} type={objectType}
disabled={disabled}
masterFilter={masterFilter} masterFilter={masterFilter}
{...inputProps}
/> />
</Form.Item>
) )
case 'objectType': case 'objectType':
return ( return (
<Form.Item name={formItemName} {...mergedFormItemProps}> <ObjectTypeSelect masterFilter={masterFilter} {...inputProps} />
<ObjectTypeSelect disabled={disabled} masterFilter={masterFilter} />
</Form.Item>
) )
case 'objectList': case 'objectList':
return ( return <ObjectSelect type={objectType} multiple {...inputProps} />
<Form.Item name={formItemName} {...mergedFormItemProps}>
<ObjectSelect type={objectType} multiple disabled={disabled} />
</Form.Item>
)
case 'tags': case 'tags':
return ( return <TagsInput {...inputProps} />
<Form.Item name={formItemName} {...mergedFormItemProps}>
<TagsInput />
</Form.Item>
)
case 'file': case 'file':
return ( 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
value={value}
properties={properties} properties={properties}
objectData={objectData} objectData={objectData}
isEditing={true} isEditing={true}
formListName={formItemName}
rollups={rollups} rollups={rollups}
{...inputProps}
/> />
) )
} }
default: default:
return <Input placeholder={label} {...inputProps} />
}
}
if (!useFormItem) {
return renderInput()
}
return ( return (
<Form.Item name={formItemName} {...mergedFormItemProps}> <Form.Item
<Input placeholder={label} {...mergedFormItemProps} /> 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> </Form.Item>
) )
} }
}
const property = renderProperty() const property = renderProperty()
// Render the property directly (remove useDescriptions functionality) // Render the property directly (remove useDescriptions functionality)
@ -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,