/** * Responsive orders display using DataList. * Pagination is shared and rendered once at the bottom. */ import { useMemo, useCallback, useState } from 'react'; import { __ } from '@wordpress/i18n'; import { Flex, Button, Tooltip, Icon } from '@wordpress/components'; import { chevronRight } from '@wordpress/icons'; import { Pagination } from '@woocommerce/components'; import type { Order, PluginSettings } from '../../types'; import { DataList, CountryFlag, Badge, RenderWeight, type DataListColumn, } from '../../shared/components'; import { formatRelativeDate, getCourierLogo, truncateText, } from '../../shared/utils'; import { getOrderTotalWeight } from './utils/orderWeight'; import { StoreSettingsResponse } from 'types/settings'; import SelectServiceModal from './select-service-modal'; import { useParcel2goAuth } from './../../shared/hooks'; interface OrderTableProps { orders: Order[]; total: number; settings: PluginSettings; page: number; rowsPerPage: number; onShipNow: (orderId: number) => void; onPageChange: (page: number) => void; isLoading?: boolean; selectedOrderIds?: number[]; onSelectionChange?: (orderIds: number[]) => void; onBulkShipNow?: (orderIds: number[]) => void; onRefreshOrders?: () => void; } function useOrderColumns( onShipNow: (orderId: number) => void, isLinked: boolean, onOpenSelectServiceModal: (order: Order) => void ): DataListColumn[] { return useMemo[]>( () => [ { key: 'orderId', label: __('Order ID', 'parcel2go-shipping'), render: (order) => `#${order.number ?? order.id}`, }, { key: 'flag', label: '', screenReaderLabel: __('Country', 'parcel2go-shipping'), render: (order) => { const code = (order.shipping?.country ?? '') .trim() .toUpperCase(); return ; }, }, { key: 'customer', label: __('Customer', 'parcel2go-shipping'), render: (order) => order.customer?.name ?? '—', }, { key: 'shipping', label: __('Shipping', 'parcel2go-shipping'), render: (order) => { const courierLogo = getCourierLogo( order.cheapestQuote?.service?.courierSlug ); const shippingMethodTitle = order.shipping_method?.title ?? ''; return ( {truncateText( shippingMethodTitle, 21 ) || __('No zone', 'parcel2go-shipping')} {isLinked ? ( <> { order.bulkError === 'in-progress' ? null : onOpenSelectServiceModal( order ); }} style={{ width: 'auto', cursor: 'pointer' }} > {order.bulkError ? ( {__( order.bulkError, 'parcel2go-shipping' )} ) : ( { )} ) : null} ); }, }, { key: 'weight', label: __('Weight', 'parcel2go-shipping'), isNumeric: true, render: (order) => { const summary = getOrderTotalWeight(order); return ( ); }, }, { key: 'date', label: __('Date', 'parcel2go-shipping'), render: (order) => formatRelativeDate(order.date_created), }, { key: 'action', label: __('Action', 'parcel2go-shipping'), render: (order) => { const isInProgress = order.p2g?.shipStatus === 'Booked' || order.p2g?.shipStatus === 'Paid'; return ( ); }, }, ], [onShipNow, isLinked, onOpenSelectServiceModal] ); } const getOrderKey = (order: Order) => order.id; const getOrderId = (order: Order) => order.id; export default function OrderTable({ orders, total, settings, page, rowsPerPage, onShipNow, onPageChange, isLoading = false, selectedOrderIds = [], onSelectionChange, onRefreshOrders, }: OrderTableProps) { const { isLinked } = useParcel2goAuth(); const [selectedOrder, setSelectedOrder] = useState(null); const openSelectServiceModal = useCallback((order: Order) => { setSelectedOrder(order); }, []); const columns = useOrderColumns( onShipNow, isLinked, openSelectServiceModal ); const handleSelectionChange = useCallback( (ids: number[]) => onSelectionChange?.(ids), [onSelectionChange] ); if (!orders.length && !total && !isLoading) return null; return ( {selectedOrder && ( setSelectedOrder(null)} onRefreshOrders={onRefreshOrders} order={selectedOrder} settings={settings} /> )} items={orders} columns={columns} getKey={getOrderKey} isLoading={isLoading} skeletonRows={rowsPerPage} emptyMessage={__( 'No processing orders found.', 'parcel2go-shipping' )} selectable={isLinked} selectedIds={selectedOrderIds} onSelectionChange={handleSelectionChange} getId={getOrderId} isDisabled={(order) => !!order.bulkError} /> {!isLoading && total > rowsPerPage && ( )} ); }