Compare commits

..

4 Commits

Author SHA1 Message Date
a41f168adc Refactor ShipmentInfo and PurchaseOrder Models for Improved Clarity and Functionality
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
- Updated ShipmentInfo component to enhance code readability by adjusting label widths and formatting masterFilter properties.
- Refactored PurchaseOrder model to spread objectData properties, improving data handling and consistency across order-related functionalities.
2026-09-01 16:49:39 +01:00
9b309aa61c Add Stock Audit and Stock Event Sections to Inventory Components
- Introduced new sections for Filament Stocks, Part Stocks, Product Stocks, and Stock Audits in the StockLocationInfo component, enhancing inventory visibility.
- Added Stock Events section to the StockTransferInfo component, improving data representation for stock transfers.
- Updated StockAuditLevelInfo component to include Stock Audits, ensuring comprehensive audit management.
- Enhanced state management and UI elements for better user experience across all components.
2026-09-01 16:35:09 +01:00
6800702881 Add Stock Events Section to Stock Audit Info Component
- Introduced StockEventIcon and added a new section for Stock Events in the StockAuditInfo component.
- Updated the collapse state management to include stock events, enhancing the user interface and data visibility.
- Modified the ObjectTable to display stock events related to the selected stock audit, improving data representation and user experience.
2026-09-01 16:34:58 +01:00
3475c1b35d Add padding to table cells in App.css for improved layout consistency 2026-09-01 16:34:49 +01:00
9 changed files with 236 additions and 13 deletions

View File

@ -2306,3 +2306,12 @@ span.ant-skeleton-input.ant-skeleton-input-sm.text-skeleton {
font-size: 18px; font-size: 18px;
color: var(--color-primary); color: var(--color-primary);
} }
.ant-table-wrapper .ant-table-cell,
.ant-table-wrapper .ant-table-thead > tr > th,
.ant-table-wrapper .ant-table-tbody > tr > th,
.ant-table-wrapper .ant-table-tbody > tr > td,
.ant-table-wrapper tfoot > tr > th,
.ant-table-wrapper tfoot > tr > td {
padding: 12px 8px;
}

View File

@ -87,7 +87,7 @@ const ShipmentInfo = () => {
finishEdit: () => { finishEdit: () => {
objectFormRef?.current?.handleUpdate?.() objectFormRef?.current?.handleUpdate?.()
return true return true
}, }
} }
return ( return (
@ -196,7 +196,7 @@ const ShipmentInfo = () => {
visibleProperties={{ visibleProperties={{
items: false items: false
}} }}
labelWidth='175px' labelWidth='285px'
/> />
</InfoCollapse> </InfoCollapse>
<InfoCollapse <InfoCollapse
@ -210,7 +210,10 @@ const ShipmentInfo = () => {
> >
<ObjectTable <ObjectTable
type='orderItem' type='orderItem'
masterFilter={{ shipment: getModelByName('shipment').prefix + ':' + shipmentId }} masterFilter={{
shipment:
getModelByName('shipment').prefix + ':' + shipmentId
}}
visibleColumns={{ visibleColumns={{
shipment: false, shipment: false,
order: false, order: false,
@ -234,7 +237,7 @@ const ShipmentInfo = () => {
indicator={<LoadingOutlined />} indicator={<LoadingOutlined />}
> >
<Card> <Card>
<NotesPanel _id={shipmentId} type='shipment' /> <NotesPanel _id={shipmentId} type='shipment' />
</Card> </Card>
</Spin> </Spin>
</InfoCollapse> </InfoCollapse>
@ -251,10 +254,7 @@ const ShipmentInfo = () => {
<ObjectTable <ObjectTable
type='auditLog' type='auditLog'
masterFilter={{ masterFilter={{
parent: parent: getModelByName('shipment').prefix + ':' + shipmentId
getModelByName('shipment').prefix +
':' +
shipmentId
}} }}
visibleColumns={{ _id: false, parent: false }} visibleColumns={{ _id: false, parent: false }}
/> />

View File

@ -14,6 +14,7 @@ import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx'
import NoteIcon from '../../../Icons/NoteIcon.jsx' import NoteIcon from '../../../Icons/NoteIcon.jsx'
import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx' import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx'
import StockAuditIcon from '../../../Icons/StockAuditIcon.jsx' import StockAuditIcon from '../../../Icons/StockAuditIcon.jsx'
import StockEventIcon from '../../../Icons/StockEventIcon.jsx'
import ObjectForm from '../../common/ObjectForm.jsx' import ObjectForm from '../../common/ObjectForm.jsx'
import EditButtons from '../../common/EditButtons.jsx' import EditButtons from '../../common/EditButtons.jsx'
import ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx' import ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx'
@ -41,6 +42,7 @@ const StockAuditInfo = () => {
{ {
info: true, info: true,
auditLines: true, auditLines: true,
stockEvents: true,
notes: true, notes: true,
auditLogs: false auditLogs: false
} }
@ -108,6 +110,7 @@ const StockAuditInfo = () => {
items={[ items={[
{ key: 'info', label: 'Stock Audit Information' }, { key: 'info', label: 'Stock Audit Information' },
{ key: 'auditLines', label: 'Audit Lines' }, { key: 'auditLines', label: 'Audit Lines' },
{ key: 'stockEvents', label: 'Stock Events' },
{ key: 'notes', label: 'Notes' }, { key: 'notes', label: 'Notes' },
{ key: 'auditLogs', label: 'Audit Logs' } { key: 'auditLogs', label: 'Audit Logs' }
]} ]}
@ -212,6 +215,32 @@ const StockAuditInfo = () => {
</ObjectForm> </ObjectForm>
</ActionHandler> </ActionHandler>
<InfoCollapse
title='Stock Events'
icon={<StockEventIcon />}
active={collapseState.stockEvents}
onToggle={(expanded) =>
updateCollapseState('stockEvents', expanded)
}
collapseKey='stockEvents'
>
{objectFormState.loading ? (
<InfoCollapsePlaceholder />
) : (
<ObjectTable
type='stockEvent'
masterFilter={{
owner:
getModelByName('stockAudit').prefix + ':' + stockAuditId
}}
visibleColumns={{
owner: false,
'owner.type': false
}}
/>
)}
</InfoCollapse>
<InfoCollapse <InfoCollapse
title='Notes' title='Notes'
icon={<NoteIcon />} icon={<NoteIcon />}

View File

@ -12,6 +12,10 @@ import ViewButton from '../../common/ViewButton.jsx'
import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx' import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx'
import NoteIcon from '../../../Icons/NoteIcon.jsx' import NoteIcon from '../../../Icons/NoteIcon.jsx'
import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx' import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx'
import StockAuditIcon from '../../../Icons/StockAuditIcon.jsx'
import FilamentStockIcon from '../../../Icons/FilamentStockIcon.jsx'
import PartStockIcon from '../../../Icons/PartStockIcon.jsx'
import ProductStockIcon from '../../../Icons/ProductStockIcon.jsx'
import ObjectForm from '../../common/ObjectForm.jsx' import ObjectForm from '../../common/ObjectForm.jsx'
import EditButtons from '../../common/EditButtons.jsx' import EditButtons from '../../common/EditButtons.jsx'
import ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx' import ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx'
@ -40,6 +44,10 @@ const StockLocationInfo = () => {
'StockLocationInfo', 'StockLocationInfo',
{ {
info: true, info: true,
filamentStocks: true,
partStocks: true,
productStocks: true,
stockAudits: true,
notes: true, notes: true,
auditLogs: false auditLogs: false
} }
@ -107,6 +115,10 @@ const StockLocationInfo = () => {
disabled={objectFormState.loading} disabled={objectFormState.loading}
items={[ items={[
{ key: 'info', label: 'Stock Location' }, { key: 'info', label: 'Stock Location' },
{ key: 'filamentStocks', label: 'Filament Stocks' },
{ key: 'partStocks', label: 'Part Stocks' },
{ key: 'productStocks', label: 'Product Stocks' },
{ key: 'stockAudits', label: 'Stock Audits' },
{ key: 'notes', label: 'Notes' }, { key: 'notes', label: 'Notes' },
{ key: 'auditLogs', label: 'Audit Logs' } { key: 'auditLogs', label: 'Audit Logs' }
]} ]}
@ -193,6 +205,118 @@ const StockLocationInfo = () => {
</InfoCollapse> </InfoCollapse>
</ActionHandler> </ActionHandler>
<InfoCollapse
title='Filament Stocks'
icon={<FilamentStockIcon />}
active={collapseState.filamentStocks}
onToggle={(expanded) =>
updateCollapseState('filamentStocks', expanded)
}
collapseKey='filamentStocks'
>
{objectFormState.loading ? (
<InfoCollapsePlaceholder />
) : (
<ObjectTable
type='filamentStock'
masterFilter={{
stockLocation:
getModelByName('stockLocation').prefix +
':' +
stockLocationId
}}
visibleColumns={{
stockLocation: false,
'stockLocation._id': false
}}
/>
)}
</InfoCollapse>
<InfoCollapse
title='Part Stocks'
icon={<PartStockIcon />}
active={collapseState.partStocks}
onToggle={(expanded) =>
updateCollapseState('partStocks', expanded)
}
collapseKey='partStocks'
>
{objectFormState.loading ? (
<InfoCollapsePlaceholder />
) : (
<ObjectTable
type='partStock'
masterFilter={{
stockLocation:
getModelByName('stockLocation').prefix +
':' +
stockLocationId
}}
visibleColumns={{
stockLocation: false,
'stockLocation._id': false
}}
/>
)}
</InfoCollapse>
<InfoCollapse
title='Product Stocks'
icon={<ProductStockIcon />}
active={collapseState.productStocks}
onToggle={(expanded) =>
updateCollapseState('productStocks', expanded)
}
collapseKey='productStocks'
>
{objectFormState.loading ? (
<InfoCollapsePlaceholder />
) : (
<ObjectTable
type='productStock'
masterFilter={{
stockLocation:
getModelByName('stockLocation').prefix +
':' +
stockLocationId
}}
visibleColumns={{
stockLocation: false,
'stockLocation._id': false
}}
/>
)}
</InfoCollapse>
<InfoCollapse
title='Stock Audits'
icon={<StockAuditIcon />}
active={collapseState.stockAudits}
onToggle={(expanded) =>
updateCollapseState('stockAudits', expanded)
}
collapseKey='stockAudits'
>
{objectFormState.loading ? (
<InfoCollapsePlaceholder />
) : (
<ObjectTable
type='stockAudit'
masterFilter={{
stockLocation:
getModelByName('stockLocation').prefix +
':' +
stockLocationId
}}
visibleColumns={{
stockLocation: false,
'stockLocation._id': false
}}
/>
)}
</InfoCollapse>
<InfoCollapse <InfoCollapse
title='Notes' title='Notes'
icon={<NoteIcon />} icon={<NoteIcon />}

View File

@ -13,6 +13,7 @@ import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx'
import NoteIcon from '../../../Icons/NoteIcon.jsx' import NoteIcon from '../../../Icons/NoteIcon.jsx'
import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx' import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx'
import StockTransferIcon from '../../../Icons/StockTransferIcon.jsx' import StockTransferIcon from '../../../Icons/StockTransferIcon.jsx'
import StockEventIcon from '../../../Icons/StockEventIcon.jsx'
import ObjectForm from '../../common/ObjectForm.jsx' import ObjectForm from '../../common/ObjectForm.jsx'
import EditButtons from '../../common/EditButtons.jsx' import EditButtons from '../../common/EditButtons.jsx'
import ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx' import ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx'
@ -47,6 +48,7 @@ const StockTransferInfo = () => {
{ {
info: true, info: true,
lines: true, lines: true,
stockEvents: true,
notes: true, notes: true,
auditLogs: false auditLogs: false
} }
@ -114,6 +116,7 @@ const StockTransferInfo = () => {
items={[ items={[
{ key: 'info', label: 'Transfer' }, { key: 'info', label: 'Transfer' },
{ key: 'lines', label: 'Lines' }, { key: 'lines', label: 'Lines' },
{ key: 'stockEvents', label: 'Stock Events' },
{ key: 'notes', label: 'Notes' }, { key: 'notes', label: 'Notes' },
{ key: 'auditLogs', label: 'Audit Logs' } { key: 'auditLogs', label: 'Audit Logs' }
]} ]}
@ -220,6 +223,34 @@ const StockTransferInfo = () => {
</ObjectForm> </ObjectForm>
</ActionHandler> </ActionHandler>
<InfoCollapse
title='Stock Events'
icon={<StockEventIcon />}
active={collapseState.stockEvents}
onToggle={(expanded) =>
updateCollapseState('stockEvents', expanded)
}
collapseKey='stockEvents'
>
{objectFormState.loading ? (
<InfoCollapsePlaceholder />
) : (
<ObjectTable
type='stockEvent'
masterFilter={{
owner:
getModelByName('stockTransfer').prefix +
':' +
stockTransferId
}}
visibleColumns={{
owner: false,
'owner.type': false
}}
/>
)}
</InfoCollapse>
<InfoCollapse <InfoCollapse
title='Notes' title='Notes'
icon={<NoteIcon />} icon={<NoteIcon />}

View File

@ -10,6 +10,7 @@ import ViewButton from '../../common/ViewButton'
import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx' import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx'
import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx' import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx'
import StockAuditLevelIcon from '../../../Icons/StockAuditLevelIcon.jsx' import StockAuditLevelIcon from '../../../Icons/StockAuditLevelIcon.jsx'
import StockAuditIcon from '../../../Icons/StockAuditIcon.jsx'
import ObjectForm from '../../common/ObjectForm' import ObjectForm from '../../common/ObjectForm'
import EditButtons from '../../common/EditButtons' import EditButtons from '../../common/EditButtons'
import ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx' import ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx'
@ -36,6 +37,7 @@ const StockAuditLevelInfo = () => {
{ {
info: true, info: true,
auditLines: true, auditLines: true,
stockAudits: true,
auditLogs: false auditLogs: false
} }
) )
@ -97,6 +99,7 @@ const StockAuditLevelInfo = () => {
items={[ items={[
{ key: 'info', label: 'Stock Audit Level Information' }, { key: 'info', label: 'Stock Audit Level Information' },
{ key: 'auditLines', label: 'Audit Lines' }, { key: 'auditLines', label: 'Audit Lines' },
{ key: 'stockAudits', label: 'Stock Audits' },
{ key: 'auditLogs', label: 'Audit Logs' } { key: 'auditLogs', label: 'Audit Logs' }
]} ]}
visibleState={collapseState} visibleState={collapseState}
@ -198,6 +201,33 @@ const StockAuditLevelInfo = () => {
)} )}
</ObjectForm> </ObjectForm>
</ActionHandler> </ActionHandler>
<InfoCollapse
title='Stock Audits'
icon={<StockAuditIcon />}
active={collapseState.stockAudits}
onToggle={(expanded) =>
updateCollapseState('stockAudits', expanded)
}
collapseKey='stockAudits'
>
{objectFormState.loading ? (
<InfoCollapsePlaceholder />
) : (
<ObjectTable
type='stockAudit'
masterFilter={{
auditLevel:
getModelByName('stockAuditLevel').prefix +
':' +
stockAuditLevelId
}}
visibleColumns={{
auditLevel: false,
'auditLevel._id': false
}}
/>
)}
</InfoCollapse>
<InfoCollapse <InfoCollapse
title='Audit Logs' title='Audit Logs'
icon={<AuditLogIcon />} icon={<AuditLogIcon />}

View File

@ -133,7 +133,7 @@ export const PurchaseOrder = {
return objectData?.state?.type != 'draft' return objectData?.state?.type != 'draft'
}, },
objectData: (objectData) => ({ objectData: (objectData) => ({
order: { _id: objectData._id }, order: { ...objectData },
orderType: 'purchaseOrder', orderType: 'purchaseOrder',
syncAmount: 'itemCost' syncAmount: 'itemCost'
}) })
@ -148,7 +148,7 @@ export const PurchaseOrder = {
}, },
objectData: (objectData) => ({ objectData: (objectData) => ({
orderType: 'purchaseOrder', orderType: 'purchaseOrder',
order: { _id: objectData._id } order: { ...objectData }
}) })
}, },
{ {
@ -167,7 +167,7 @@ export const PurchaseOrder = {
}, },
objectData: (objectData) => ({ objectData: (objectData) => ({
orderType: 'purchaseOrder', orderType: 'purchaseOrder',
order: objectData order: { ...objectData }
}) })
}, },
{ {

View File

@ -35,7 +35,7 @@ export const StockAudit = {
name: 'new', name: 'new',
type: 'modal', type: 'modal',
pageName: 'list', pageName: 'list',
modalWidth: 800, modalWidth: 700,
label: 'New Stock Audit', label: 'New Stock Audit',
icon: PlusIcon, icon: PlusIcon,
content: (objectData, { onOk } = {}) => { content: (objectData, { onOk } = {}) => {

View File

@ -32,7 +32,7 @@ export const StockAuditLevel = {
name: 'new', name: 'new',
type: 'modal', type: 'modal',
pageName: 'list', pageName: 'list',
modalWidth: 900, modalWidth: 700,
label: 'New Stock Audit Level', label: 'New Stock Audit Level',
icon: PlusIcon, icon: PlusIcon,
content: (objectData, { onOk } = {}) => { content: (objectData, { onOk } = {}) => {