import React from 'react'
import PropTypes from 'prop-types'
import {
Typography,
Badge,
Input,
InputNumber,
Form,
Select,
DatePicker,
Switch
} from 'antd'
import VendorSelect from './VendorSelect'
import FilamentSelect from './FilamentSelect'
import IdDisplay from './IdDisplay'
import TimeDisplay from './TimeDisplay'
import dayjs from 'dayjs'
import PrinterSelect from './PrinterSelect'
import GCodeFileSelect from './GCodeFileSelect'
import PartSelect from './PartSelect'
import EmailDisplay from '../../Icons/EmailDisplay'
import UrlDisplay from '../../Icons/UrlDisplay'
import CountryDisplay from './CountryDisplay'
import CountrySelect from './CountrySelect'
import TagsDisplay from './TagsDisplay'
import TagsInput from './TagsInput'
import BoolDisplay from './BoolDisplay'
import PrinterState from './PrinterState'
import SubJobState from './SubJobState'
import JobState from './JobState'
import ColorSelector from './ColorSelector'
import SecretDisplay from './SecretDisplay'
import EyeIcon from '../../Icons/EyeIcon'
import EyeSlashIcon from '../../Icons/EyeSlashIcon'
const { Text } = Typography
const MATERIAL_OPTIONS = [
{ value: 'PLA', label: 'PLA' },
{ value: 'PETG', label: 'PETG' },
{ value: 'ABS', label: 'ABS' },
{ value: 'ASA', label: 'ASA' },
{ value: 'HIPS', label: 'HIPS' },
{ value: 'TPU', label: 'TPU' }
]
const ObjectProperty = ({
type = 'text',
value,
isEditing = false,
formItemProps = {},
required = false,
name,
label,
showLabel = false,
objectType = 'unknown',
readOnly = false,
...rest
}) => {
const renderProperty = () => {
console.log('Rendering')
if (!isEditing || readOnly) {
switch (type) {
case 'secret':
if (value != null) {
return
} else {
return n/a
}
case 'wsprotocol':
switch (value) {
case 'ws':
return Websocket
case 'wss':
return Websocket Secure
default:
return n/a
}
case 'bool': {
if (value != null) {
return
} else {
return n/a
}
}
case 'dateTime': {
if (value != null) {
return
} else {
return n/a
}
}
case 'currency': {
if (value != null) {
return {`£${value}/kg`}
} else {
return n/a
}
}
case 'country': {
if (value != null) {
return
} else {
return n/a
}
}
case 'color': {
if (value) {
return
} else {
return n/a
}
}
case 'weight': {
if (value != null) {
return {`${value}g`}
} else {
return n/a
}
}
case 'number': {
if (value != null) {
return {value}
} else {
return n/a
}
}
case 'text':
if (value != null && value != '') {
return {value}
} else {
return n/a
}
case 'email':
if (value != null && value != '') {
return
} else {
return n/a
}
case 'url':
if (value != null && value != '') {
return
} else {
return n/a
}
case 'object': {
if (value && value.name) {
return {value.name}
} else {
return n/a
}
}
case 'state': {
if (value && value?.state) {
switch (objectType) {
case 'printer':
return
case 'job':
return
case 'subjob':
return
default:
return n/a
}
} else {
return n/a
}
}
case 'material': {
if (value) {
return {value}
} else {
return n/a
}
}
case 'id': {
if (value) {
return
} else {
return n/a
}
}
case 'density': {
if (value != null) {
return {`${value} g/cm³`}
} else {
return n/a
}
}
case 'mm': {
if (value != null) {
return {`${value} mm`}
} else {
return n/a
}
}
case 'tags': {
if (value != null || value?.length != 0) {
return
} else {
return n/a
}
}
case 'version': {
if (value != null) {
return {`${value} mm`}
} else {
return n/a
}
}
default: {
if (value) {
return {value}
} else {
return n/a
}
}
}
}
// Editable mode: wrap in Form.Item
// Merge required rule if needed
let mergedFormItemProps = { ...formItemProps }
if (required) {
let rules
if (mergedFormItemProps.rules) {
rules = [...mergedFormItemProps.rules]
} else {
rules = []
}
const hasRequiredRule = rules.some((rule) => rule && rule.required)
if (!hasRequiredRule) {
rules.push({ required: true, message: 'This field is required' })
}
mergedFormItemProps.rules = rules
}
// Remove name from mergedFormItemProps if present
if (mergedFormItemProps.name) {
delete mergedFormItemProps.name
}
// If label is provided, set it on Form.Item
if (label && showLabel == true) {
mergedFormItemProps.label = label
}
// Always apply style: { margin: 0 } unless overridden
mergedFormItemProps.style = {
margin: 0,
...(mergedFormItemProps.style || {})
}
switch (type) {
case 'secret':
return (
visible ? :
}
/>
)
case 'wsprotocol':
return (
)
case 'bool':
return (
)
case 'dateTime':
return (
({ value: v ? dayjs(v) : null })}
>
)
case 'currency':
return (
)
case 'country':
return (
)
case 'color':
return (
v}
>
)
case 'weight':
return (
)
case 'number':
return (
)
case 'text':
return (
)
case 'material':
return (
)
case 'id':
// id is not editable, just show view mode
if (value) {
return
} else {
return n/a
}
case 'object':
switch (objectType) {
case 'vendor':
return (
)
case 'printer':
return (
)
case 'gcodefile':
return (
)
case 'filament':
return (
)
case 'part':
return (
)
default:
return n/a
}
case 'density':
return (
)
case 'mm':
return (
)
case 'tags':
return (
)
default:
return (
)
}
}
const property = renderProperty()
// Render the property directly (remove useDescriptions functionality)
return property
}
ObjectProperty.propTypes = {
type: PropTypes.oneOf([
'text',
'number',
'currency',
'color',
'weight',
'vendor',
'material',
'id',
'density',
'mm'
]),
value: PropTypes.any,
isEditing: PropTypes.bool,
formItemProps: PropTypes.object,
required: PropTypes.bool,
name: PropTypes.string,
label: PropTypes.string,
showLabel: PropTypes.bool,
objectType: PropTypes.string.isRequired,
readOnly: PropTypes.bool
}
ObjectProperty.defaultProps = {}
export default ObjectProperty