Compare commits

...

5 Commits

Author SHA1 Message Date
bcb7460bf2 Enhance Loading State in Dashboard Components
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
- Added a loading spinner to various components including InvoiceInfo, PaymentInfo, TaxRecordInfo, and others to improve user experience during data fetching.
- Integrated Spin component from Ant Design with a LoadingOutlined icon to visually indicate loading states for notes sections across multiple dashboard components.
- Ensured consistent loading behavior across all relevant components, enhancing overall responsiveness and user feedback.
2026-08-22 21:16:21 +01:00
0c38cea5b6 Fix modal centering logic in ActionsContext to prevent errors when resolvedModalAction is undefined. Updated useEffect to check for resolvedModalAction before setting modalCentered state. 2026-08-22 21:10:04 +01:00
6643c8a8c7 Add danger prop to action button in ObjectTable component 2026-08-22 21:07:47 +01:00
43464f8054 Refactor Delete Functionality Across Multiple Components
- Removed the delete action from various components including InvoiceInfo, PaymentInfo, and others to streamline functionality.
- Introduced a new DeleteObject component to handle deletion logic in a centralized manner, enhancing code maintainability.
- Updated models to utilize the new DeleteObject component for consistent deletion handling across the application.
- Simplified ObjectForm by eliminating the previous delete modal, improving component structure and clarity.
2026-08-22 21:06:32 +01:00
c99227816e Refactor Object Form and Child Table for Improved Data Handling and Computed Values Management
- Introduced applyComputedEntries function to streamline the merging of computed entries with existing object data, enhancing clarity and maintainability.
- Updated NewObjectForm and ObjectForm components to utilize applyComputedEntries for setting initial form data and computed values, improving data handling consistency.
- Refactored ObjectChildTable to ensure proper handling of value props and fallback mechanisms, enhancing user experience during editing.
- Removed unused DeleteObjectModal from ObjectForm, simplifying the component structure.
2026-08-22 21:01:50 +01:00
88 changed files with 856 additions and 514 deletions

View File

@ -1,6 +1,6 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -92,10 +92,6 @@ const InvoiceInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -273,9 +269,14 @@ const InvoiceInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={invoiceId} type='invoice' /> <NotesPanel _id={invoiceId} type='invoice' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -85,10 +85,6 @@ const PaymentInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -208,9 +204,14 @@ const PaymentInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={paymentId} type='payment' /> <NotesPanel _id={paymentId} type='payment' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config' import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
@ -77,10 +78,6 @@ const TaxRecordInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -191,9 +188,14 @@ const TaxRecordInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={taxRecordId} type='taxRecord' /> <NotesPanel _id={taxRecordId} type='taxRecord' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
import ObjectForm from '../../common/ObjectForm' import ObjectForm from '../../common/ObjectForm'
import ObjectInfo from '../../common/ObjectInfo' import ObjectInfo from '../../common/ObjectInfo'
@ -226,9 +227,14 @@ const FilamentStockInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={filamentStockId} type='filamentStock' /> <NotesPanel _id={filamentStockId} type='filamentStock' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -78,10 +78,6 @@ const OrderItemInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -197,9 +193,14 @@ const OrderItemInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={orderItemId} type='orderItem' /> <NotesPanel _id={orderItemId} type='orderItem' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -246,9 +246,14 @@ const PartStockInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={partStockId} type='partStock' /> <NotesPanel _id={partStockId} type='partStock' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,6 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -98,10 +98,6 @@ const ProductStockInfo = () => {
objectFormRef?.current.handleUpdate() objectFormRef?.current.handleUpdate()
return true return true
}, },
delete: () => {
objectFormRef?.current.handleDelete?.()
return true
}
} }
return ( return (
@ -280,9 +276,14 @@ const ProductStockInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={productStockId} type='productStock' /> <NotesPanel _id={productStockId} type='productStock' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,6 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -103,10 +103,6 @@ const PurchaseOrderInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -313,9 +309,14 @@ const PurchaseOrderInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={purchaseOrderId} type='purchaseOrder' /> <NotesPanel _id={purchaseOrderId} type='purchaseOrder' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Modal, Space } from 'antd' import { Card, Flex, Modal, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -96,10 +96,6 @@ const PurchaseOrderInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
},
newOrderItem: () => { newOrderItem: () => {
setNewOrderItemOpen(true) setNewOrderItemOpen(true)
return true return true
@ -274,9 +270,14 @@ const PurchaseOrderInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={purchaseOrderId} type='purchaseOrder' /> <NotesPanel _id={purchaseOrderId} type='purchaseOrder' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -88,10 +88,6 @@ const ShipmentInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -233,9 +229,14 @@ const ShipmentInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={shipmentId} type='shipment' /> <NotesPanel _id={shipmentId} type='shipment' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -202,9 +202,14 @@ const StockAuditInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={stockAuditId} type='stockAudit' /> <NotesPanel _id={stockAuditId} type='stockAudit' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -200,9 +200,14 @@ const StockLocationInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={stockLocationId} type='stockLocation' /> <NotesPanel _id={stockLocationId} type='stockLocation' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,6 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import useCollapseState from '../../hooks/useCollapseState.jsx' import useCollapseState from '../../hooks/useCollapseState.jsx'
import NotesPanel from '../../common/NotesPanel.jsx' import NotesPanel from '../../common/NotesPanel.jsx'
@ -88,10 +88,6 @@ const StockTransferInfo = () => {
objectFormRef?.current.handleUpdate() objectFormRef?.current.handleUpdate()
return true return true
}, },
delete: () => {
objectFormRef?.current.handleDelete?.()
return true
}
} }
return ( return (
@ -231,9 +227,14 @@ const StockTransferInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={stockTransferId} type='stockTransfer' /> <NotesPanel _id={stockTransferId} type='stockTransfer' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config' import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
@ -79,10 +80,6 @@ const CourierServiceInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -193,9 +190,14 @@ const CourierServiceInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={courierServiceId} type='courierService' /> <NotesPanel _id={courierServiceId} type='courierService' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config' import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
@ -75,10 +76,6 @@ const CourierInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -210,9 +207,14 @@ const CourierInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={courierId} type='courier' /> <NotesPanel _id={courierId} type='courier' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -191,9 +191,14 @@ const DocumentJobInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={documentJobId} type='documentJob' /> <NotesPanel _id={documentJobId} type='documentJob' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -99,7 +99,7 @@ const DocumentPrinterInfo = () => {
<Space size='small'> <Space size='small'>
<ObjectActions <ObjectActions
type='documentPrinter' type='documentPrinter'
pageName='info' pageName='info'
id={documentPrinterId} id={documentPrinterId}
disabled={objectFormState.loading} disabled={objectFormState.loading}
objectData={objectFormState.objectData} objectData={objectFormState.objectData}
@ -204,9 +204,14 @@ const DocumentPrinterInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
<NotesPanel _id={documentPrinterId} type='documentPrinter' /> spinning={objectFormState.loading}
</Card> indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={documentPrinterId} type='documentPrinter' />
</Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
@ -224,10 +229,10 @@ const DocumentPrinterInfo = () => {
<ObjectTable <ObjectTable
type='auditLog' type='auditLog'
masterFilter={{ masterFilter={{
parent: parent:
getModelByName('documentPrinter').prefix + getModelByName('documentPrinter').prefix +
':' + ':' +
documentPrinterId documentPrinterId
}} }}
visibleColumns={{ _id: false, parent: false }} visibleColumns={{ _id: false, parent: false }}
/> />

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -192,9 +192,14 @@ const DocumentSizeInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={documentSizeId} type='documentSize' /> <NotesPanel _id={documentSizeId} type='documentSize' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useState, useRef, useMemo } from 'react' import { useState, useRef, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Space, Flex, Card } from 'antd' import { Space, Flex, Card, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
import useCollapseState from '../../hooks/useCollapseState.jsx' import useCollapseState from '../../hooks/useCollapseState.jsx'
@ -173,9 +174,14 @@ const DocumentTemplateDesign = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={documentTemplateId} type='documentTemplate' /> <NotesPanel _id={documentTemplateId} type='documentTemplate' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
</Flex> </Flex>
</ScrollBox> </ScrollBox>

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -205,9 +205,14 @@ const DocumentTemplateInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={documentTemplateId} type='documentTemplate' /> <NotesPanel _id={documentTemplateId} type='documentTemplate' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
import NotesPanel from '../../common/NotesPanel' import NotesPanel from '../../common/NotesPanel'
import InfoCollapse from '../../common/InfoCollapse' import InfoCollapse from '../../common/InfoCollapse'
@ -74,10 +75,6 @@ const FilamentSkuInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -188,9 +185,14 @@ const FilamentSkuInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={filamentSkuId} type='filamentSku' /> <NotesPanel _id={filamentSkuId} type='filamentSku' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config' import config from '../../../../config'
@ -93,10 +93,6 @@ const FilamentInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -258,9 +254,14 @@ const FilamentInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={filamentId} type='filament' /> <NotesPanel _id={filamentId} type='filament' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,7 @@
import { useContext, useRef, useState, useMemo } from 'react' import { useContext, useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
import useCollapseState from '../../hooks/useCollapseState.jsx' import useCollapseState from '../../hooks/useCollapseState.jsx'
@ -87,10 +88,6 @@ const FileInfo = () => {
fetchFileContent(objectFormState?.objectData, true) fetchFileContent(objectFormState?.objectData, true)
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -241,9 +238,14 @@ const FileInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={fileId} type='file' /> <NotesPanel _id={fileId} type='file' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -88,10 +88,6 @@ const HostInfo = () => {
objectFormRef?.current.handleUpdate() objectFormRef?.current.handleUpdate()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -253,9 +249,14 @@ const HostInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={hostId} type='host' /> <NotesPanel _id={hostId} type='host' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config' import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
@ -77,10 +78,6 @@ const MaterialInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -191,9 +188,14 @@ const MaterialInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={materialId} type='material' /> <NotesPanel _id={materialId} type='material' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -78,10 +78,6 @@ const NoteInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -219,9 +215,14 @@ const NoteInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={noteId} type='note' /> <NotesPanel _id={noteId} type='note' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
import NotesPanel from '../../common/NotesPanel' import NotesPanel from '../../common/NotesPanel'
import InfoCollapse from '../../common/InfoCollapse' import InfoCollapse from '../../common/InfoCollapse'
@ -69,10 +70,6 @@ const PartSkuInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -183,9 +180,14 @@ const PartSkuInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={partSkuId} type='partSku' /> <NotesPanel _id={partSkuId} type='partSku' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
import NotesPanel from '../../common/NotesPanel' import NotesPanel from '../../common/NotesPanel'
import InfoCollapse from '../../common/InfoCollapse' import InfoCollapse from '../../common/InfoCollapse'
@ -209,9 +210,14 @@ const PartInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={partId} type='part' /> <NotesPanel _id={partId} type='part' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -81,10 +81,6 @@ const PermissionSettingInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -226,12 +222,17 @@ const PermissionSettingInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel <NotesPanel
_id={permissionSettingId} _id={permissionSettingId}
type='permissionSetting' type='permissionSetting'
/> />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
import NotesPanel from '../../common/NotesPanel' import NotesPanel from '../../common/NotesPanel'
import InfoCollapse from '../../common/InfoCollapse' import InfoCollapse from '../../common/InfoCollapse'
@ -74,10 +75,6 @@ const ProductCategoryInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -188,9 +185,14 @@ const ProductCategoryInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={productCategoryId} type='productCategory' /> <NotesPanel _id={productCategoryId} type='productCategory' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
import NotesPanel from '../../common/NotesPanel' import NotesPanel from '../../common/NotesPanel'
import InfoCollapse from '../../common/InfoCollapse' import InfoCollapse from '../../common/InfoCollapse'
@ -75,10 +76,6 @@ const ProductSkuInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -215,9 +212,14 @@ const ProductSkuInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={productSkuId} type='productSku' /> <NotesPanel _id={productSkuId} type='productSku' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
import NotesPanel from '../../common/NotesPanel' import NotesPanel from '../../common/NotesPanel'
import InfoCollapse from '../../common/InfoCollapse' import InfoCollapse from '../../common/InfoCollapse'
@ -216,9 +217,14 @@ const ProductInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={productId} type='product' /> <NotesPanel _id={productId} type='product' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config' import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
@ -74,10 +75,6 @@ const TaxRateInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -188,9 +185,14 @@ const TaxRateInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={taxRateId} type='taxRate' /> <NotesPanel _id={taxRateId} type='taxRate' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -81,10 +81,6 @@ const UserGroupInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -242,9 +238,14 @@ const UserGroupInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={userGroupId} type='userGroup' /> <NotesPanel _id={userGroupId} type='userGroup' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -259,9 +259,14 @@ const UserInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={userId} type='user' /> <NotesPanel _id={userId} type='user' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config' import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
@ -74,10 +75,6 @@ const VendorInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -188,9 +185,14 @@ const VendorInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={vendorId} type='vendor' /> <NotesPanel _id={vendorId} type='vendor' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import ActionHandler from '../../common/ActionHandler' import ActionHandler from '../../common/ActionHandler'
import AuditLogIcon from '../../../Icons/AuditLogIcon' import AuditLogIcon from '../../../Icons/AuditLogIcon'
@ -112,10 +112,6 @@ const FilamentProfileInfo = () => {
objectFormRef.current?.handleUpdate?.() objectFormRef.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -528,9 +524,14 @@ const FilamentProfileInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={filamentProfileId} type='filamentProfile' /> <NotesPanel _id={filamentProfileId} type='filamentProfile' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -225,9 +225,14 @@ const GCodeFileInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={gcodeFileId} type='gcodeFile' /> <NotesPanel _id={gcodeFileId} type='gcodeFile' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Space, Flex, Card } from 'antd' import { Space, Flex, Card, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
import useCollapseState from '../../hooks/useCollapseState.jsx' import useCollapseState from '../../hooks/useCollapseState.jsx'
@ -143,9 +144,14 @@ const GCodeFilePreview = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={gcodeFileId} type='gcodeFile' /> <NotesPanel _id={gcodeFileId} type='gcodeFile' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
</Flex> </Flex>
</ScrollBox> </ScrollBox>

View File

@ -1,6 +1,6 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -219,9 +219,14 @@ const JobInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={jobId} type='job' /> <NotesPanel _id={jobId} type='job' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import ActionHandler from '../../common/ActionHandler' import ActionHandler from '../../common/ActionHandler'
import AuditLogIcon from '../../../Icons/AuditLogIcon' import AuditLogIcon from '../../../Icons/AuditLogIcon'
@ -90,10 +90,6 @@ const PrinterProfileInfo = () => {
objectFormRef.current?.handleUpdate?.() objectFormRef.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -379,9 +375,14 @@ const PrinterProfileInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={printerProfileId} type='printerProfile' /> <NotesPanel _id={printerProfileId} type='printerProfile' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,7 @@
import { useState, useRef, useEffect, useContext, useMemo } from 'react' import { useState, useRef, useEffect, useContext, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Space, Flex, Card, Splitter, Divider } from 'antd' import { Space, Flex, Card, Splitter, Divider, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
import useCollapseState from '../../hooks/useCollapseState.jsx' import useCollapseState from '../../hooks/useCollapseState.jsx'
@ -620,9 +621,14 @@ const ControlPrinter = ({ slicerIntegration = false }) => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={printerId} type='printer' /> <NotesPanel _id={printerId} type='printer' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
</Flex> </Flex>
</ScrollBox> </ScrollBox>

View File

@ -1,6 +1,6 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -239,9 +239,14 @@ const PrinterInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={printerId} type='printer' /> <NotesPanel _id={printerId} type='printer' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse

View File

@ -1,6 +1,6 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
import NotesPanel from '../../common/NotesPanel' import NotesPanel from '../../common/NotesPanel'
@ -198,9 +198,14 @@ const SubJobInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={subJobId} type='subJob' /> <NotesPanel _id={subJobId} type='subJob' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useMemo } from 'react' import { useRef, useState, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config' import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
@ -74,10 +75,6 @@ const ClientInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -188,9 +185,14 @@ const ClientInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={clientId} type='client' /> <NotesPanel _id={clientId} type='client' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config' import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
@ -88,10 +89,6 @@ const ListingVarientInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -205,9 +202,14 @@ const ListingVarientInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={listingVarientId} type='listingVarient' /> <NotesPanel _id={listingVarientId} type='listingVarient' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd' import { Card, Flex, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config' import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
@ -86,10 +87,6 @@ const ListingInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -223,9 +220,14 @@ const ListingInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={listingId} type='listing' /> <NotesPanel _id={listingId} type='listing' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,7 @@
import { useContext, useRef, useState, useEffect, useMemo } from 'react' import { useContext, useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Card, Flex, message, Space } from 'antd' import { Card, Flex, message, Space, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config' import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState' import useCollapseState from '../../hooks/useCollapseState'
@ -143,10 +144,6 @@ const MarketplaceInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
},
connect: () => { connect: () => {
startAuthorization() startAuthorization()
return true return true
@ -269,9 +266,14 @@ const MarketplaceInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={marketplaceId} type='marketplace' /> <NotesPanel _id={marketplaceId} type='marketplace' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -1,6 +1,6 @@
import { useRef, useState, useEffect, useMemo } from 'react' import { useRef, useState, useEffect, useMemo } from 'react'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { Space, Flex, Card } from 'antd' import { Space, Flex, Card, Spin } from 'antd'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel' import loglevel from 'loglevel'
import config from '../../../../config.js' import config from '../../../../config.js'
@ -101,10 +101,6 @@ const SalesOrderInfo = () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, },
delete: () => {
objectFormRef?.current?.handleDelete?.()
return true
}
} }
return ( return (
@ -311,9 +307,14 @@ const SalesOrderInfo = () => {
onToggle={(expanded) => updateCollapseState('notes', expanded)} onToggle={(expanded) => updateCollapseState('notes', expanded)}
collapseKey='notes' collapseKey='notes'
> >
<Card> <Spin
spinning={objectFormState.loading}
indicator={<LoadingOutlined />}
>
<Card>
<NotesPanel _id={salesOrderId} type='salesOrder' /> <NotesPanel _id={salesOrderId} type='salesOrder' />
</Card> </Card>
</Spin>
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'

View File

@ -16,7 +16,9 @@ const ActionHandler = forwardRef(
) => { ) => {
const location = useLocation() const location = useLocation()
const navigate = useNavigate() const navigate = useNavigate()
const action = new URLSearchParams(location.search).get(actionParam) const searchParams = new URLSearchParams(location.search)
const action = searchParams.get(actionParam)
const actionObjectType = searchParams.get('actionObjectType')
// Ref to track last executed action // Ref to track last executed action
const lastExecutedAction = useRef(null) const lastExecutedAction = useRef(null)
@ -44,6 +46,7 @@ const ActionHandler = forwardRef(
if ( if (
loading == false && loading == false &&
action && action &&
!actionObjectType &&
actions[action] && actions[action] &&
lastExecutedAction.current !== action lastExecutedAction.current !== action
) { ) {
@ -71,6 +74,7 @@ const ActionHandler = forwardRef(
}, [ }, [
loading, loading,
action, action,
actionObjectType,
actions, actions,
actionParam, actionParam,
clearAfterExecute, clearAfterExecute,

View File

@ -0,0 +1,76 @@
import { useState, useContext } from 'react'
import PropTypes from 'prop-types'
import { useLocation, useNavigate } from 'react-router-dom'
import { ApiServerContext } from '../context/ApiServerContext'
import { useMessageContext } from '../context/MessageContext'
import { useActions } from '../context/ActionsContext'
import { getModelByName } from '../../../database/ObjectModels'
import MessageDialogView from './MessageDialogView.jsx'
import BinIcon from '../../Icons/BinIcon'
const capitalizeFirstLetter = (value) => {
return String(value).charAt(0).toUpperCase() + String(value).slice(1)
}
const DeleteObject = ({ onOk, objectData, objectType: objectTypeProp }) => {
const [deleteLoading, setDeleteLoading] = useState(false)
const { deleteObject } = useContext(ApiServerContext)
const { showSuccess, showError } = useMessageContext()
const { currentObjectType } = useActions()
const location = useLocation()
const navigate = useNavigate()
const objectType =
objectTypeProp ||
new URLSearchParams(location.search).get('actionObjectType') ||
currentObjectType
const model = objectType ? getModelByName(objectType) : null
const modelLabel = model?.label || 'object'
const objectName =
objectData?.name || objectData?._reference || objectData?._id
const handleDelete = async () => {
if (!objectData?._id || !objectType) return
setDeleteLoading(true)
try {
await deleteObject(objectData._id, objectType)
showSuccess(
`${capitalizeFirstLetter(modelLabel.toLowerCase())} deleted successfully!`
)
const onInfoPage = model?.url && location.pathname === `${model.url}/info`
if (onInfoPage) {
navigate(model.url)
} else {
onOk()
}
} catch (error) {
console.error('Error deleting object:', error)
showError(`Failed to delete ${modelLabel.toLowerCase()}.`)
} finally {
setDeleteLoading(false)
}
}
return (
<MessageDialogView
icon={<BinIcon />}
title={`Are you sure you want to delete this ${modelLabel.toLowerCase()}?`}
description={
objectName ? `This will permanently delete ${objectName}.` : undefined
}
onOk={handleDelete}
okText='Delete'
okLoading={deleteLoading}
danger
/>
)
}
DeleteObject.propTypes = {
onOk: PropTypes.func.isRequired,
objectData: PropTypes.object,
objectType: PropTypes.string
}
export default DeleteObject

View File

@ -1,58 +0,0 @@
import PropTypes from 'prop-types'
import { Modal, Button, Space, Typography } from 'antd'
import { getModelByName } from '../../../database/ObjectModels'
import BinIcon from '../../Icons/BinIcon'
const { Text } = Typography
const DeleteObjectModal = ({ open, onOk, onCancel, loading, objectType }) => {
const model = getModelByName(objectType)
return (
<Modal
open={open}
title={
<Space size={'middle'}>
<BinIcon />
{`Confirm Delete ${model.label}`}
</Space>
}
onOk={onOk}
onCancel={onCancel}
okText='Delete'
cancelText='Cancel'
okType='danger'
closable={false}
centered
maskClosable={false}
footer={[
<Button key='cancel' onClick={onCancel} disabled={loading}>
Cancel
</Button>,
<Button
key='delete'
type='primary'
danger
onClick={onOk}
loading={loading}
disabled={loading}
>
Delete
</Button>
]}
>
<Text>
Are you sure you want to delete this {model.label.toLowerCase()}?
</Text>
</Modal>
)
}
DeleteObjectModal.propTypes = {
open: PropTypes.bool.isRequired,
onOk: PropTypes.func.isRequired,
onCancel: PropTypes.func.isRequired,
loading: PropTypes.bool,
objectType: PropTypes.string.isRequired
}
export default DeleteObjectModal

View File

@ -10,7 +10,8 @@ const MessageDialogView = ({
description, description,
onOk, onOk,
okText, okText,
okLoading okLoading,
danger = false
}) => { }) => {
return ( return (
<Flex vertical gap={'middle'}> <Flex vertical gap={'middle'}>
@ -20,7 +21,12 @@ const MessageDialogView = ({
</Flex> </Flex>
{description && <Text>{description}</Text>} {description && <Text>{description}</Text>}
<Flex justify={'end'}> <Flex justify={'end'}>
<Button type='primary' onClick={onOk} loading={okLoading}> <Button
type='primary'
danger={danger}
onClick={onOk}
loading={okLoading}
>
{okText || 'OK'} {okText || 'OK'}
</Button> </Button>
</Flex> </Flex>
@ -34,7 +40,8 @@ MessageDialogView.propTypes = {
description: PropTypes.node, description: PropTypes.node,
onOk: PropTypes.func.isRequired, onOk: PropTypes.func.isRequired,
okText: PropTypes.string, okText: PropTypes.string,
okLoading: PropTypes.bool okLoading: PropTypes.bool,
danger: PropTypes.bool
} }
export default MessageDialogView export default MessageDialogView

View File

@ -3,6 +3,7 @@ import { Form } from 'antd'
import { ApiServerContext } from '../context/ApiServerContext' import { ApiServerContext } from '../context/ApiServerContext'
import { useMessageContext } from '../context/MessageContext' import { useMessageContext } from '../context/MessageContext'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import merge from 'lodash/merge'
import mergeWith from 'lodash/mergeWith' import mergeWith from 'lodash/mergeWith'
import set from 'lodash/set' import set from 'lodash/set'
import { getModelByName } from '../../../database/ObjectModels' import { getModelByName } from '../../../database/ObjectModels'
@ -18,6 +19,16 @@ const buildObjectFromEntries = (entries = []) => {
}, {}) }, {})
} }
const applyComputedEntries = (base, entries = []) => {
const result = merge({}, base || {})
entries.forEach((entry) => {
const { namePath, value } = entry || {}
if (!Array.isArray(namePath) || value === undefined) return
set(result, namePath, value)
})
return result
}
const arrayReplaceCustomizer = (objValue, srcValue, key) => { const arrayReplaceCustomizer = (objValue, srcValue, key) => {
if (Array.isArray(srcValue)) { if (Array.isArray(srcValue)) {
return srcValue return srcValue
@ -172,12 +183,9 @@ const NewObjectForm = ({ type, style, defaultValues = {}, children }) => {
if (Object.keys(defaultValues).length > 0) { if (Object.keys(defaultValues).length > 0) {
// Calculate computed values for initial data // Calculate computed values for initial data
const computedEntries = calculateComputedValues(defaultValues, model) const computedEntries = calculateComputedValues(defaultValues, model)
const computedValuesObject = buildObjectFromEntries(computedEntries) const initialFormData = applyComputedEntries(
const initialFormData = mergeWith(
{},
defaultValues, defaultValues,
computedValuesObject, computedEntries
arrayReplaceCustomizer
) )
form.setFieldsValue(initialFormData) form.setFieldsValue(initialFormData)
setObjectData((prev) => setObjectData((prev) =>
@ -196,12 +204,9 @@ const NewObjectForm = ({ type, style, defaultValues = {}, children }) => {
try { try {
setSubmitLoading(true) setSubmitLoading(true)
const computedEntries = calculateComputedValues(objectData, model) const computedEntries = calculateComputedValues(objectData, model)
const computedValuesObject = buildObjectFromEntries(computedEntries) const computedObjectData = applyComputedEntries(
const computedObjectData = mergeWith(
{},
objectData, objectData,
computedValuesObject, computedEntries
arrayReplaceCustomizer
) )
const newObject = await createObject(type, computedObjectData) const newObject = await createObject(type, computedObjectData)
showSuccess('Object created successfully') showSuccess('Object created successfully')
@ -253,14 +258,7 @@ const NewObjectForm = ({ type, style, defaultValues = {}, children }) => {
}) })
} }
// Merge all values (user input + computed values) const allValues = applyComputedEntries(allFormValues, computedEntries)
const computedValuesObject = buildObjectFromEntries(computedEntries)
const allValues = mergeWith(
{},
allFormValues,
computedValuesObject,
arrayReplaceCustomizer
)
setObjectData((prev) => { setObjectData((prev) => {
return mergeWith({}, prev, allValues, arrayReplaceCustomizer) return mergeWith({}, prev, allValues, arrayReplaceCustomizer)
}) })

View File

@ -64,7 +64,7 @@ const ObjectChildTable = ({
additionalColumns = [], additionalColumns = [],
emptyText = 'No items', emptyText = 'No items',
isEditing = false, isEditing = false,
value = [], value,
rollups = [], rollups = [],
onChange, onChange,
hiddenPropertyWidth = '300px', hiddenPropertyWidth = '300px',
@ -159,10 +159,13 @@ const ObjectChildTable = ({
) )
}, [columns, properties]) }, [columns, properties])
// When used inside antd Form.Item without Form.List, `value` will be the controlled array. // Form.Item may not have hydrated yet; fall back to objectData the same way
// rollups already do.
const itemsSource = useMemo(() => { const itemsSource = useMemo(() => {
return value ?? [] if (Array.isArray(value)) return value
}, [value]) if (name && Array.isArray(objectData?.[name])) return objectData[name]
return []
}, [value, name, objectData])
const handleRemoveItem = useCallback( const handleRemoveItem = useCallback(
(record, index) => { (record, index) => {
@ -265,12 +268,11 @@ const ObjectChildTable = ({
<ObjectProperty <ObjectProperty
{...property} {...property}
longId={false} longId={false}
inTable={true}
objectData={record} objectData={record}
parentData={objectData} parentData={objectData}
isEditing={isEditing} isEditing={isEditing}
useFormItem={false} useFormItem={false}
name={undefined}
value={record[property.name]}
onChange={handleCellChange} onChange={handleCellChange}
/> />
) )
@ -384,10 +386,7 @@ const ObjectChildTable = ({
const rollupDataSource = useMemo(() => { const rollupDataSource = useMemo(() => {
if (!rollups || rollups.length === 0) return [] if (!rollups || rollups.length === 0) return []
// Use value from form/props, or fall back to objectData when entering edit mode const itemsForRollup = itemsSource
// (form may not have populated the field yet)
const itemsForRollup =
value ?? (name && objectData ? objectData[name] : null) ?? []
// Build parent object with children array for rollup functions (e.g. objectData.parts) // Build parent object with children array for rollup functions (e.g. objectData.parts)
const updatedObjectData = { ...objectData } const updatedObjectData = { ...objectData }
@ -420,7 +419,7 @@ const ObjectChildTable = ({
}) })
return [summaryRow] return [summaryRow]
}, [properties, rollups, objectData, value, name]) }, [properties, rollups, objectData, itemsSource, name])
const rollupColumns = useMemo(() => { const rollupColumns = useMemo(() => {
const propertyColumns = resolvedProperties.map((property, index) => { const propertyColumns = resolvedProperties.map((property, index) => {
@ -634,7 +633,8 @@ const ObjectChildTable = ({
setMinimalModelOpen(true) setMinimalModelOpen(true)
}} }}
> >
{value?.length || 0} {value?.length == 1 ? 'item' : 'items'} {itemsSource?.length || 0}{' '}
{itemsSource?.length == 1 ? 'item' : 'items'}
</Link> </Link>
<Modal <Modal
open={minimalModelOpen} open={minimalModelOpen}

View File

@ -11,7 +11,6 @@ import { Form } from 'antd'
import { ApiServerContext } from '../context/ApiServerContext' import { ApiServerContext } from '../context/ApiServerContext'
import { AuthContext } from '../context/AuthContext' import { AuthContext } from '../context/AuthContext'
import { useMessageContext } from '../context/MessageContext' import { useMessageContext } from '../context/MessageContext'
import DeleteObjectModal from './DeleteObjectModal'
import merge from 'lodash/merge' import merge from 'lodash/merge'
import mergeWith from 'lodash/mergeWith' import mergeWith from 'lodash/mergeWith'
import set from 'lodash/set' import set from 'lodash/set'
@ -79,6 +78,19 @@ const buildObjectFromEntries = (entries = []) => {
}, {}) }, {})
} }
// Patch computed fields onto a full object. Building them as a sparse tree and
// merge-replacing arrays would wipe stored child-row fields (shipment, amount,
// etc.) while leaving calculated columns intact.
const applyComputedEntries = (base, entries = []) => {
const result = merge({}, base || {})
entries.forEach((entry) => {
const { namePath, value } = entry || {}
if (!Array.isArray(namePath) || value === undefined) return
set(result, namePath, value)
})
return result
}
const getEditDisabled = (model, objectData, userProfile) => { const getEditDisabled = (model, objectData, userProfile) => {
if (model?.readOnly === true) { if (model?.readOnly === true) {
return true return true
@ -144,12 +156,9 @@ const ObjectForm = forwardRef(
const [form] = Form.useForm() const [form] = Form.useForm()
const formUpdateValues = Form.useWatch([], form) const formUpdateValues = Form.useWatch([], form)
const { showSuccess, showError } = useMessageContext() const { showSuccess, showError } = useMessageContext()
const [deleteModalOpen, setDeleteModalOpen] = useState(false)
const [deleteLoading, setDeleteLoading] = useState(false)
const { const {
fetchObject, fetchObject,
updateObject, updateObject,
deleteObject,
setObjectActivity, setObjectActivity,
clearObjectActivity, clearObjectActivity,
fetchObjectActivities, fetchObjectActivities,
@ -356,12 +365,9 @@ const ObjectForm = forwardRef(
serverObjectData.current, serverObjectData.current,
model model
) )
const computedValuesObject = buildObjectFromEntries(computedEntries) const resetFormData = applyComputedEntries(
const resetFormData = mergeWith(
{},
serverObjectData.current, serverObjectData.current,
computedValuesObject, computedEntries
arrayReplaceCustomizer
) )
setIsEditing(false) setIsEditing(false)
isEditingRef.current = false isEditingRef.current = false
@ -498,13 +504,7 @@ const ObjectForm = forwardRef(
// Calculate and set computed values on initial load // Calculate and set computed values on initial load
const computedEntries = calculateComputedValues(data, model) const computedEntries = calculateComputedValues(data, model)
const computedValuesObject = buildObjectFromEntries(computedEntries) const initialFormData = applyComputedEntries(data, computedEntries)
const initialFormData = mergeWith(
{},
data,
computedValuesObject,
arrayReplaceCustomizer
)
setObjectData({ ...initialFormData, _isEditing: isEditingRef.current }) setObjectData({ ...initialFormData, _isEditing: isEditingRef.current })
form.setFieldsValue(initialFormData) form.setFieldsValue(initialFormData)
setFetchLoading(false) setFetchLoading(false)
@ -703,17 +703,11 @@ const ObjectForm = forwardRef(
setIsEditing(true) setIsEditing(true)
const computedEntries = calculateComputedValues(objectData, model) const computedEntries = calculateComputedValues(objectData, model)
const computedValuesObject = buildObjectFromEntries(computedEntries)
setObjectData((prev) => ({
...prev,
...computedValuesObject,
_isEditing: true
}))
const nextObjectData = { const nextObjectData = {
...objectData, ...applyComputedEntries(objectData, computedEntries),
...computedValuesObject,
_isEditing: true _isEditing: true
} }
setObjectData(nextObjectData)
onStateChangeRef.current({ onStateChangeRef.current({
isEditing: true, isEditing: true,
objectData: nextObjectData, objectData: nextObjectData,
@ -779,34 +773,10 @@ const ObjectForm = forwardRef(
onStateChangeRef.current({ editLoading: false }) onStateChangeRef.current({ editLoading: false })
} }
const handleDelete = () => {
setDeleteModalOpen(true)
}
const confirmDelete = async () => {
setDeleteLoading(true)
try {
await deleteObject(id, type)
setDeleteModalOpen(false)
showSuccess(`${getModelMessageLabel(type)} deleted successfully!`)
navigate(-2)
// Optionally: trigger a callback to parent to remove this object from view
} catch (err) {
console.error(err)
showError(
`Failed to delete ${getModelMessageLabel(type).toLowerCase()}.`
)
} finally {
setDeleteLoading(false)
}
}
useImperativeHandle(ref, () => ({ useImperativeHandle(ref, () => ({
startEditing, startEditing,
cancelEditing, cancelEditing,
handleUpdate, handleUpdate,
handleDelete,
confirmDelete,
handleFetchObject, handleFetchObject,
editLoading, editLoading,
fetchLoading, fetchLoading,
@ -817,14 +787,6 @@ const ObjectForm = forwardRef(
return ( return (
<> <>
<DeleteObjectModal
open={deleteModalOpen}
onOk={confirmDelete}
onCancel={() => setDeleteModalOpen(false)}
loading={deleteLoading}
objectType={type}
objectName={objectData?.name || objectData?.label || ''}
/>
<Form <Form
form={form} form={form}
layout='vertical' layout='vertical'
@ -868,12 +830,9 @@ const ObjectForm = forwardRef(
}) })
} }
const computedValuesObject = buildObjectFromEntries(computedEntries) const mergedFormValues = applyComputedEntries(
const mergedFormValues = mergeWith(
{},
allFormValues, allFormValues,
computedValuesObject, computedEntries
arrayReplaceCustomizer
) )
mergedFormValues._isEditing = isEditingRef.current mergedFormValues._isEditing = isEditingRef.current
@ -902,8 +861,7 @@ const ObjectForm = forwardRef(
editLoading, editLoading,
editDisabled: getEditDisabled(model, objectData, userProfile), editDisabled: getEditDisabled(model, objectData, userProfile),
activities, activities,
handleFetchObject, handleFetchObject
handleDelete
})} })}
</Form> </Form>
</> </>

View File

@ -460,6 +460,7 @@ const ObjectTable = forwardRef(
disabled={disabled || objectData?.isSkeleton} disabled={disabled || objectData?.isSkeleton}
type={'text'} type={'text'}
size={'small'} size={'small'}
danger={action?.danger || false}
onClick={() => { onClick={() => {
if (denied) return if (denied) return
if ( if (

View File

@ -174,10 +174,9 @@ const ActionsProvider = ({ children }) => {
const [modalCentered, setModalCentered] = useState(false) const [modalCentered, setModalCentered] = useState(false)
useEffect(() => { useEffect(() => {
if (resolvedModalAction?.modalCentered !== undefined) { if (!resolvedModalAction) return
setModalCentered(resolvedModalAction.modalCentered) setModalCentered(resolvedModalAction.modalCentered === true)
} }, [resolvedModalAction])
}, [resolvedModalAction?.modalCentered])
const modalContentData = const modalContentData =
modalAction?.type === 'alias' modalAction?.type === 'alias'

View File

@ -6,6 +6,9 @@ const ClientInfo = lazy(
const NewClient = lazy( const NewClient = lazy(
() => import('../../components/Dashboard/Sales/Clients/NewClient') () => import('../../components/Dashboard/Sales/Clients/NewClient')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import ClientIcon from '../../components/Icons/ClientIcon' import ClientIcon from '../../components/Icons/ClientIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -84,11 +87,15 @@ export const Client = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const CourierInfo = lazy(
const NewCourier = lazy( const NewCourier = lazy(
() => import('../../components/Dashboard/Management/Couriers/NewCourier') () => import('../../components/Dashboard/Management/Couriers/NewCourier')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import CourierIcon from '../../components/Icons/CourierIcon' import CourierIcon from '../../components/Icons/CourierIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -84,11 +87,15 @@ export const Courier = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const CourierServiceInfo = lazy(
const NewCourierService = lazy( const NewCourierService = lazy(
() => import('../../components/Dashboard/Management/CourierServices/NewCourierService') () => import('../../components/Dashboard/Management/CourierServices/NewCourierService')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import CourierServiceIcon from '../../components/Icons/CourierServiceIcon' import CourierServiceIcon from '../../components/Icons/CourierServiceIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -84,11 +87,15 @@ export const CourierService = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const FilamentInfo = lazy(
const NewFilament = lazy( const NewFilament = lazy(
() => import('../../components/Dashboard/Management/Filaments/NewFilament') () => import('../../components/Dashboard/Management/Filaments/NewFilament')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import EditIcon from '../../components/Icons/EditIcon' import EditIcon from '../../components/Icons/EditIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import CheckIcon from '../../components/Icons/CheckIcon' import CheckIcon from '../../components/Icons/CheckIcon'
@ -95,13 +98,17 @@ export const Filament = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true, danger: true,
visible: (objectData) => { visible: (objectData) => {
return !(objectData?._isEditing && objectData?._isEditing == true) return !(objectData?._isEditing && objectData?._isEditing == true)
},
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
} }
} }
], ],

View File

@ -7,6 +7,9 @@ const FilamentProfileInfo = lazy(
const NewFilamentProfile = lazy( const NewFilamentProfile = lazy(
() => import('../../components/Dashboard/Production/FilamentProfiles/NewFilamentProfile') () => import('../../components/Dashboard/Production/FilamentProfiles/NewFilamentProfile')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import FilamentProfileIcon from '../../components/Icons/FilamentProfileIcon' import FilamentProfileIcon from '../../components/Icons/FilamentProfileIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -85,12 +88,16 @@ export const FilamentProfile = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
row: true, row: true,
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const FilamentSkuInfo = lazy(
const NewFilamentSku = lazy( const NewFilamentSku = lazy(
() => import('../../components/Dashboard/Management/FilamentSkus/NewFilamentSku') () => import('../../components/Dashboard/Management/FilamentSkus/NewFilamentSku')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import FilamentSkuIcon from '../../components/Icons/FilamentSkuIcon' import FilamentSkuIcon from '../../components/Icons/FilamentSkuIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -84,11 +87,15 @@ export const FilamentSku = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -3,6 +3,9 @@ import { createElement, lazy } from 'react'
const FileInfo = lazy( const FileInfo = lazy(
() => import('../../components/Dashboard/Management/Files/FileInfo') () => import('../../components/Dashboard/Management/Files/FileInfo')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import DownloadIcon from '../../components/Icons/DownloadIcon' import DownloadIcon from '../../components/Icons/DownloadIcon'
import FileIcon from '../../components/Icons/FileIcon' import FileIcon from '../../components/Icons/FileIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -78,11 +81,15 @@ export const File = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -9,6 +9,9 @@ const NewHost = lazy(
const HostOTP = lazy( const HostOTP = lazy(
() => import('../../components/Dashboard/Management/Hosts/HostOtp') () => import('../../components/Dashboard/Management/Hosts/HostOtp')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import HostIcon from '../../components/Icons/HostIcon' import HostIcon from '../../components/Icons/HostIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -100,11 +103,15 @@ export const Host = {
}, },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -12,6 +12,9 @@ const PostInvoice = lazy(
const AcknowledgeInvoice = lazy( const AcknowledgeInvoice = lazy(
() => import('../../components/Dashboard/Finance/Invoices/AcknowledgeInvoice') () => import('../../components/Dashboard/Finance/Invoices/AcknowledgeInvoice')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import InvoiceIcon from '../../components/Icons/InvoiceIcon' import InvoiceIcon from '../../components/Icons/InvoiceIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -92,8 +95,9 @@ export const Invoice = {
}, },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true, danger: true,
@ -102,6 +106,9 @@ export const Invoice = {
}, },
disabled: (objectData) => { disabled: (objectData) => {
return objectData?.state?.type != 'draft' return objectData?.state?.type != 'draft'
},
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
} }
}, },
{ type: 'divider' }, { type: 'divider' },

View File

@ -9,6 +9,9 @@ const NewJob = lazy(
const DeployJob = lazy( const DeployJob = lazy(
() => import('../../components/Dashboard/Production/Jobs/DeployJob') () => import('../../components/Dashboard/Production/Jobs/DeployJob')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import JobIcon from '../../components/Icons/JobIcon' import JobIcon from '../../components/Icons/JobIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -90,8 +93,9 @@ export const Job = {
}, },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true, danger: true,
@ -100,6 +104,9 @@ export const Job = {
}, },
disabled: (objectData) => { disabled: (objectData) => {
return objectData?.state?.type != 'draft' return objectData?.state?.type != 'draft'
},
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
} }
}, },
{ type: 'divider' }, { type: 'divider' },

View File

@ -12,6 +12,9 @@ const PublishListing = lazy(
const UnpublishListing = lazy( const UnpublishListing = lazy(
() => import('../../components/Dashboard/Sales/Listings/UnpublishListing') () => import('../../components/Dashboard/Sales/Listings/UnpublishListing')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import ListingIcon from '../../components/Icons/ListingIcon' import ListingIcon from '../../components/Icons/ListingIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -126,11 +129,15 @@ export const Listing = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -12,6 +12,9 @@ const PublishListingVarient = lazy(
const UnpublishListingVarient = lazy( const UnpublishListingVarient = lazy(
() => import('../../components/Dashboard/Sales/ListingVarients/UnpublishListingVarient') () => import('../../components/Dashboard/Sales/ListingVarients/UnpublishListingVarient')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import ListingVarientIcon from '../../components/Icons/ListingVarientIcon' import ListingVarientIcon from '../../components/Icons/ListingVarientIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -118,11 +121,15 @@ export const ListingVarient = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -12,6 +12,9 @@ const SyncListings = lazy(
const SyncOrders = lazy( const SyncOrders = lazy(
() => import('../../components/Dashboard/Sales/Marketplaces/SyncOrders') () => import('../../components/Dashboard/Sales/Marketplaces/SyncOrders')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import MarketplaceIcon from '../../components/Icons/MarketplaceIcon' import MarketplaceIcon from '../../components/Icons/MarketplaceIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -154,11 +157,15 @@ export const Marketplace = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const MaterialInfo = lazy(
const NewMaterial = lazy( const NewMaterial = lazy(
() => import('../../components/Dashboard/Management/Materials/NewMaterial') () => import('../../components/Dashboard/Management/Materials/NewMaterial')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import MaterialIcon from '../../components/Icons/MaterialIcon' import MaterialIcon from '../../components/Icons/MaterialIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -84,11 +87,15 @@ export const Material = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const OrderItemInfo = lazy(
const NewOrderItem = lazy( const NewOrderItem = lazy(
() => import('../../components/Dashboard/Inventory/OrderItems/NewOrderItem') () => import('../../components/Dashboard/Inventory/OrderItems/NewOrderItem')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import OrderItemIcon from '../../components/Icons/OrderItemIcon' import OrderItemIcon from '../../components/Icons/OrderItemIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -31,7 +34,11 @@ export const OrderItem = {
label: 'New Order Item', label: 'New Order Item',
icon: PlusIcon, icon: PlusIcon,
content: (objectData, { onOk } = {}) => { content: (objectData, { onOk } = {}) => {
return createElement(NewOrderItem, { defaultValues: objectData, onOk, reset: true }) return createElement(NewOrderItem, {
defaultValues: objectData,
onOk,
reset: true
})
} }
}, },
{ {
@ -86,9 +93,11 @@ export const OrderItem = {
}, },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
row: true,
icon: BinIcon, icon: BinIcon,
danger: true, danger: true,
visible: (objectData) => { visible: (objectData) => {
@ -96,6 +105,9 @@ export const OrderItem = {
}, },
disabled: (objectData) => { disabled: (objectData) => {
return objectData?.state?.type != 'draft' return objectData?.state?.type != 'draft'
},
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
} }
} }
], ],

View File

@ -6,6 +6,9 @@ const PartSkuInfo = lazy(
const NewPartSku = lazy( const NewPartSku = lazy(
() => import('../../components/Dashboard/Management/PartSkus/NewPartSku') () => import('../../components/Dashboard/Management/PartSkus/NewPartSku')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import PartSkuIcon from '../../components/Icons/PartSkuIcon' import PartSkuIcon from '../../components/Icons/PartSkuIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -84,11 +87,15 @@ export const PartSku = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -18,6 +18,9 @@ const DeclinePayment = lazy(
const CancelPayment = lazy( const CancelPayment = lazy(
() => import('../../components/Dashboard/Finance/Payments/CancelPayment') () => import('../../components/Dashboard/Finance/Payments/CancelPayment')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import PaymentIcon from '../../components/Icons/PaymentIcon' import PaymentIcon from '../../components/Icons/PaymentIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -98,8 +101,9 @@ export const Payment = {
}, },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true, danger: true,
@ -108,6 +112,9 @@ export const Payment = {
}, },
disabled: (objectData) => { disabled: (objectData) => {
return objectData?.state?.type != 'draft' return objectData?.state?.type != 'draft'
},
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
} }
}, },
{ type: 'divider' }, { type: 'divider' },

View File

@ -7,6 +7,9 @@ const PermissionSettingInfo = lazy(
const NewPermissionSetting = lazy( const NewPermissionSetting = lazy(
() => import('../../components/Dashboard/Management/PermissionSettings/NewPermissionSetting') () => import('../../components/Dashboard/Management/PermissionSettings/NewPermissionSetting')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import PermissionSettingIcon from '../../components/Icons/PermissionSettingIcon' import PermissionSettingIcon from '../../components/Icons/PermissionSettingIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -86,11 +89,15 @@ export const PermissionSetting = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const PrinterProfileInfo = lazy(
const NewPrinterProfile = lazy( const NewPrinterProfile = lazy(
() => import('../../components/Dashboard/Production/PrinterProfiles/NewPrinterProfile') () => import('../../components/Dashboard/Production/PrinterProfiles/NewPrinterProfile')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import PrinterProfileIcon from '../../components/Icons/PrinterProfileIcon' import PrinterProfileIcon from '../../components/Icons/PrinterProfileIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -349,12 +352,16 @@ export const PrinterProfile = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
row: true, row: true,
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const ProductCategoryInfo = lazy(
const NewProductCategory = lazy( const NewProductCategory = lazy(
() => import('../../components/Dashboard/Management/ProductCategories/NewProductCategory') () => import('../../components/Dashboard/Management/ProductCategories/NewProductCategory')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import ProductCategoryIcon from '../../components/Icons/ProductCategoryIcon' import ProductCategoryIcon from '../../components/Icons/ProductCategoryIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -85,11 +88,15 @@ export const ProductCategory = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const ProductSkuInfo = lazy(
const NewProductSku = lazy( const NewProductSku = lazy(
() => import('../../components/Dashboard/Management/ProductSkus/NewProductSku') () => import('../../components/Dashboard/Management/ProductSkus/NewProductSku')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import ProductSkuIcon from '../../components/Icons/ProductSkuIcon' import ProductSkuIcon from '../../components/Icons/ProductSkuIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -84,11 +87,15 @@ export const ProductSku = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -9,6 +9,9 @@ const NewProductStock = lazy(
const PostProductStock = lazy( const PostProductStock = lazy(
() => import('../../components/Dashboard/Inventory/ProductStocks/PostProductStock') () => import('../../components/Dashboard/Inventory/ProductStocks/PostProductStock')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import ProductStockIcon from '../../components/Icons/ProductStockIcon' import ProductStockIcon from '../../components/Icons/ProductStockIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import { getModelByName } from '../ObjectModels.js' import { getModelByName } from '../ObjectModels.js'
@ -90,8 +93,9 @@ export const ProductStock = {
}, },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true, danger: true,
@ -100,6 +104,9 @@ export const ProductStock = {
}, },
disabled: (objectData) => { disabled: (objectData) => {
return objectData?.state?.type != 'draft' return objectData?.state?.type != 'draft'
},
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
} }
}, },
{ type: 'divider' }, { type: 'divider' },

View File

@ -15,6 +15,9 @@ const AcknowledgePurchaseOrder = lazy(
const CancelPurchaseOrder = lazy( const CancelPurchaseOrder = lazy(
() => import('../../components/Dashboard/Inventory/PurchaseOrders/CancelPurchaseOrder') () => import('../../components/Dashboard/Inventory/PurchaseOrders/CancelPurchaseOrder')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import PurchaseOrderIcon from '../../components/Icons/PurchaseOrderIcon' import PurchaseOrderIcon from '../../components/Icons/PurchaseOrderIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -95,8 +98,9 @@ export const PurchaseOrder = {
}, },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true, danger: true,
@ -105,6 +109,9 @@ export const PurchaseOrder = {
}, },
disabled: (objectData) => { disabled: (objectData) => {
return objectData?.state?.type != 'draft' return objectData?.state?.type != 'draft'
},
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
} }
}, },
{ type: 'divider' }, { type: 'divider' },

View File

@ -15,6 +15,9 @@ const ConfirmSalesOrder = lazy(
const CancelSalesOrder = lazy( const CancelSalesOrder = lazy(
() => import('../../components/Dashboard/Sales/SalesOrders/CancelSalesOrder') () => import('../../components/Dashboard/Sales/SalesOrders/CancelSalesOrder')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import SalesOrderIcon from '../../components/Icons/SalesOrderIcon' import SalesOrderIcon from '../../components/Icons/SalesOrderIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -95,8 +98,9 @@ export const SalesOrder = {
}, },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true, danger: true,
@ -105,6 +109,9 @@ export const SalesOrder = {
}, },
disabled: (objectData) => { disabled: (objectData) => {
return objectData?.state?.type != 'draft' return objectData?.state?.type != 'draft'
},
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
} }
}, },
{ type: 'divider' }, { type: 'divider' },

View File

@ -15,6 +15,9 @@ const ReceiveShipment = lazy(
const CancelShipment = lazy( const CancelShipment = lazy(
() => import('../../components/Dashboard/Inventory/Shipments/CancelShipment') () => import('../../components/Dashboard/Inventory/Shipments/CancelShipment')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import ShipmentIcon from '../../components/Icons/ShipmentIcon' import ShipmentIcon from '../../components/Icons/ShipmentIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -95,8 +98,9 @@ export const Shipment = {
}, },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true, danger: true,
@ -105,6 +109,9 @@ export const Shipment = {
}, },
disabled: (objectData) => { disabled: (objectData) => {
return objectData?.state?.type != 'draft' return objectData?.state?.type != 'draft'
},
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
} }
}, },
{ type: 'divider' }, { type: 'divider' },

View File

@ -9,6 +9,9 @@ const NewStockTransfer = lazy(
const PostStockTransfer = lazy( const PostStockTransfer = lazy(
() => import('../../components/Dashboard/Inventory/StockTransfers/PostStockTransfer') () => import('../../components/Dashboard/Inventory/StockTransfers/PostStockTransfer')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import StockTransferIcon from '../../components/Icons/StockTransferIcon' import StockTransferIcon from '../../components/Icons/StockTransferIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -89,8 +92,9 @@ export const StockTransfer = {
}, },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true, danger: true,
@ -99,6 +103,9 @@ export const StockTransfer = {
}, },
disabled: (objectData) => { disabled: (objectData) => {
return objectData?.state?.type != 'draft' return objectData?.state?.type != 'draft'
},
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
} }
}, },
{ type: 'divider' }, { type: 'divider' },

View File

@ -6,6 +6,9 @@ const TaxRateInfo = lazy(
const NewTaxRate = lazy( const NewTaxRate = lazy(
() => import('../../components/Dashboard/Management/TaxRates/NewTaxRate') () => import('../../components/Dashboard/Management/TaxRates/NewTaxRate')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import TaxRateIcon from '../../components/Icons/TaxRateIcon' import TaxRateIcon from '../../components/Icons/TaxRateIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -84,11 +87,15 @@ export const TaxRate = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const TaxRecordInfo = lazy(
const NewTaxRecord = lazy( const NewTaxRecord = lazy(
() => import('../../components/Dashboard/Finance/TaxRecords/NewTaxRecord') () => import('../../components/Dashboard/Finance/TaxRecords/NewTaxRecord')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import TaxRecordIcon from '../../components/Icons/TaxRecordIcon' import TaxRecordIcon from '../../components/Icons/TaxRecordIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -84,11 +87,15 @@ export const TaxRecord = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const UserGroupInfo = lazy(
const NewUserGroup = lazy( const NewUserGroup = lazy(
() => import('../../components/Dashboard/Management/UserGroups/NewUserGroup') () => import('../../components/Dashboard/Management/UserGroups/NewUserGroup')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import PersonGroupIcon from '../../components/Icons/PersonGroupIcon' import PersonGroupIcon from '../../components/Icons/PersonGroupIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -85,11 +88,15 @@ export const UserGroup = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [

View File

@ -6,6 +6,9 @@ const VendorInfo = lazy(
const NewVendor = lazy( const NewVendor = lazy(
() => import('../../components/Dashboard/Management/Vendors/NewVendor') () => import('../../components/Dashboard/Management/Vendors/NewVendor')
) )
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import VendorIcon from '../../components/Icons/VendorIcon' import VendorIcon from '../../components/Icons/VendorIcon'
import PlusIcon from '../../components/Icons/PlusIcon' import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
@ -84,11 +87,15 @@ export const Vendor = {
{ type: 'divider' }, { type: 'divider' },
{ {
name: 'delete', name: 'delete',
type: 'page', type: 'modal',
pageName: 'info', modalWidth: 520,
modalCentered: true,
label: 'Delete', label: 'Delete',
icon: BinIcon, icon: BinIcon,
danger: true danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
} }
], ],
pages: [ pages: [