import React, { useCallback, useMemo, useState } from 'react'; import { DataTable, DataTableSkeleton, DatePicker, DatePickerInput, InlineLoading, Link, Pagination, Table, TableBody, TableCell, TableContainer, TableExpandedRow, TableExpandHeader, TableExpandRow, TableHead, TableHeader, TableRow, TableToolbar, TableToolbarAction, TableToolbarContent, TableToolbarMenu, TableToolbarSearch, Tile, } from '@carbon/react'; import { ArrowRight } from '@carbon/react/icons'; import { useTranslation } from 'react-i18next'; import { isDesktop, restBaseUrl } from '@openmrs/esm-framework'; import { DATE_PICKER_CONTROL_FORMAT, DATE_PICKER_FORMAT, StockFilters } from '../constants'; import { formatDisplayDate } from '../core/utils/datetimeUtils'; import { handleMutate } from '../utils'; import { ResourceRepresentation } from '../core/api/api'; import { useStockOperationPages } from './stock-operations-table.resource'; import EditStockOperationActionMenu from './edit-stock-operation/edit-stock-operation-action-menu.component'; import StockOperationTypesSelector from './stock-operation-types-selector/stock-operation-types-selector.component'; import StockOperationsFilters from './stock-operations-filters.component'; import StockOperationExpandedRow from './add-stock-operation/stock-operations-expanded-row/stock-operation-expanded-row.component'; import styles from './stock-operations-table.scss'; interface StockOperationsTableProps { status?: string; } const StockOperations: React.FC = () => { const { t } = useTranslation(); const handleRefresh = () => { handleMutate(`${restBaseUrl}/stockmanagement/stockoperation`); }; const [selectedFromDate, setSelectedFromDate] = useState(null); const [selectedToDate, setSelectedToDate] = useState(null); const [selectedSources, setSelectedSources] = useState([]); const [selectedStatus, setSelectedStatus] = useState([]); const [selectedOperations, setSelectedOperations] = useState([]); const { items, tableHeaders, currentPage, pageSizes, totalItems, goTo, currentPageSize, setPageSize, isLoading } = useStockOperationPages({ v: ResourceRepresentation.Full, totalCount: true, operationDateMin: selectedFromDate?.toISOString(), operationDateMax: selectedToDate?.toISOString(), status: selectedStatus.join(','), sourceTypeUuid: selectedSources.join(','), operationTypeUuid: selectedOperations.join(','), }); const filterApplied = selectedFromDate || selectedToDate || selectedSources.length || selectedStatus.length || selectedOperations.length; const handleOnFilterChange = useCallback((selectedItems, filterType) => { if (filterType === StockFilters.SOURCES) { setSelectedSources(selectedItems); } else if (filterType === StockFilters.OPERATION) { setSelectedOperations(selectedItems); } else { setSelectedStatus(selectedItems); } }, []); const handleDateFilterChange = ([startDate, endDate]) => { if (startDate) { setSelectedFromDate(startDate); if (selectedToDate && startDate && selectedToDate < startDate) { setSelectedToDate(startDate); } } if (endDate) { setSelectedToDate(endDate); if (selectedFromDate && endDate && selectedFromDate > endDate) { setSelectedFromDate(endDate); } } }; const tableRows = useMemo( () => items?.map((stockOperation, index) => { const threshHold = 1; const itemCountGreaterThanThreshhold = (stockOperation?.stockOperationItems?.length ?? 0) > threshHold; const commonNames = stockOperation?.stockOperationItems ?.slice(0, itemCountGreaterThanThreshhold ? threshHold : undefined) .map((item) => item.commonName) .join(', ') ?? ''; return { ...stockOperation, id: stockOperation?.uuid, key: `key-${stockOperation?.uuid}`, operationTypeName: `${stockOperation?.operationTypeName}`, operationNumber: ( ), stockOperationItems: { commonNames, more: itemCountGreaterThanThreshhold ? stockOperation?.stockOperationItems?.length - threshHold : 0, }, status: `${stockOperation?.status}`, source: `${stockOperation?.sourceName ?? ''}`, destination: `${stockOperation?.destinationName ?? ''}`, location: ( <> {stockOperation?.sourceName ?? ''} {stockOperation?.sourceName && stockOperation?.destinationName ? ( ) : ( '' )}{' '} {stockOperation?.destinationName ?? ''} ), responsiblePerson: `${ stockOperation?.responsiblePersonFamilyName ?? stockOperation?.responsiblePersonOther ?? '' } ${stockOperation?.responsiblePersonGivenName ?? ''}`, operationDate: formatDisplayDate(stockOperation?.operationDate), actions: , }; }), [items], ); if (isLoading && !filterApplied) { return ( ); } return ( <>

{t('stockOperationsTableHeader', 'Stock operations to track movement of stock.')}

{({ expandRow, getExpandedRowProps, getHeaderProps, getRowProps, getTableProps, headers, onInputChange, rows, }) => (
handleDateFilterChange([startDate, endDate])} value={[selectedFromDate, selectedToDate]} >
{t('refresh', 'Refresh')}
{headers.map( (header: any) => header.key !== 'details' && ( {header.header?.content ?? header.header} ), )} {rows?.map((row: any, index) => { const props = getRowProps({ row }); const expandedRowProps = getExpandedRowProps({ row }); return ( {row.cells.map((cell) => ( {cell?.info?.header === 'stockOperationItems' ? ( {cell.value.commonNames} {cell.value.more > 0 && ( expandRow(row.id)}>{`...(${cell.value.more} more)`} )} ) : ( cell.value )} ))} {row.isExpanded ? ( ) : ( )} ); })}
{rows.length === 0 && !isLoading ? (

{t('noOperationsToDisplay', 'No stock operations to display')}

{t('checkFilters', 'Check the filters above')}

) : null} {Boolean(filterApplied && isLoading) && (
)}
)}
{items.length > 0 && ( { if (pageSize !== currentPageSize) { setPageSize(pageSize); } if (page !== currentPage) { goTo(page); } }} className={styles.paginationOverride} /> )} ); }; export default StockOperations;