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 'material': 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