Bug 32030: Pretty vue files
[srvgit] / koha-tmpl / intranet-tmpl / prog / js / vue / components / ERM / LicensesList.vue
1 <template>
2     <div v-if="!initialized">{{ $__("Loading") }}</div>
3     <div v-else-if="licenses" id="licenses_list">
4         <Toolbar />
5         <table v-if="licenses.length" :id="table_id"></table>
6         <div v-else-if="initialized" class="dialog message">
7             {{ $__("There are no licenses defined") }}
8         </div>
9     </div>
10 </template>
11
12 <script>
13 import Toolbar from "./LicensesToolbar.vue"
14 import { inject, createVNode, render } from "vue"
15 import { storeToRefs } from "pinia"
16 import { fetchLicenses } from "../../fetch"
17 import { useDataTable } from "../../composables/datatables"
18
19 export default {
20     setup() {
21         const vendorStore = inject("vendorStore")
22         const { vendors } = storeToRefs(vendorStore)
23
24         const AVStore = inject("AVStore")
25         const { get_lib_from_av, map_av_dt_filter } = AVStore
26
27         const table_id = "license_list"
28         useDataTable(table_id)
29
30         return {
31             vendors,
32             get_lib_from_av,
33             map_av_dt_filter,
34             table_id,
35         }
36     },
37     data: function () {
38         return {
39             licenses: [],
40             initialized: false,
41         }
42     },
43     beforeRouteEnter(to, from, next) {
44         next(vm => {
45             vm.getLicenses().then(() => vm.build_datatable())
46         })
47     },
48     methods: {
49         async getLicenses() {
50             const licenses = await fetchLicenses()
51             this.licenses = licenses
52             this.initialized = true
53         },
54         show_license: function (license_id) {
55             this.$router.push("/cgi-bin/koha/erm/licenses/" + license_id)
56         },
57         edit_license: function (license_id) {
58             this.$router.push("/cgi-bin/koha/erm/licenses/edit/" + license_id)
59         },
60         delete_license: function (license_id) {
61             this.$router.push("/cgi-bin/koha/erm/licenses/delete/" + license_id)
62         },
63         build_datatable: function () {
64             let show_license = this.show_license
65             let edit_license = this.edit_license
66             let delete_license = this.delete_license
67             let get_lib_from_av = this.get_lib_from_av
68             let map_av_dt_filter = this.map_av_dt_filter
69             let default_search = this.$route.query.q
70             let table_id = this.table_id
71
72             window["vendors"] = this.vendors.map(e => {
73                 e["_id"] = e["id"]
74                 e["_str"] = e["name"]
75                 return e
76             })
77             let vendors_map = this.vendors.reduce((map, e) => {
78                 map[e.id] = e
79                 return map
80             }, {})
81             let avs = ["av_license_types", "av_license_statuses"]
82             avs.forEach(function (av_cat) {
83                 window[av_cat] = map_av_dt_filter(av_cat)
84             })
85
86             $("#" + table_id).kohaTable(
87                 {
88                     ajax: {
89                         url: "/api/v1/erm/licenses",
90                     },
91                     order: [[0, "asc"]],
92                     search: { search: default_search },
93                     columnDefs: [
94                         {
95                             targets: [0, 1],
96                             render: function (data, type, row, meta) {
97                                 if (type == "display") {
98                                     return escape_str(data)
99                                 }
100                                 return data
101                             },
102                         },
103                     ],
104                     columns: [
105                         {
106                             title: __("Name"),
107                             data: "me.license_id:me.name",
108                             searchable: true,
109                             orderable: true,
110                             render: function (data, type, row, meta) {
111                                 // Rendering done in drawCallback
112                                 return ""
113                             },
114                         },
115                         {
116                             title: __("Vendor"),
117                             data: "vendor_id",
118                             searchable: true,
119                             orderable: true,
120                             render: function (data, type, row, meta) {
121                                 return row.vendor_id != undefined
122                                     ? escape_str(
123                                           vendors_map[row.vendor_id].name
124                                       )
125                                     : ""
126                             },
127                         },
128
129                         {
130                             title: __("Description"),
131                             data: "description",
132                             searchable: true,
133                             orderable: true,
134                         },
135                         {
136                             title: __("Type"),
137                             data: "type",
138                             searchable: true,
139                             orderable: true,
140                             render: function (data, type, row, meta) {
141                                 return escape_str(
142                                     get_lib_from_av(
143                                         "av_license_types",
144                                         row.type
145                                     )
146                                 )
147                             },
148                         },
149                         {
150                             title: __("Status"),
151                             data: "status",
152                             searchable: true,
153                             orderable: true,
154                             render: function (data, type, row, meta) {
155                                 return escape_str(
156                                     get_lib_from_av(
157                                         "av_license_statuses",
158                                         row.status
159                                     )
160                                 )
161                             },
162                         },
163                         {
164                             title: __("Started on"),
165                             data: "started_on",
166                             searchable: true,
167                             orderable: true,
168                             render: function (data, type, row, meta) {
169                                 return $date(row.started_on)
170                             },
171                         },
172                         {
173                             title: __("Ended on"),
174                             data: "ended_on",
175                             searchable: true,
176                             orderable: true,
177                             render: function (data, type, row, meta) {
178                                 return $date(row.ended_on)
179                             },
180                         },
181                         {
182                             title: __("Actions"),
183                             data: function (row, type, val, meta) {
184                                 return '<div class="actions"></div>'
185                             },
186                             className: "actions noExport",
187                             searchable: false,
188                             orderable: false,
189                         },
190                     ],
191                     drawCallback: function (settings) {
192                         var api = new $.fn.dataTable.Api(settings)
193
194                         $.each(
195                             $(this).find("td .actions"),
196                             function (index, e) {
197                                 let tr = $(this).parent().parent()
198                                 let license_id = api.row(tr).data().license_id
199                                 let editButton = createVNode(
200                                     "a",
201                                     {
202                                         class: "btn btn-default btn-xs",
203                                         role: "button",
204                                         onClick: () => {
205                                             edit_license(license_id)
206                                         },
207                                     },
208                                     [
209                                         createVNode("i", {
210                                             class: "fa fa-pencil",
211                                             "aria-hidden": "true",
212                                         }),
213                                         __("Edit"),
214                                     ]
215                                 )
216
217                                 let deleteButton = createVNode(
218                                     "a",
219                                     {
220                                         class: "btn btn-default btn-xs",
221                                         role: "button",
222                                         onClick: () => {
223                                             delete_license(license_id)
224                                         },
225                                     },
226                                     [
227                                         createVNode("i", {
228                                             class: "fa fa-trash",
229                                             "aria-hidden": "true",
230                                         }),
231                                         __("Delete"),
232                                     ]
233                                 )
234
235                                 let n = createVNode("span", {}, [
236                                     editButton,
237                                     " ",
238                                     deleteButton,
239                                 ])
240                                 render(n, e)
241                             }
242                         )
243
244                         $.each(
245                             $(this).find("tbody tr td:first-child"),
246                             function (index, e) {
247                                 let tr = $(this).parent()
248                                 let row = api.row(tr).data()
249                                 if (!row) return // Happen if the table is empty
250                                 let n = createVNode(
251                                     "a",
252                                     {
253                                         role: "button",
254                                         onClick: () => {
255                                             show_license(row.license_id)
256                                         },
257                                     },
258                                     `${row.name} (#${row.license_id})`
259                                 )
260                                 render(n, e)
261                             }
262                         )
263                     },
264                     preDrawCallback: function (settings) {
265                         $("#" + table_id)
266                             .find("thead th")
267                             .eq(1)
268                             .attr("data-filter", "vendors")
269                         $("#" + table_id)
270                             .find("thead th")
271                             .eq(3)
272                             .attr("data-filter", "av_license_types")
273                         $("#" + table_id)
274                             .find("thead th")
275                             .eq(4)
276                             .attr("data-filter", "av_license_statuses")
277                     },
278                 },
279                 license_table_settings,
280                 1
281             )
282         },
283     },
284     props: {
285         av_license_types: Array,
286         av_license_statuses: Array,
287     },
288     components: { Toolbar },
289     name: "LicensesList",
290 }
291 </script>