1196 lines
51 KiB
Vue
1196 lines
51 KiB
Vue
<template>
|
|
<BaseResource
|
|
:routeAction="routeAction"
|
|
:instancedResource="this"
|
|
></BaseResource>
|
|
</template>
|
|
<script>
|
|
import { useRouter } from "vue-router";
|
|
import { ISO18626 } from "./ISO18626.js";
|
|
import BaseResource from "../BaseResource.vue";
|
|
import { useBaseResource } from "../../composables/base-resource.js";
|
|
import { inject, ref } from "vue";
|
|
import { APIClient } from "../../fetch/api-client.js";
|
|
import { $__ } from "@koha-vue/i18n";
|
|
|
|
export default {
|
|
props: {
|
|
routeAction: String,
|
|
},
|
|
|
|
setup(props) {
|
|
const router = useRouter();
|
|
const { getCodesForElement } = ISO18626();
|
|
|
|
const {
|
|
setConfirmationDialog,
|
|
setMessage,
|
|
updateConfirmationDialogInputs,
|
|
submitting,
|
|
submitted,
|
|
} = inject("mainStore");
|
|
|
|
const conditionalInputs = ref([]);
|
|
const isActionPending = ref(false);
|
|
|
|
const statuses = ref([
|
|
{
|
|
id: "RequestReceived",
|
|
next_actions: [
|
|
"PlaceHold",
|
|
"ExpectToSupply",
|
|
"CopyCompleted",
|
|
"Loaned",
|
|
"RetryPossible",
|
|
"WillSupply",
|
|
"Unfilled",
|
|
"Cancelled",
|
|
],
|
|
},
|
|
{
|
|
id: "ExpectToSupply",
|
|
confirm_message: $__(
|
|
"Supplying library expects to fill the request, based on e.g. information in the local OPAC. The message may include the ExpectedDeliveryDate"
|
|
),
|
|
dont_show: resource =>
|
|
resource.service_type === "Loan" ||
|
|
resource.status !== "RequestReceived",
|
|
button_label: $__("Expect to supply copy"),
|
|
icon: "fa-calendar-days",
|
|
btn_class: "btn btn-primary",
|
|
next_actions: [
|
|
"CopyCompleted",
|
|
"Loaned",
|
|
"WillSupply",
|
|
"RetryPossible",
|
|
"Unfilled",
|
|
"Cancelled",
|
|
],
|
|
action_inputs: [
|
|
{
|
|
name: "expectedDeliveryDate",
|
|
label: $__("Expected delivery date"),
|
|
type: "date",
|
|
toolTip: $__(
|
|
"Date and time the supplying library expects to deliver the item."
|
|
),
|
|
},
|
|
],
|
|
},
|
|
{
|
|
id: "PlaceHold",
|
|
dont_show: resource =>
|
|
resource.service_type === "Copy" ||
|
|
resource.hold_id ||
|
|
resource.status !== "RequestReceived",
|
|
button_label: resource =>
|
|
resource.biblio_id
|
|
? $__("Expect to supply (Place hold)")
|
|
: $__("Expect to supply (Search to hold)"),
|
|
icon: resource =>
|
|
resource.biblio_id ? "fa-calendar-days" : "fa-search",
|
|
btn_class: "btn btn-primary",
|
|
next_actions: [
|
|
"CopyCompleted",
|
|
"Loaned",
|
|
"WillSupply",
|
|
"RetryPossible",
|
|
"Unfilled",
|
|
"Cancelled",
|
|
],
|
|
|
|
onClick: resource => {
|
|
const date = new Date();
|
|
date.setTime(date.getTime() + 10 * 60 * 1000);
|
|
|
|
Cookies.set(
|
|
"holdfor",
|
|
resource.requesting_agency.patron_id,
|
|
{
|
|
path: "/",
|
|
expires: date,
|
|
sameSite: "Lax",
|
|
}
|
|
);
|
|
Cookies.set(
|
|
"holdforsupplyill",
|
|
resource.iso18626_request_id,
|
|
{
|
|
path: "/",
|
|
expires: date,
|
|
sameSite: "Lax",
|
|
}
|
|
);
|
|
|
|
if (resource.biblio_id) {
|
|
getPatron(resource.requesting_agency.patron_id).then(
|
|
patron => {
|
|
location.href =
|
|
`/cgi-bin/koha/reserve/request.pl?` +
|
|
`biblionumber=${resource.biblio_id}` +
|
|
`&findborrower=${patron.cardnumber}` +
|
|
`&supplyill=${resource.iso18626_request_id}`;
|
|
}
|
|
);
|
|
} else {
|
|
location.href =
|
|
`/cgi-bin/koha/catalogue/search.pl?context=supplyill:` +
|
|
resource.iso18626_request_id;
|
|
}
|
|
},
|
|
},
|
|
{
|
|
id: "WillSupply",
|
|
dont_show: resource => {
|
|
return !(
|
|
resource.status === "ExpectToSupply" &&
|
|
resource.biblio_id &&
|
|
resource.hold_id &&
|
|
!resource.hold?.item_id
|
|
);
|
|
},
|
|
button_label: $__("Will supply (Assign item)"),
|
|
icon: "fa-download",
|
|
btn_class: "btn btn-primary",
|
|
next_actions: [
|
|
"Loaned",
|
|
"RetryPossible",
|
|
"CopyCompleted",
|
|
"Unfilled",
|
|
],
|
|
onClick: resource => {
|
|
getBiblioItems(resource.biblio_id).then(result => {
|
|
let tableHtml = `
|
|
<p>${$__("An item must be associated with this hold. Check in any of the following items and confirm the hold.")}</p>
|
|
<table class="table table-bordered table-striped" style="width:100%; margin-top:10px;">
|
|
<thead>
|
|
<tr>
|
|
<th>${$__("Barcode")}</th>
|
|
<th>${$__("Home library")}</th>
|
|
<th>${$__("Holding library")}</th>
|
|
<th>${$__("Action")}</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>`;
|
|
|
|
result.forEach(item => {
|
|
const barcode =
|
|
item.external_id || $__("No barcode");
|
|
const home_library =
|
|
item.home_library_id?.name ||
|
|
item.home_library_id ||
|
|
$__("Unknown");
|
|
const holding_library =
|
|
item.holding_library_id?.name ||
|
|
item.holding_library_id ||
|
|
$__("Unknown");
|
|
const link = `/cgi-bin/koha/catalogue/detail.pl?biblionumber=${resource.biblio_id}`;
|
|
const checkinAction = renderCheckinForm(
|
|
item.external_id
|
|
);
|
|
|
|
tableHtml += `
|
|
<tr>
|
|
<td><a href="${link}" target="_blank"><strong>${barcode}</strong></a></td>
|
|
<td>${home_library}</td>
|
|
<td>${holding_library}</td>
|
|
<td>${checkinAction}</td>
|
|
</tr>`;
|
|
});
|
|
tableHtml += `</tbody></table>`;
|
|
|
|
setConfirmationDialog({
|
|
size: "modal-lg",
|
|
title: $__(
|
|
"Update this request's status to <strong>WillSupply</strong>?"
|
|
),
|
|
message: tableHtml,
|
|
cancel_label: $__("Cancel"),
|
|
});
|
|
});
|
|
},
|
|
},
|
|
{
|
|
id: "Loaned",
|
|
dont_show: iso18626_request => !iso18626_request?.hold?.item_id,
|
|
button_label: $__("Mark as loaned (Check out)"),
|
|
icon: "fa-box",
|
|
btn_class: "btn btn-primary",
|
|
next_actions: ["LoanCompleted", "CompletedWithoutReturn"],
|
|
onClick: resource => {
|
|
getItem(resource.hold.item_id).then(result => {
|
|
performCheckout({
|
|
borrowernumber:
|
|
resource.requesting_agency.patron_id,
|
|
branch: userenv?.branch,
|
|
barcode: result.external_id,
|
|
});
|
|
});
|
|
},
|
|
},
|
|
// TODO: 'Overdue' should automatically be set by a cron?
|
|
// {
|
|
// id: "Overdue",
|
|
// confirm_message: $__(
|
|
// "The item currently on loan to the requesting library for this request is now overdue"
|
|
// ),
|
|
// button_label: $__("Mark as ovedue"),
|
|
// icon: "fa-box",
|
|
// next_actions: ["LoanCompleted", "CompletedWithoutReturn"], //[ 'Recalled', 'HoldReturn', 'LoanCompleted' ]
|
|
// action_inputs: [],
|
|
// },
|
|
{
|
|
id: "Recalled",
|
|
confirm_message: $__(
|
|
"The item currently on loan to the requesting library for this request has been recalled"
|
|
),
|
|
button_label: $__("Ask for recall"),
|
|
icon: "fa-box",
|
|
next_actions: ["LoanCompleted", "CompletedWithoutReturn"],
|
|
action_inputs: [],
|
|
},
|
|
{
|
|
id: "RetryPossible",
|
|
confirm_message: $__(
|
|
"The supplying library cannot fill the request based on information provided or may be able to supply at a later date. Additional information is provided in the RetryInfo section. The requesting library may submit a Retry request which may include updated information"
|
|
),
|
|
button_label: $__("Ask for retry"),
|
|
btn_class: "btn btn-danger",
|
|
icon: "fa-repeat",
|
|
next_actions: [],
|
|
action_inputs: [
|
|
{
|
|
name: "retryBefore",
|
|
label: $__("Retry before"),
|
|
type: "date",
|
|
toolTip: $__(
|
|
"Specify that a retry should be attempted before the specified date."
|
|
),
|
|
},
|
|
{
|
|
name: "retryAfter",
|
|
label: $__("Retry after"),
|
|
type: "date",
|
|
toolTip: $__(
|
|
"Specify that a retry should be attempted only after the specified date."
|
|
),
|
|
},
|
|
{
|
|
name: "reasonRetry",
|
|
label: $__("Reason for retry"),
|
|
required: true,
|
|
toolTip: $__(
|
|
"Specify the reason why a retry from the requesting agency is necessary"
|
|
),
|
|
type: "select",
|
|
onSelected: resource => {
|
|
conditionalInputs.value = [];
|
|
if (resource.reasonRetry == "CostExceedsMaxCost") {
|
|
conditionalInputs.value.push({
|
|
name: "offeredCostsCurrencyCode",
|
|
type: "select",
|
|
label: $__("Currency code"),
|
|
required: true,
|
|
toolTip: $__(
|
|
"Specify the currency code for the offered costs"
|
|
),
|
|
options: [
|
|
{
|
|
value: "USD",
|
|
description: $__("USD"),
|
|
},
|
|
{
|
|
value: "EUR",
|
|
description: $__("EUR"),
|
|
},
|
|
{
|
|
value: "GBP",
|
|
description: $__("GBP"),
|
|
},
|
|
{
|
|
value: "AUD",
|
|
description: $__("AUD"),
|
|
},
|
|
{
|
|
value: "SEK",
|
|
description: $__("SEK"),
|
|
},
|
|
],
|
|
requiredKey: "value",
|
|
selectLabel: "description",
|
|
});
|
|
conditionalInputs.value.push({
|
|
name: "offeredCostsMonetaryValue",
|
|
type: "number",
|
|
label: $__("Monetary value"),
|
|
required: true,
|
|
toolTip: $__(
|
|
"Specify the monetary value for the offered costs"
|
|
),
|
|
});
|
|
} else if (
|
|
resource.reasonRetry == "MultiVolAvail"
|
|
) {
|
|
conditionalInputs.value.push({
|
|
name: "volume",
|
|
type: "text",
|
|
label: $__("Volume(s)"),
|
|
required: true,
|
|
placeholder: "14,15",
|
|
toolTip: $__(
|
|
"Specify which volume(s) are available, separated by comma ','"
|
|
),
|
|
});
|
|
} else if (
|
|
resource.reasonRetry == "MustMeetLoanCondition"
|
|
) {
|
|
conditionalInputs.value.push({
|
|
name: "loanCondition",
|
|
label: $__("Loan condition(s)"),
|
|
required: true,
|
|
type: "select",
|
|
toolTip: $__(
|
|
"Specify the condition(s) of use that need to be met once the requested item is delivered"
|
|
),
|
|
allowMultipleChoices: true,
|
|
options:
|
|
getCodesForElement("loanCondition"),
|
|
requiredKey: "value",
|
|
selectLabel: "description",
|
|
});
|
|
} else if (
|
|
resource.reasonRetry == "ReqDelMethodNotSupp"
|
|
) {
|
|
conditionalInputs.value.push({
|
|
name: "deliveryMethod",
|
|
type: "select",
|
|
vselectStyle: {
|
|
dropdownMaxHeight: "150px",
|
|
},
|
|
toolTip: $__(
|
|
"Specify which delivery method(s) can be supplied"
|
|
),
|
|
allowMultipleChoices: true,
|
|
label: $__("Delivery method(s)"),
|
|
required: true,
|
|
options:
|
|
getCodesForElement("deliveryMethod"),
|
|
requiredKey: "value",
|
|
selectLabel: "description",
|
|
onUpdated: inputValues => {
|
|
const deliveryMethods =
|
|
inputValues.deliveryMethod;
|
|
if (
|
|
deliveryMethods &&
|
|
deliveryMethods.includes("Courier")
|
|
) {
|
|
const existingInput =
|
|
conditionalInputs.value.find(
|
|
input =>
|
|
input.name ===
|
|
"courierName"
|
|
);
|
|
if (!existingInput) {
|
|
conditionalInputs.value.push({
|
|
name: "courierName",
|
|
type: "select",
|
|
vselectStyle: {
|
|
dropdownMaxHeight:
|
|
"150px",
|
|
},
|
|
allowMultipleChoices: true,
|
|
toolTip: $__(
|
|
"Specify which courier(s) can be used"
|
|
),
|
|
label: $__(
|
|
"Courier name(s)"
|
|
),
|
|
required: true,
|
|
options:
|
|
getCodesForElement(
|
|
"courierName"
|
|
),
|
|
requiredKey: "value",
|
|
selectLabel: "description",
|
|
});
|
|
updateConfirmationDialogInputs(
|
|
getDialogInputs(inputValues)
|
|
);
|
|
}
|
|
} else {
|
|
const existingInput =
|
|
conditionalInputs.value.find(
|
|
input =>
|
|
input.name ===
|
|
"courierName"
|
|
);
|
|
if (existingInput) {
|
|
const index =
|
|
conditionalInputs.value.indexOf(
|
|
existingInput
|
|
);
|
|
if (index > -1) {
|
|
conditionalInputs.value.splice(
|
|
index,
|
|
1
|
|
);
|
|
updateConfirmationDialogInputs(
|
|
getDialogInputs(
|
|
inputValues
|
|
)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
});
|
|
} else if (
|
|
resource.reasonRetry == "ReqEditionNotPossible"
|
|
) {
|
|
conditionalInputs.value.push({
|
|
name: "edition",
|
|
type: "text",
|
|
toolTip: $__(
|
|
"Specify which edition(s) are available, separated by comma ','"
|
|
),
|
|
label: $__("Edition(s)"),
|
|
required: true,
|
|
placeholder: "14,15",
|
|
});
|
|
} else if (
|
|
resource.reasonRetry == "ReqFormatNotPossible"
|
|
) {
|
|
conditionalInputs.value.push({
|
|
name: "itemFormat",
|
|
type: "select",
|
|
vselectStyle: {
|
|
dropdownMaxHeight: "150px",
|
|
},
|
|
toolTip: $__(
|
|
"Specify which format(s) can be supplied"
|
|
),
|
|
allowMultipleChoices: true,
|
|
label: $__("Item format(s)"),
|
|
required: true,
|
|
options: getCodesForElement("itemFormat"),
|
|
requiredKey: "value",
|
|
selectLabel: "description",
|
|
});
|
|
} else if (
|
|
resource.reasonRetry ==
|
|
"ReqPayMethodNotSupported"
|
|
) {
|
|
conditionalInputs.value.push({
|
|
name: "paymentMethod",
|
|
type: "select",
|
|
toolTip: $__(
|
|
"Specify which payment method(s) can be used"
|
|
),
|
|
allowMultipleChoices: true,
|
|
label: $__("Payment method(s)"),
|
|
required: true,
|
|
options:
|
|
getCodesForElement("paymentMethod"),
|
|
requiredKey: "value",
|
|
selectLabel: "description",
|
|
});
|
|
} else if (
|
|
resource.reasonRetry == "ReqServLevelNotSupp"
|
|
) {
|
|
conditionalInputs.value.push({
|
|
name: "serviceLevel",
|
|
type: "select",
|
|
toolTip: $__(
|
|
"Select which service level(s) are supported"
|
|
),
|
|
allowMultipleChoices: true,
|
|
label: $__("Service level(s)"),
|
|
required: true,
|
|
options: getCodesForElement("serviceLevel"),
|
|
requiredKey: "value",
|
|
selectLabel: "description",
|
|
});
|
|
} else if (
|
|
resource.reasonRetry == "ReqServTypeNotPossible"
|
|
) {
|
|
conditionalInputs.value.push({
|
|
name: "serviceType",
|
|
type: "select",
|
|
toolTip: $__(
|
|
"Select the service type which can be supplied"
|
|
),
|
|
label: $__("Service type"),
|
|
required: true,
|
|
options: [
|
|
//TODO: Only show the 2 options that dont match current resource's service_type
|
|
{
|
|
value: "Copy",
|
|
description: $__("Copy"),
|
|
},
|
|
{
|
|
value: "CopyOrLoan",
|
|
description: $__("CopyOrLoan"),
|
|
},
|
|
{
|
|
value: "Loan",
|
|
description: $__("Loan"),
|
|
},
|
|
],
|
|
requiredKey: "value",
|
|
selectLabel: "description",
|
|
});
|
|
}
|
|
updateConfirmationDialogInputs(
|
|
getDialogInputs(resource)
|
|
);
|
|
},
|
|
vselectStyle: {
|
|
dropdownMaxHeight: "150px",
|
|
},
|
|
options: getCodesForElement("reasonRetry"),
|
|
requiredKey: "value",
|
|
selectLabel: "description",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
id: "Unfilled",
|
|
confirm_message: $__(
|
|
"The supplying library cannot fill the request. The explanation may be provided in the ReasonUnfilled data element"
|
|
),
|
|
button_label: $__("Unfilled"),
|
|
icon: "fa-ban",
|
|
btn_class: "btn btn-danger",
|
|
next_actions: [],
|
|
action_inputs: [
|
|
{
|
|
name: "reasonUnfilled",
|
|
label: $__("Reason unfilled"),
|
|
required: true,
|
|
type: "select",
|
|
options: getCodesForElement("reasonUnfilled"),
|
|
requiredKey: "value",
|
|
selectLabel: "description",
|
|
},
|
|
],
|
|
},
|
|
//HoldReturn
|
|
//ReleaseHoldReturn
|
|
{
|
|
id: "CopyCompleted",
|
|
confirm_message: $__(
|
|
"The supplying library has sent the requested item (this status is used when there is no need to return the item supplied)"
|
|
),
|
|
button_label: $__("Copy completed"),
|
|
icon: "fa-check",
|
|
btn_class: "btn btn-primary",
|
|
next_actions: [],
|
|
dont_show: iso18626_request =>
|
|
iso18626_request.service_type === "Loan" ||
|
|
iso18626_request.hold_id,
|
|
index: -20,
|
|
action_inputs: [],
|
|
},
|
|
{
|
|
id: "LoanCompleted",
|
|
dont_show: resource => !resource.issue_id,
|
|
button_label: $__("Complete loan (Check in)"),
|
|
icon: "fa-download",
|
|
btn_class: "btn btn-primary",
|
|
next_actions: [],
|
|
onClick: resource => {
|
|
if (!resource.issue_id) return;
|
|
|
|
getCheckout(resource.issue_id).then(
|
|
result => {
|
|
const item_barcode = result.item.external_id;
|
|
performCheckin(item_barcode);
|
|
},
|
|
error => {
|
|
setMessage(
|
|
$__("Error fetching checkout details"),
|
|
false
|
|
);
|
|
}
|
|
);
|
|
},
|
|
},
|
|
{
|
|
id: "CompletedWithoutReturn",
|
|
confirm_message: $__(
|
|
"The supplying library has closed the request without the return of supplied item, e.g. because of loss or damage"
|
|
),
|
|
button_label: $__("Complete without return"),
|
|
icon: "fa-check",
|
|
btn_class: "btn btn-primary",
|
|
next_actions: [],
|
|
action_inputs: [],
|
|
},
|
|
{
|
|
id: "Cancelled",
|
|
confirm_message: $__(
|
|
"You are responding to this request's cancellation action (as indicated by the requesting library)"
|
|
),
|
|
button_label: $__("Cancel"),
|
|
icon: "fa-xmark",
|
|
btn_class: "btn btn-danger",
|
|
next_actions: [],
|
|
action_inputs: [
|
|
{
|
|
name: "answerYesNo",
|
|
type: "boolean",
|
|
label: $__("Can cancel?"),
|
|
value: true,
|
|
},
|
|
],
|
|
dont_show: iso18626_request =>
|
|
iso18626_request.pending_requesting_agency_action !==
|
|
"Cancel",
|
|
},
|
|
]);
|
|
|
|
const statusToUpdate = ref({});
|
|
const action = ref();
|
|
|
|
const progressRequest = (actionClicked, iso18626_request) => {
|
|
conditionalInputs.value = [];
|
|
statusToUpdate.value = statuses.value.find(
|
|
status => status.id === actionClicked
|
|
);
|
|
action.value = actionClicked;
|
|
setConfirmationDialog(
|
|
{
|
|
size: "modal-lg",
|
|
title: $__(
|
|
"Update this request's status to <strong>%s</strong>?"
|
|
).format(actionClicked),
|
|
message: statusToUpdate.value.confirm_message,
|
|
accept_label: $__("Confirm"),
|
|
cancel_label: $__("Cancel"),
|
|
inputs: getDialogInputs(),
|
|
},
|
|
(callback_result, inputFields) => {
|
|
const client = APIClient.ill.supplying;
|
|
inputFields.answerYesNo =
|
|
inputFields.answerYesNo === true
|
|
? "Y"
|
|
: inputFields.answerYesNo === false
|
|
? "N"
|
|
: undefined;
|
|
|
|
isActionPending.value = true;
|
|
submitting();
|
|
client
|
|
.patch(
|
|
inputFields,
|
|
iso18626_request.iso18626_request_id
|
|
)
|
|
.then(
|
|
success => {
|
|
isActionPending.value = false;
|
|
submitted();
|
|
for (const key in success) {
|
|
if (iso18626_request.hasOwnProperty(key)) {
|
|
iso18626_request[key] = success[key];
|
|
}
|
|
}
|
|
setMessage(
|
|
$__("ISO18626 request #%s updated").format(
|
|
iso18626_request.iso18626_request_id
|
|
),
|
|
true
|
|
);
|
|
baseResource.refreshTemplateState();
|
|
},
|
|
error => {
|
|
isActionPending.value = false;
|
|
submitted();
|
|
}
|
|
);
|
|
}
|
|
);
|
|
};
|
|
|
|
const getDialogInputs = inputValues => {
|
|
if (inputValues && statusToUpdate.value.action_inputs) {
|
|
for (const actionInput of statusToUpdate.value.action_inputs) {
|
|
if (
|
|
inputValues &&
|
|
inputValues.hasOwnProperty(actionInput.name)
|
|
) {
|
|
actionInput.value = inputValues[actionInput.name];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (inputValues && conditionalInputs.value) {
|
|
for (const conditionalInput of conditionalInputs.value) {
|
|
if (
|
|
inputValues &&
|
|
inputValues.hasOwnProperty(conditionalInput.name)
|
|
) {
|
|
conditionalInput.value =
|
|
inputValues[conditionalInput.name];
|
|
}
|
|
}
|
|
}
|
|
|
|
return [
|
|
...(statusToUpdate.value.action_inputs
|
|
? statusToUpdate.value.action_inputs
|
|
: []),
|
|
...(conditionalInputs.value ? conditionalInputs.value : []),
|
|
{
|
|
name: "messageInfoNote",
|
|
type: "textarea",
|
|
textAreaRows: 7,
|
|
label: $__("Message note"),
|
|
placeholder: $__(
|
|
"Note to be sent to the requesting agency"
|
|
),
|
|
value:
|
|
inputValues &&
|
|
inputValues.hasOwnProperty("messageInfoNote")
|
|
? inputValues.messageInfoNote
|
|
: "",
|
|
required: false,
|
|
},
|
|
{
|
|
name: "status",
|
|
type: "hidden",
|
|
value: action.value,
|
|
},
|
|
];
|
|
};
|
|
|
|
const additionalToolbarButtons = resource => {
|
|
const show_buttons = [];
|
|
const currentStatus = statuses.value.find(
|
|
status => status.id === resource.status
|
|
);
|
|
if (currentStatus) {
|
|
currentStatus.next_actions.forEach(nextStatus => {
|
|
const nextStatusDef = statuses.value.find(
|
|
status => status.id === nextStatus
|
|
);
|
|
|
|
if (
|
|
nextStatusDef.dont_show &&
|
|
nextStatusDef.dont_show(resource)
|
|
) {
|
|
return;
|
|
}
|
|
|
|
show_buttons.push({
|
|
cssClass: `${nextStatusDef.btn_class || "btn btn-default"}${isActionPending.value ? " disabled" : ""}`,
|
|
title:
|
|
typeof nextStatusDef.button_label === "function"
|
|
? nextStatusDef.button_label(resource)
|
|
: nextStatusDef.button_label,
|
|
icon:
|
|
typeof nextStatusDef.icon === "function"
|
|
? nextStatusDef.icon(resource)
|
|
: nextStatusDef.icon,
|
|
index: nextStatusDef.index,
|
|
onClick: nextStatusDef.onClick
|
|
? () => {
|
|
if (!isActionPending.value)
|
|
nextStatusDef.onClick(resource);
|
|
}
|
|
: () => {
|
|
if (!isActionPending.value)
|
|
progressRequest(
|
|
nextStatusDef.id,
|
|
resource
|
|
);
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|
|
return {
|
|
show: show_buttons,
|
|
};
|
|
};
|
|
|
|
const defaultToolbarButtons = () => {
|
|
return {
|
|
list: [],
|
|
show: [],
|
|
};
|
|
};
|
|
|
|
const performCheckout = params => {
|
|
const url = "/cgi-bin/koha/circ/circulation.pl";
|
|
const csrfMeta = document.querySelector('meta[name="csrf-token"]');
|
|
params.csrf_token = csrfMeta
|
|
? csrfMeta.getAttribute("content")
|
|
: "";
|
|
params.op = "cud-checkout";
|
|
|
|
const form = document.createElement("form");
|
|
form.method = "POST";
|
|
form.action = url;
|
|
|
|
for (const key in params) {
|
|
if (params.hasOwnProperty(key)) {
|
|
const hiddenField = document.createElement("input");
|
|
hiddenField.type = "hidden";
|
|
hiddenField.name = key;
|
|
hiddenField.value = params[key];
|
|
form.appendChild(hiddenField);
|
|
}
|
|
}
|
|
|
|
document.body.appendChild(form);
|
|
form.submit();
|
|
};
|
|
|
|
const getCheckinParams = barcode => {
|
|
const csrfMeta = document.querySelector('meta[name="csrf-token"]');
|
|
return {
|
|
url: "/cgi-bin/koha/circ/returns.pl",
|
|
params: {
|
|
barcode: barcode,
|
|
op: "cud-checkin",
|
|
csrf_token: csrfMeta
|
|
? csrfMeta.getAttribute("content")
|
|
: "",
|
|
},
|
|
};
|
|
};
|
|
|
|
const performCheckin = barcode => {
|
|
if (!barcode) return;
|
|
const { url, params } = getCheckinParams(barcode);
|
|
|
|
const form = document.createElement("form");
|
|
form.method = "POST";
|
|
form.action = url;
|
|
|
|
Object.keys(params).forEach(key => {
|
|
const input = document.createElement("input");
|
|
input.type = "hidden";
|
|
input.name = key;
|
|
input.value = params[key];
|
|
form.appendChild(input);
|
|
});
|
|
|
|
document.body.appendChild(form);
|
|
form.submit();
|
|
};
|
|
|
|
const renderCheckinForm = barcode => {
|
|
if (!barcode) return `<em>${$__("No barcode")}</em>`;
|
|
const { url, params } = getCheckinParams(barcode);
|
|
|
|
// Build the hidden inputs dynamically from the same params object
|
|
const inputs = Object.entries(params)
|
|
.map(
|
|
([name, value]) =>
|
|
`<input type="hidden" name="${name}" value="${value}" />`
|
|
)
|
|
.join("");
|
|
|
|
return `
|
|
<form method="POST" action="${url}" style="display:inline;">
|
|
${inputs}
|
|
<button type="submit" class="btn btn-default btn-sm">
|
|
<i class="fa fa-download"></i> ${$__("Check-in")}
|
|
</button>
|
|
</form>
|
|
`;
|
|
};
|
|
|
|
const baseResource = useBaseResource({
|
|
resourceName: "iso18626_request",
|
|
nameAttr: "iso18626_request_id",
|
|
idAttr: "iso18626_request_id",
|
|
components: {
|
|
show: "SupplyingShow",
|
|
list: "SupplyingList",
|
|
},
|
|
apiClient: APIClient.ill.supplying,
|
|
additionalToolbarButtons,
|
|
defaultToolbarButtons,
|
|
i18n: {
|
|
deleteConfirmationMessage: $__(
|
|
"Are you sure you want to remove this supplying ILL?"
|
|
),
|
|
deleteSuccessMessage: $__("Supplying ILL %s deleted"),
|
|
displayName: $__("Supplying ILL"),
|
|
editLabel: $__("Edit supplying ILL #%s"),
|
|
emptyListMessage: $__("There are no supplying ILLs defined"),
|
|
newLabel: $__("New supplying ILL"),
|
|
},
|
|
table: {
|
|
resourceTableUrl:
|
|
APIClient.ill.httpClient._baseURL + "iso18626_requests",
|
|
},
|
|
showGroupsDisplayMode: "splitScreen",
|
|
splitScreenGroupings: [
|
|
{ name: $__("Request details"), pane: 1 },
|
|
{ name: $__("ISO18626 Messages"), pane: 1 },
|
|
{ name: $__("Circulation information"), pane: 2 },
|
|
{ name: $__("Specified by the requesting agency"), pane: 2 },
|
|
],
|
|
resourceAttrs: [
|
|
{
|
|
name: "iso18626_request_id",
|
|
label: $__("Supplying agency request ID"),
|
|
type: "text",
|
|
hideIn: ["Form"],
|
|
group: $__("Request details"),
|
|
},
|
|
{
|
|
name: "iso18626_requesting_agency_id",
|
|
label: $__("Requesting agency"),
|
|
type: "relationshipSelect",
|
|
showElement: {
|
|
type: "text",
|
|
value: "requesting_agency.name",
|
|
link: {
|
|
href: "/cgi-bin/koha/ill/iso18626_requesting_agencies",
|
|
slug: "iso18626_requesting_agency_id",
|
|
},
|
|
},
|
|
relationshipAPIClient: APIClient.ill.requesting_agencies,
|
|
relationshipOptionLabelAttr: "name",
|
|
relationshipRequiredKey: "iso18626_requesting_agency_id",
|
|
group: $__("Request details"),
|
|
},
|
|
{
|
|
name: "status",
|
|
label: $__("Status"),
|
|
type: "text",
|
|
hideIn: ["Form"],
|
|
group: $__("Request details"),
|
|
},
|
|
{
|
|
name: "service_type",
|
|
label: $__("Service type"),
|
|
type: "text",
|
|
hideIn: ["Form"],
|
|
group: $__("Specified by the requesting agency"),
|
|
},
|
|
{
|
|
name: "pending_requesting_agency_action",
|
|
label: $__("Requesting agency has requested"),
|
|
type: "text",
|
|
hideIn: ["Form", "List"],
|
|
group: $__("Specified by the requesting agency"),
|
|
format: value => (value ? value : $__("N/A")),
|
|
},
|
|
{
|
|
name: "created_on",
|
|
label: $__("Created on"),
|
|
type: "date",
|
|
hideIn: ["Form"],
|
|
group: $__("Request details"),
|
|
},
|
|
{
|
|
name: "updated_on",
|
|
label: $__("Updated on"),
|
|
type: "date",
|
|
hideIn: ["Form"],
|
|
group: $__("Request details"),
|
|
},
|
|
{
|
|
name: "requestingAgencyRequestId",
|
|
label: $__("Requesting agency request ID"),
|
|
type: "text",
|
|
hideIn: ["List", "Form"],
|
|
group: $__("Request details"),
|
|
},
|
|
{
|
|
name: "biblio_id",
|
|
label: $__("Bibliographic record"),
|
|
type: "text",
|
|
hideIn: ["List", "Form"],
|
|
showElement: {
|
|
value: "biblio_id",
|
|
link: {
|
|
href: "/cgi-bin/koha/catalogue/detail.pl",
|
|
params: {
|
|
biblionumber: "biblio_id",
|
|
},
|
|
},
|
|
},
|
|
group: $__("Request details"),
|
|
},
|
|
{
|
|
name: "hold_id",
|
|
label: $__("Active hold on biblio"),
|
|
type: "text",
|
|
format: value => (value ? $__("Yes") : $__("No")),
|
|
hideIn: ["List", "Form"],
|
|
group: $__("Circulation information"),
|
|
},
|
|
{
|
|
name: "hold",
|
|
label: $__("Active hold on item"),
|
|
type: "text",
|
|
hideIn: ["List", "Form"],
|
|
format: value => (value?.item_id ? $__("Yes") : $__("No")),
|
|
group: $__("Circulation information"),
|
|
},
|
|
{
|
|
name: "issue_id",
|
|
label: $__("Active checkout"),
|
|
type: "text",
|
|
hideIn: ["List", "Form"],
|
|
format: value => (value ? $__("Yes") : $__("No")),
|
|
group: $__("Circulation information"),
|
|
},
|
|
{
|
|
group: $__("ISO18626 Messages"),
|
|
name: "messages",
|
|
label: "",
|
|
type: "relationshipWidget",
|
|
hideIn: ["List"],
|
|
type: "component",
|
|
columnData: "messages",
|
|
hidden: iso18626_request => 1,
|
|
showElement: {
|
|
componentPath:
|
|
"@koha-vue/components/ILL/ISO18626MessageDisplay.vue",
|
|
componentProps: {
|
|
iso18626_request: {
|
|
type: "resource",
|
|
value: null,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
],
|
|
moduleStore: "ILLStore",
|
|
props: props,
|
|
});
|
|
|
|
const tableOptions = {
|
|
url: () => tableUrl(),
|
|
options: { embed: "requesting_agency,messages" },
|
|
table_settings: supplying_ill_table_settings,
|
|
add_filters: true,
|
|
filters_options: {
|
|
status: statuses.value
|
|
.map(status => ({
|
|
_id: status.id,
|
|
_str: $__(status.id),
|
|
}))
|
|
.sort((a, b) => a._str.localeCompare(b._str)),
|
|
service_type: [
|
|
{
|
|
_id: "Copy",
|
|
_str: $__("Copy"),
|
|
},
|
|
{
|
|
_id: "CopyOrLoan",
|
|
_str: $__("CopyOrLoan"),
|
|
},
|
|
{
|
|
_id: "Loan",
|
|
_str: $__("Loan"),
|
|
},
|
|
],
|
|
},
|
|
actions: {
|
|
0: ["show"],
|
|
1: [],
|
|
"-1": [
|
|
{
|
|
receive: {
|
|
text: $__("Manage request"),
|
|
icon: "fa fa-pencil",
|
|
should_display: row => 1,
|
|
callback: ({ iso18626_request_id }, dt, event) => {
|
|
event.preventDefault();
|
|
router.push({
|
|
name: "SupplyingShow",
|
|
params: {
|
|
iso18626_request_id:
|
|
iso18626_request_id,
|
|
},
|
|
});
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
};
|
|
|
|
const getItem = async item_id => {
|
|
const client = APIClient.item;
|
|
return await client.items.get(item_id).then(
|
|
result => {
|
|
return result;
|
|
},
|
|
error => {}
|
|
);
|
|
};
|
|
|
|
const getPatron = async patron_id => {
|
|
const client = APIClient.patron;
|
|
return await client.patrons.get(patron_id).then(
|
|
result => {
|
|
return result;
|
|
},
|
|
error => {}
|
|
);
|
|
};
|
|
|
|
const getBiblioItems = async biblio_id => {
|
|
const client = APIClient.biblio;
|
|
return await client.items.get(biblio_id).then(
|
|
result => {
|
|
return result;
|
|
},
|
|
error => {}
|
|
);
|
|
};
|
|
|
|
const getCheckout = async checkout_id => {
|
|
const client = APIClient.checkout;
|
|
return await client.checkouts.get(checkout_id).then(
|
|
result => {
|
|
return result;
|
|
},
|
|
error => {}
|
|
);
|
|
};
|
|
|
|
const afterResourceFetch = (componentData, resource, caller) => {
|
|
if (caller === "show") {
|
|
resource.created_on = new Date(
|
|
resource.created_on
|
|
).toLocaleString();
|
|
resource.updated_on = new Date(
|
|
resource.updated_on
|
|
).toLocaleString();
|
|
}
|
|
};
|
|
|
|
const onFormSave = (e, supplyingILLToSave) => {
|
|
e.preventDefault();
|
|
// Nothing to do here
|
|
};
|
|
const tableUrl = filters => {
|
|
return baseResource.getResourceTableUrl();
|
|
};
|
|
|
|
return {
|
|
...baseResource,
|
|
tableOptions,
|
|
onFormSave,
|
|
tableUrl,
|
|
afterResourceFetch,
|
|
};
|
|
},
|
|
emits: ["select-resource"],
|
|
name: "SupplyingResource",
|
|
components: {
|
|
BaseResource,
|
|
},
|
|
};
|
|
</script>
|