diff --git a/src/components/Dashboard/Production/PrinterProfiles.jsx b/src/components/Dashboard/Production/PrinterProfiles.jsx index 260c0ea..39e5f2e 100644 --- a/src/components/Dashboard/Production/PrinterProfiles.jsx +++ b/src/components/Dashboard/Production/PrinterProfiles.jsx @@ -1,8 +1,6 @@ import { useContext, useRef, useState } from 'react' import { Button, Dropdown, Flex, Modal, Space } from 'antd' -import NewPrinterProfile, { - EditPrinterProfile -} from './PrinterProfiles/NewPrinterProfile' +import NewPrinterProfile from './PrinterProfiles/NewPrinterProfile' import ColumnViewButton from '../common/ColumnViewButton' import ExportListButton from '../common/ExportListButton' import FilterSidebarButton from '../common/FilterSidebarButton' @@ -16,10 +14,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useViewMode from '../hooks/useViewMode' const PrinterProfiles = () => { const { deleteObject } = useContext(ApiServerContext) - const [profileModal, setProfileModal] = useState({ - open: false, - profileId: null - }) + const [newProfileOpen, setNewProfileOpen] = useState(false) const tableRef = useRef() const [viewMode, setViewMode] = useViewMode('PrinterProfiles') const [columnVisibility, setColumnVisibility] = @@ -45,17 +40,12 @@ const PrinterProfiles = () => { if (key === 'reloadList') { tableRef.current?.reload() } else if (key === 'newPrinterProfile') { - setProfileModal({ open: true, profileId: null }) + setNewProfileOpen(true) } } } const handleRowAction = (action, profile) => { - if (action.name === 'edit') { - setProfileModal({ open: true, profileId: profile._id }) - return true - } - if (action.name === 'delete') { Modal.confirm({ title: 'Delete printer profile?', @@ -112,29 +102,20 @@ const PrinterProfiles = () => { setProfileModal({ open: false, profileId: null })} + onCancel={() => setNewProfileOpen(false)} destroyOnHidden > - {profileModal.open && - (profileModal.profileId ? ( - { - setProfileModal({ open: false, profileId: null }) - tableRef.current?.reload() - }} - /> - ) : ( - { - setProfileModal({ open: false, profileId: null }) - tableRef.current?.reload() - }} - /> - ))} + {newProfileOpen && ( + { + setNewProfileOpen(false) + tableRef.current?.reload() + }} + /> + )} ) diff --git a/src/components/Dashboard/Production/PrinterProfiles/NewPrinterProfile.jsx b/src/components/Dashboard/Production/PrinterProfiles/NewPrinterProfile.jsx index 9960a13..1f38917 100644 --- a/src/components/Dashboard/Production/PrinterProfiles/NewPrinterProfile.jsx +++ b/src/components/Dashboard/Production/PrinterProfiles/NewPrinterProfile.jsx @@ -1,7 +1,6 @@ -import { useEffect, useMemo, useRef, useState } from 'react' +import { useMemo } from 'react' import PropTypes from 'prop-types' import NewObjectForm from '../../common/NewObjectForm' -import ObjectForm from '../../common/ObjectForm' import ObjectInfo from '../../common/ObjectInfo' import WizardView from '../../common/WizardView' @@ -144,229 +143,140 @@ const SUMMARY_PROPERTIES = [ ...OPTIONAL_PROPERTIES ] -const PrinterProfileWizard = ({ - objectData, - formValid, - loading, - onSubmit, - editing, - printerId = null -}) => { - const visibleProperties = useMemo(() => { - if (!printerId) return undefined - return { printer: false, 'printer._id': false } - }, [printerId]) - - const steps = useMemo( - () => [ - { - title: 'Required', - key: 'required', - content: ( - - ) - }, - { - title: 'Dimensions', - key: 'dimensions', - content: ( - - ) - }, - { - title: 'Extruders', - key: 'extruders', - content: ( - - ) - }, - { - title: 'Motion', - key: 'motion', - content: ( - - ) - }, - { - title: 'Optional', - key: 'optional', - content: ( - - ) - }, - { - title: 'Summary', - key: 'summary', - content: ( - - ) - } - ], - [objectData, visibleProperties] +const NewPrinterProfile = ({ onOk, reset, defaultValues = {} }) => { + const mergedDefaultValues = useMemo( + () => ({ + ...PRUSA_MK3S_PROFILE_DEFAULTS, + ...defaultValues + }), + [defaultValues] ) return ( - + + {({ handleSubmit, submitLoading, objectData, formValid }) => { + const steps = [ + { + title: 'Required', + key: 'required', + content: ( + + ) + }, + { + title: 'Dimensions', + key: 'dimensions', + content: ( + + ) + }, + { + title: 'Extruders', + key: 'extruders', + content: ( + + ) + }, + { + title: 'Motion', + key: 'motion', + content: ( + + ) + }, + { + title: 'Optional', + key: 'optional', + content: ( + + ) + }, + { + title: 'Summary', + key: 'summary', + content: ( + + ) + } + ] + + return ( + { + const result = await handleSubmit() + if (result?._id) onOk(result) + }} + /> + ) + }} + ) } -PrinterProfileWizard.propTypes = { - objectData: PropTypes.object, - formValid: PropTypes.bool.isRequired, - loading: PropTypes.bool, - onSubmit: PropTypes.func.isRequired, - editing: PropTypes.bool, - printerId: PropTypes.string -} - -const NewPrinterProfile = ({ onOk, printerId = null }) => ( - - {({ handleSubmit, submitLoading, objectData, formValid }) => ( - { - const result = await handleSubmit() - if (result?._id) onOk(result) - }} - /> - )} - -) - NewPrinterProfile.propTypes = { onOk: PropTypes.func.isRequired, - printerId: PropTypes.string -} - -export const EditPrinterProfile = ({ profileId, onOk, printerId = null }) => { - const formRef = useRef(null) - const startedEditingRef = useRef(false) - const saveRequestedRef = useRef(false) - const stateRef = useRef({}) - const [formState, setFormState] = useState({ - loading: true, - editLoading: false, - formValid: false, - isEditing: false, - objectData: {} - }) - - useEffect(() => { - if ( - !formState.loading && - !formState.isEditing && - !startedEditingRef.current - ) { - startedEditingRef.current = true - formRef.current?.startEditing() - } - }, [formState.isEditing, formState.loading]) - - return ( - { - stateRef.current = { ...stateRef.current, ...nextState } - setFormState((current) => ({ ...current, ...nextState })) - - if (saveRequestedRef.current && nextState.isEditing === false) { - saveRequestedRef.current = false - onOk(stateRef.current.objectData) - } - }} - > - {({ objectData, formValid, editLoading, handleUpdate }) => ( - { - saveRequestedRef.current = true - handleUpdate() - }} - /> - )} - - ) -} - -EditPrinterProfile.propTypes = { - profileId: PropTypes.string.isRequired, - onOk: PropTypes.func.isRequired, - printerId: PropTypes.string + reset: PropTypes.bool, + defaultValues: PropTypes.object } export default NewPrinterProfile diff --git a/src/components/Dashboard/Production/Printers/PrinterInfo.jsx b/src/components/Dashboard/Production/Printers/PrinterInfo.jsx index 24b4da5..232bda4 100644 --- a/src/components/Dashboard/Production/Printers/PrinterInfo.jsx +++ b/src/components/Dashboard/Production/Printers/PrinterInfo.jsx @@ -1,9 +1,7 @@ import { useRef, useState } from 'react' import { useLocation } from 'react-router-dom' -import { Space, Flex, Card, Button, Modal } from 'antd' -import NewPrinterProfile, { - EditPrinterProfile -} from '../PrinterProfiles/NewPrinterProfile' +import { Space, Flex, Card, Modal } from 'antd' +import NewPrinterProfile from '../PrinterProfiles/NewPrinterProfile' import { LoadingOutlined } from '@ant-design/icons' import loglevel from 'loglevel' import config from '../../../../config.js' @@ -25,7 +23,6 @@ import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' import UserNotifierToggle from '../../common/UserNotifierToggle.jsx' import ScrollBox from '../../common/ScrollBox.jsx' -import PlusIcon from '../../../Icons/PlusIcon.jsx' import PrinterProfileIcon from '../../../Icons/PrinterProfileIcon.jsx' const log = loglevel.getLogger('PrinterInfo') log.setLevel(config.logLevel) @@ -52,15 +49,7 @@ const PrinterInfo = () => { loading: false, objectData: {} }) - const [profileModal, setProfileModal] = useState({ - open: false, - profileId: null - }) - - const handleProfileSaved = () => { - setProfileModal({ open: false, profileId: null }) - profilesTableRef.current?.reload() - } + const [newPrinterProfileOpen, setNewPrinterProfileOpen] = useState(false) const actions = { edit: () => { @@ -74,6 +63,10 @@ const PrinterInfo = () => { finishEdit: () => { objectFormRef?.current.handleUpdate() return true + }, + newPrinterProfile: () => { + setNewPrinterProfileOpen(true) + return true } } @@ -196,37 +189,15 @@ const PrinterInfo = () => { {objectFormState.loading ? ( ) : ( - - - - - { - if (action.name === 'edit') { - setProfileModal({ - open: true, - profileId: profile._id - }) - return true - } - return false - }} - /> - + )} @@ -265,25 +236,25 @@ const PrinterInfo = () => { setProfileModal({ open: false, profileId: null })} - destroyOnHidden + width={800} + onCancel={() => { + setNewPrinterProfileOpen(false) + }} + destroyOnHidden={true} > - {profileModal.open && - (profileModal.profileId ? ( - - ) : ( - - ))} + { + setNewPrinterProfileOpen(false) + profilesTableRef.current?.reload() + }} + reset={newPrinterProfileOpen} + defaultValues={{ + printer: { ...objectFormState.objectData } + }} + /> ) diff --git a/src/database/models/Printer.js b/src/database/models/Printer.js index 9eae643..2d69f20 100644 --- a/src/database/models/Printer.js +++ b/src/database/models/Printer.js @@ -10,6 +10,7 @@ import StopCircleIcon from '../../components/Icons/StopCircleIcon' import FilamentStockIcon from '../../components/Icons/FilamentStockIcon' import ControlIcon from '../../components/Icons/ControlIcon' import JobIcon from '../../components/Icons/JobIcon' +import PlusIcon from '../../components/Icons/PlusIcon' export const Printer = { name: 'printer', @@ -67,6 +68,15 @@ export const Printer = { } }, { type: 'divider' }, + { + name: 'newPrinterProfile', + label: 'New Printer Profile', + type: 'button', + icon: PlusIcon, + url: (_id) => + `/dashboard/production/printers/info?printerId=${_id}&action=newPrinterProfile` + }, + { type: 'divider' }, { name: 'restartSubmenu', label: 'Restart',