2 <div v-if="!initialized">{{ $__("Loading") }}</div>
3 <div v-else-if="agreements" id="agreements_list">
4 <Toolbar v-if="before_route_entered" />
5 <fieldset v-if="agreements.length" 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"
24 :value="$__('Filter')"
27 <div v-if="agreements.length" class="page-section">
28 <table :id="table_id"></table>
30 <div v-else-if="initialized" class="dialog message">
31 {{ $__("There are no agreements defined") }}
37 import flatPickr from "vue-flatpickr-component"
38 import Toolbar from "./AgreementsToolbar.vue"
39 import { inject, createVNode, render } from "vue"
40 import { APIClient } from "../../fetch/api-client.js"
41 import { storeToRefs } from "pinia"
42 import { useDataTable, build_url } from "../../composables/datatables"
46 const vendorStore = inject("vendorStore")
47 const { vendors } = storeToRefs(vendorStore)
49 const AVStore = inject("AVStore")
50 const { get_lib_from_av, map_av_dt_filter } = AVStore
52 const table_id = "agreement_list"
53 useDataTable(table_id)
64 fp_config: flatpickr_defaults,
68 by_expired: this.$route.query.by_expired || false,
70 this.$route.query.max_expiration_date || "",
72 before_route_entered: false,
73 building_table: false,
76 beforeRouteEnter(to, from, next) {
78 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)
79 if (!vm.building_table) {
80 vm.building_table = true
81 vm.getAgreements().then(() => vm.build_datatable())
87 let url = "/api/v1/erm/agreements"
88 if (this.filters.by_expired)
90 "?max_expiration_date=" + this.filters.max_expiration_date
95 async getAgreements() {
96 const client = APIClient.erm
97 await client.agreements.getAll().then(
99 this.agreements = data
100 this.initialized = true
105 show_agreement: function (agreement_id) {
106 this.$router.push("/cgi-bin/koha/erm/agreements/" + agreement_id)
108 edit_agreement: function (agreement_id) {
110 "/cgi-bin/koha/erm/agreements/edit/" + agreement_id
113 delete_agreement: function (agreement_id) {
115 "/cgi-bin/koha/erm/agreements/delete/" + agreement_id
118 select_agreement: function (agreement_id) {
119 this.$emit("select-agreement", agreement_id)
122 filter_table: async function () {
123 if (this.before_route_entered) {
124 let new_route = build_url(
125 "/cgi-bin/koha/erm/agreements",
128 this.$router.push(new_route)
130 if (this.filters.by_expired) {
131 if (!this.filters.max_expiration_date)
132 this.filters.max_expiration_date = new Date()
136 $("#" + this.table_id)
138 .ajax.url(this.datatable_url)
141 table_url: function () {},
142 build_datatable: function () {
143 let show_agreement = this.show_agreement
144 let edit_agreement = this.edit_agreement
145 let delete_agreement = this.delete_agreement
146 let select_agreement = this.select_agreement
147 let get_lib_from_av = this.get_lib_from_av
148 let map_av_dt_filter = this.map_av_dt_filter
149 let datatable_url = this.datatable_url
150 let default_search = this.$route.query.q
151 let actions = this.before_route_entered ? "edit_delete" : "select"
152 let table_id = this.table_id
154 window["vendors"] = this.vendors.map(e => {
156 e["_str"] = e["name"]
159 let vendors_map = this.vendors.reduce((map, e) => {
164 "av_agreement_statuses",
165 "av_agreement_closure_reasons",
166 "av_agreement_renewal_priorities",
168 avs.forEach(function (av_cat) {
169 window[av_cat] = map_av_dt_filter(av_cat)
172 window["av_agreement_is_perpetual"] = [
173 { _id: 0, _str: _("No") },
174 { _id: 1, _str: _("Yes") },
177 const table = $("#" + table_id).kohaTable(
184 search: { search: default_search },
188 render: function (data, type, row, meta) {
189 if (type == "display") {
190 return escape_str(data)
199 data: "me.agreement_id:me.name",
202 render: function (data, type, row, meta) {
203 // Rendering done in drawCallback
212 render: function (data, type, row, meta) {
213 return row.vendor_id != undefined
215 vendors_map[row.vendor_id].name
221 title: __("Description"),
231 render: function (data, type, row, meta) {
234 "av_agreement_statuses",
241 title: __("Closure reason"),
242 data: "closure_reason",
245 render: function (data, type, row, meta) {
248 "av_agreement_closure_reasons",
255 title: __("Is perpetual"),
256 data: "is_perpetual",
259 render: function (data, type, row, meta) {
261 row.is_perpetual ? _("Yes") : _("No")
266 title: __("Renewal priority"),
267 data: "renewal_priority",
270 render: function (data, type, row, meta) {
273 "av_agreement_renewal_priorities",
280 title: __("Actions"),
281 data: function (row, type, val, meta) {
282 return '<div class="actions"></div>'
284 className: "actions noExport",
289 drawCallback: function (settings) {
290 var api = new $.fn.dataTable.Api(settings)
292 if (actions == "edit_delete") {
294 $(this).find("td .actions"),
295 function (index, e) {
296 let tr = $(this).parent().parent()
297 let agreement_id = api
300 let editButton = createVNode(
303 class: "btn btn-default btn-xs",
306 edit_agreement(agreement_id)
311 class: "fa fa-pencil",
312 "aria-hidden": "true",
318 let deleteButton = createVNode(
321 class: "btn btn-default btn-xs",
324 delete_agreement(agreement_id)
329 class: "fa fa-trash",
330 "aria-hidden": "true",
336 let n = createVNode("span", {}, [
346 $(this).find("td .actions"),
347 function (index, e) {
348 let tr = $(this).parent().parent()
349 let agreement_id = api
352 let selectButton = createVNode(
355 class: "btn btn-default btn-xs",
358 select_agreement(agreement_id)
363 class: "fa fa-check",
364 "aria-hidden": "true",
370 let n = createVNode("span", {}, [
379 $(this).find("tbody tr td:first-child"),
380 function (index, e) {
381 let tr = $(this).parent()
382 let row = api.row(tr).data()
383 if (!row) return // Happen if the table is empty
389 show_agreement(row.agreement_id)
392 `${row.name} (#${row.agreement_id})`
398 preDrawCallback: function (settings) {
402 .attr("data-filter", "vendors")
406 .attr("data-filter", "av_agreement_statuses")
410 .attr("data-filter", "av_agreement_closure_reasons")
414 .attr("data-filter", "av_agreement_is_perpetual")
420 "av_agreement_renewal_priorities"
424 agreement_table_settings,
430 if (!this.building_table) {
431 this.building_table = true
432 this.getAgreements().then(() => this.build_datatable())
435 components: { flatPickr, Toolbar },
436 name: "AgreementsList",
437 emits: ["select-agreement", "close"],
445 .filters > input[type="checkbox"],
446 .filters > input[type="button"] {