Bug 32030: Display the number of local packages and titles matching the search
[srvgit] / koha-tmpl / intranet-tmpl / prog / js / vue / components / ERM / EHoldingsLocalTitlesList.vue
1 <template>
2     <div>
3         <div v-if="!this.initialized">{{ $t("Loading") }}</div>
4         <div v-else-if="this.titles" id="titles_list">
5             <Toolbar />
6             <div v-if="this.titles.length" id="title_list_result">
7                 <table v-if="this.titles.length" id="title_list"></table>
8             </div>
9             <div v-else-if="this.initialized" class="dialog message">
10                 {{ $t("There are no titles defined") }}
11             </div>
12         </div>
13     </div>
14 </template>
15
16 <script>
17 import Toolbar from "./EHoldingsLocalTitlesToolbar.vue"
18 import { createVNode, render } from 'vue'
19 import { useVendorStore } from "../../stores/vendors"
20 import { useAVStore } from "../../stores/authorised_values"
21 import { storeToRefs } from "pinia"
22 import { fetchLocalTitles } from "../../fetch"
23
24 export default {
25     setup() {
26         const vendorStore = useVendorStore()
27         const { vendors } = storeToRefs(vendorStore)
28
29         const AVStore = useAVStore()
30         const { av_title_publication_types } = storeToRefs(AVStore)
31         const { get_lib_from_av } = AVStore
32
33         return {
34             vendors,
35             av_title_publication_types,
36             get_lib_from_av,
37         }
38     },
39     data: function () {
40         return {
41             titles: [],
42             initialized: false,
43             filters: {
44                 publication_title: this.$route.query.publication_title || "",
45                 publication_type: this.$route.query.publication_type || "",
46             },
47             cannot_search: false,
48         }
49     },
50     beforeRouteEnter(to, from, next) {
51         next(vm => {
52             vm.getTitles().then(() => vm.build_datatable())
53         })
54     },
55     methods: {
56         async getTitles() {
57             const titles = await fetchLocalTitles()
58             this.titles = titles
59             this.initialized = true
60         },
61         show_title: function (title_id) {
62             this.$router.push("/cgi-bin/koha/erm/eholdings/local/titles/" + title_id)
63         },
64         edit_title: function (title_id) {
65             this.$router.push("/cgi-bin/koha/erm/eholdings/local/titles/edit/" + title_id)
66         },
67         delete_title: function (title_id) {
68             this.$router.push("/cgi-bin/koha/erm/eholdings/local/titles/delete/" + title_id)
69         },
70         build_datatable: function () {
71             let show_title = this.show_title
72             let edit_title = this.edit_title
73             let delete_title = this.delete_title
74             let get_lib_from_av = this.get_lib_from_av
75             let filters = this.filters
76
77             window['vendors'] = this.vendors.map(e => {
78                 e['_id'] = e['id']
79                 e['_str'] = e['name']
80                 return e
81             })
82             let vendors_map = this.vendors.reduce((map, e) => {
83                 map[e.id] = e
84                 return map
85             }, {})
86             window['av_title_publication_types'] = this.av_title_publication_types.map(e => {
87                 e['_id'] = e['authorised_value']
88                 e['_str'] = e['lib']
89                 return e
90             })
91
92             $('#title_list').kohaTable({
93                 ajax: {
94                     url: "/api/v1/erm/eholdings/local/titles",
95                 },
96                 embed: ["resources.package"],
97                 order: [[0, "asc"]],
98                 autoWidth: false,
99                 searchCols: [
100                     { search: filters.publication_title },
101                     null,
102                     { search: filters.publication_type },
103                     null,
104                 ],
105                 columns: [
106                     {
107                         title: __("Title"),
108                         data: "me.publication_title",
109                         searchable: true,
110                         orderable: true,
111                         render: function (data, type, row, meta) {
112                             // Rendering done in drawCallback
113                             return ""
114                         }
115                     },
116                     {
117                         title: __("Vendor"),
118                         data: "vendor_id",
119                         searchable: true,
120                         orderable: true,
121                         render: function (data, type, row, meta) {
122                             return row.vendor_id != undefined ? escape_str(vendors_map[row.vendor_id].name) : ""
123                         }
124                     },
125                     {
126                         title: __("Publication type"),
127                         data: "publication_type",
128                         searchable: true,
129                         orderable: true,
130                         render: function (data, type, row, meta) {
131                             return escape_str(get_lib_from_av("av_title_publication_types", row.publication_type))
132                         }
133                     },
134                     {
135                         title: __("Identifier"),
136                         data: "print_identifier:online_identifier",
137                         searchable: true,
138                         orderable: true,
139                         render: function (data, type, row, meta) {
140                             let print_identifier = row.print_identifier
141                             let online_identifier = row.online_identifier
142                             return (print_identifier ? escape_str(_("ISBN (Print): %s").format(print_identifier)) : "") +
143                                 (online_identifier ? escape_str(_("ISBN (Online): %s").format(online_identifier)) : "")
144                         }
145                     },
146                     {
147                         title: __("Actions"),
148                         data: function (row, type, val, meta) {
149                             return '<div class="actions"></div>'
150                         },
151                         className: "actions noExport",
152                         searchable: false,
153                         orderable: false
154                     }
155                 ],
156                 drawCallback: function (settings) {
157
158                     var api = new $.fn.dataTable.Api(settings)
159
160                     $.each($(this).find("td .actions"), function (index, e) {
161                         let title_id = api.row(index).data().title_id
162                         let editButton = createVNode("a", {
163                             class: "btn btn-default btn-xs", role: "button", onClick: () => {
164                                 edit_title(title_id)
165                             }
166                         },
167                             [createVNode("i", { class: "fa fa-pencil", 'aria-hidden': "true" }), __("Edit")])
168
169                         let deleteButton = createVNode("a", {
170                             class: "btn btn-default btn-xs", role: "button", onClick: () => {
171                                 delete_title(title_id)
172                             }
173                         },
174                             [createVNode("i", { class: "fa fa-trash", 'aria-hidden': "true" }), __("Delete")])
175
176                         let n = createVNode('span', {}, [editButton, " ", deleteButton])
177                         render(n, e)
178                     })
179
180                     $.each($(this).find("tbody tr td:first-child"), function (index, e) {
181                         let row = api.row(index).data()
182                         if (!row) return // Happen if the table is empty
183                         let n = createVNode("a", {
184                             role: "button",
185                             href: "/cgi-bin/koha/erm/eholdings/local/titles/" + row.title_id,
186                             onClick: (e) => {
187                                 e.preventDefault()
188                                 show_title(row.title_id)
189                             }
190                         },
191                             `${row.publication_title} (#${row.title_id})`
192                         )
193                         render(n, e)
194                     })
195                 },
196                 preDrawCallback: function (settings) {
197                     var table_id = settings.nTable.id
198                     $("#" + table_id).find("thead th").eq(1).attr('data-filter', 'vendors')
199                 }
200             }, eholdings_titles_table_settings, 1)
201         },
202     },
203     components: { Toolbar },
204     name: "EHoldingsLocalTitlesList",
205 }
206 </script>