@inveniosoftware/react-invenio-app-ils 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGES.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changes
2
2
 
3
+ Version 1.2.0 (released 2024-11-19)
4
+
5
+ - self-checkout: integrate new dedicate endpoints
6
+
3
7
  Version 1.1.0 (released 2024-11-04)
4
8
 
5
9
  - self-checkout: uppercase barcode when input by the user
package/dist/cjs/index.js CHANGED
@@ -440,6 +440,12 @@ const RECORDS_CONFIG = {
440
440
  iconClass: 'dolly'
441
441
  }
442
442
  },
443
+ deliveryMethodSelfCheckout: {
444
+ 'SELF-CHECKOUT': {
445
+ text: 'SELF-CHECKOUT',
446
+ iconClass: 'shopping basket'
447
+ }
448
+ },
443
449
  extensionsMaxCount: 3,
444
450
  loanWillExpireDays: 7,
445
451
  loanActiveStates: ['ITEM_AT_DESK', 'ITEM_ON_LOAN', 'ITEM_IN_TRANSIT_FOR_PICKUP', 'ITEM_IN_TRANSIT_TO_HOUSE'],
@@ -3447,6 +3453,7 @@ const serializer$4 = {
3447
3453
 
3448
3454
  const apiPaths$1 = {
3449
3455
  checkout: '/circulation/loans/checkout',
3456
+ selfCheckout: '/circulation/loans/self-checkout',
3450
3457
  notificationOverdue: '/circulation/loans/:loanPid/notification-overdue',
3451
3458
  item: '/circulation/loans/:loanPid',
3452
3459
  list: '/circulation/loans/',
@@ -3540,6 +3547,24 @@ const doCheckout = async function (documentPid, itemPid, patronPid) {
3540
3547
  response.data = serializer$4.fromJSON(response.data);
3541
3548
  return response;
3542
3549
  };
3550
+ const doSelfCheckoutSearchItem = async barcode => {
3551
+ const response = await http.get(`${apiPaths$1.selfCheckout}?barcode=${barcode}`);
3552
+ response.data = serializer$4.fromJSON(response.data);
3553
+ return response;
3554
+ };
3555
+ const doSelfCheckout = async (documentPid, itemPid, patronPid) => {
3556
+ const currentUser = sessionManager.user;
3557
+ const payload = {
3558
+ document_pid: documentPid,
3559
+ item_pid: itemPid,
3560
+ patron_pid: patronPid,
3561
+ transaction_location_pid: `${currentUser.locationPid}`,
3562
+ transaction_user_pid: `${currentUser.id}`
3563
+ };
3564
+ const response = await http.post(apiPaths$1.selfCheckout, payload);
3565
+ response.data = serializer$4.fromJSON(response.data);
3566
+ return response;
3567
+ };
3543
3568
  const assignItemToLoan$1 = async (itemPid, loanPid) => {
3544
3569
  const path = reactRouterDom.generatePath(apiPaths$1.replaceItem, {
3545
3570
  loanPid: loanPid
@@ -3720,6 +3745,8 @@ const loanApi = {
3720
3745
  doAction: doAction,
3721
3746
  doRequest: doRequest,
3722
3747
  doCheckout: doCheckout,
3748
+ doSelfCheckout: doSelfCheckout,
3749
+ doSelfCheckoutSearchItem: doSelfCheckoutSearchItem,
3723
3750
  sendOverdueLoansNotificationReminder: sendOverdueLoansNotificationReminder$1,
3724
3751
  serializer: serializer$4,
3725
3752
  updateDates: updateDates,
@@ -12163,6 +12190,7 @@ class LoanListEntry extends React.Component {
12163
12190
  const patronPid = loan.metadata.patron_pid;
12164
12191
  const delivery = _get__default["default"](loan.metadata.delivery, 'method');
12165
12192
  const deliveryMethod = delivery && loan.metadata.state === 'PENDING' ? invenioConfig.CIRCULATION.deliveryMethods[delivery] : '';
12193
+ const isSelfCheckout = delivery === 'SELF-CHECKOUT';
12166
12194
  return /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Item, null, /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Item.Content, null, loan.metadata.is_overdue && /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Label, {
12167
12195
  color: "red"
12168
12196
  }, "Overdue"), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Item.Header, {
@@ -12197,8 +12225,10 @@ class LoanListEntry extends React.Component {
12197
12225
  }, loan.metadata.extension_count || '0'), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.List.Content, null, /*#__PURE__*/React__default["default"].createElement("label", null, " Extensions"))))), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Grid.Column, {
12198
12226
  width: 2,
12199
12227
  textAlign: "center"
12200
- }, deliveryMethod && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, delivery, ' ', deliveryMethod.iconClass && /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Icon, {
12228
+ }, deliveryMethod ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, delivery, ' ', deliveryMethod.iconClass && /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Icon, {
12201
12229
  className: deliveryMethod.iconClass
12230
+ })) : isSelfCheckout && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, delivery, ' ', /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Icon, {
12231
+ className: invenioConfig.CIRCULATION.deliveryMethodSelfCheckout[delivery].iconClass
12202
12232
  }))), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Grid.Column, {
12203
12233
  computer: 3,
12204
12234
  largeScreen: 3
@@ -24871,7 +24901,7 @@ const deleteItem = itemPid => {
24871
24901
  }
24872
24902
  };
24873
24903
  };
24874
- const checkoutItem$2 = function (documentPid, itemPid, patronPid) {
24904
+ const checkoutItem$1 = function (documentPid, itemPid, patronPid) {
24875
24905
  let force = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
24876
24906
  return async dispatch => {
24877
24907
  dispatch({
@@ -25071,7 +25101,7 @@ const mapDispatchToProps$J = dispatch => ({
25071
25101
  deleteItem: itemPid => dispatch(deleteItem(itemPid)),
25072
25102
  checkoutItem: function (documentPid, itemPid, patronPid) {
25073
25103
  let force = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
25074
- return dispatch(checkoutItem$2(documentPid, itemPid, patronPid, force));
25104
+ return dispatch(checkoutItem$1(documentPid, itemPid, patronPid, force));
25075
25105
  }
25076
25106
  });
25077
25107
  const ItemActionMenu = reactRedux.connect(mapStateToProps$W, mapDispatchToProps$J)(ItemActionMenu$1);
@@ -25452,7 +25482,7 @@ const mapDispatchToProps$I = dispatch => ({
25452
25482
  deleteItem: itemPid => dispatch(deleteItem(itemPid)),
25453
25483
  checkoutItem: function (documentPid, itemPid, patronPid) {
25454
25484
  let force = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
25455
- return dispatch(checkoutItem$2(documentPid, itemPid, patronPid, force));
25485
+ return dispatch(checkoutItem$1(documentPid, itemPid, patronPid, force));
25456
25486
  }
25457
25487
  });
25458
25488
  const ItemMetadata$1 = reactRedux.connect(mapStateToProps$U, mapDispatchToProps$I)(ItemMetadata$2);
@@ -26625,7 +26655,7 @@ class LoanMetadata$1 extends React.Component {
26625
26655
  getDelivery(_delivery) {
26626
26656
  const delivery = _get__default["default"](_delivery, 'method');
26627
26657
  if (delivery) {
26628
- const deliveryMethod = invenioConfig.CIRCULATION.deliveryMethods[delivery];
26658
+ const deliveryMethod = invenioConfig.CIRCULATION.deliveryMethods[delivery] || invenioConfig.CIRCULATION.deliveryMethodSelfCheckout[delivery];
26629
26659
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, deliveryMethod.text, ' ', deliveryMethod.iconClass && /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Icon, {
26630
26660
  className: deliveryMethod.iconClass
26631
26661
  }));
@@ -29571,7 +29601,7 @@ const CLEAR_SEARCH = 'itemsSearchBarcode/CLEAR_SEARCH';
29571
29601
  const IS_LOADING$h = 'patronItemCheckout/IS_LOADING';
29572
29602
  const SUCCESS$h = 'patronItemCheckout/SUCCESS';
29573
29603
  const HAS_ERROR$h = 'patronItemCheckout/ERROR';
29574
- const checkoutItem$1 = function (documentPid, itemPid, patronPid) {
29604
+ const checkoutItem = function (documentPid, itemPid, patronPid) {
29575
29605
  let force = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
29576
29606
  return async dispatch => {
29577
29607
  dispatch({
@@ -29612,7 +29642,7 @@ const checkoutItem$1 = function (documentPid, itemPid, patronPid) {
29612
29642
  const mapDispatchToProps$t = dispatch => ({
29613
29643
  checkoutItem: function (documentPid, itemPid, patronPid) {
29614
29644
  let force = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
29615
- return dispatch(checkoutItem$1(documentPid, itemPid, patronPid, force));
29645
+ return dispatch(checkoutItem(documentPid, itemPid, patronPid, force));
29616
29646
  }
29617
29647
  });
29618
29648
  const mapStateToProps$E = state => ({
@@ -29774,7 +29804,7 @@ const mapStateToProps$D = state => ({
29774
29804
  const mapDispatchToProps$s = dispatch => ({
29775
29805
  checkoutItem: function (documentPid, itemPid, patronPid) {
29776
29806
  let force = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
29777
- return dispatch(checkoutItem$1(documentPid, itemPid, patronPid, force));
29807
+ return dispatch(checkoutItem(documentPid, itemPid, patronPid, force));
29778
29808
  }
29779
29809
  });
29780
29810
  const ItemsResultsList = reactRedux.connect(mapStateToProps$D, mapDispatchToProps$s)(ItemsResultsList$1);
@@ -29900,7 +29930,7 @@ const fetchAndCheckoutIfOne = (barcode, patronPid, onSuccess) => {
29900
29930
  type: recordToPidType(itemToCheckout),
29901
29931
  value: itemToCheckout.metadata.pid
29902
29932
  };
29903
- dispatch(checkoutItem$1(documentPid, itemPid, patronPid, true));
29933
+ dispatch(checkoutItem(documentPid, itemPid, patronPid, true));
29904
29934
  onSuccess();
29905
29935
  }
29906
29936
  } catch (error) {
@@ -29935,7 +29965,7 @@ const mapDispatchToProps$r = dispatch => ({
29935
29965
  clearResults: () => dispatch(clearResults()),
29936
29966
  checkoutItem: function (documentPid, itemPid, patronPid) {
29937
29967
  let force = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
29938
- return dispatch(checkoutItem$1(documentPid, itemPid, patronPid, force));
29968
+ return dispatch(checkoutItem(documentPid, itemPid, patronPid, force));
29939
29969
  }
29940
29970
  });
29941
29971
  const mapStateToProps$C = state => ({
@@ -37766,11 +37796,11 @@ class SelfCheckoutModal$1 extends React__default["default"].Component {
37766
37796
  size: "large",
37767
37797
  centered: true,
37768
37798
  onClose: () => toggleModal(false)
37769
- }, /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Modal.Header, null, `You are about to checkout a book with barcode:
37799
+ }, /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Modal.Header, null, `You are about to checkout the literature with barcode:
37770
37800
  ${item === null || item === void 0 ? void 0 : item.metadata.barcode}`), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Modal.Content, null, /*#__PURE__*/React__default["default"].createElement(DocumentCard, {
37771
37801
  item: item
37772
37802
  }), /*#__PURE__*/React__default["default"].createElement(ManualCheckout, {
37773
- label: "Wrong book?",
37803
+ label: "Wrong literature?",
37774
37804
  autofocus: true,
37775
37805
  show: true,
37776
37806
  onBarcodeInput: onBarcodeDetected
@@ -37808,22 +37838,19 @@ const notifyResultMessage = message => {
37808
37838
  dispatch(sendWarningNotification(message));
37809
37839
  };
37810
37840
  };
37811
- const searchItem = async (dispatch, term) => {
37812
- const upperCasedTerm = term.toUpperCase();
37813
- const response = await itemApi.list(itemApi.query().withBarcode(upperCasedTerm).qs());
37814
- const item = _first__default["default"](response.data.hits) || null;
37815
- dispatch({
37816
- type: SEARCH_ITEM_SUCCESS,
37817
- payload: item
37818
- });
37819
- };
37820
37841
  const selfCheckOutSearch = term => {
37821
37842
  return async dispatch => {
37822
37843
  dispatch({
37823
37844
  type: SEARCH_IS_LOADING
37824
37845
  });
37825
37846
  try {
37826
- await searchItem(dispatch, term);
37847
+ const upperCasedTerm = term.toUpperCase();
37848
+ const response = await loanApi.doSelfCheckoutSearchItem(upperCasedTerm);
37849
+ const item = response.data || null;
37850
+ dispatch({
37851
+ type: SEARCH_ITEM_SUCCESS,
37852
+ payload: item
37853
+ });
37827
37854
  } catch (error) {
37828
37855
  dispatch({
37829
37856
  type: SEARCH_HAS_ERROR,
@@ -37833,16 +37860,13 @@ const selfCheckOutSearch = term => {
37833
37860
  }
37834
37861
  };
37835
37862
  };
37836
- const checkoutItem = (documentPid, itemPid, patronPid) => {
37863
+ const selfCheckOut = (documentPid, itemPid, patronPid) => {
37837
37864
  return async dispatch => {
37838
37865
  try {
37839
- const response = await loanApi.doCheckout(documentPid, itemPid, patronPid);
37840
- const {
37841
- pid
37842
- } = response.data.metadata;
37843
- const linkToLoan = /*#__PURE__*/React__default["default"].createElement("p", null, "The loan ", pid, " has been created by you! You can view all your current loans on your ", /*#__PURE__*/React__default["default"].createElement(reactRouterDom.Link, {
37866
+ await loanApi.doSelfCheckout(documentPid, itemPid, patronPid);
37867
+ const linkToLoan = /*#__PURE__*/React__default["default"].createElement("p", null, "Self-checkout completed! You can view all your current loans on your", ' ', /*#__PURE__*/React__default["default"].createElement(reactRouterDom.Link, {
37844
37868
  to: FrontSiteRoutes.patronProfile
37845
- }, "profile"), ' ', "page.");
37869
+ }, "profile"), " page.");
37846
37870
  dispatch(sendSuccessNotification('Success!', linkToLoan));
37847
37871
  } catch (error) {
37848
37872
  dispatch(sendErrorNotification(error));
@@ -37851,7 +37875,7 @@ const checkoutItem = (documentPid, itemPid, patronPid) => {
37851
37875
  };
37852
37876
 
37853
37877
  const mapDispatchToProps$a = dispatch => ({
37854
- checkoutItem: (documentPid, itemPid, patronPid) => dispatch(checkoutItem(documentPid, itemPid, patronPid))
37878
+ checkoutItem: (documentPid, itemPid, patronPid) => dispatch(selfCheckOut(documentPid, itemPid, patronPid))
37855
37879
  });
37856
37880
  const mapStateToProps$b = state => ({
37857
37881
  user: state.authenticationManagement.data,
@@ -37885,49 +37909,9 @@ class SelfCheckout$1 extends React__default["default"].Component {
37885
37909
  selfCheckOutSearch
37886
37910
  } = this.props;
37887
37911
  await selfCheckOutSearch(detectedBarcode);
37888
-
37889
- // open modal if item is loanable
37890
- const shouldShowModal = this.isItemLoanable(detectedBarcode);
37891
- if (shouldShowModal) {
37892
- this.toggleModal(true);
37893
- } else {
37894
- this.toggleModal(false);
37895
- }
37912
+ this.toggleModal(true);
37896
37913
  }
37897
37914
  };
37898
- this.itemStatus = item => ({
37899
- canCirculate: () => invenioConfig.ITEMS.canCirculateStatuses.includes(item.metadata.status),
37900
- isOnShelf: () => !item.metadata.circulation.state // on shelf if circulation.state doesn't exist
37901
- });
37902
- this.isItemLoanable = itemBarcode => {
37903
- const {
37904
- user,
37905
- item,
37906
- notifyResultMessage
37907
- } = this.props;
37908
- var resultMessage = `Book with barcode ${itemBarcode} not found.`;
37909
- if (!_isEmpty__default["default"](item)) {
37910
- if (this.itemStatus(item).canCirculate()) {
37911
- if (this.itemStatus(item).isOnShelf()) {
37912
- return true;
37913
- } else {
37914
- if (item.metadata.circulation.patron_pid === user.id.toString()) {
37915
- resultMessage = `You already loaned this book with barcode: ${itemBarcode}!`;
37916
- } else {
37917
- resultMessage = `Book with barcode: ${itemBarcode} is currently on loan!`;
37918
- }
37919
- }
37920
- } else {
37921
- var _item$metadata;
37922
- const status = _find__default["default"](invenioConfig.ITEMS.statuses, {
37923
- value: (_item$metadata = item.metadata) === null || _item$metadata === void 0 ? void 0 : _item$metadata.status
37924
- });
37925
- resultMessage = `Book with barcode: ${itemBarcode} is ${status === null || status === void 0 ? void 0 : status.text}!`;
37926
- }
37927
- }
37928
- notifyResultMessage(resultMessage);
37929
- return false;
37930
- };
37931
37915
  this.renderInstructions = () => {
37932
37916
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Header, {
37933
37917
  as: "h3"
@@ -37979,13 +37963,11 @@ class SelfCheckout$1 extends React__default["default"].Component {
37979
37963
  }), this.renderInstructions());
37980
37964
  }
37981
37965
  }
37982
- SelfCheckout$1.defaultProps = {
37983
- item: null
37984
- };
37985
37966
  var SelfCheckoutComponent = Overridable__default["default"].component('SelfCheckout', SelfCheckout$1);
37986
37967
 
37987
37968
  const mapDispatchToProps$9 = dispatch => ({
37988
37969
  selfCheckOutSearch: term => dispatch(selfCheckOutSearch(term)),
37970
+ selfCheckOut: term => dispatch(selfCheckOut(term)),
37989
37971
  notifyResultMessage: message => dispatch(notifyResultMessage(message))
37990
37972
  });
37991
37973
  const mapStateToProps$a = state => ({