2 <div v-if="!initialized">{{ $__("Loading") }}</div>
3 <div v-else id="agreements_list">
4 <Toolbar v-if="before_route_entered" />
5 <fieldset v-if="agreement_count > 0" class="filters">
6 <label for="expired_filter">{{ $__("Filter by expired") }}:</label>
10 v-model="filters.by_expired"
11 @keyup.enter="filter_table"
15 id="max_expiration_date_filter"
16 v-model="filters.max_expiration_date"
20 <label for="by_mine_filter">{{ $__("Show mine only") }}:</label>
24 v-model="filters.by_mine"
25 @keyup.enter="filter_table"
32 :value="$__('Filter')"
35 <div v-if="agreement_count > 0" class="page-section">
44 <div v-else class="dialog message">
45 {{ $__("There are no agreements defined") }}
51 import flatPickr from "vue-flatpickr-component"
52 import Toolbar from "./AgreementsToolbar.vue"
53 import { inject, createVNode, render, ref } from "vue"
54 import { APIClient } from "../../fetch/api-client.js"
55 import { storeToRefs } from "pinia"
56 import { build_url } from "../../composables/datatables"
57 import KohaTable from "../KohaTable.vue"
61 const vendorStore = inject("vendorStore")
62 const { vendors } = storeToRefs(vendorStore)
64 const AVStore = inject("AVStore")
65 const { get_lib_from_av, map_av_dt_filter } = AVStore
67 const { setConfirmationDialog, setMessage } = inject("mainStore")
77 setConfirmationDialog,
80 agreement_table_settings,
85 fp_config: flatpickr_defaults,
89 by_expired: this.$route.query.by_expired || false,
91 this.$route.query.max_expiration_date || "",
92 by_mine: this.$route.query.by_mine || false,
94 before_route_entered: false,
95 building_table: false,
97 columns: this.getTableColumns(),
98 url: () => this.table_url(),
99 table_settings: this.agreement_table_settings,
103 "-1": ["edit", "delete"],
108 beforeRouteEnter(to, from, next) {
110 vm.before_route_entered = true // FIXME This is ugly, but we need to distinguish when it's used as main component or child component (from EHoldingsEBSCOPAckagesShow for instance)
111 if (!vm.building_table) {
112 vm.building_table = true
113 vm.getAgreementCount()
114 vm.initialized = true
119 async getAgreementCount() {
120 const client = APIClient.erm
121 await client.agreements.count().then(
123 this.agreement_count = count
128 doShow: function (agreement, dt, event) {
129 event.preventDefault()
131 "/cgi-bin/koha/erm/agreements/" + agreement.agreement_id
134 doEdit: function (agreement, dt, event) {
136 "/cgi-bin/koha/erm/agreements/edit/" + agreement.agreement_id
139 doDelete: function (agreement, dt, event) {
140 this.setConfirmationDialog(
143 "Are you sure you want to delete this agreement?"
145 message: agreement.name,
146 accept_label: this.$__("Yes, delete"),
147 cancel_label: this.$__("No, do not delete"),
150 const client = APIClient.erm
151 client.agreements.delete(agreement.agreement_id).then(
154 this.$__("Agreement %s deleted").format(
166 table_url: function () {
167 let url = "/api/v1/erm/agreements"
168 if (this.filters.by_expired)
170 "?max_expiration_date=" + this.filters.max_expiration_date
173 select_agreement: function (agreement_id) {
174 this.$emit("select-agreement", agreement_id)
177 filter_table: async function () {
178 if (this.before_route_entered) {
179 let new_route = build_url(
180 "/cgi-bin/koha/erm/agreements",
183 this.$router.push(new_route)
185 if (this.filters.by_expired) {
186 if (!this.filters.max_expiration_date)
187 this.filters.max_expiration_date = new Date()
191 this.$refs.table.redraw(this.table_url())
193 build_datatable: function () {
194 let show_agreement = this.show_agreement
195 let edit_agreement = this.edit_agreement
196 let delete_agreement = this.delete_agreement
197 let select_agreement = this.select_agreement
198 let get_lib_from_av = this.get_lib_from_av
199 let map_av_dt_filter = this.map_av_dt_filter
200 let datatable_url = this.datatable_url
201 let default_search = this.$route.query.q
202 let actions = this.before_route_entered ? "edit_delete" : "select"
203 let filters = this.filters
204 let table_id = this.table_id
205 let logged_in_user = this.logged_in_user
207 window["vendors"] = this.vendors.map(e => {
209 e["_str"] = e["name"]
212 let vendors_map = this.vendors.reduce((map, e) => {
217 "av_agreement_statuses",
218 "av_agreement_closure_reasons",
219 "av_agreement_renewal_priorities",
221 avs.forEach(function (av_cat) {
222 window[av_cat] = map_av_dt_filter(av_cat)
225 window["av_agreement_is_perpetual"] = [
226 { _id: 0, _str: _("No") },
227 { _id: 1, _str: _("Yes") },
230 let additional_filters = {
231 "user_roles.user_id": function () {
232 return filters.by_mine ? logged_in_user.borrowernumber : ""
235 const table = $("#" + table_id).kohaTable(
240 embed: ["user_roles"],
243 search: { search: default_search },
247 render: function (data, type, row, meta) {
248 if (type == "display") {
249 return escape_str(data)
258 data: "me.agreement_id:me.name",
261 render: function (data, type, row, meta) {
262 // Rendering done in drawCallback
271 render: function (data, type, row, meta) {
272 return row.vendor_id != undefined
274 vendors_map[row.vendor_id].name
280 title: __("Description"),
290 render: function (data, type, row, meta) {
293 "av_agreement_statuses",
300 title: __("Closure reason"),
301 data: "closure_reason",
304 render: function (data, type, row, meta) {
307 "av_agreement_closure_reasons",
314 title: __("Is perpetual"),
315 data: "is_perpetual",
318 render: function (data, type, row, meta) {
320 row.is_perpetual ? _("Yes") : _("No")
325 title: __("Renewal priority"),
326 data: "renewal_priority",
329 render: function (data, type, row, meta) {
332 "av_agreement_renewal_priorities",
339 title: __("Actions"),
340 data: function (row, type, val, meta) {
341 return '<div class="actions"></div>'
343 className: "actions noExport",
348 drawCallback: function (settings) {
349 var api = new $.fn.dataTable.Api(settings)
351 if (actions == "edit_delete") {
353 $(this).find("td .actions"),
354 function (index, e) {
355 let tr = $(this).parent().parent()
356 let agreement_id = api
359 let agreement_name = api.row(tr).data().name
360 let editButton = createVNode(
363 class: "btn btn-default btn-xs",
366 edit_agreement(agreement_id)
371 class: "fa fa-pencil",
372 "aria-hidden": "true",
378 let deleteButton = createVNode(
381 class: "btn btn-default btn-xs",
392 class: "fa fa-trash",
393 "aria-hidden": "true",
399 let n = createVNode("span", {}, [
409 $(this).find("td .actions"),
410 function (index, e) {
411 let tr = $(this).parent().parent()
412 let agreement_id = api
415 let selectButton = createVNode(
418 class: "btn btn-default btn-xs",
421 select_agreement(agreement_id)
426 class: "fa fa-check",
427 "aria-hidden": "true",
433 let n = createVNode("span", {}, [
442 $(this).find("tbody tr td:first-child"),
443 function (index, e) {
444 let tr = $(this).parent()
445 let row = api.row(tr).data()
446 if (!row) return // Happen if the table is empty
452 show_agreement(row.agreement_id)
455 `${row.name} (#${row.agreement_id})`
461 preDrawCallback: function (settings) {
465 .attr("data-filter", "vendors")
469 .attr("data-filter", "av_agreement_statuses")
473 .attr("data-filter", "av_agreement_closure_reasons")
477 .attr("data-filter", "av_agreement_is_perpetual")
483 "av_agreement_renewal_priorities"
487 agreement_table_settings,
492 getTableColumns: function () {
493 let get_lib_from_av = this.get_lib_from_av
494 let escape_str = this.escape_str
495 window["vendors"] = this.vendors.map(e => {
497 e["_str"] = e["name"]
500 let vendors_map = this.vendors.reduce((map, e) => {
505 "av_agreement_statuses",
506 "av_agreement_closure_reasons",
507 "av_agreement_renewal_priorities",
510 avs.forEach(function (av_cat) {
511 window[av_cat] = c.map_av_dt_filter(av_cat)
514 window["av_agreement_is_perpetual"] = [
515 { _id: 0, _str: _("No") },
516 { _id: 1, _str: _("Yes") },
521 data: "me.agreement_id:me.name",
524 render: function (data, type, row, meta) {
525 // Rendering done in drawCallback
527 '<a href="/cgi-bin/koha/erm/agreements/' +
529 '" class="show">show</a>'
538 render: function (data, type, row, meta) {
539 return row.vendor_id != undefined
540 ? escape_str(vendors_map[row.vendor_id].name)
545 title: __("Description"),
555 render: function (data, type, row, meta) {
557 get_lib_from_av("av_agreement_statuses", row.status)
562 title: __("Closure reason"),
563 data: "closure_reason",
566 render: function (data, type, row, meta) {
569 "av_agreement_closure_reasons",
576 title: __("Is perpetual"),
577 data: "is_perpetual",
580 render: function (data, type, row, meta) {
581 return escape_str(row.is_perpetual ? _("Yes") : _("No"))
585 title: __("Renewal priority"),
586 data: "renewal_priority",
589 render: function (data, type, row, meta) {
592 "av_agreement_renewal_priorities",
599 title: __("Actions"),
600 data: function (row, type, val, meta) {
601 return '<div class="actions"></div>'
603 className: "actions noExport",
611 if (!this.building_table) {
612 this.building_table = true
613 this.getAgreementCount()
616 components: { flatPickr, Toolbar, KohaTable },
617 name: "AgreementsList",
618 emits: ["select-agreement", "close"],
626 .filters > label[for="by_mine_filter"],
627 .filters > input[type="checkbox"],
628 .filters > input[type="button"] {