2 <div v-if="!this.initialized">{{ $t("Loading") }}</div>
3 <div v-else-if="this.agreements" id="agreements_list">
4 <Toolbar v-if="before_route_entered" />
5 <table v-if="this.agreements.length" :id="table_id"></table>
6 <div v-else-if="this.initialized" class="dialog message">
7 {{ $t("There are no agreements defined") }}
13 import Toolbar from "./AgreementsToolbar.vue"
14 import { createVNode, render } from 'vue'
15 import { useVendorStore } from "../../stores/vendors"
16 import { useAVStore } from "../../stores/authorised_values"
17 import { storeToRefs } from "pinia"
18 import { fetchAgreements } from "../../fetch"
19 import { useDataTable } from "../../composables/datatables"
23 const vendorStore = useVendorStore()
24 const { vendors } = storeToRefs(vendorStore)
26 const AVStore = useAVStore()
27 const { get_lib_from_av, map_av_dt_filter } = AVStore
29 const table_id = "agreement_list"
30 useDataTable(table_id)
43 before_route_entered: false,
44 building_table: false,
47 beforeRouteEnter(to, from, next) {
49 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)
50 if (!vm.building_table) {
51 vm.building_table = true
52 vm.getAgreements().then(() => vm.build_datatable())
57 async getAgreements() {
58 const agreements = await fetchAgreements()
59 this.agreements = agreements
60 this.initialized = true
62 show_agreement: function (agreement_id) {
63 this.$router.push("/cgi-bin/koha/erm/agreements/" + agreement_id)
65 edit_agreement: function (agreement_id) {
66 this.$router.push("/cgi-bin/koha/erm/agreements/edit/" + agreement_id)
68 delete_agreement: function (agreement_id) {
69 this.$router.push("/cgi-bin/koha/erm/agreements/delete/" + agreement_id)
71 select_agreement: function (agreement_id) {
72 this.$emit('select-agreement', agreement_id)
75 build_datatable: function () {
76 let show_agreement = this.show_agreement
77 let edit_agreement = this.edit_agreement
78 let delete_agreement = this.delete_agreement
79 let select_agreement = this.select_agreement
80 let get_lib_from_av = this.get_lib_from_av
81 let map_av_dt_filter = this.map_av_dt_filter
82 let default_search = this.$route.query.q
83 let actions = this.before_route_entered ? 'edit_delete' : 'select'
84 let table_id = this.table_id
86 window['vendors'] = this.vendors.map(e => {
91 let vendors_map = this.vendors.reduce((map, e) => {
95 let avs = ['av_agreement_statuses', 'av_agreement_closure_reasons', 'av_agreement_renewal_priorities']
96 avs.forEach(function (av_cat) {
97 window[av_cat] = map_av_dt_filter(av_cat)
100 window['av_agreement_is_perpetual'] = [{ _id: 0, _str: _('No') }, { _id: 1, _str: _("Yes") }]
102 const table = $("#" + table_id).kohaTable({
104 url: "/api/v1/erm/agreements",
108 search: { search: default_search },
111 render: function (data, type, row, meta) {
112 if (type == 'display') {
113 return escape_str(data)
121 data: "me.agreement_id:me.name",
124 render: function (data, type, row, meta) {
125 // Rendering done in drawCallback
134 render: function (data, type, row, meta) {
135 return row.vendor_id != undefined ? escape_str(vendors_map[row.vendor_id].name) : ""
139 title: __("Description"),
149 render: function (data, type, row, meta) {
150 return escape_str(get_lib_from_av("av_agreement_statuses", row.status))
154 title: __("Closure reason"),
155 data: "closure_reason",
158 render: function (data, type, row, meta) {
159 return escape_str(get_lib_from_av("av_agreement_closure_reasons", row.closure_reason))
163 title: __("Is perpetual"),
164 data: "is_perpetual",
167 render: function (data, type, row, meta) {
168 return escape_str(row.is_perpetual ? _("Yes") : _("No"))
172 title: __("Renewal priority"),
173 data: "renewal_priority",
176 render: function (data, type, row, meta) {
177 return escape_str(get_lib_from_av("av_agreement_renewal_priorities", row.renewal_priority))
181 title: __("Actions"),
182 data: function (row, type, val, meta) {
183 return '<div class="actions"></div>'
185 className: "actions noExport",
190 drawCallback: function (settings) {
192 var api = new $.fn.dataTable.Api(settings)
194 if (actions == 'edit_delete') {
195 $.each($(this).find("td .actions"), function (index, e) {
196 let tr = $(this).parent().parent()
197 let agreement_id = api.row(tr).data().agreement_id
198 let editButton = createVNode("a", {
199 class: "btn btn-default btn-xs", role: "button", onClick: () => {
200 edit_agreement(agreement_id)
203 [createVNode("i", { class: "fa fa-pencil", 'aria-hidden': "true" }), __("Edit")])
205 let deleteButton = createVNode("a", {
206 class: "btn btn-default btn-xs", role: "button", onClick: () => {
207 delete_agreement(agreement_id)
210 [createVNode("i", { class: "fa fa-trash", 'aria-hidden': "true" }), __("Delete")])
212 let n = createVNode('span', {}, [editButton, " ", deleteButton])
216 $.each($(this).find("td .actions"), function (index, e) {
217 let tr = $(this).parent().parent()
218 let agreement_id = api.row(tr).data().agreement_id
219 let selectButton = createVNode("a", {
220 class: "btn btn-default btn-xs", role: "button", onClick: () => {
221 select_agreement(agreement_id)
224 [createVNode("i", { class: "fa fa-check", 'aria-hidden': "true" }), __("Select")])
226 let n = createVNode('span', {}, [selectButton])
231 $.each($(this).find("tbody tr td:first-child"), function (index, e) {
232 let tr = $(this).parent()
233 let row = api.row(tr).data()
234 if (!row) return // Happen if the table is empty
235 let n = createVNode("a", {
238 show_agreement(row.agreement_id)
241 `${row.name} (#${row.agreement_id})`
246 preDrawCallback: function (settings) {
247 $("#" + table_id).find("thead th").eq(1).attr('data-filter', 'vendors')
248 $("#" + table_id).find("thead th").eq(3).attr('data-filter', 'av_agreement_statuses')
249 $("#" + table_id).find("thead th").eq(4).attr('data-filter', 'av_agreement_closure_reasons')
250 $("#" + table_id).find("thead th").eq(5).attr('data-filter', 'av_agreement_is_perpetual')
251 $("#" + table_id).find("thead th").eq(6).attr('data-filter', 'av_agreement_renewal_priorities')
254 }, agreement_table_settings, 1)
258 if (!this.building_table) {
259 this.building_table = true
260 this.getAgreements().then(() => this.build_datatable())
263 components: { Toolbar },
264 name: "AgreementsList",
265 emits: ["select-agreement", "close"],