Compare commits

...

2 Commits

Author SHA1 Message Date
eea7e1f724 Add InfoActionButtons to Various Dashboard Components
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
- Integrated InfoActionButtons into multiple components across the Finance and Inventory sections, enhancing user interaction and providing contextual actions for invoices, payment policies, payments, tax records, and various inventory items.
- Updated the respective components to include the new buttons with appropriate object types and list mode settings, improving the overall functionality and user experience in the dashboard.
2026-09-14 23:33:03 +01:00
8adf2d7847 Refactor HostDeviceScanner for Enhanced Scanning Logic and State Management
- Introduced refs to manage scanning state and active host ID, improving control over scan initiation and termination.
- Updated useEffect to handle scanning conditions more effectively, including debouncing stop scan actions.
- Enhanced session management and error handling during network scans, ensuring better user feedback and reliability.
- Cleaned up component lifecycle management to prevent memory leaks and ensure proper resource cleanup.
2026-09-14 23:11:21 +01:00
68 changed files with 487 additions and 94 deletions

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -48,6 +49,7 @@ const Invoices = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='invoice' /> <ExportListButton objectType='invoice' />
<InfoActionButtons type='invoice' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -48,6 +49,7 @@ const PaymentPolicies = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='paymentPolicy' /> <ExportListButton objectType='paymentPolicy' />
<InfoActionButtons type='paymentPolicy' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const Payments = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='payment' /> <ExportListButton objectType='payment' />
<InfoActionButtons type='payment' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const TaxRecords = () => {
updateCollapseState={setColumnVisibility} updateCollapseState={setColumnVisibility}
/> />
<ExportListButton objectType='taxRecord' /> <ExportListButton objectType='taxRecord' />
<InfoActionButtons type='taxRecord' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -15,6 +15,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -56,6 +57,7 @@ const FilamentStocks = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='filamentStock' /> <ExportListButton objectType='filamentStock' />
<InfoActionButtons type='filamentStock' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const OrderItems = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='orderItem' /> <ExportListButton objectType='orderItem' />
<InfoActionButtons type='orderItem' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -15,6 +15,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -56,6 +57,7 @@ const PartStocks = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='partStock' /> <ExportListButton objectType='partStock' />
<InfoActionButtons type='partStock' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -16,6 +16,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -57,6 +58,7 @@ const ProductStocks = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='productStock' /> <ExportListButton objectType='productStock' />
<InfoActionButtons type='productStock' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const PurchaseOrders = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='purchaseOrder' /> <ExportListButton objectType='purchaseOrder' />
<InfoActionButtons type='purchaseOrder' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const Shipments = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='shipment' /> <ExportListButton objectType='shipment' />
<InfoActionButtons type='shipment' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -15,6 +15,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -56,6 +57,7 @@ const StockAudits = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='stockAudit' /> <ExportListButton objectType='stockAudit' />
<InfoActionButtons type='stockAudit' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const StockEvents = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='stockEvent' /> <ExportListButton objectType='stockEvent' />
<InfoActionButtons type='stockEvent' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -13,6 +13,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -54,6 +55,7 @@ const StockLocations = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='stockLocation' /> <ExportListButton objectType='stockLocation' />
<InfoActionButtons type='stockLocation' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -13,6 +13,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -54,6 +55,7 @@ const StockTransfers = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='stockTransfer' /> <ExportListButton objectType='stockTransfer' />
<InfoActionButtons type='stockTransfer' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import SortSidebarButton from '../common/SortSidebarButton'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -51,6 +52,7 @@ const AppPasswords = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='appPassword' /> <ExportListButton objectType='appPassword' />
<InfoActionButtons type='appPassword' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import FilterSidebarButton from '../common/FilterSidebarButton'
import SortSidebarButton from '../common/SortSidebarButton' import SortSidebarButton from '../common/SortSidebarButton'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import ObjectTableViewButton from '../common/ObjectTableViewButton' import ObjectTableViewButton from '../common/ObjectTableViewButton'
@ -49,6 +50,7 @@ const AuditLogs = () => {
updateVisibleState={updateColumnVisibility} updateVisibleState={updateColumnVisibility}
/> />
<ExportListButton objectType='auditLog' /> <ExportListButton objectType='auditLog' />
<InfoActionButtons type='auditLog' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const CourierServices = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='courierService' /> <ExportListButton objectType='courierService' />
<InfoActionButtons type='courierService' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -51,6 +52,7 @@ const Couriers = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='courier' /> <ExportListButton objectType='courier' />
<InfoActionButtons type='courier' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const DocumentJobs = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='documentJob' /> <ExportListButton objectType='documentJob' />
<InfoActionButtons type='documentJob' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -8,6 +8,7 @@ import { ApiServerContext } from '../../context/ApiServerContext'
import { useCallback, useContext, useEffect, useRef, useState } from 'react' import { useCallback, useContext, useEffect, useRef, useState } from 'react'
import { Modal } from 'antd' import { Modal } from 'antd'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { toTemplateObjectData } from '../../utils/templateObjectData'
const NewDocumentJob = ({ onOk, defaultValues = {} }) => { const NewDocumentJob = ({ onOk, defaultValues = {} }) => {
const { const {
@ -125,7 +126,7 @@ const NewDocumentJob = ({ onOk, defaultValues = {} }) => {
}} }}
> >
<TemplatePreview <TemplatePreview
objectData={objectData?.object} objectData={toTemplateObjectData(objectData?.objects)}
documentTemplate={objectData?.documentTemplate} documentTemplate={objectData?.documentTemplate}
/> />
</div> </div>
@ -158,7 +159,7 @@ const NewDocumentJob = ({ onOk, defaultValues = {} }) => {
downloadTemplate( downloadTemplate(
objectData.documentTemplate._id, objectData.documentTemplate._id,
objectData.documentTemplate.content, objectData.documentTemplate.content,
objectData.object, toTemplateObjectData(objectData.objects),
fileName, fileName,
'pdf', 'pdf',
() => { () => {
@ -175,7 +176,7 @@ const NewDocumentJob = ({ onOk, defaultValues = {} }) => {
downloadTemplate( downloadTemplate(
objectData.documentTemplate._id, objectData.documentTemplate._id,
objectData.documentTemplate.content, objectData.documentTemplate.content,
objectData.object, toTemplateObjectData(objectData.objects),
fileName, fileName,
'png', 'png',
() => { () => {
@ -192,7 +193,7 @@ const NewDocumentJob = ({ onOk, defaultValues = {} }) => {
downloadTemplate( downloadTemplate(
objectData.documentTemplate._id, objectData.documentTemplate._id,
objectData.documentTemplate.content, objectData.documentTemplate.content,
objectData.object, toTemplateObjectData(objectData.objects),
fileName, fileName,
'jpeg', 'jpeg',
() => { () => {
@ -209,7 +210,7 @@ const NewDocumentJob = ({ onOk, defaultValues = {} }) => {
downloadTemplate( downloadTemplate(
objectData.documentTemplate._id, objectData.documentTemplate._id,
objectData.documentTemplate.content, objectData.documentTemplate.content,
objectData.object, toTemplateObjectData(objectData.objects),
fileName, fileName,
'svg', 'svg',
() => { () => {

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const DocumentPrinters = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='documentPrinter' /> <ExportListButton objectType='documentPrinter' />
<InfoActionButtons type='documentPrinter' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -51,6 +52,7 @@ const DocumentSizes = () => {
updateCollapseState={setColumnVisibility} updateCollapseState={setColumnVisibility}
/> />
<ExportListButton objectType='documentSize' /> <ExportListButton objectType='documentSize' />
<InfoActionButtons type='documentSize' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const DocumentTemplates = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='documentTemplate' /> <ExportListButton objectType='documentTemplate' />
<InfoActionButtons type='documentTemplate' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -48,6 +49,7 @@ const EmailAccounts = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='emailAccount' /> <ExportListButton objectType='emailAccount' />
<InfoActionButtons type='emailAccount' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -48,6 +49,7 @@ const EmailMessages = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='emailMessage' /> <ExportListButton objectType='emailMessage' />
<InfoActionButtons type='emailMessage' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -14,7 +14,8 @@ import WizardView from '../../common/WizardView'
import TemplatePreview from '../../common/TemplatePreview' import TemplatePreview from '../../common/TemplatePreview'
import ProgressDisplay from '../../common/ProgressDisplay' import ProgressDisplay from '../../common/ProgressDisplay'
import { ApiServerContext } from '../../context/ApiServerContext' import { ApiServerContext } from '../../context/ApiServerContext'
import { resolveEmailRecipients } from '../../utils/emailRecipients' import { resolveEmailRecipientsForObjects } from '../../utils/emailRecipients'
import { toTemplateObjectData } from '../../utils/templateObjectData'
const progressByState = { const progressByState = {
queued: 10, queued: 10,
@ -46,9 +47,13 @@ const EmailWizardContent = ({
return return
} }
let cancelled = false let cancelled = false
resolveEmailRecipients({ resolveEmailRecipientsForObjects({
type: objectData?.objectType, type: objectData?.objectType,
objectData: objectData?.object, objects: Array.isArray(objectData?.objects)
? objectData.objects
: objectData?.object
? [objectData.object]
: [],
fetchObject fetchObject
}).then((result) => { }).then((result) => {
if (!cancelled) setCandidates(result) if (!cancelled) setCandidates(result)
@ -60,6 +65,7 @@ const EmailWizardContent = ({
defaultCandidates, defaultCandidates,
fetchObject, fetchObject,
objectData?.object, objectData?.object,
objectData?.objects,
objectData?.objectType objectData?.objectType
]) ])
@ -110,7 +116,7 @@ const EmailWizardContent = ({
visibleProperties={{ visibleProperties={{
name: true, name: true,
objectType: true, objectType: true,
object: true, objects: true,
emailTemplate: true, emailTemplate: true,
emailAccount: true, emailAccount: true,
recipientEmail: true, recipientEmail: true,
@ -142,7 +148,7 @@ const EmailWizardContent = ({
}} }}
> >
<TemplatePreview <TemplatePreview
objectData={objectData?.object} objectData={toTemplateObjectData(objectData?.objects)}
template={objectData?.emailTemplate} template={objectData?.emailTemplate}
templateType='emailTemplate' templateType='emailTemplate'
capabilities={{ capabilities={{

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -48,6 +49,7 @@ const EmailTemplates = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='emailTemplate' /> <ExportListButton objectType='emailTemplate' />
<InfoActionButtons type='emailTemplate' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -13,6 +13,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -54,6 +55,7 @@ const FilamentSkus = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='filamentSku' /> <ExportListButton objectType='filamentSku' />
<InfoActionButtons type='filamentSku' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -13,6 +13,7 @@ import ObjectTableViewButton from '../common/ObjectTableViewButton'
import FilterSidebarButton from '../common/FilterSidebarButton' import FilterSidebarButton from '../common/FilterSidebarButton'
import SortSidebarButton from '../common/SortSidebarButton' import SortSidebarButton from '../common/SortSidebarButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -58,6 +59,7 @@ const Filaments = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='filament' /> <ExportListButton objectType='filament' />
<InfoActionButtons type='filament' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -50,6 +51,7 @@ const Files = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='file' /> <ExportListButton objectType='file' />
<InfoActionButtons type='file' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -7,6 +7,7 @@ import { Flex, Space } from 'antd'
import useColumnVisibility from '../hooks/useColumnVisibility' import useColumnVisibility from '../hooks/useColumnVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -57,6 +58,7 @@ const Hosts = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='host' /> <ExportListButton objectType='host' />
<InfoActionButtons type='host' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -13,6 +13,7 @@ import SortSidebarButton from '../common/SortSidebarButton'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -54,6 +55,7 @@ const Materials = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='material' /> <ExportListButton objectType='material' />
<InfoActionButtons type='material' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const NoteTypes = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='noteType' /> <ExportListButton objectType='noteType' />
<InfoActionButtons type='noteType' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -13,6 +13,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -53,6 +54,7 @@ const PartSkus = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='partSku' /> <ExportListButton objectType='partSku' />
<InfoActionButtons type='partSku' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -18,6 +18,7 @@ import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -57,6 +58,7 @@ const Parts = (filter) => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='part' /> <ExportListButton objectType='part' />
<InfoActionButtons type='part' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const PermissionSettingsList = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='permissionSetting' /> <ExportListButton objectType='permissionSetting' />
<InfoActionButtons type='permissionSetting' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -13,6 +13,7 @@ import SortSidebarButton from '../common/SortSidebarButton'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -54,6 +55,7 @@ const ProductCategories = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='productCategory' /> <ExportListButton objectType='productCategory' />
<InfoActionButtons type='productCategory' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -13,6 +13,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -54,6 +55,7 @@ const ProductSkus = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='productSku' /> <ExportListButton objectType='productSku' />
<InfoActionButtons type='productSku' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -29,6 +29,7 @@ import SortSidebarButton from '../common/SortSidebarButton'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -320,6 +321,7 @@ const Products = () => {
onReload={() => tableRef.current?.reload()} onReload={() => tableRef.current?.reload()}
/> />
<ExportListButton objectType='product' /> <ExportListButton objectType='product' />
<InfoActionButtons type='product' listMode={true} />
<Popover <Popover
content={getViewDropdownItems()} content={getViewDropdownItems()}
placement='bottomLeft' placement='bottomLeft'

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -51,6 +52,7 @@ const StockAuditLevels = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='stockAuditLevel' /> <ExportListButton objectType='stockAuditLevel' />
<InfoActionButtons type='stockAuditLevel' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -51,6 +52,7 @@ const TaxRates = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='taxRate' /> <ExportListButton objectType='taxRate' />
<InfoActionButtons type='taxRate' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -51,6 +52,7 @@ const UserGroups = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='userGroup' /> <ExportListButton objectType='userGroup' />
<InfoActionButtons type='userGroup' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -51,6 +52,7 @@ const Users = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='user' /> <ExportListButton objectType='user' />
<InfoActionButtons type='user' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -50,6 +51,7 @@ const Vendors = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='vendor' /> <ExportListButton objectType='vendor' />
<InfoActionButtons type='vendor' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -2,6 +2,7 @@ import { useRef } from 'react'
import { Flex, Space } from 'antd' import { Flex, Space } from 'antd'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -49,6 +50,7 @@ const FilamentProfiles = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='filamentProfile' /> <ExportListButton objectType='filamentProfile' />
<InfoActionButtons type='filamentProfile' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -14,6 +14,7 @@ import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -55,6 +56,7 @@ const GCodeFiles = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='gcodeFile' /> <ExportListButton objectType='gcodeFile' />
<InfoActionButtons type='gcodeFile' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -13,6 +13,7 @@ import ColumnViewButton from '../common/ColumnViewButton.jsx'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility.jsx' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility.jsx'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ExportListButton from '../common/ExportListButton.jsx' import ExportListButton from '../common/ExportListButton.jsx'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -53,6 +54,7 @@ const Jobs = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='job' /> <ExportListButton objectType='job' />
<InfoActionButtons type='job' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -2,6 +2,7 @@ import { useRef } from 'react'
import { Flex, Space } from 'antd' import { Flex, Space } from 'antd'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -48,6 +49,7 @@ const PrinterProfiles = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='printerProfile' /> <ExportListButton objectType='printerProfile' />
<InfoActionButtons type='printerProfile' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -7,6 +7,7 @@ import ObjectActions from '../common/ObjectActions'
import BulkObjectActions from '../common/BulkObjectActions' import BulkObjectActions from '../common/BulkObjectActions'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -58,6 +59,7 @@ const Printers = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='printer' /> <ExportListButton objectType='printer' />
<InfoActionButtons type='printer' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -13,6 +13,7 @@ import ColumnViewButton from '../common/ColumnViewButton.jsx'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility.jsx' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility.jsx'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ExportListButton from '../common/ExportListButton.jsx' import ExportListButton from '../common/ExportListButton.jsx'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -53,6 +54,7 @@ const SubJobs = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='subJob' /> <ExportListButton objectType='subJob' />
<InfoActionButtons type='subJob' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -51,6 +52,7 @@ const Clients = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='client' /> <ExportListButton objectType='client' />
<InfoActionButtons type='client' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -48,6 +49,7 @@ const FulfillmentPolicies = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='fulfillmentPolicy' /> <ExportListButton objectType='fulfillmentPolicy' />
<InfoActionButtons type='fulfillmentPolicy' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const ListingVarients = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='listingVarient' /> <ExportListButton objectType='listingVarient' />
<InfoActionButtons type='listingVarient' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const Listings = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='listing' /> <ExportListButton objectType='listing' />
<InfoActionButtons type='listing' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const Marketplaces = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='marketplace' /> <ExportListButton objectType='marketplace' />
<InfoActionButtons type='marketplace' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -47,6 +48,7 @@ const ReturnPolicies = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='returnPolicy' /> <ExportListButton objectType='returnPolicy' />
<InfoActionButtons type='returnPolicy' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -11,6 +11,7 @@ import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton' import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton' import ExportListButton from '../common/ExportListButton'
import InfoActionButtons from '../common/InfoActionButtons'
import ListViewTabs from '../common/ListViewTabs' import ListViewTabs from '../common/ListViewTabs'
import ListViewEditButtons from '../common/ListViewEditButtons' import ListViewEditButtons from '../common/ListViewEditButtons'
import { ObjectListViewProvider } from '../context/ObjectListViewContext' import { ObjectListViewProvider } from '../context/ObjectListViewContext'
@ -52,6 +53,7 @@ const SalesOrders = () => {
updateVisibleState={setColumnVisibility} updateVisibleState={setColumnVisibility}
/> />
<ExportListButton objectType='salesOrder' /> <ExportListButton objectType='salesOrder' />
<InfoActionButtons type='salesOrder' listMode={true} />
</Space> </Space>
<ListViewTabs /> <ListViewTabs />
<Space> <Space>

View File

@ -7,33 +7,39 @@ import {
useMemo, useMemo,
useRef useRef
} from 'react' } from 'react'
// import { getModelByName } from '../../../database/ObjectModels'
import DocumentPrinterIcon from '../../Icons/DocumentPrinterIcon' import DocumentPrinterIcon from '../../Icons/DocumentPrinterIcon'
import { Button, Dropdown, Modal } from 'antd' import { Button, Dropdown, Modal, message } from 'antd'
import { ApiServerContext } from '../context/ApiServerContext' import { ApiServerContext } from '../context/ApiServerContext'
import { TableStateContext } from '../context/TableStateContext'
import DocumentTemplateIcon from '../../Icons/DocumentTemplateIcon' import DocumentTemplateIcon from '../../Icons/DocumentTemplateIcon'
import NewDocumentJob from '../Management/DocumentJobs/NewDocumentJob' import NewDocumentJob from '../Management/DocumentJobs/NewDocumentJob'
import { AuthContext } from '../context/AuthContext' import { AuthContext } from '../context/AuthContext'
import LoadingPleaseWaitModal from './LoadingPleaseWaitModal'
import { fetchAllObjectPages } from '../utils/fetchAllObjectPages'
import { resolveObjectsList } from '../utils/templateObjectData'
const DocumentPrintButton = ({ const DocumentPrintButton = ({
type, type,
objectData, objectData,
objects,
listMode = false,
disabled = false, disabled = false,
...buttonProps ...buttonProps
}) => { }) => {
const { const { fetchObjects, connected, subscribeToObjectUpdates, subscribeToObjectTypeUpdates } =
fetchObjects, useContext(ApiServerContext)
connected, const tableState = useContext(TableStateContext)
subscribeToObjectUpdates,
subscribeToObjectTypeUpdates
} = useContext(ApiServerContext)
const fetchObjectsRef = useRef(fetchObjects) const fetchObjectsRef = useRef(fetchObjects)
fetchObjectsRef.current = fetchObjects fetchObjectsRef.current = fetchObjects
const [documentTemplates, setDocumentTemplates] = useState([]) const [documentTemplates, setDocumentTemplates] = useState([])
const [currentDocumentTemplate, setCurrentDocumentTemplate] = useState(null) const [currentDocumentTemplate, setCurrentDocumentTemplate] = useState(null)
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const [listLoading, setListLoading] = useState(false)
const [newDocumentJobOpen, setNewDocumentJobOpen] = useState(false) const [newDocumentJobOpen, setNewDocumentJobOpen] = useState(false)
const [selectedObjects, setSelectedObjects] = useState(() =>
resolveObjectsList(objects, objectData)
)
const subscribedIdsRef = useRef([]) const subscribedIdsRef = useRef([])
const unsubscribesRef = useRef([]) const unsubscribesRef = useRef([])
@ -42,6 +48,11 @@ const DocumentPrintButton = ({
const { token } = useContext(AuthContext) const { token } = useContext(AuthContext)
const resolvedObjects = useMemo(
() => resolveObjectsList(objects, objectData),
[objects, objectData]
)
const subscriptionFilter = useMemo( const subscriptionFilter = useMemo(
() => ({ () => ({
objectType: type, objectType: type,
@ -69,7 +80,7 @@ const DocumentPrintButton = ({
try { try {
const result = await fetchObjectsRef.current('documentTemplate', { const result = await fetchObjectsRef.current('documentTemplate', {
filter: subscriptionFilter, filter: subscriptionFilter,
limit: 100 // Get more templates to show in dropdown limit: 100
}) })
if (result && result.data) { if (result && result.data) {
@ -89,13 +100,13 @@ const DocumentPrintButton = ({
const loadDocumentTemplatesRef = useRef(loadDocumentTemplates) const loadDocumentTemplatesRef = useRef(loadDocumentTemplates)
loadDocumentTemplatesRef.current = loadDocumentTemplates loadDocumentTemplatesRef.current = loadDocumentTemplates
// Stable key from objectData._id (excludes _isEditing so toggling edit mode doesn't trigger template reload)
const objectKey = useMemo(() => { const objectKey = useMemo(() => {
if (!objectData) return null if (listMode) return 'list'
return objectData._id ?? objectData.id ?? null const first = resolvedObjects[0]
}, [objectData]) if (!first) return null
return first._id ?? first.id ?? null
}, [listMode, resolvedObjects])
// Fetch document templates when component mounts or objectData, type or token changes
useEffect(() => { useEffect(() => {
loadDocumentTemplates() loadDocumentTemplates()
}, [objectKey, token, type, loadDocumentTemplates]) }, [objectKey, token, type, loadDocumentTemplates])
@ -147,7 +158,9 @@ const DocumentPrintButton = ({
useEffect(() => { useEffect(() => {
if (connected !== true) return if (connected !== true) return
const templateIds = documentTemplates.map((template) => template._id).filter(Boolean) const templateIds = documentTemplates
.map((template) => template._id)
.filter(Boolean)
const newTemplateIds = templateIds.filter( const newTemplateIds = templateIds.filter(
(id) => !subscribedIdsRef.current.includes(id) (id) => !subscribedIdsRef.current.includes(id)
@ -197,15 +210,40 @@ const DocumentPrintButton = ({
} }
}, []) }, [])
// Handle template selection const handleTemplateSelect = useCallback(
const handleTemplateSelect = (template) => { async (template) => {
setCurrentDocumentTemplate(template) setCurrentDocumentTemplate(template)
setNewDocumentJobOpen(true)
// TODO: Implement the actual printing logic here if (listMode) {
// This could open a print dialog, navigate to a print page, etc. setListLoading(true)
} try {
const list = await fetchAllObjectPages({
fetchObjects: fetchObjectsRef.current,
type,
filter: tableState?.getObjectListFilter?.(type) || {},
sorter: tableState?.getObjectListSorter?.(type) || {}
})
if (!list.length) {
message.warning('No objects in this list to print')
return
}
setSelectedObjects(list)
setNewDocumentJobOpen(true)
} catch (error) {
console.error('Error fetching objects for document job:', error)
message.error('Failed to load objects for printing')
} finally {
setListLoading(false)
}
return
}
setSelectedObjects(resolvedObjects)
setNewDocumentJobOpen(true)
},
[listMode, resolvedObjects, tableState, type]
)
// Group templates by tag for nested dropdown menu; untagged templates at root
const menuItems = useMemo(() => { const menuItems = useMemo(() => {
const templatesByTag = new Map() const templatesByTag = new Map()
const untaggedTemplates = [] const untaggedTemplates = []
@ -228,9 +266,9 @@ const DocumentPrintButton = ({
} }
for (const tag of templateTags) { for (const tag of templateTags) {
const templates = templatesByTag.get(tag) ?? [] const tagged = templatesByTag.get(tag) ?? []
templates.push(template) tagged.push(template)
templatesByTag.set(tag, templates) templatesByTag.set(tag, tagged)
} }
} }
@ -252,9 +290,14 @@ const DocumentPrintButton = ({
.map(toTemplateMenuItem) .map(toTemplateMenuItem)
return [...rootUntaggedItems, ...taggedMenuItems] return [...rootUntaggedItems, ...taggedMenuItems]
}, [documentTemplates]) }, [documentTemplates, handleTemplateSelect])
const unavailable =
disabled ||
loading ||
listLoading ||
(!listMode && resolvedObjects.length === 0)
// If no templates available, show disabled state
if (documentTemplates.length === 0 && !loading) { if (documentTemplates.length === 0 && !loading) {
return ( return (
<Button <Button
@ -274,16 +317,17 @@ const DocumentPrintButton = ({
loading: loading loading: loading
}} }}
trigger={['hover']} trigger={['hover']}
disabled={disabled || loading} disabled={unavailable}
> >
<Button <Button
{...buttonProps} {...buttonProps}
icon={<DocumentPrinterIcon />} icon={<DocumentPrinterIcon />}
disabled={disabled || loading} disabled={unavailable}
loading={loading} loading={loading || listLoading}
title={loading ? 'Loading templates...' : 'Print document'} title={loading ? 'Loading templates...' : 'Print document'}
/> />
</Dropdown> </Dropdown>
<LoadingPleaseWaitModal open={listLoading} />
<Modal <Modal
open={newDocumentJobOpen} open={newDocumentJobOpen}
onCancel={() => setNewDocumentJobOpen(false)} onCancel={() => setNewDocumentJobOpen(false)}
@ -305,7 +349,7 @@ const DocumentPrintButton = ({
reset={!newDocumentJobOpen} reset={!newDocumentJobOpen}
defaultValues={{ defaultValues={{
objectType: type, objectType: type,
object: objectData, objects: selectedObjects,
documentTemplate: currentDocumentTemplate documentTemplate: currentDocumentTemplate
}} }}
/> />
@ -317,7 +361,9 @@ const DocumentPrintButton = ({
DocumentPrintButton.propTypes = { DocumentPrintButton.propTypes = {
type: PropTypes.string.isRequired, type: PropTypes.string.isRequired,
disabled: PropTypes.bool, disabled: PropTypes.bool,
objectData: PropTypes.object.isRequired objectData: PropTypes.object,
objects: PropTypes.array,
listMode: PropTypes.bool
} }
export default DocumentPrintButton export default DocumentPrintButton

View File

@ -7,18 +7,30 @@ import {
useRef, useRef,
useState useState
} from 'react' } from 'react'
import { Button, Dropdown, Modal } from 'antd' import { Button, Dropdown, Modal, message } from 'antd'
import { ApiServerContext } from '../context/ApiServerContext' import { ApiServerContext } from '../context/ApiServerContext'
import { AuthContext } from '../context/AuthContext' import { AuthContext } from '../context/AuthContext'
import { TableStateContext } from '../context/TableStateContext'
import MailIcon from '../../Icons/MailIcon' import MailIcon from '../../Icons/MailIcon'
import EmailTemplateIcon from '../../Icons/EmailTemplateIcon' import EmailTemplateIcon from '../../Icons/EmailTemplateIcon'
import NewEmailMessage from '../Management/EmailMessages/NewEmailMessage' import NewEmailMessage from '../Management/EmailMessages/NewEmailMessage'
import { import {
getDefaultEmailRecipient, getDefaultEmailRecipient,
resolveEmailRecipients resolveEmailRecipients,
resolveEmailRecipientsForObjects
} from '../utils/emailRecipients' } from '../utils/emailRecipients'
import LoadingPleaseWaitModal from './LoadingPleaseWaitModal'
import { fetchAllObjectPages } from '../utils/fetchAllObjectPages'
import { resolveObjectsList } from '../utils/templateObjectData'
const EmailSendButton = ({ type, objectData, disabled = false, ...buttonProps }) => { const EmailSendButton = ({
type,
objectData,
objects,
listMode = false,
disabled = false,
...buttonProps
}) => {
const { const {
fetchObject, fetchObject,
fetchObjects, fetchObjects,
@ -27,16 +39,26 @@ const EmailSendButton = ({ type, objectData, disabled = false, ...buttonProps })
subscribeToObjectTypeUpdates subscribeToObjectTypeUpdates
} = useContext(ApiServerContext) } = useContext(ApiServerContext)
const { token } = useContext(AuthContext) const { token } = useContext(AuthContext)
const tableState = useContext(TableStateContext)
const [templates, setTemplates] = useState([]) const [templates, setTemplates] = useState([])
const [recipients, setRecipients] = useState([]) const [recipients, setRecipients] = useState([])
const [selectedTemplate, setSelectedTemplate] = useState(null) const [selectedTemplate, setSelectedTemplate] = useState(null)
const [selectedObjects, setSelectedObjects] = useState(() =>
resolveObjectsList(objects, objectData)
)
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const [listLoading, setListLoading] = useState(false)
const fetchObjectsRef = useRef(fetchObjects) const fetchObjectsRef = useRef(fetchObjects)
const fetchObjectRef = useRef(fetchObject) const fetchObjectRef = useRef(fetchObject)
fetchObjectsRef.current = fetchObjects fetchObjectsRef.current = fetchObjects
fetchObjectRef.current = fetchObject fetchObjectRef.current = fetchObject
const resolvedObjects = useMemo(
() => resolveObjectsList(objects, objectData),
[objects, objectData]
)
const filter = useMemo( const filter = useMemo(
() => ({ objectType: type, global: false, active: true }), () => ({ objectType: type, global: false, active: true }),
[type] [type]
@ -71,11 +93,15 @@ const EmailSendButton = ({ type, objectData, disabled = false, ...buttonProps })
}, [loadTemplates]) }, [loadTemplates])
useEffect(() => { useEffect(() => {
if (listMode) {
setRecipients([])
return undefined
}
let cancelled = false let cancelled = false
setRecipients([]) setRecipients([])
resolveEmailRecipients({ resolveEmailRecipients({
type, type,
objectData, objectData: resolvedObjects[0],
fetchObject: (...args) => fetchObjectRef.current(...args) fetchObject: (...args) => fetchObjectRef.current(...args)
}).then((result) => { }).then((result) => {
if (!cancelled) setRecipients(result) if (!cancelled) setRecipients(result)
@ -83,19 +109,14 @@ const EmailSendButton = ({ type, objectData, disabled = false, ...buttonProps })
return () => { return () => {
cancelled = true cancelled = true
} }
}, [objectData, type]) }, [listMode, resolvedObjects, type])
useEffect(() => { useEffect(() => {
if (!connected) return undefined if (!connected) return undefined
return subscribeToObjectTypeUpdates('emailTemplate', filter, () => return subscribeToObjectTypeUpdates('emailTemplate', filter, () =>
loadTemplates(true) loadTemplates(true)
) )
}, [ }, [connected, filter, loadTemplates, subscribeToObjectTypeUpdates])
connected,
filter,
loadTemplates,
subscribeToObjectTypeUpdates
])
useEffect(() => { useEffect(() => {
if (!connected) return undefined if (!connected) return undefined
@ -121,6 +142,50 @@ const EmailSendButton = ({ type, objectData, disabled = false, ...buttonProps })
return () => unsubscribes.forEach((unsubscribe) => unsubscribe?.()) return () => unsubscribes.forEach((unsubscribe) => unsubscribe?.())
}, [connected, matches, subscribeToObjectUpdates, templates]) }, [connected, matches, subscribeToObjectUpdates, templates])
const handleTemplateSelect = useCallback(
async (template) => {
setSelectedTemplate(template)
if (listMode) {
setListLoading(true)
try {
const list = await fetchAllObjectPages({
fetchObjects: fetchObjectsRef.current,
type,
filter: tableState?.getObjectListFilter?.(type) || {},
sorter: tableState?.getObjectListSorter?.(type) || {}
})
if (!list.length) {
message.warning('No objects in this list to email')
return
}
const nextRecipients = await resolveEmailRecipientsForObjects({
type,
objects: list,
fetchObject: (...args) => fetchObjectRef.current(...args)
})
if (!nextRecipients.length) {
message.warning('No email recipients available for these objects')
return
}
setSelectedObjects(list)
setRecipients(nextRecipients)
setOpen(true)
} catch (error) {
console.error('Error fetching objects for email:', error)
message.error('Failed to load objects for email')
} finally {
setListLoading(false)
}
return
}
setSelectedObjects(resolvedObjects)
setOpen(true)
},
[listMode, resolvedObjects, tableState, type]
)
const menuItems = useMemo(() => { const menuItems = useMemo(() => {
const byTag = new Map() const byTag = new Map()
const untagged = [] const untagged = []
@ -129,8 +194,7 @@ const EmailSendButton = ({ type, objectData, disabled = false, ...buttonProps })
label: template.name, label: template.name,
icon: <EmailTemplateIcon />, icon: <EmailTemplateIcon />,
onClick: () => { onClick: () => {
setSelectedTemplate(template) handleTemplateSelect(template)
setOpen(true)
} }
}) })
@ -159,19 +223,28 @@ const EmailSendButton = ({ type, objectData, disabled = false, ...buttonProps })
.map(makeItem) .map(makeItem)
})) }))
] ]
}, [templates]) }, [handleTemplateSelect, templates])
const defaultRecipient = useMemo( const defaultRecipient = useMemo(
() => getDefaultEmailRecipient(recipients), () => getDefaultEmailRecipient(recipients),
[recipients] [recipients]
) )
const unavailable = disabled || loading || !templates.length || !recipients.length const unavailable =
const title = !recipients.length disabled ||
? 'No email recipients available for this object' loading ||
: !templates.length listLoading ||
!templates.length ||
(!listMode && (!resolvedObjects.length || !recipients.length))
const title = listMode
? !templates.length
? 'No email templates available for this object type' ? 'No email templates available for this object type'
: 'Send email' : 'Send email'
: !recipients.length
? 'No email recipients available for this object'
: !templates.length
? 'No email templates available for this object type'
: 'Send email'
return ( return (
<> <>
@ -180,10 +253,11 @@ const EmailSendButton = ({ type, objectData, disabled = false, ...buttonProps })
{...buttonProps} {...buttonProps}
icon={<MailIcon />} icon={<MailIcon />}
disabled={unavailable} disabled={unavailable}
loading={loading} loading={loading || listLoading}
title={title} title={title}
/> />
</Dropdown> </Dropdown>
<LoadingPleaseWaitModal open={listLoading} />
<Modal <Modal
open={open} open={open}
onCancel={() => setOpen(false)} onCancel={() => setOpen(false)}
@ -195,7 +269,7 @@ const EmailSendButton = ({ type, objectData, disabled = false, ...buttonProps })
onOk={() => setOpen(false)} onOk={() => setOpen(false)}
defaultValues={{ defaultValues={{
objectType: type, objectType: type,
object: objectData, objects: selectedObjects,
emailTemplate: selectedTemplate, emailTemplate: selectedTemplate,
...defaultRecipient ...defaultRecipient
}} }}
@ -208,7 +282,9 @@ const EmailSendButton = ({ type, objectData, disabled = false, ...buttonProps })
EmailSendButton.propTypes = { EmailSendButton.propTypes = {
type: PropTypes.string.isRequired, type: PropTypes.string.isRequired,
objectData: PropTypes.object.isRequired, objectData: PropTypes.object,
objects: PropTypes.array,
listMode: PropTypes.bool,
disabled: PropTypes.bool disabled: PropTypes.bool
} }

View File

@ -52,6 +52,9 @@ const HostDeviceScanner = ({
? crypto.randomUUID() ? crypto.randomUUID()
: `scan-${Date.now()}-${Math.random().toString(16).slice(2)}` : `scan-${Date.now()}-${Math.random().toString(16).slice(2)}`
) )
const startedRef = useRef(false)
const activeHostIdRef = useRef(null)
const pendingStopRef = useRef(null)
const [scanning, setScanning] = useState(false) const [scanning, setScanning] = useState(false)
const [progress, setProgress] = useState(0) const [progress, setProgress] = useState(0)
@ -80,22 +83,52 @@ const HostDeviceScanner = ({
} }
useEffect(() => { useEffect(() => {
if (!hostId || connected !== true || !compatible) { const sessionId = sessionIdRef.current
return const canScan = Boolean(hostId) && connected === true && compatible
const stopScan = (targetHostId) => {
if (!targetHostId || !startedRef.current) {
return
}
sendObjectActionRef.current(targetHostId, 'host', {
type: 'scanNetworkStop',
data: { sessionId }
})
startedRef.current = false
activeHostIdRef.current = null
}
if (pendingStopRef.current) {
clearTimeout(pendingStopRef.current)
pendingStopRef.current = null
}
if (!canScan) {
const hostToStop = activeHostIdRef.current
pendingStopRef.current = setTimeout(() => {
stopScan(hostToStop)
pendingStopRef.current = null
}, 250)
return () => {
if (pendingStopRef.current) {
clearTimeout(pendingStopRef.current)
pendingStopRef.current = null
}
}
} }
let cancelled = false let cancelled = false
const sessionId = sessionIdRef.current console.log('Scan session id:', sessionId)
const isSessionEvent = (event) => event?.data?.sessionId === sessionId const isSessionEvent = (event) => event?.data?.sessionId === sessionId
const startScan = () => { const startScan = () => {
if (cancelled) return
setProgress(0) setProgress(0)
setCurrentIP(null) setCurrentIP(null)
setScanError(null) setScanError(null)
setScanning(true) setScanning(true)
setDevices([])
setSelectedKey(null)
sendObjectActionRef.current( sendObjectActionRef.current(
hostId, hostId,
@ -113,6 +146,7 @@ const HostDeviceScanner = ({
if (result?.success === false) { if (result?.success === false) {
setScanning(false) setScanning(false)
setScanError(result.error || 'Failed to start network scan') setScanError(result.error || 'Failed to start network scan')
startedRef.current = false
} }
} }
) )
@ -192,29 +226,27 @@ const HostDeviceScanner = ({
onComplete onComplete
) )
setDevices([]) const alreadyRunning = startedRef.current && activeHostIdRef.current === hostId
setSelectedKey(null) if (!alreadyRunning) {
startScan() if (startedRef.current && activeHostIdRef.current) {
stopScan(activeHostIdRef.current)
}
startedRef.current = true
activeHostIdRef.current = hostId
startScan()
}
return () => { return () => {
cancelled = true cancelled = true
if (unsubFound) unsubFound() if (unsubFound) unsubFound()
if (unsubProgress) unsubProgress() if (unsubProgress) unsubProgress()
if (unsubComplete) unsubComplete() if (unsubComplete) unsubComplete()
sendObjectActionRef.current(hostId, 'host', { pendingStopRef.current = setTimeout(() => {
type: 'scanNetworkStop', stopScan(hostId)
data: { sessionId } pendingStopRef.current = null
}) }, 250)
} }
}, [ }, [hostId, connected, compatible])
hostId,
connected,
compatible,
port,
protocol,
connectionInterface,
objectType
])
const applyDevice = useCallback( const applyDevice = useCallback(
(device) => { (device) => {

View File

@ -25,7 +25,9 @@ const InfoActionButtons = (props) => {
InfoActionButtons.propTypes = { InfoActionButtons.propTypes = {
type: PropTypes.string.isRequired, type: PropTypes.string.isRequired,
disabled: PropTypes.bool, disabled: PropTypes.bool,
objectData: PropTypes.object.isRequired objectData: PropTypes.object,
objects: PropTypes.array,
listMode: PropTypes.bool
} }
export default InfoActionButtons export default InfoActionButtons

View File

@ -0,0 +1,30 @@
import PropTypes from 'prop-types'
import { Modal, Space, Typography } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
const { Text } = Typography
const LoadingPleaseWaitModal = ({ open = false }) => (
<Modal
open={open}
className='loading-modal'
title={false}
height={20}
style={{ maxWidth: 220, top: '50%', transform: 'translateY(-50%)' }}
closable={false}
maskClosable={false}
footer={false}
zIndex={2000}
>
<Space size={'middle'}>
<LoadingOutlined />
<Text style={{ margin: 0 }}>Loading, please wait...</Text>
</Space>
</Modal>
)
LoadingPleaseWaitModal.propTypes = {
open: PropTypes.bool
}
export default LoadingPleaseWaitModal

View File

@ -10,7 +10,10 @@ import {
import { useSearchParams } from 'react-router-dom' import { useSearchParams } from 'react-router-dom'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
const TableStateContext = createContext() const TableStateContext = createContext(null)
// eslint-disable-next-line react-refresh/only-export-components
export { TableStateContext }
export const FILTER_URL_PARAM = 'filter' export const FILTER_URL_PARAM = 'filter'
export const SORT_URL_PARAM = 'sort' export const SORT_URL_PARAM = 'sort'

View File

@ -79,6 +79,26 @@ export const resolveEmailRecipients = async ({
return candidates return candidates
} }
export const resolveEmailRecipientsForObjects = async ({
type,
objects,
fetchObject
}) => {
const list = Array.isArray(objects) ? objects.filter(Boolean) : []
const merged = []
for (const objectData of list) {
const result = await resolveEmailRecipients({
type,
objectData,
fetchObject
})
for (const candidate of result) {
addCandidate(merged, candidate)
}
}
return merged
}
/** Prefer a client/vendor ref; otherwise use a plain email candidate. */ /** Prefer a client/vendor ref; otherwise use a plain email candidate. */
export const getDefaultEmailRecipient = (candidates = []) => { export const getDefaultEmailRecipient = (candidates = []) => {
if (!Array.isArray(candidates) || !candidates.length) return null if (!Array.isArray(candidates) || !candidates.length) return null

View File

@ -0,0 +1,41 @@
export async function fetchAllObjectPages({
fetchObjects,
type,
filter = {},
sorter = {},
limit = 25
}) {
if (!type || typeof fetchObjects !== 'function') return []
const all = []
let page = 1
let totalPages = 1
do {
const result = await fetchObjects(type, {
page,
limit,
filter,
sorter
})
if (!result || Array.isArray(result)) {
break
}
const data = Array.isArray(result.data) ? result.data : []
all.push(...data)
if (Number.isFinite(result.totalPages) && result.totalPages > 0) {
totalPages = result.totalPages
} else if (result.hasMore) {
totalPages = page + 1
} else {
totalPages = page
}
page += 1
} while (page <= totalPages)
return all
}

View File

@ -0,0 +1,21 @@
export function resolveObjectsList(objects, objectData) {
if (Array.isArray(objects) && objects.length) {
return objects.filter(Boolean)
}
if (objectData) {
return [objectData]
}
return []
}
export function toTemplateObjectData(objects) {
const list = Array.isArray(objects) ? objects.filter(Boolean) : []
if (!list.length) return {}
if (list.length === 1) {
const first = list[0]
if (first && typeof first === 'object' && !Array.isArray(first)) {
return first
}
}
return { objects: list }
}

View File

@ -166,7 +166,12 @@ export const DocumentJob = {
columnFixed: 'left', columnFixed: 'left',
value: (objectData) => { value: (objectData) => {
if (objectData?.createdAt == undefined) { if (objectData?.createdAt == undefined) {
return `${objectData?.documentTemplate?.name || 'No template'} ${dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')} (${objectData?.object?.name || objectData?.object?._id})` const list = Array.isArray(objectData?.objects)
? objectData.objects
: []
const first = list[0]
const extra = list.length > 1 ? ` +${list.length - 1}` : ''
return `${objectData?.documentTemplate?.name || 'No template'} ${dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')} (${first?.name || first?._id || 'no object'}${extra})`
} }
} }
}, },
@ -188,11 +193,11 @@ export const DocumentJob = {
type: 'objectType' type: 'objectType'
}, },
{ {
name: 'object', name: 'objects',
label: 'Object', label: 'Objects',
required: true, required: true,
columnWidth: 150, columnWidth: 150,
type: 'object', type: 'objectList',
objectType: (objectData) => { objectType: (objectData) => {
return objectData?.objectType return objectData?.objectType
}, },

View File

@ -220,9 +220,9 @@ export const EmailMessage = {
columnWidth: 180 columnWidth: 180
}, },
{ {
name: 'object', name: 'objects',
label: 'Object', label: 'Objects',
type: 'object', type: 'objectList',
objectType: (data) => data?.objectType, objectType: (data) => data?.objectType,
required: true, required: true,
readOnly: readOnlyAfterCreate, readOnly: readOnlyAfterCreate,