Skip to content

Commit

Permalink
Use instanceId param for ILR from items response
Browse files Browse the repository at this point in the history
  • Loading branch information
artem-blazhko committed Oct 7, 2024
1 parent 9fdbd0d commit d4cba7f
Show file tree
Hide file tree
Showing 12 changed files with 128 additions and 112 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
* Add sorting to 'Printed' and '# Copies' columns in the Request App. Refs UIREQ-1140.
* Implement "Print Status" filters as server-side filters. Refs UIREQ-1147.
* Navigate to first page when saving the pick slip print log from beyond the first page. Refs UIREQ-1145.
* Use `instanceId` param for ILR from items response. Refs UIREQ-1149.

## [9.1.2] (https://github.com/folio-org/ui-requests/tree/v9.1.2) (2024-09-13)
[Full Changelog](https://github.com/folio-org/ui-requests/compare/v9.1.1...v9.1.2)
Expand Down
24 changes: 14 additions & 10 deletions src/RequestForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ class RequestForm extends React.Component {
values: PropTypes.object.isRequired,
form: PropTypes.object.isRequired,
blocked: PropTypes.bool.isRequired,
instanceId: PropTypes.string.isRequired,
isPatronBlocksOverridden: PropTypes.bool.isRequired,
onSubmit: PropTypes.func,
parentMutator: PropTypes.shape({
Expand All @@ -160,7 +159,6 @@ class RequestForm extends React.Component {
onSetSelectedInstance: PropTypes.func.isRequired,
onSetBlocked: PropTypes.func.isRequired,
onSetIsPatronBlocksOverridden: PropTypes.func.isRequired,
onSetInstanceId: PropTypes.func.isRequired,
};

static defaultProps = {
Expand Down Expand Up @@ -717,22 +715,21 @@ class RequestForm extends React.Component {
findItemRelatedResources(item) {
const {
findResource,
onSetInstanceId,
} = this.props;
if (!item) return null;

if (!item) {
return null;
}

return Promise.all(
[
findResource('loan', item.id),
findResource('requestsForItem', item.id),
findResource(RESOURCE_TYPES.HOLDING, item.holdingsRecordId),
],
).then((results) => {
const selectedLoan = results[0]?.loans?.[0];
const itemRequestCount = results[1]?.requests?.length;
const holdingsRecord = results[2]?.holdingsRecords?.[0];

onSetInstanceId(holdingsRecord?.instanceId);
this.setState({
itemRequestCount,
selectedLoan,
Expand Down Expand Up @@ -811,6 +808,11 @@ class RequestForm extends React.Component {

return foundItem;
})
.catch(() => {
onSetSelectedItem(null);

return null;
})
.then(item => {
if (item && selectedUser?.id) {
const requester = getRequester(proxy, selectedUser);
Expand Down Expand Up @@ -888,6 +890,11 @@ class RequestForm extends React.Component {

return instance;
})
.catch(() => {
onSetSelectedInstance(null);

return null;
})
.then(instance => {
if (instance && selectedUser?.id) {
const requester = getRequester(proxy, selectedUser);
Expand Down Expand Up @@ -1093,7 +1100,6 @@ class RequestForm extends React.Component {
selectedUser,
selectedInstance,
isPatronBlocksOverridden,
instanceId,
blocked,
values,
onCancel,
Expand Down Expand Up @@ -1283,7 +1289,6 @@ class RequestForm extends React.Component {
onSetSelectedInstance={onSetSelectedInstance}
isLoading={isItemOrInstanceLoading}
instanceRequestCount={instanceRequestCount}
instanceId={instanceId}
/>
</div>
</Accordion>
Expand All @@ -1305,7 +1310,6 @@ class RequestForm extends React.Component {
onSetSelectedItem={onSetSelectedItem}
values={values}
itemRequestCount={itemRequestCount}
instanceId={instanceId}
selectedLoan={selectedLoan}
isLoading={isItemOrInstanceLoading}
/>
Expand Down
113 changes: 91 additions & 22 deletions src/RequestForm.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import RequestForm, {
} from './RequestForm';
import FulfilmentPreference from './components/FulfilmentPreference';
import RequesterInformation from './components/RequesterInformation';
import ItemInformation from './components/ItemInformation';
import InstanceInformation from './components/InstanceInformation';

import {
REQUEST_LEVEL_TYPES,
Expand Down Expand Up @@ -52,6 +54,8 @@ const testIds = {
closePatronModalButton: 'closePatronModalButton',
itemDialogCloseButton: 'itemDialogCloseButton',
itemDialogRow: 'itemDialogRow',
itemEnterButton: 'itemEnterButton',
instanceEnterButton: 'instanceEnterButton',
};
const fieldValue = 'value';
const idResourceType = 'id';
Expand Down Expand Up @@ -214,7 +218,6 @@ describe('RequestForm', () => {
onSetSelectedInstance: jest.fn(),
onSetSelectedItem: jest.fn(),
onSetSelectedUser: jest.fn(),
onSetInstanceId: jest.fn(),
onSetIsPatronBlocksOverridden: jest.fn(),
onSetBlocked: jest.fn(),
onShowErrorModal: jest.fn(),
Expand Down Expand Up @@ -1232,6 +1235,7 @@ describe('RequestForm', () => {
id: 'itemId',
barcode: initialItemBarcode,
holdingsRecordId: 'holdingsRecordId',
instanceId,
}
],
};
Expand All @@ -1253,13 +1257,6 @@ describe('RequestForm', () => {
const itemRequestsResult = {
requests: [],
};
const holdingsRecordResult = {
holdingsRecords: [
{
instanceId,
}
],
};
let findResource;

beforeEach(() => {
Expand All @@ -1269,7 +1266,6 @@ describe('RequestForm', () => {
.mockResolvedValueOnce(requestTypesResult)
.mockResolvedValueOnce(loanResult)
.mockResolvedValueOnce(itemRequestsResult)
.mockResolvedValueOnce(holdingsRecordResult)
.mockResolvedValue({});

const props = {
Expand Down Expand Up @@ -1338,19 +1334,6 @@ describe('RequestForm', () => {
expect(findResource).toHaveBeenCalledWith(...expectedArgs);
});

it('should get information about holdings', () => {
const expectedArgs = [
RESOURCE_TYPES.HOLDING,
itemResult.items[0].holdingsRecordId
];

expect(findResource).toHaveBeenCalledWith(...expectedArgs);
});

it('should set instance id', () => {
expect(basicProps.onSetInstanceId).toHaveBeenCalledWith(holdingsRecordResult.holdingsRecords[0].instanceId);
});

it('should handle item barcode field change', () => {
const expectedArgs = [RESOURCE_TYPES.ITEM, fieldValue, RESOURCE_KEYS.id];
const itemField = screen.getByTestId(testIds.itemField);
Expand Down Expand Up @@ -1420,6 +1403,47 @@ describe('RequestForm', () => {
expect(findResource).not.toHaveBeenCalledWith(...expectedArgs);
});
});

describe('When error during item finding', () => {
beforeEach(() => {
const props = {
...basicProps,
request: undefined,
findResource: jest.fn()
.mockRejectedValue({}),
};

ItemInformation.mockImplementationOnce(({
findItem,
}) => {
const handleClick = () => {
findItem(idResourceType, 'id', false);
};

return (
<button
type="button"
data-testid={testIds.itemEnterButton}
onClick={handleClick}
>
Enter
</button>
);
});

renderComponent(props);
});

it('should reset item information', async () => {
const itemField = screen.getByTestId(testIds.itemEnterButton);

fireEvent.click(itemField);

await waitFor(() => {
expect(basicProps.onSetSelectedItem).toHaveBeenCalledWith(null);
});
});
});
});

describe('Component updating', () => {
Expand Down Expand Up @@ -1697,6 +1721,51 @@ describe('RequestForm', () => {
expect(resetFieldState).not.toHaveBeenCalledWith(...expectedArgs);
});
});

describe('When error during instance finding', () => {
beforeEach(() => {
const props = {
...basicProps,
request: undefined,
values: {
...basicProps.values,
createTitleLevelRequest: true,
},
findResource: jest.fn()
.mockRejectedValue({}),
};

InstanceInformation.mockImplementationOnce(({
findInstance,
}) => {
const handleClick = () => {
findInstance('id', false);
};

return (
<button
type="button"
data-testid={testIds.instanceEnterButton}
onClick={handleClick}
>
Enter
</button>
);
});

renderComponent(props);
});

it('should reset instance information', async () => {
const itemField = screen.getByTestId(testIds.instanceEnterButton);

fireEvent.click(itemField);

await waitFor(() => {
expect(basicProps.onSetSelectedInstance).toHaveBeenCalledWith(null);
});
});
});
});

describe('Component updating', () => {
Expand Down
9 changes: 1 addition & 8 deletions src/RequestFormContainer.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ const RequestFormContainer = ({
const [selectedUser, setSelectedUser] = useState({ ...requester, id: requesterId });
const [selectedInstance, setSelectedInstance] = useState(request?.instance);
const [isPatronBlocksOverridden, setIsPatronBlocksOverridden] = useState(false);
const [instanceId, setInstanceId] = useState('');
const [blocked, setBlocked] = useState(false);

const setItem = (optedItem) => {
Expand All @@ -62,10 +61,6 @@ const RequestFormContainer = ({
setIsPatronBlocksOverridden(value);
};

const setStateInstanceId = (id) => {
setInstanceId(id);
};

const getPatronManualBlocks = (resources) => {
return (resources?.patronBlocks?.records || [])
.filter(b => b.requests === true)
Expand Down Expand Up @@ -142,7 +137,7 @@ const RequestFormContainer = ({
};
}

requestData.instanceId = request?.instanceId || instanceId || selectedInstance?.id;
requestData.instanceId = request?.instanceId || selectedInstance?.id || selectedItem?.instanceId;
requestData.requestLevel = request?.requestLevel || getRequestLevelValue(requestData.createTitleLevelRequest);

if (requestData.requestLevel === REQUEST_LEVEL_TYPES.ITEM) {
Expand Down Expand Up @@ -179,15 +174,13 @@ const RequestFormContainer = ({
selectedUser={selectedUser}
selectedInstance={selectedInstance}
isPatronBlocksOverridden={isPatronBlocksOverridden}
instanceId={instanceId}
onGetPatronManualBlocks={getPatronManualBlocks}
onGetAutomatedPatronBlocks={getAutomatedPatronBlocks}
onSetBlocked={setIsBlocked}
onSetSelectedItem={setItem}
onSetSelectedUser={setUser}
onSetSelectedInstance={setInstance}
onSetIsPatronBlocksOverridden={setStateIsPatronBlocksOverridden}
onSetInstanceId={setStateInstanceId}
onSubmit={handleSubmit}
/>
);
Expand Down
9 changes: 6 additions & 3 deletions src/RequestFormContainer.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,13 @@ describe('RequestFormContainer', () => {
},
selectedInstance: defaultProps.request.instance,
isPatronBlocksOverridden: false,
instanceId: '',
onGetPatronManualBlocks: expect.any(Function),
onGetAutomatedPatronBlocks: expect.any(Function),
onSetBlocked: expect.any(Function),
onSetSelectedItem: expect.any(Function),
onSetSelectedUser: expect.any(Function),
onSetSelectedInstance: expect.any(Function),
onSetIsPatronBlocksOverridden: expect.any(Function),
onSetInstanceId: expect.any(Function),
onSubmit: expect.any(Function),
};

Expand Down Expand Up @@ -100,13 +98,18 @@ describe('RequestFormContainer', () => {
};
const props = {
...defaultProps,
request: {
...defaultProps.request,
instanceId: null,
},
itemId: 'itemId',
item: {
id: 'id',
},
};
const selectedItem = {
holdingsRecordId: 'holdingsRecordId',
instanceId: 'instanceId',
};
const selectItemLabel = 'Select Item';

Expand Down Expand Up @@ -144,7 +147,7 @@ describe('RequestFormContainer', () => {
const expectedArg = {
holdingsRecordId: selectedItem.holdingsRecordId,
fulfillmentPreference: fulfillmentTypeMap.HOLD_SHELF,
instanceId: defaultProps.request.instanceId,
instanceId: selectedItem.instanceId,
requestLevel: REQUEST_LEVEL_TYPES.ITEM,
pickupServicePointId: submitData.pickupServicePointId,
item: submitData.item,
Expand Down
4 changes: 1 addition & 3 deletions src/components/InstanceInformation/InstanceInformation.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ class InstanceInformation extends Component {
values: PropTypes.object.isRequired,
onSetSelectedInstance: PropTypes.func.isRequired,
isLoading: PropTypes.bool.isRequired,
instanceId: PropTypes.string.isRequired,
request: PropTypes.object,
instanceRequestCount: PropTypes.number,
selectedInstance: PropTypes.object,
Expand Down Expand Up @@ -159,7 +158,6 @@ class InstanceInformation extends Component {
values,
isLoading,
instanceRequestCount,
instanceId,
} = this.props;
const {
isInstanceClicked,
Expand Down Expand Up @@ -247,7 +245,7 @@ class InstanceInformation extends Component {
{
isTitleInfoVisible &&
<TitleInformation
instanceId={request?.instanceId || selectedInstance.id || instanceId}
instanceId={request?.instanceId || selectedInstance.id}
titleLevelRequestsCount={titleLevelRequestsCount}
title={selectedInstance.title}
contributors={selectedInstance.contributors || selectedInstance.contributorNames}
Expand Down
Loading

0 comments on commit d4cba7f

Please sign in to comment.