diff --git a/src/TitleDetails/AddPieceModal/AddPieceModal.js b/src/TitleDetails/AddPieceModal/AddPieceModal.js index b4b7792b..c9babfde 100644 --- a/src/TitleDetails/AddPieceModal/AddPieceModal.js +++ b/src/TitleDetails/AddPieceModal/AddPieceModal.js @@ -51,23 +51,24 @@ import { PieceFields } from './PieceFields'; import { ReceivingStatusChangeLog } from './ReceivingStatusChangeLog'; const AddPieceModal = ({ + canDeletePiece, close, createInventoryValues, deletePiece, - canDeletePiece, form, - initialValues, + getHoldingsItemsAndPieces, handleSubmit, hasValidationErrors, - pristine, + initialValues, instanceId, locationIds, locations, onCheckIn, + onUnreceive, pieceFormatOptions, - values: formValues, poLine, - getHoldingsItemsAndPieces, + pristine, + values: formValues, }) => { const { batch, @@ -179,6 +180,17 @@ const AddPieceModal = ({ onSave(); }, [change, onSave]); + const onUnreceivePiece = useCallback(async () => { + const currentPiece = { + ...formValues, + checked: true, + }; + + await onUnreceive([currentPiece]); + close(); + }, + [close, onUnreceive, formValues]); + const onClaimDelay = useCallback(({ claimingDate }) => { change('claimingInterval', getClaimingIntervalFromDate(claimingDate)); onStatusChange(PIECE_STATUS.claimDelayed); @@ -219,6 +231,7 @@ const AddPieceModal = ({ onClaimSend={toggleClaimSendModal} onDelete={toggleDeleteConfirmation} onReceive={onReceive} + onUnreceivePiece={onUnreceivePiece} onSave={onSave} onStatusChange={onStatusChange} status={receivingStatus} @@ -369,6 +382,7 @@ AddPieceModal.propTypes = { deletePiece: PropTypes.func.isRequired, canDeletePiece: PropTypes.bool, handleSubmit: PropTypes.func.isRequired, + onUnreceive: PropTypes.func.isRequired, form: PropTypes.object, values: PropTypes.object.isRequired, instanceId: PropTypes.string, diff --git a/src/TitleDetails/AddPieceModal/AddPieceModal.test.js b/src/TitleDetails/AddPieceModal/AddPieceModal.test.js index a03ca718..8ff059fe 100644 --- a/src/TitleDetails/AddPieceModal/AddPieceModal.test.js +++ b/src/TitleDetails/AddPieceModal/AddPieceModal.test.js @@ -22,6 +22,10 @@ jest.mock('@folio/stripes-acq-components', () => { }); jest.mock('../../common/components/LineLocationsView/LineLocationsView', () => jest.fn().mockReturnValue('LineLocationsView')); +jest.mock('../../common/hooks', () => ({ + ...jest.requireActual('../../common/hooks'), + useUnreceive: jest.fn().mockReturnValue({ unreceive: jest.fn(() => Promise.resolve()) }), +})); jest.mock('../hooks', () => ({ ...jest.requireActual('../hooks'), usePieceStatusChangeLog: jest.fn(), @@ -262,6 +266,34 @@ describe('AddPieceModal', () => { expect(defaultProps.onSubmit).toHaveBeenCalled(); }); + it('should unreceive piece', async () => { + const onUnreceive = jest.fn(); + + renderAddPieceModal({ + onUnreceive, + hasValidationErrors: false, + initialValues: { + 'id': 'cd3fd1e7-c195-4d8e-af75-525e1039d643', + 'format': 'Other', + 'poLineId': 'a92ae36c-e093-4daf-b234-b4c6dc33a258', + 'titleId': '03329fea-1b5d-43ab-b955-20bcd9ba530d', + 'holdingId': '60c67dc5-b646-425e-bf08-a8bf2d0681fb', + 'isCreateAnother': false, + 'isCreateItem': false, + receivingStatus: PIECE_STATUS.received, + receivedDate: new Date().toISOString(), + }, + }); + + await user.click(screen.getByTestId('dropdown-trigger-button')); + const unReceiveButton = await screen.findByTestId('unReceive-piece-button'); + + expect(unReceiveButton).toBeInTheDocument(); + await user.click(unReceiveButton); + + expect(onUnreceive).toHaveBeenCalled(); + }); + describe('Actions', () => { const initialValues = { format: PIECE_FORMAT.other, diff --git a/src/TitleDetails/AddPieceModal/AddPieceModalContainer.js b/src/TitleDetails/AddPieceModal/AddPieceModalContainer.js index d06737f7..136d0fb1 100644 --- a/src/TitleDetails/AddPieceModal/AddPieceModalContainer.js +++ b/src/TitleDetails/AddPieceModal/AddPieceModalContainer.js @@ -14,6 +14,7 @@ const AddPieceModalContainer = ({ close, deletePiece, canDeletePiece, + onUnreceive, initialValues, instanceId, locations, @@ -70,6 +71,7 @@ const AddPieceModalContainer = ({ onCheckIn={onQuickReceive} onSubmit={onSavePiece} pieceFormatOptions={pieceFormatOptions} + onUnreceive={onUnreceive} poLine={poLine} getHoldingsItemsAndPieces={getHoldingsItemsAndPieces} /> @@ -88,6 +90,7 @@ AddPieceModalContainer.propTypes = { onSubmit: PropTypes.func.isRequired, poLine: PropTypes.object.isRequired, getHoldingsItemsAndPieces: PropTypes.func.isRequired, + onUnreceive: PropTypes.func.isRequired, }; export default AddPieceModalContainer; diff --git a/src/TitleDetails/AddPieceModal/AddPieceModalContainer.test.js b/src/TitleDetails/AddPieceModal/AddPieceModalContainer.test.js index 8bdaa642..f1e78658 100644 --- a/src/TitleDetails/AddPieceModal/AddPieceModalContainer.test.js +++ b/src/TitleDetails/AddPieceModal/AddPieceModalContainer.test.js @@ -14,6 +14,10 @@ jest.mock('@folio/stripes-acq-components', () => ({ })); jest.mock('../../common/components/LineLocationsView/LineLocationsView', () => jest.fn().mockReturnValue('LineLocationsView')); +jest.mock('../../common/hooks', () => ({ + ...jest.requireActual('../../common/hooks'), + useUnreceive: jest.fn().mockReturnValue({ unreceive: jest.fn(() => Promise.resolve()) }), +})); jest.mock('../hooks', () => ({ ...jest.requireActual('../hooks'), usePieceStatusChangeLog: jest.fn(() => ({ data: [] })), diff --git a/src/TitleDetails/AddPieceModal/ModalActionButtons/ModalActionButtons.js b/src/TitleDetails/AddPieceModal/ModalActionButtons/ModalActionButtons.js index 43ca3ba1..f83d0218 100644 --- a/src/TitleDetails/AddPieceModal/ModalActionButtons/ModalActionButtons.js +++ b/src/TitleDetails/AddPieceModal/ModalActionButtons/ModalActionButtons.js @@ -25,6 +25,7 @@ export const ModalActionButtons = ({ onReceive, onSave, onStatusChange, + onUnreceivePiece, status, }) => { const actionMenu = getPieceActionMenu({ @@ -37,6 +38,7 @@ export const ModalActionButtons = ({ onDelete, onReceive, onStatusChange, + onUnreceivePiece, status, }); const saveButtonLabelId = 'ui-receiving.piece.actions.saveAndClose'; @@ -95,6 +97,7 @@ ModalActionButtons.propTypes = { onReceive: PropTypes.func.isRequired, onSave: PropTypes.func.isRequired, onStatusChange: PropTypes.func.isRequired, + onUnreceivePiece: PropTypes.func.isRequired, status: PropTypes.string, }; diff --git a/src/TitleDetails/AddPieceModal/ModalActionButtons/constants.js b/src/TitleDetails/AddPieceModal/ModalActionButtons/constants.js index 189b6401..d19df2ef 100644 --- a/src/TitleDetails/AddPieceModal/ModalActionButtons/constants.js +++ b/src/TitleDetails/AddPieceModal/ModalActionButtons/constants.js @@ -53,6 +53,7 @@ export const PIECE_ACTIONS = ({ onStatusChange, onDelete, onReceive, + onUnreceivePiece, }) => ({ delayClaim: (