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">
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 <table v-if="agreements.length" :id="table_id"></table>
28 <div v-else-if="initialized" class="dialog message">
29 {{ $__("There are no agreements defined") }}
35 import flatPickr from "vue-flatpickr-component"
36 import Toolbar from "./AgreementsToolbar.vue"
37 import { inject, createVNode, render } from "vue"
38 import { storeToRefs } from "pinia"
39 import { fetchAgreements } from "../../fetch"
40 import { useDataTable, build_url } from "../../composables/datatables"
44 const vendorStore = inject("vendorStore")
45 const { vendors } = storeToRefs(vendorStore)
47 const AVStore = inject("AVStore")
48 const { get_lib_from_av, map_av_dt_filter } = AVStore
50 const table_id = "agreement_list"
51 useDataTable(table_id)
62 fp_config: flatpickr_defaults,
66 by_expired: this.$route.query.by_expired || false,
68 this.$route.query.max_expiration_date || "",
70 before_route_entered: false,
71 building_table: false,
74 beforeRouteEnter(to, from, next) {
76 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)
77 if (!vm.building_table) {
78 vm.building_table = true
79 vm.getAgreements().then(() => vm.build_datatable())
85 let url = "/api/v1/erm/agreements"
86 if (this.filters.by_expired)
88 "?max_expiration_date=" + this.filters.max_expiration_date
93 async getAgreements() {
94 const agreements = await fetchAgreements()
95 this.agreements = agreements
96 this.initialized = true
98 show_agreement: function (agreement_id) {
99 this.$router.push("/cgi-bin/koha/erm/agreements/" + agreement_id)
101 edit_agreement: function (agreement_id) {
103 "/cgi-bin/koha/erm/agreements/edit/" + agreement_id
106 delete_agreement: function (agreement_id) {
108 "/cgi-bin/koha/erm/agreements/delete/" + agreement_id
111 select_agreement: function (agreement_id) {
112 this.$emit("select-agreement", agreement_id)
115 filter_table: async function () {
116 let new_route = build_url(
117 "/cgi-bin/koha/erm/agreements",
120 this.$router.push(new_route)
121 if (this.filters.by_expired) {
122 if (!this.filters.max_expiration_date)
123 this.filters.max_expiration_date = new Date()
127 $("#" + this.table_id)
129 .ajax.url(this.datatable_url)
132 table_url: function () {},
133 build_datatable: function () {
134 let show_agreement = this.show_agreement
135 let edit_agreement = this.edit_agreement
136 let delete_agreement = this.delete_agreement
137 let select_agreement = this.select_agreement
138 let get_lib_from_av = this.get_lib_from_av
139 let map_av_dt_filter = this.map_av_dt_filter
140 let datatable_url = this.datatable_url
141 let default_search = this.$route.query.q
142 let actions = this.before_route_entered ? "edit_delete" : "select"
143 let table_id = this.table_id
145 window["vendors"] = this.vendors.map(e => {
147 e["_str"] = e["name"]
150 let vendors_map = this.vendors.reduce((map, e) => {
155 "av_agreement_statuses",
156 "av_agreement_closure_reasons",
157 "av_agreement_renewal_priorities",
159 avs.forEach(function (av_cat) {
160 window[av_cat] = map_av_dt_filter(av_cat)
163 window["av_agreement_is_perpetual"] = [
164 { _id: 0, _str: _("No") },
165 { _id: 1, _str: _("Yes") },
168 const table = $("#" + table_id).kohaTable(
175 search: { search: default_search },
179 render: function (data, type, row, meta) {
180 if (type == "display") {
181 return escape_str(data)
190 data: "me.agreement_id:me.name",
193 render: function (data, type, row, meta) {
194 // Rendering done in drawCallback
203 render: function (data, type, row, meta) {
204 return row.vendor_id != undefined
206 vendors_map[row.vendor_id].name
212 title: __("Description"),
222 render: function (data, type, row, meta) {
225 "av_agreement_statuses",
232 title: __("Closure reason"),
233 data: "closure_reason",
236 render: function (data, type, row, meta) {
239 "av_agreement_closure_reasons",
246 title: __("Is perpetual"),
247 data: "is_perpetual",
250 render: function (data, type, row, meta) {
252 row.is_perpetual ? _("Yes") : _("No")
257 title: __("Renewal priority"),
258 data: "renewal_priority",
261 render: function (data, type, row, meta) {
264 "av_agreement_renewal_priorities",
271 title: __("Actions"),
272 data: function (row, type, val, meta) {
273 return '<div class="actions"></div>'
275 className: "actions noExport",
280 drawCallback: function (settings) {
281 var api = new $.fn.dataTable.Api(settings)
283 if (actions == "edit_delete") {
285 $(this).find("td .actions"),
286 function (index, e) {
287 let tr = $(this).parent().parent()
288 let agreement_id = api
291 let editButton = createVNode(
294 class: "btn btn-default btn-xs",
297 edit_agreement(agreement_id)
302 class: "fa fa-pencil",
303 "aria-hidden": "true",
309 let deleteButton = createVNode(
312 class: "btn btn-default btn-xs",
315 delete_agreement(agreement_id)
320 class: "fa fa-trash",
321 "aria-hidden": "true",
327 let n = createVNode("span", {}, [
337 $(this).find("td .actions"),
338 function (index, e) {
339 let tr = $(this).parent().parent()
340 let agreement_id = api
343 let selectButton = createVNode(
346 class: "btn btn-default btn-xs",
349 select_agreement(agreement_id)
354 class: "fa fa-check",
355 "aria-hidden": "true",
361 let n = createVNode("span", {}, [
370 $(this).find("tbody tr td:first-child"),
371 function (index, e) {
372 let tr = $(this).parent()
373 let row = api.row(tr).data()
374 if (!row) return // Happen if the table is empty
380 show_agreement(row.agreement_id)
383 `${row.name} (#${row.agreement_id})`
389 preDrawCallback: function (settings) {
393 .attr("data-filter", "vendors")
397 .attr("data-filter", "av_agreement_statuses")
401 .attr("data-filter", "av_agreement_closure_reasons")
405 .attr("data-filter", "av_agreement_is_perpetual")
411 "av_agreement_renewal_priorities"
415 agreement_table_settings,
421 if (!this.building_table) {
422 this.building_table = true
423 this.getAgreements().then(() => this.build_datatable())
426 components: { flatPickr, Toolbar },
427 name: "AgreementsList",
428 emits: ["select-agreement", "close"],