import { useRef, useState } from 'react' import { useLocation } from 'react-router-dom' import { Space, Flex, Card, Modal } from 'antd' import { LoadingOutlined } from '@ant-design/icons' import loglevel from 'loglevel' import config from '../../../../config.js' import useCollapseState from '../../hooks/useCollapseState.jsx' import NotesPanel from '../../common/NotesPanel.jsx' import InfoCollapse from '../../common/InfoCollapse.jsx' import ObjectInfo from '../../common/ObjectInfo.jsx' import ViewButton from '../../common/ViewButton.jsx' import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx' import NoteIcon from '../../../Icons/NoteIcon.jsx' import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx' import ObjectForm from '../../common/ObjectForm.jsx' import EditButtons from '../../common/EditButtons.jsx' import LockIndicator from '../../common/LockIndicator.jsx' import ActionHandler from '../../common/ActionHandler.jsx' import ObjectActions from '../../common/ObjectActions.jsx' import ObjectTable from '../../common/ObjectTable.jsx' 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 OrderItemsIcon from '../../../Icons/OrderItemIcon.jsx' import NewOrderItem from '../OrderItems/NewOrderItem.jsx' import NewShipment from '../Shipments/NewShipment.jsx' import PostPurchaseOrder from './PostPurchaseOrder.jsx' import AcknowledgePurchaseOrder from './AcknowledgePurchaseOrder.jsx' import CancelPurchaseOrder from './CancelPurchaseOrder.jsx' import ShipmentIcon from '../../../Icons/ShipmentIcon.jsx' import InvoiceIcon from '../../../Icons/InvoiceIcon.jsx' import StockEventIcon from '../../../Icons/StockEventIcon.jsx' import { getModelByName } from '../../../../database/ObjectModels.js' import NewInvoice from '../../Finance/Invoices/NewInvoice.jsx' const log = loglevel.getLogger('PurchaseOrderInfo') log.setLevel(config.logLevel) const PurchaseOrderInfo = () => { const location = useLocation() const objectFormRef = useRef(null) const orderItemsTableRef = useRef(null) const shipmentsTableRef = useRef(null) const actionHandlerRef = useRef(null) const [newOrderItemOpen, setNewOrderItemOpen] = useState(false) const [newShipmentOpen, setNewShipmentOpen] = useState(false) const [postPurchaseOrderOpen, setPostPurchaseOrderOpen] = useState(false) const [acknowledgePurchaseOrderOpen, setAcknowledgePurchaseOrderOpen] = useState(false) const [cancelPurchaseOrderOpen, setCancelPurchaseOrderOpen] = useState(false) const [newInvoiceOpen, setNewInvoiceOpen] = useState(false) const purchaseOrderId = new URLSearchParams(location.search).get( 'purchaseOrderId' ) const [collapseState, updateCollapseState] = useCollapseState( 'PurchaseOrderInfo', { info: true, notes: true, orderItems: true, shipments: true, auditLogs: false, invoices: true, stockEvents: true } ) const [objectFormState, setEditFormState] = useState({ isEditing: false, editLoading: false, formValid: false, lock: null, loading: false, objectData: {} }) const actions = { edit: () => { orderItemsTableRef?.current?.startEditing?.() objectFormRef?.current?.startEditing?.() return false }, cancelEdit: () => { orderItemsTableRef?.current?.cancelEditing?.() objectFormRef?.current?.cancelEditing?.() return true }, finishEdit: () => { orderItemsTableRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.() return true }, delete: () => { objectFormRef?.current?.handleDelete?.() return true }, newOrderItem: () => { setNewOrderItemOpen(true) return true }, newShipment: () => { setNewShipmentOpen(true) return true }, newInvoice: () => { setNewInvoiceOpen(true) return true }, post: () => { setPostPurchaseOrderOpen(true) return true }, acknowledge: () => { setAcknowledgePurchaseOrderOpen(true) return true }, cancel: () => { setCancelPurchaseOrderOpen(true) return true } } const editDisabled = getModelByName('purchaseOrder') .actions.find((action) => action.name === 'edit') .disabled(objectFormState.objectData) return ( <> { actionHandlerRef.current.callAction('finishEdit') }} cancelEditing={() => { actionHandlerRef.current.callAction('cancelEdit') }} startEditing={() => { actionHandlerRef.current.callAction('edit') }} editLoading={objectFormState.editLoading} formValid={objectFormState.formValid} disabled={ objectFormState.lock?.locked || objectFormState.loading || editDisabled } loading={objectFormState.editLoading} /> { setEditFormState((prev) => ({ ...prev, ...state })) }} > {({ loading, isEditing, objectData }) => ( } active={collapseState.info} onToggle={(expanded) => updateCollapseState('info', expanded) } collapseKey='info' > } isEditing={isEditing} type='purchaseOrder' labelWidth='225px' objectData={objectData} visibleProperties={{ items: false }} /> } active={collapseState.orderItems} onToggle={(expanded) => updateCollapseState('orderItems', expanded) } collapseKey='orderItems' > } active={collapseState.shipments} onToggle={(expanded) => updateCollapseState('shipments', expanded) } collapseKey='shipments' > } active={collapseState.invoices} onToggle={(expanded) => updateCollapseState('invoices', expanded) } collapseKey='invoices' > {objectFormState.loading ? ( ) : ( )} } active={collapseState.stockEvents} onToggle={(expanded) => updateCollapseState('stockEvents', expanded) } collapseKey='stockEvents' > {objectFormState.loading ? ( ) : ( )} )} } active={collapseState.notes} onToggle={(expanded) => updateCollapseState('notes', expanded)} collapseKey='notes' > } active={collapseState.auditLogs} onToggle={(expanded) => updateCollapseState('auditLogs', expanded) } collapseKey='auditLogs' > {objectFormState.loading ? ( ) : ( )} { setNewOrderItemOpen(false) }} width={800} footer={null} destroyOnHidden={true} > { setNewOrderItemOpen(false) }} reset={newOrderItemOpen} defaultValues={{ order: { _id: purchaseOrderId }, orderType: 'purchaseOrder', syncAmount: 'itemCost' }} /> { setNewShipmentOpen(false) }} width={800} footer={null} destroyOnHidden={true} > { setNewShipmentOpen(false) }} reset={newShipmentOpen} defaultValues={{ orderType: 'purchaseOrder', order: { _id: purchaseOrderId } }} /> { setNewInvoiceOpen(false) }} width={800} footer={null} destroyOnHidden={true} > { setNewInvoiceOpen(false) }} reset={newInvoiceOpen} defaultValues={{ orderType: 'purchaseOrder', order: { ...objectFormState.objectData } }} /> { setPostPurchaseOrderOpen(false) }} width={500} footer={null} destroyOnHidden={true} centered={true} > { setPostPurchaseOrderOpen(false) objectFormRef?.current.handleFetchObject() }} objectData={objectFormState.objectData} /> { setAcknowledgePurchaseOrderOpen(false) }} width={515} footer={null} destroyOnHidden={true} centered={true} > { setAcknowledgePurchaseOrderOpen(false) objectFormRef?.current.handleFetchObject() }} objectData={objectFormState.objectData} /> { setCancelPurchaseOrderOpen(false) }} width={515} footer={null} destroyOnHidden={true} centered={true} > { setCancelPurchaseOrderOpen(false) objectFormRef?.current.handleFetchObject() }} objectData={objectFormState.objectData} /> ) } export default PurchaseOrderInfo