import { useRef, useState, useMemo } 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 ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx'
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 { useDashboardObjectTools } from '../../context/DashboardObjectToolsContext'
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 { getModelByName } from '../../../../database/ObjectModels.js'
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,
editDisabled: false,
objectData: {}
})
const currentObjectTools = useMemo(
() => (
),
[objectFormState.loading, filamentProfileId]
)
useDashboardObjectTools(currentObjectTools)
const actions = {
edit: () => {
objectFormRef.current?.startEditing?.()
return false
},
cancelEdit: () => {
objectFormRef.current?.cancelEditing?.()
return true
},
finishEdit: () => {
objectFormRef.current?.handleUpdate?.()
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 ||
objectFormState.editDisabled
}
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