Bug 38010: Reset basket view

Signed-off-by: Michaela Sieber <michaela.sieber@kit.edu>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
This commit is contained in:
Matt Blenkinsop 2024-11-08 13:08:20 +00:00 committed by Katrin Fischer
parent 27bfe4ec94
commit d4c3342262
No known key found for this signature in database
GPG Key ID: 0EF6E2C03357A834
9 changed files with 30 additions and 370 deletions

View File

@ -18,9 +18,8 @@ package Koha::REST::V1::Acquisitions::Baskets;
use Modern::Perl;
use Mojo::Base 'Mojolicious::Controller';
use Try::Tiny qw( catch try );
use C4::Acquisition qw( CanUserManageBasket );
use Try::Tiny qw( catch try );
=head1 NAME
@ -66,25 +65,13 @@ Return a list of baskets
=cut
sub list {
my $c = shift->openapi->valid_input or return;
my $patron = $c->stash('koha.user');
my $c = shift->openapi->valid_input or return;
return try {
my $baskets_rs = Koha::Acquisition::Baskets->new;
my $baskets = $c->objects->search($baskets_rs);
my $userflags = C4::Auth::getuserflags( $patron->flags, $patron->userid );
my @user_baskets;
foreach my $basket (@$baskets) {
my $success = CanUserManageBasket( $patron->unblessed, $basket, $userflags );
push @user_baskets, $basket if $success;
}
return $c->render(
status => 200,
openapi => \@user_baskets
openapi => $c->objects->search( Koha::Acquisition::Baskets->new ),
);
} catch {
$c->unhandled_exception($_);

View File

@ -73,22 +73,6 @@ properties:
- string
- "null"
description: basket notes
orders:
type: array
description: List of orderlines for the basket
items:
$ref: "order.yaml"
creator:
type:
- object
- "null"
description: Creator for the basket
$ref: "patron.yaml"
basket_group:
type:
- object
- "null"
description: Basket group
create_items:
type:
- string

View File

@ -14,18 +14,6 @@
- $ref: "../swagger.yaml#/parameters/per_page"
- $ref: "../swagger.yaml#/parameters/q_param"
- $ref: "../swagger.yaml#/parameters/q_body"
- name: x-koha-embed
in: header
required: false
description: Embed list sent as a request header
type: array
items:
type: string
enum:
- orders
- creator
- basket_group
collectionFormat: csv
produces:
- application/json
responses:

View File

@ -1,7 +1,7 @@
[% IF ( booksellerid ) %]
<div id="vendor-menu" class="sidebar_menu">
<ul>
[% IF ( CAN_user_acquisition_order_manage ) %]<li><a href="/cgi-bin/koha/vendors/[% booksellerid | uri %]/baskets">Baskets</a></li>[% END %]
[% IF ( CAN_user_acquisition_order_manage ) %]<li><a href="/cgi-bin/koha/acqui/booksellers.pl?booksellerid=[% booksellerid | uri %]">Baskets</a></li>[% END %]
[% IF ( CAN_user_acquisition_group_manage ) %]<li><a href="/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=[% booksellerid | uri %]">Basket groups</a></li>[% END %]
[% IF ( CAN_user_acquisition_contracts_manage ) %]<li><a href="/cgi-bin/koha/admin/aqcontract.pl?booksellerid=[% booksellerid | uri %]">Contracts</a></li>[% END %]
[% IF ( CAN_user_acquisition_issue_manage ) %]<li><a href="/cgi-bin/koha/acqui/vendor_issues.pl?booksellerid=[% booksellerid | uri %]">Vendor issues</a></li>[% END %]

View File

@ -7,9 +7,10 @@
isUserPermitted('CAN_user_acquisition_order_manage')
"
>
<a :href="`/cgi-bin/koha/vendors/${vendorId}/baskets`">{{
$__("Baskets")
}}</a>
<a
:href="`/cgi-bin/koha/acqui/booksellers.pl?booksellerid=${vendorId}`"
>{{ $__("Baskets") }}</a
>
</li>
<li
v-if="

View File

@ -1,263 +0,0 @@
<template>
<div id="vendor_baskets">
<div v-if="parseInt(basketCount) > 0" class="page-section">
<KohaTable
ref="table"
v-bind="tableOptions"
@addToBasket="addToBasket"
@closeBasket="closeBasket"
@uncertainPrices="uncertainPrices"
></KohaTable>
</div>
<div v-else class="alert alert-info">
{{ $__("There are no baskets defined") }}
</div>
</div>
</template>
<script>
import { inject, ref } from "vue";
import { storeToRefs } from "pinia";
import KohaTable from "../KohaTable.vue";
export default {
setup() {
const patronToHTML = $patron_to_html;
const formatDate = $date;
const vendorStore = inject("vendorStore");
const { vendors } = storeToRefs(vendorStore);
const { setConfirmationDialog, setMessage } = inject("mainStore");
const table = ref();
return {
vendors,
table,
setConfirmationDialog,
setMessage,
escape_str,
patronToHTML,
formatDate,
};
},
data() {
return {
fp_config: flatpickr_defaults,
initialized: false,
tableOptions: {
columns: this.getTableColumns(),
options: { embed: "orders,creator,basket_group" },
url: () => this.tableURL(),
add_filters: true,
actions: {
"-1": [
{
addToBasket: {
text: this.$__("Add to basket"),
icon: "fa fa-plus",
},
},
{
closeBasket: {
text: this.$__("Close basket"),
icon: "fa fa-close",
should_display: row =>
row.orders.length > 0 && !row.standing,
},
},
{
uncertainPrices: {
text: this.$__("Uncertain prices"),
icon: "fa fa-question",
should_display: row =>
row.orders.filter(o => o.uncertain_price)
.length > 0,
},
},
],
},
},
};
},
methods: {
addToBasket({ basket_id }, dt, event) {
event.preventDefault();
location.href =
"/cgi-bin/koha/acqui/basket.pl?basketno=" + basket_id;
},
closeBasket({ basket_id }, dt, event) {
event.preventDefault();
location.href =
"/cgi-bin/koha/acqui/basket.pl?basketno=" + basket_id;
},
uncertainPrices({ basket_id }, dt, event) {
event.preventDefault();
location.href =
"/cgi-bin/koha/acqui/uncertainprice.pl?booksellerid=" +
basket_id +
"&owner=1";
},
tableURL() {
let url =
"/api/v1/acquisitions/baskets?q=" +
JSON.stringify({ "me.vendor_id": this.vendorId });
return url;
},
getTableColumns() {
const escape_str = this.escape_str;
const patronToHTML = this.patronToHTML;
const formatDate = this.formatDate;
return [
{
title: __("Name"),
data: "me.name:me.basket_id",
searchable: true,
orderable: true,
render(data, type, row, meta) {
const name = row.name ? row.name : __("Unnamed basket");
return (
'<a href="/cgi-bin/koha/acqui/basket.pl?basketno=' +
row.basket_id +
'" class="show">' +
escape_str(`${name} (#${row.basket_id})`) +
"</a>"
);
},
},
{
title: __("Item count"),
data: "name",
searchable: false,
orderable: true,
render(data, type, row, meta) {
let count = row.orders.length;
const cancelledOrders = row.orders.filter(
o => o.status == "cancelled"
).length;
if (cancelledOrders) {
count +=
" (" + cancelledOrders + __(" cancelled") + ")";
}
return count;
},
},
{
title: __("Bibliographic record count"),
data: "name",
searchable: false,
orderable: true,
render(data, type, row, meta) {
const recordCount = row.orders.reduce(
(acc, order) => {
if (
!acc.cancelledBibs.includes(
order.biblio_id
) &&
order.status == "cancelled"
) {
acc.cancelledBibs.push(order.biblio_id);
}
if (acc.bibNumbers.includes(order.biblio_id)) {
return acc;
}
acc.bibNumbers.push(order.biblio_id);
return acc;
},
{
bibNumbers: [],
cancelledBibs: [],
}
);
let count = recordCount.bibNumbers.length;
if (recordCount.cancelledBibs.length) {
count +=
" (" +
recordCount.cancelledBibs.length +
__(" cancelled") +
")";
}
return count;
},
},
{
title: __("Items expected"),
data: "name",
searchable: false,
orderable: true,
render(data, type, row, meta) {
return row.orders.filter(
o => !o.date_received && !o.cancellation_date
).length;
},
},
{
title: __("Created by"),
data: "creator_id",
searchable: false,
orderable: true,
render(data, type, row, meta) {
return patronToHTML(row.creator);
},
},
{
title: __("Date"),
data: "creation_date",
searchable: false,
orderable: true,
render(data, type, row, meta) {
return formatDate(row.creation_date);
},
},
{
title: __("Basket group"),
data: "basket_group_id",
searchable: false,
orderable: true,
render(data, type, row, meta) {
return row.basket_group ? row.basket_group.name : "";
},
},
{
title: __("Internal note"),
data: "note",
searchable: false,
orderable: true,
},
{
title: __("Closed"),
data: "close_date",
searchable: false,
orderable: true,
render(data, type, row, meta) {
return formatDate(row.close_date);
},
},
];
},
},
components: { KohaTable },
props: {
basketCount: {
type: String,
default: "0",
},
vendorId: {
type: Number,
},
},
name: "VendorBaskets",
emits: ["select-vendor", "close"],
};
</script>
<style scoped>
.filters > label[for="by_mine_filter"],
.filters > input[type="checkbox"],
.filters > input[type="button"] {
margin-left: 1rem;
}
</style>

View File

@ -238,9 +238,9 @@ export default {
orderable: false,
render(data, type, row, meta) {
return row.baskets.length
? '<a href="/cgi-bin/koha/vendors/' +
? '<a href="/cgi-bin/koha/acqui/booksellers.pl?booksellerid=' +
row.id +
'/baskets" class="show">' +
'" class="show">' +
escape_str(
`${row.baskets.length} basket(s)`
) +

View File

@ -66,36 +66,27 @@
<h1>
{{ vendor.name }}
</h1>
<template v-if="!basketView">
<div class="row">
<div class="col-sm-6">
<VendorDetails :vendor="vendor" :display="true" />
<VendorOrderingInformation
:vendor="vendor"
:display="true"
/>
<VendorInterfaces
:vendor="vendor"
v-if="vendor.interfaces.length > 0"
:display="true"
/>
</div>
<div class="col-sm-6">
<VendorContacts :vendor="vendor" :display="true" />
<VendorSubscriptions :vendor="vendor" />
</div>
<div class="row">
<div class="col-sm-6">
<VendorDetails :vendor="vendor" :display="true" />
<VendorOrderingInformation :vendor="vendor" :display="true" />
<VendorInterfaces
:vendor="vendor"
v-if="vendor.interfaces.length > 0"
:display="true"
/>
</div>
<div
class="page-section rows"
v-if="vendor.contracts && vendor.contracts.length > 0"
>
<VendorContracts :vendor="vendor" />
<div class="col-sm-6">
<VendorContacts :vendor="vendor" :display="true" />
<VendorSubscriptions :vendor="vendor" />
</div>
</template>
<template v-if="basketView">
<h2>{{ $__("Baskets") }}</h2>
<VendorBaskets :basketCount="basketCount" :vendorId="vendor.id" />
</template>
</div>
<div
class="page-section rows"
v-if="vendor.contracts && vendor.contracts.length > 0"
>
<VendorContracts :vendor="vendor" />
</div>
</div>
</template>
@ -110,7 +101,6 @@ import VendorInterfaces from "./VendorInterfaces.vue";
import VendorContacts from "./VendorContacts.vue";
import VendorSubscriptions from "./VendorSubscriptions.vue";
import VendorContracts from "./VendorContracts.vue";
import VendorBaskets from "./VendorBaskets.vue";
import DropdownButtons from "../DropdownButtons.vue";
export default {
@ -126,20 +116,11 @@ export default {
return {
vendor: null,
initialized: false,
basketView: false,
basketCount: null,
};
},
beforeRouteEnter(to, from, next) {
next(vm => {
if (to.path.includes("basket")) {
vm.basketView = true;
vm.getVendor(to.params.vendor_id).then(() =>
vm.getBasketCount(to.params.vendor_id)
);
} else {
vm.getVendor(to.params.vendor_id);
}
vm.getVendor(to.params.vendor_id);
});
},
methods: {
@ -153,16 +134,6 @@ export default {
error => {}
);
},
async getBasketCount(booksellerid) {
const client = APIClient.acquisition;
await client.baskets.count({ booksellerid }).then(
count => {
this.basketCount = count;
this.initialized = true;
},
error => {}
);
},
},
components: {
Toolbar,
@ -174,7 +145,6 @@ export default {
VendorContacts,
VendorSubscriptions,
VendorContracts,
VendorBaskets,
},
name: "VendorShow",
};

View File

@ -52,13 +52,6 @@ export const routes = [
component: markRaw(VendorFormAdd),
title: $__("Edit vendor"),
},
{
path: ":vendor_id/baskets",
name: "VendorShowBaskets",
component: markRaw(VendorShow),
title: $__("Baskets"),
alternateLeftMenu: "VendorMenu",
},
],
},
],