import { useRef, useState } from 'react' import { useLocation } from 'react-router-dom' import { Card, Flex, Space } from 'antd' import { LoadingOutlined } from '@ant-design/icons' import ActionHandler from '../../common/ActionHandler' import AuditLogIcon from '../../../Icons/AuditLogIcon' import DocumentPrintButton from '../../common/DocumentPrintButton' import EditButtons from '../../common/EditButtons' import FilamentIcon from '../../../Icons/FilamentIcon' import GCodeFileIcon from '../../../Icons/GCodeFileIcon' import HotEndIcon from '../../../Icons/HotEndIcon' import InfoCircleIcon from '../../../Icons/InfoCircleIcon' import InfoCollapse from '../../common/InfoCollapse' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder' import ActivityIndicator from '../../common/ActivityIndicator' import MultiMotionIcon from '../../../Icons/MultiMotionIcon' import NoteIcon from '../../../Icons/NoteIcon' import NotesPanel from '../../common/NotesPanel' import ObjectActions from '../../common/ObjectActions' import ObjectForm from '../../common/ObjectForm' import ObjectInfo from '../../common/ObjectInfo' import ObjectTable from '../../common/ObjectTable' import RulerIcon from '../../../Icons/RulerIcon' import ScrollBox from '../../common/ScrollBox' import SettingsIcon from '../../../Icons/SettingsIcon' import UserNotifierToggle from '../../common/UserNotifierToggle' import ViewButton from '../../common/ViewButton' import useCollapseState from '../../hooks/useCollapseState' import { FILAMENT_PROFILE_BED_TEMPERATURE_PROPERTIES, FILAMENT_PROFILE_COMPATIBILITY_PROPERTIES, FILAMENT_PROFILE_COOLING_PROPERTIES, FILAMENT_PROFILE_EXHAUST_FAN_PROPERTIES, FILAMENT_PROFILE_FLOW_PRESSURE_PROPERTIES, FILAMENT_PROFILE_GCODE_PROPERTIES, FILAMENT_PROFILE_LOADING_PROPERTIES, FILAMENT_PROFILE_MATERIAL_PROPERTIES, FILAMENT_PROFILE_RETRACTION_PROPERTIES, FILAMENT_PROFILE_SHRINKAGE_DRYING_PROPERTIES, FILAMENT_PROFILE_SPEED_PROPERTIES, FILAMENT_PROFILE_TEMPERATURE_PROPERTIES, FILAMENT_PROFILE_WIPE_TOWER_PROPERTIES } from '../../../../database/models/FilamentProfile' const toVisibleProperties = (propertyNames) => Object.fromEntries(propertyNames.map((name) => [name, true])) const FilamentProfileInfo = () => { const location = useLocation() const objectFormRef = useRef(null) const actionHandlerRef = useRef(null) const filamentProfileId = new URLSearchParams(location.search).get( 'filamentProfileId' ) const [collapseState, updateCollapseState] = useCollapseState( 'FilamentProfileInfo', { info: true, material: true, flowPressure: true, temperature: true, bedTemperature: true, speed: true, cooling: true, exhaustFan: true, retraction: true, loading: true, wipeTower: true, gCodeSettings: true, compatibility: true, shrinkageDrying: true, notes: true, auditLogs: false } ) const [objectFormState, setObjectFormState] = useState({ isEditing: false, editLoading: false, formValid: false, lock: null, loading: false, objectData: {} }) const actions = { edit: () => { objectFormRef.current?.startEditing?.() return false }, cancelEdit: () => { objectFormRef.current?.cancelEditing?.() return true }, finishEdit: () => { objectFormRef.current?.handleUpdate?.() return true }, delete: () => { objectFormRef.current?.handleDelete?.() return true } } return ( actionHandlerRef.current.callAction('finishEdit')} cancelEditing={() => actionHandlerRef.current.callAction('cancelEdit') } startEditing={() => actionHandlerRef.current.callAction('edit')} editLoading={objectFormState.editLoading} formValid={objectFormState.formValid} disabled={objectFormState.beingEditedByOther || objectFormState.loading} loading={objectFormState.editLoading} /> setObjectFormState((current) => ({ ...current, ...state })) } > {({ loading, isEditing, objectData }) => ( } active={collapseState.info} onToggle={(expanded) => updateCollapseState('info', expanded) } collapseKey='info' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='140px' visibleProperties={{ _id: true, name: true, _reference: true, filamentType: true, filament: true, createdAt: true, updatedAt: true }} /> } active={collapseState.material} onToggle={(expanded) => updateCollapseState('material', expanded) } collapseKey='material' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='220px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_MATERIAL_PROPERTIES )} /> } active={collapseState.flowPressure} onToggle={(expanded) => updateCollapseState('flowPressure', expanded) } collapseKey='flowPressure' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='325px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_FLOW_PRESSURE_PROPERTIES )} /> } active={collapseState.temperature} onToggle={(expanded) => updateCollapseState('temperature', expanded) } collapseKey='temperature' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='280px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_TEMPERATURE_PROPERTIES )} /> } active={collapseState.bedTemperature} onToggle={(expanded) => updateCollapseState('bedTemperature', expanded) } collapseKey='bedTemperature' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='280px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_BED_TEMPERATURE_PROPERTIES )} /> } active={collapseState.speed} onToggle={(expanded) => updateCollapseState('speed', expanded) } collapseKey='speed' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='265px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_SPEED_PROPERTIES )} /> } active={collapseState.cooling} onToggle={(expanded) => updateCollapseState('cooling', expanded) } collapseKey='cooling' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='350px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_COOLING_PROPERTIES )} /> } active={collapseState.exhaustFan} onToggle={(expanded) => updateCollapseState('exhaustFan', expanded) } collapseKey='exhaustFan' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='285px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_EXHAUST_FAN_PROPERTIES )} /> } active={collapseState.retraction} onToggle={(expanded) => updateCollapseState('retraction', expanded) } collapseKey='retraction' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='250px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_RETRACTION_PROPERTIES )} /> } active={collapseState.loading} onToggle={(expanded) => updateCollapseState('loading', expanded) } collapseKey='loading' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='220px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_LOADING_PROPERTIES )} /> } active={collapseState.wipeTower} onToggle={(expanded) => updateCollapseState('wipeTower', expanded) } collapseKey='wipeTower' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='330px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_WIPE_TOWER_PROPERTIES )} /> } active={collapseState.gCodeSettings} onToggle={(expanded) => updateCollapseState('gCodeSettings', expanded) } collapseKey='gCodeSettings' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='270px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_GCODE_PROPERTIES )} /> } active={collapseState.compatibility} onToggle={(expanded) => updateCollapseState('compatibility', expanded) } collapseKey='compatibility' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='270px' visibleProperties={toVisibleProperties( FILAMENT_PROFILE_COMPATIBILITY_PROPERTIES )} /> } active={collapseState.shrinkageDrying} onToggle={(expanded) => updateCollapseState('shrinkageDrying', expanded) } collapseKey='shrinkageDrying' > } isEditing={isEditing} type='filamentProfile' objectData={objectData} labelWidth='340px' visibleProperties={{ ...toVisibleProperties( FILAMENT_PROFILE_SHRINKAGE_DRYING_PROPERTIES ), filamentNotes: true }} /> )} } active={collapseState.notes} onToggle={(expanded) => updateCollapseState('notes', expanded)} collapseKey='notes' > } active={collapseState.auditLogs} onToggle={(expanded) => updateCollapseState('auditLogs', expanded)} collapseKey='auditLogs' > {objectFormState.loading ? ( ) : ( )} ) } export default FilamentProfileInfo