51967120c3893fad7db8515e5bd2cb6c33eb4115
[srvgit] / koha-tmpl / intranet-tmpl / prog / js / vue / components / ERM / EHoldingsLocalPackagesList.vue
1 <template>
2     <div>
3         <div v-if="!initialized">{{ $__("Loading") }}</div>
4         <div v-else-if="package_count" id="packages_list">
5             <Toolbar />
6             <div
7                 v-if="package_count > 0"
8                 id="package_list_result"
9                 class="page-section"
10             >
11                 <table :id="table_id"></table>
12             </div>
13             <div v-else-if="initialized" class="dialog message">
14                 {{ $__("There are no packages defined") }}
15             </div>
16         </div>
17     </div>
18 </template>
19
20 <script>
21 import Toolbar from "./EHoldingsLocalPackagesToolbar.vue"
22 import { inject, createVNode, render } from "vue"
23 import { storeToRefs } from "pinia"
24 import { APIClient } from "../../fetch/api-client.js"
25 import { useDataTable } from "../../composables/datatables"
26
27 export default {
28     setup() {
29         const vendorStore = inject("vendorStore")
30         const { vendors } = storeToRefs(vendorStore)
31
32         const AVStore = inject("AVStore")
33         const { get_lib_from_av, map_av_dt_filter } = AVStore
34
35         const { setConfirmationDialog, setMessage } = inject("mainStore")
36
37         const table_id = "package_list"
38         useDataTable(table_id)
39
40         return {
41             vendors,
42             get_lib_from_av,
43             map_av_dt_filter,
44             table_id,
45             setConfirmationDialog,
46             setMessage,
47         }
48     },
49     data: function () {
50         return {
51             package_count: null,
52             initialized: false,
53             filters: {
54                 package_name: this.$route.query.package_name || "",
55                 content_type: this.$route.query.content_type || "",
56             },
57         }
58     },
59     beforeRouteEnter(to, from, next) {
60         next(vm => {
61             vm.getPackageCount().then(() => vm.build_datatable())
62         })
63     },
64     methods: {
65         async getPackageCount() {
66             const client = APIClient.erm
67             await client.localPackages.count().then(
68                 count => {
69                     this.package_count = count
70                     this.initialized = true
71                 },
72                 error => {}
73             )
74         },
75         show_package: function (package_id) {
76             this.$router.push(
77                 "/cgi-bin/koha/erm/eholdings/local/packages/" + package_id
78             )
79         },
80         edit_package: function (package_id) {
81             this.$router.push(
82                 "/cgi-bin/koha/erm/eholdings/local/packages/edit/" + package_id
83             )
84         },
85         delete_package: function (package_id, package_name) {
86             this.setConfirmationDialog(
87                 {
88                     title: this.$__(
89                         "Are you sure you want to remove this package?"
90                     ),
91                     message: package_name,
92                     accept_label: this.$__("Yes, delete"),
93                     cancel_label: this.$__("No, do not delete"),
94                 },
95                 () => {
96                     const client = APIClient.erm
97                     client.localPackages.delete(package_id).then(
98                         success => {
99                             this.setMessage(
100                                 this.$__("Local package %s deleted").format(
101                                     package_name
102                                 ),
103                                 true
104                             )
105                             $("#" + this.table_id)
106                                 .DataTable()
107                                 .ajax.url(
108                                     "/api/v1/erm/eholdings/local/packages"
109                                 )
110                                 .draw()
111                         },
112                         error => {}
113                     )
114                 }
115             )
116         },
117         build_datatable: function () {
118             let show_package = this.show_package
119             let edit_package = this.edit_package
120             let delete_package = this.delete_package
121             let get_lib_from_av = this.get_lib_from_av
122             let map_av_dt_filter = this.map_av_dt_filter
123             let filters = this.filters
124             let table_id = this.table_id
125
126             window["vendors"] = this.vendors.map(e => {
127                 e["_id"] = e["id"]
128                 e["_str"] = e["name"]
129                 return e
130             })
131             let avs = ["av_package_types", "av_package_content_types"]
132             avs.forEach(function (av_cat) {
133                 window[av_cat] = map_av_dt_filter(av_cat)
134             })
135
136             $("#" + table_id).kohaTable(
137                 {
138                     ajax: {
139                         url: "/api/v1/erm/eholdings/local/packages",
140                     },
141                     embed: ["resources+count", "vendor.name"],
142                     order: [[0, "asc"]],
143                     autoWidth: false,
144                     searchCols: [
145                         { search: filters.package_name },
146                         null,
147                         null,
148                         { search: filters.content_type },
149                         null,
150                         null,
151                     ],
152                     columns: [
153                         {
154                             title: __("Name"),
155                             data: "me.package_id:me.name",
156                             searchable: true,
157                             orderable: true,
158                             render: function (data, type, row, meta) {
159                                 // Rendering done in drawCallback
160                                 return ""
161                             },
162                         },
163                         {
164                             title: __("Vendor"),
165                             data: "vendor_id",
166                             searchable: true,
167                             orderable: true,
168                             render: function (data, type, row, meta) {
169                                 return row.vendor
170                                     ? escape_str(row.vendor.name)
171                                     : ""
172                             },
173                         },
174                         {
175                             title: __("Type"),
176                             data: "package_type",
177                             searchable: true,
178                             orderable: true,
179                             render: function (data, type, row, meta) {
180                                 return escape_str(
181                                     get_lib_from_av(
182                                         "av_package_types",
183                                         row.package_type
184                                     )
185                                 )
186                             },
187                         },
188                         {
189                             title: __("Content type"),
190                             data: "content_type",
191                             searchable: true,
192                             orderable: true,
193                             render: function (data, type, row, meta) {
194                                 return escape_str(
195                                     get_lib_from_av(
196                                         "av_package_content_types",
197                                         row.content_type
198                                     )
199                                 )
200                             },
201                         },
202                         {
203                             title: __("Created on"),
204                             data: "created_on",
205                             searchable: false,
206                             orderable: true,
207                             render: function (data, type, row, meta) {
208                                 return $date(row.created_on)
209                             },
210                         },
211                         {
212                             title: __("Notes"),
213                             data: "notes",
214                             searchable: true,
215                             orderable: true,
216                             render: function (data, type, row, meta) {
217                                 return row.notes
218                             },
219                         },
220                         {
221                             title: __("Actions"),
222                             data: function (row, type, val, meta) {
223                                 return '<div class="actions"></div>'
224                             },
225                             className: "actions noExport",
226                             searchable: false,
227                             orderable: false,
228                         },
229                     ],
230                     drawCallback: function (settings) {
231                         var api = new $.fn.dataTable.Api(settings)
232
233                         $.each(
234                             $(this).find("td .actions"),
235                             function (index, e) {
236                                 let tr = $(this).parent().parent()
237                                 let package_id = api.row(tr).data().package_id
238                                 let package_name = api.row(tr).data().name
239                                 let editButton = createVNode(
240                                     "a",
241                                     {
242                                         class: "btn btn-default btn-xs",
243                                         role: "button",
244                                         onClick: () => {
245                                             edit_package(package_id)
246                                         },
247                                     },
248                                     [
249                                         createVNode("i", {
250                                             class: "fa fa-pencil",
251                                             "aria-hidden": "true",
252                                         }),
253                                         __("Edit"),
254                                     ]
255                                 )
256
257                                 let deleteButton = createVNode(
258                                     "a",
259                                     {
260                                         class: "btn btn-default btn-xs",
261                                         role: "button",
262                                         onClick: () => {
263                                             delete_package(
264                                                 package_id,
265                                                 package_name
266                                             )
267                                         },
268                                     },
269                                     [
270                                         createVNode("i", {
271                                             class: "fa fa-trash",
272                                             "aria-hidden": "true",
273                                         }),
274                                         __("Delete"),
275                                     ]
276                                 )
277
278                                 let n = createVNode("span", {}, [
279                                     editButton,
280                                     " ",
281                                     deleteButton,
282                                 ])
283                                 render(n, e)
284                             }
285                         )
286
287                         $.each(
288                             $(this).find("tbody tr td:first-child"),
289                             function (index, e) {
290                                 let tr = $(this).parent()
291                                 let row = api.row(tr).data()
292                                 if (!row) return // Happen if the table is empty
293                                 let n = createVNode(
294                                     "a",
295                                     {
296                                         role: "button",
297                                         href:
298                                             "/cgi-bin/koha/erm/eholdings/local/packages/" +
299                                             row.package_id,
300                                         onClick: e => {
301                                             e.preventDefault()
302                                             show_package(row.package_id)
303                                         },
304                                     },
305                                     `${row.name} (#${row.package_id})`
306                                 )
307                                 render(n, e)
308                             }
309                         )
310                     },
311                     preDrawCallback: function (settings) {
312                         $("#" + table_id)
313                             .find("thead th")
314                             .eq(1)
315                             .attr("data-filter", "vendors")
316                         $("#" + table_id)
317                             .find("thead th")
318                             .eq(2)
319                             .attr("data-filter", "av_package_types")
320                         $("#" + table_id)
321                             .find("thead th")
322                             .eq(3)
323                             .attr("data-filter", "av_package_content_types")
324                     },
325                 },
326                 eholdings_packages_table_settings,
327                 1
328             )
329         },
330     },
331     components: { Toolbar },
332     name: "EHoldingsLocalPackagesList",
333 }
334 </script>