diff --git a/ui/src/overridableMapping.js b/ui/src/overridableMapping.js
index b6c6d1ae0..55e8fecfb 100644
--- a/ui/src/overridableMapping.js
+++ b/ui/src/overridableMapping.js
@@ -37,6 +37,7 @@ import { OpeningHoursDetails } from "./overridden/frontsite/OpeningHours/Opening
import { PaymentInformationGrid } from "./overridden/backoffice/PaymentInformation/PaymentInformation";
import { OrderDetailsLine } from "./overridden/backoffice/Acquisition/OrderDetails";
import { ItemCirculationShelf } from "./overridden/backoffice/Items/ItemCirculationShelf";
+import { DocumentItems } from "./overridden/backoffice/Document/DocumentDetails/DocumentItems";
export const overriddenCmps = {
"Backoffice.PatronDetails.Metadata": PatronMetadata,
@@ -71,4 +72,5 @@ export const overriddenCmps = {
"Acquisition.OrderLine": OrderDetailsLine,
"DocumentCirculation.Extras": DocumentCirculationExtras,
"ItemCirculation.backoffice.shelf": ItemCirculationShelf,
+ "DocumentDetails.DocumentItems": DocumentItems,
};
diff --git a/ui/src/overridden/backoffice/Document/DocumentDetails/DocumentItems.js b/ui/src/overridden/backoffice/Document/DocumentDetails/DocumentItems.js
new file mode 100644
index 000000000..5e082b00c
--- /dev/null
+++ b/ui/src/overridden/backoffice/Document/DocumentDetails/DocumentItems.js
@@ -0,0 +1,127 @@
+import React, { Component } from "react";
+import PropTypes from "prop-types";
+import { Link } from "react-router-dom";
+import {
+ BackOfficeRoutes,
+ itemApi,
+ ResultsTable,
+ Loader,
+ Error,
+ SeeAllButton,
+} from "@inveniosoftware/react-invenio-app-ils";
+import _get from "lodash/get";
+import _isEmpty from "lodash/isEmpty";
+
+export class DocumentItems extends Component {
+ componentDidMount() {
+ const { fetchDocumentItems, documentDetails } = this.props;
+ fetchDocumentItems(documentDetails.pid);
+ }
+
+ seeAllButton = () => {
+ const { documentDetails } = this.props;
+
+ const path = BackOfficeRoutes.itemsListWithQuery(
+ itemApi.query().withDocPid(documentDetails.pid).qs()
+ );
+ return ;
+ };
+
+ viewDetails = ({ row }) => {
+ return (
+
+ {row.metadata.barcode}
+
+ );
+ };
+
+ locationFormatter = ({ row }) => {
+ return `${row.metadata.internal_location.name} (${row.metadata.internal_location.location.name})`;
+ };
+
+ callNumberFormatter = ({ row }) => {
+ if (!_isEmpty(row.metadata.identifiers)) {
+ return row.metadata.identifiers.find(
+ (identifier) => identifier.scheme === "CALL_NUMBER"
+ ).value;
+ }
+ return "-";
+ };
+
+ renderTable(data) {
+ const { showMaxItems } = this.props;
+ const columns = [
+ {
+ title: "Barcode",
+ field: "metadata.barcode",
+ formatter: this.viewDetails,
+ },
+ { title: "Status", field: "metadata.status" },
+ { title: "Medium", field: "metadata.medium" },
+ {
+ title: "Location",
+ field: "metadata.internal_location.name",
+ formatter: this.locationFormatter,
+ },
+ {
+ title: "Call number",
+ field: "metadata.identifiers",
+ formatter: this.callNumberFormatter,
+ },
+ { title: "Restrictions", field: "metadata.circulation_restriction" },
+ {
+ title: "Loan Status",
+ field: "metadata.circulation.state",
+ formatter: ({ row, col }) => {
+ if (_get(row, col.field) === "ITEM_ON_LOAN") {
+ return (
+
+ on loan
+
+ );
+ }
+ return _get(row, col.field) || "-";
+ },
+ },
+ ];
+ return (
+
+ );
+ }
+
+ render() {
+ const { documentItems, isLoading, error } = this.props;
+ return (
+
+ {this.renderTable(documentItems)}
+
+ );
+ }
+}
+
+DocumentItems.propTypes = {
+ documentItems: PropTypes.object.isRequired,
+ documentDetails: PropTypes.object.isRequired,
+ fetchDocumentItems: PropTypes.func.isRequired,
+ showMaxItems: PropTypes.number,
+ isLoading: PropTypes.bool,
+ error: PropTypes.object,
+};
+
+DocumentItems.defaultProps = {
+ showMaxItems: 5,
+ isLoading: false,
+ error: null,
+};
diff --git a/ui/src/overridden/backoffice/Items/ItemCirculationShelf.js b/ui/src/overridden/backoffice/Items/ItemCirculationShelf.js
index 329f4cbe5..60747bbf8 100644
--- a/ui/src/overridden/backoffice/Items/ItemCirculationShelf.js
+++ b/ui/src/overridden/backoffice/Items/ItemCirculationShelf.js
@@ -1,11 +1,11 @@
-import { isEmpty } from "lodash";
+import _isEmpty from "lodash/isEmpty";
import React from "react";
import { Grid, Icon } from "semantic-ui-react";
import PropTypes from "prop-types";
export const ItemCirculationShelf = ({ metadata }) => {
let callNumber = {};
- if (!isEmpty(metadata.identifiers)) {
+ if (!_isEmpty(metadata.identifiers)) {
callNumber = metadata.identifiers.find(
(identifier) => identifier.scheme === "CALL_NUMBER"
);
@@ -13,8 +13,8 @@ export const ItemCirculationShelf = ({ metadata }) => {
return (
- Call number: {callNumber ? callNumber.value : "missing"} (SHELF:{" "}
- {metadata.shelf ? metadata.shelf : "missing"})
+ Call number: {!_isEmpty(callNumber) ? callNumber.value : "missing"}
+ {metadata.shelf ? ` (SHELF: ${metadata.shelf})` : ""}
);
};