@inveniosoftware/react-invenio-app-ils 1.3.0 → 2.0.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,6 +1,13 @@
1
1
  # Changes
2
2
 
3
- Version 1.3.0 (released 2024-06-04)
3
+ Version 2.0.0 (released 2025-08-12)
4
+
5
+ - global: adapt API calls to latest versions (invenio-banners)
6
+ - administration: remove access to invenio-admin endpoints (phase out package)
7
+ - frontside: added config to display selected item identifiers
8
+ - backoffice: added NOT-SPECIFIED delivery method
9
+
10
+ Version 1.3.0 (released 2025-06-04)
4
11
 
5
12
  - closures: disabled closed dates in Backoffice LoanUpdateDates calendar
6
13
  - backoffice: fix relations table only showing items on the first page
package/dist/cjs/index.js CHANGED
@@ -431,6 +431,10 @@ const RECORDS_CONFIG = {
431
431
  },
432
432
  CIRCULATION: {
433
433
  deliveryMethods: {
434
+ 'NOT-SPECIFIED': {
435
+ text: 'Not Specified',
436
+ iconClass: 'question circle outline'
437
+ },
434
438
  PICKUP: {
435
439
  text: 'Pick it up at the library desk',
436
440
  iconClass: 'warehouse'
@@ -735,6 +739,7 @@ const RECORDS_CONFIG = {
735
739
  }
736
740
  },
737
741
  ITEMS: {
742
+ identifiersToDisplayInFrontside: [],
738
743
  circulationRestrictions: [{
739
744
  value: 'NO_RESTRICTION',
740
745
  text: 'No restriction (4 weeks)'
@@ -2393,11 +2398,15 @@ const orderApi = {
2393
2398
  const bannerURL = '/banners/';
2394
2399
  const getActive = async () => {
2395
2400
  const URLPath = window.location.pathname;
2396
- return await http.get(`${bannerURL}active`, {
2401
+ const response = await http.get(`${bannerURL}`, {
2397
2402
  params: {
2398
- url_path: URLPath
2403
+ url_path: URLPath,
2404
+ active: true
2399
2405
  }
2400
2406
  });
2407
+ response.data.total = getSearchTotal(response.data.hits);
2408
+ response.data.hits = response.data.hits.hits;
2409
+ return response;
2401
2410
  };
2402
2411
  const bannerApi = {
2403
2412
  getActive: getActive,
@@ -6214,7 +6223,8 @@ class DocumentItemBody extends React.Component {
6214
6223
  const {
6215
6224
  items,
6216
6225
  shelfLink,
6217
- documentDetails
6226
+ documentDetails,
6227
+ identifiersToDisplayInFrontside
6218
6228
  } = this.props;
6219
6229
  return items.map(item => /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.Row, {
6220
6230
  key: item.pid
@@ -6224,7 +6234,16 @@ class DocumentItemBody extends React.Component {
6224
6234
  }, item.barcode), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.Cell, {
6225
6235
  "data-label": "Shelf",
6226
6236
  className: "document-item-table-itemCell"
6227
- }, shelfLink !== null ? shelfLink(item, documentDetails) : _get__default["default"](item, 'shelf')), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.Cell, {
6237
+ }, shelfLink !== null ? shelfLink(item, documentDetails) : _get__default["default"](item, 'shelf')), identifiersToDisplayInFrontside.map(identifier => {
6238
+ var _item$identifiers, _item$identifiers$fin;
6239
+ return /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.Cell, {
6240
+ key: identifier,
6241
+ "data-label": identifier.text,
6242
+ className: "document-item-table-itemCell"
6243
+ }, (_item$identifiers = item.identifiers) === null || _item$identifiers === void 0 ? void 0 : (_item$identifiers$fin = _item$identifiers.find(entry => {
6244
+ return entry.scheme === identifier.key;
6245
+ })) === null || _item$identifiers$fin === void 0 ? void 0 : _item$identifiers$fin.value);
6246
+ }), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.Cell, {
6228
6247
  "data-label": "Status"
6229
6248
  }, this.statusLabel(item)), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.Cell, {
6230
6249
  "data-label": "Medium"
@@ -7993,7 +8012,7 @@ const BannerCmp = _ref => {
7993
8012
  break;
7994
8013
  }
7995
8014
  return /*#__PURE__*/React__default["default"].createElement(Overridable__default["default"], {
7996
- id: "Banner.layout",
8015
+ id: "Banners.layout",
7997
8016
  message: message,
7998
8017
  category: category,
7999
8018
  colorProp: colorProp
@@ -8005,42 +8024,44 @@ const BannerCmp = _ref => {
8005
8024
  }
8006
8025
  })));
8007
8026
  };
8008
- class Banner$1 extends React.Component {
8027
+ class Banners$1 extends React.Component {
8009
8028
  componentDidMount() {
8010
8029
  const {
8011
- fetchBanner,
8012
- resetBanner
8030
+ fetchBanners,
8031
+ resetBanners
8013
8032
  } = this.props;
8014
- resetBanner();
8015
- fetchBanner();
8016
- this.intervalFetchBannerId = setInterval(fetchBanner, FETCH_BANNER_EVERY_SECS * 1000);
8033
+ resetBanners();
8034
+ fetchBanners();
8035
+ this.intervalfetchBannersId = setInterval(fetchBanners, FETCH_BANNER_EVERY_SECS * 1000);
8017
8036
  }
8018
8037
  componentWillUnmount() {
8019
- this.intervalFetchBannerId && clearInterval(this.intervalFetchBannerId);
8038
+ this.intervalfetchBannersId && clearInterval(this.intervalfetchBannersId);
8020
8039
  }
8021
8040
  render() {
8022
8041
  const {
8023
- banner,
8042
+ banners,
8024
8043
  children
8025
8044
  } = this.props;
8026
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, !_isEmpty__default["default"](banner) ? /*#__PURE__*/React__default["default"].createElement(BannerCmp, banner) : null, " ", children);
8045
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, !_isEmpty__default["default"](banners) ? banners.hits.map(banner => /*#__PURE__*/React__default["default"].createElement(BannerCmp, Object.assign({
8046
+ key: banner.id
8047
+ }, banner))) : null, ' ', children);
8027
8048
  }
8028
8049
  }
8029
- Banner$1.defaultProps = {
8030
- banner: null,
8050
+ Banners$1.defaultProps = {
8051
+ banners: null,
8031
8052
  children: null
8032
8053
  };
8033
- var BannerComponent = Overridable__default["default"].component('Banner', Banner$1);
8054
+ var BannerComponent = Overridable__default["default"].component('Banners', Banners$1);
8034
8055
 
8035
- const BANNER_RESET = 'fetchBanner/RESET';
8036
- const BANNER_SUCCESS = 'fetchBanner/SUCCESS';
8037
- const BANNER_HAS_ERROR = 'fetchBanner/HAS_ERROR';
8038
- const resetBanner = () => {
8056
+ const BANNER_RESET = 'fetchBanners/RESET';
8057
+ const BANNER_SUCCESS = 'fetchBanners/SUCCESS';
8058
+ const BANNER_HAS_ERROR = 'fetchBanners/HAS_ERROR';
8059
+ const resetBanners = () => {
8039
8060
  return async dispatch => dispatch({
8040
8061
  type: BANNER_RESET
8041
8062
  });
8042
8063
  };
8043
- const fetchBanner = () => {
8064
+ const fetchBanners = () => {
8044
8065
  return async dispatch => {
8045
8066
  try {
8046
8067
  const response = await bannerApi.getActive();
@@ -8058,14 +8079,14 @@ const fetchBanner = () => {
8058
8079
  };
8059
8080
 
8060
8081
  const mapStateToProps$1D = state => ({
8061
- banner: state.banner.data,
8062
- error: state.banner.error
8082
+ banners: state.banners.data,
8083
+ error: state.banners.error
8063
8084
  });
8064
8085
  const mapDispatchToProps$1j = dispatch => ({
8065
- fetchBanner: () => dispatch(fetchBanner()),
8066
- resetBanner: () => dispatch(resetBanner())
8086
+ fetchBanners: () => dispatch(fetchBanners()),
8087
+ resetBanners: () => dispatch(resetBanners())
8067
8088
  });
8068
- const Banner = reactRedux.connect(mapStateToProps$1D, mapDispatchToProps$1j)(BannerComponent);
8089
+ const Banners = reactRedux.connect(mapStateToProps$1D, mapDispatchToProps$1j)(BannerComponent);
8069
8090
 
8070
8091
  const LoginWithLocalAccountLayout = _ref => {
8071
8092
  let {
@@ -8481,7 +8502,7 @@ class Login$1 extends React.Component {
8481
8502
  this.redirectIfAlreadyLoggedIn();
8482
8503
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Overridable__default["default"], {
8483
8504
  id: "Login.extras"
8484
- }, /*#__PURE__*/React__default["default"].createElement(Banner, null)), /*#__PURE__*/React__default["default"].createElement(LoginLayout, Object.assign({
8505
+ }, /*#__PURE__*/React__default["default"].createElement(Banners, null)), /*#__PURE__*/React__default["default"].createElement(LoginLayout, Object.assign({
8485
8506
  hasError: hasError,
8486
8507
  errorHeader: errorHeader,
8487
8508
  errorMessage: errorMessage
@@ -8757,11 +8778,11 @@ class AdminMenu extends React.Component {
8757
8778
  className: "bo-menu bo-menu-footer"
8758
8779
  }, /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Menu.Item, null, /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Menu.Menu, null, /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Menu.Item, {
8759
8780
  as: "a",
8760
- href: `${invenioConfig.APP.INVENIO_UI_URL}/admin`,
8781
+ href: `${invenioConfig.APP.INVENIO_UI_URL}/administration`,
8761
8782
  target: "_blank"
8762
8783
  }, "Admin panel"), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Menu.Item, {
8763
8784
  as: "a",
8764
- href: `${invenioConfig.APP.INVENIO_UI_URL}/admin/page`,
8785
+ href: `${invenioConfig.APP.INVENIO_UI_URL}/administration/pages`,
8765
8786
  target: "_blank"
8766
8787
  }, "Static pages"))))));
8767
8788
  }
@@ -13848,7 +13869,7 @@ class ESSelectorLoanRequest extends React.Component {
13848
13869
  placeholder: "Select delivery method",
13849
13870
  options: this.deliveryMethods,
13850
13871
  onChange: this.handleDeliveryMethodChange,
13851
- defaultValue: this.deliveryMethods[1].value,
13872
+ defaultValue: this.defaultDeliveryMethod,
13852
13873
  selection: true
13853
13874
  })) : null;
13854
13875
  };
@@ -13868,7 +13889,11 @@ class ESSelectorLoanRequest extends React.Component {
13868
13889
  value: key,
13869
13890
  text: invenioConfig.CIRCULATION.deliveryMethods[key].text
13870
13891
  })) : [];
13871
- this.state['deliveryMethod'] = this.withDeliveryMethod ? this.deliveryMethods[1].value : null;
13892
+ this.defaultDeliveryMethod = null;
13893
+ if (this.withDeliveryMethod) {
13894
+ this.defaultDeliveryMethod = this.deliveryMethods.some(method => method.value === 'NOT-SPECIFIED') ? 'NOT-SPECIFIED' : this.deliveryMethods[0].value;
13895
+ }
13896
+ this.state['deliveryMethod'] = this.defaultDeliveryMethod;
13872
13897
  }
13873
13898
  render() {
13874
13899
  const {
@@ -34688,7 +34713,7 @@ class BackOffice extends React.Component {
34688
34713
  } = this.props;
34689
34714
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Overridable__default["default"], {
34690
34715
  id: "BackOffice.extras"
34691
- }, /*#__PURE__*/React__default["default"].createElement(Banner, null)), /*#__PURE__*/React__default["default"].createElement("div", {
34716
+ }, /*#__PURE__*/React__default["default"].createElement(Banners, null)), /*#__PURE__*/React__default["default"].createElement("div", {
34692
34717
  className: "backoffice"
34693
34718
  }, /*#__PURE__*/React__default["default"].createElement("div", {
34694
34719
  className: "bo-sidebar"
@@ -35130,6 +35155,21 @@ class DocumentStats extends React.Component {
35130
35155
  class DocumentItem extends React.Component {
35131
35156
  constructor(props) {
35132
35157
  super(props);
35158
+ this.fetchIdentifiersToDisplayInFrontsideTitles = () => {
35159
+ const query = vocabularyApi.query().withType(invenioConfig.VOCABULARIES.item.identifier.scheme);
35160
+ vocabularyApi.list(query.qs()).then(response => {
35161
+ const identifiersToDisplayInFrontside = this.state.identifiersToDisplayInFrontside.map(identifier => {
35162
+ const vocabEntry = response.data.hits.find(entry => entry.metadata.key === identifier.key);
35163
+ return {
35164
+ ...identifier,
35165
+ text: vocabEntry ? vocabEntry.metadata.text : identifier.text
35166
+ };
35167
+ });
35168
+ this.setState({
35169
+ identifiersToDisplayInFrontside
35170
+ });
35171
+ });
35172
+ };
35133
35173
  this.toggleItems = () => {
35134
35174
  const {
35135
35175
  isShowingAll
@@ -35138,10 +35178,18 @@ class DocumentItem extends React.Component {
35138
35178
  isShowingAll: !isShowingAll
35139
35179
  });
35140
35180
  };
35181
+ const _identifiersToDisplayInFrontside = invenioConfig.ITEMS.identifiersToDisplayInFrontside.map(identifier => ({
35182
+ key: identifier,
35183
+ text: identifier
35184
+ }));
35141
35185
  this.state = {
35142
35186
  isShowingAll: false,
35143
- itemAmountLimit: 5
35187
+ itemAmountLimit: 5,
35188
+ identifiersToDisplayInFrontside: _identifiersToDisplayInFrontside
35144
35189
  };
35190
+ if (_identifiersToDisplayInFrontside.length > 0) {
35191
+ this.fetchIdentifiersToDisplayInFrontsideTitles();
35192
+ }
35145
35193
  }
35146
35194
  get moreItemsToLoad() {
35147
35195
  const {
@@ -35161,7 +35209,8 @@ class DocumentItem extends React.Component {
35161
35209
  } = this.props;
35162
35210
  const {
35163
35211
  isShowingAll,
35164
- itemAmountLimit
35212
+ itemAmountLimit,
35213
+ identifiersToDisplayInFrontside
35165
35214
  } = this.state;
35166
35215
  const previewArrayOfItems = items.slice(0, itemAmountLimit);
35167
35216
  const completeArrayOfItems = items;
@@ -35179,11 +35228,14 @@ class DocumentItem extends React.Component {
35179
35228
  id: "DocumentDetails.DocumentItem.TableHeader"
35180
35229
  }, /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.Row, {
35181
35230
  "data-test": "header"
35182
- }, /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.HeaderCell, null, "Barcode"), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.HeaderCell, null, "Shelf"), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.HeaderCell, null, "Status"), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.HeaderCell, null, "Medium"), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.HeaderCell, null, "Loan restriction")))), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.Body, null, /*#__PURE__*/React__default["default"].createElement(Overridable__default["default"], {
35231
+ }, /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.HeaderCell, null, "Barcode"), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.HeaderCell, null, "Shelf"), identifiersToDisplayInFrontside.map(identifier => /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.HeaderCell, {
35232
+ key: identifier.key
35233
+ }, identifier.text)), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.HeaderCell, null, "Status"), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.HeaderCell, null, "Medium"), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.HeaderCell, null, "Loan restriction")))), /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.Body, null, /*#__PURE__*/React__default["default"].createElement(Overridable__default["default"], {
35183
35234
  id: "DocumentDetails.DocumentItemTableBody"
35184
35235
  }, /*#__PURE__*/React__default["default"].createElement(DocumentItemBody, {
35185
35236
  items: itemsToShow,
35186
- documentDetails: documentDetails
35237
+ documentDetails: documentDetails,
35238
+ identifiersToDisplayInFrontside: identifiersToDisplayInFrontside
35187
35239
  }))), this.moreItemsToLoad && /*#__PURE__*/React__default["default"].createElement(semanticUiReact.Table.Footer, {
35188
35240
  fullWidth: true,
35189
35241
  "data-test": "footer",
@@ -36510,7 +36562,7 @@ class LoanRequestForm$1 extends React.Component {
36510
36562
 
36511
36563
  // init delivery method
36512
36564
  this.withDeliveryMethod = !_isEmpty__default["default"](invenioConfig.CIRCULATION.deliveryMethods);
36513
- this.deliveryMethods = this.withDeliveryMethod ? Object.keys(invenioConfig.CIRCULATION.deliveryMethods).map(key => ({
36565
+ this.deliveryMethods = this.withDeliveryMethod ? Object.keys(invenioConfig.CIRCULATION.deliveryMethods).filter(method => method !== 'NOT-SPECIFIED').map(key => ({
36514
36566
  key: key,
36515
36567
  value: key,
36516
36568
  text: invenioConfig.CIRCULATION.deliveryMethods[key].text
@@ -40789,7 +40841,7 @@ class FrontSite extends React.Component {
40789
40841
  className: "fs-content"
40790
40842
  }, /*#__PURE__*/React__default["default"].createElement(Overridable__default["default"], {
40791
40843
  id: "FrontSite.extras"
40792
- }, /*#__PURE__*/React__default["default"].createElement(Banner, null)), /*#__PURE__*/React__default["default"].createElement(reactRouterDom.Switch, null, /*#__PURE__*/React__default["default"].createElement(reactRouterDom.Route, {
40844
+ }, /*#__PURE__*/React__default["default"].createElement(Banners, null)), /*#__PURE__*/React__default["default"].createElement(reactRouterDom.Switch, null, /*#__PURE__*/React__default["default"].createElement(reactRouterDom.Route, {
40793
40845
  exact: true,
40794
40846
  path: FrontSiteRoutes.home,
40795
40847
  render: props => /*#__PURE__*/React__default["default"].createElement(Home$1, Object.assign({}, props, this.props))
@@ -40931,7 +40983,7 @@ const initialState$N = {
40931
40983
  data: {},
40932
40984
  error: {}
40933
40985
  };
40934
- const fetchBannerReducer = function () {
40986
+ const fetchBannersReducer = function () {
40935
40987
  let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState$N;
40936
40988
  let action = arguments.length > 1 ? arguments[1] : undefined;
40937
40989
  switch (action.type) {
@@ -43138,7 +43190,7 @@ function createILSReducer(asyncReducers) {
43138
43190
  borrowingRequestLoanExtension: borrowingRequestLoanExtensionReducer,
43139
43191
  itemsCheckIn: itemsCheckInReducer,
43140
43192
  checkOut: checkOutReducer,
43141
- banner: fetchBannerReducer,
43193
+ banners: fetchBannersReducer,
43142
43194
  bulkLoanExtend: patronBulkExtendLoans,
43143
43195
  ...asyncReducers
43144
43196
  });