Bug 32030: Pretty vue files
[koha.git] / koha-tmpl / intranet-tmpl / prog / js / vue / components / ERM / EHoldingsLocalTitlesFormImport.vue
1 <template>
2     <h2>{{ $__("Import from a list") }}</h2>
3     <div v-if="job_id" class="dialog message">
4         {{ $__("Import in progress,") }}
5         <router-link :to="`/cgi-bin/koha/admin/background_jobs/${job_id}`">
6             {{ $__("see job #%s").format(job_id) }}
7         </router-link>
8     </div>
9     <div id="package_list">
10         {{ $__("To the following local package") }}:
11         <v-select
12             v-model="package_id"
13             label="name"
14             :reduce="p => p.package_id"
15             :options="packages"
16             :clearable="false"
17         >
18         </v-select>
19     </div>
20     <div id="import_list_result">
21         <table :id="table_id"></table>
22     </div>
23 </template>
24
25 <script>
26 import { setMessage, setError, setWarning } from "../../messages"
27 import { createVNode, render } from "vue"
28 import { useDataTable } from "../../composables/datatables"
29 import { checkError, fetchLocalPackages } from "../../fetch.js"
30
31 export default {
32     setup() {
33         const table_id = "list_list"
34         useDataTable(table_id)
35
36         return {
37             table_id,
38             logged_in_user_lists,
39         }
40     },
41     data() {
42         return {
43             job_id: null,
44             package_id: null,
45             packages: [],
46         }
47     },
48     beforeCreate() {
49         fetchLocalPackages().then(packages => {
50             this.packages = packages
51             if (this.packages.length) {
52                 this.package_id = packages[0].package_id
53             }
54         })
55     },
56     methods: {
57         import_from_list: async function (list_id) {
58             if (!this.package_id) {
59                 setError(this.$__("Cannot import, no package selected"))
60                 return
61             }
62             if (!list_id) return
63             await fetch("/api/v1/erm/eholdings/local/titles/import", {
64                 method: "POST",
65                 body: JSON.stringify({ list_id, package_id: this.package_id }),
66                 headers: {
67                     Accept: "application/json",
68                     "Content-Type": "application/json",
69                 },
70             })
71                 .then(checkError)
72                 .then(
73                     result => {
74                         this.job_id = result.job_id
75                     },
76                     error => {
77                         setError(error)
78                     }
79                 )
80         },
81         build_datatable: function () {
82             let lists = this.logged_in_user_lists
83             let table_id = this.table_id
84             let import_from_list = this.import_from_list
85             $("#" + table_id).dataTable(
86                 $.extend(true, {}, dataTablesDefaults, {
87                     data: lists,
88                     order: [[0, "asc"]],
89                     autoWidth: false,
90                     columns: [
91                         {
92                             title: __("Name"),
93                             data: "shelfname",
94                             searchable: true,
95                             orderable: true,
96                             width: "100%",
97                             render: function (data, type, row, meta) {
98                                 return (
99                                     row.shelfname +
100                                     " (#" +
101                                     row.shelfnumber +
102                                     ")"
103                                 )
104                             },
105                         },
106                         {
107                             title: __("Actions"),
108                             data: function (row, type, val, meta) {
109                                 return '<div class="actions"></div>'
110                             },
111                             className: "actions noExport",
112                             searchable: false,
113                             orderable: false,
114                         },
115                     ],
116                     drawCallback: function (settings) {
117                         var api = new $.fn.dataTable.Api(settings)
118
119                         $.each(
120                             $(this).find("td .actions"),
121                             function (index, e) {
122                                 let tr = $(this).parent().parent()
123                                 let list_id = api.row(tr).data().shelfnumber
124                                 let importButton = createVNode(
125                                     "a",
126                                     {
127                                         class: "btn btn-default btn-xs",
128                                         role: "button",
129                                         onClick: () => {
130                                             import_from_list(list_id)
131                                         },
132                                     },
133                                     [
134                                         createVNode("i", {
135                                             class: "fa fa-download",
136                                             "aria-hidden": "true",
137                                         }),
138                                         __("Import"),
139                                     ]
140                                 )
141
142                                 let n = createVNode("span", {}, [importButton])
143                                 render(n, e)
144                             }
145                         )
146                     },
147                 })
148             )
149         },
150     },
151     mounted() {
152         this.build_datatable()
153     },
154     name: "EHoldingsLocalTitlesFormImport",
155 }
156 </script>
157 <style scoped>
158 fieldset.rows label {
159     width: 25rem;
160 }
161 </style>