View | Details | Raw Unified | Return to bug 33066
Collapse All | Expand All

(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/AgreementsList.vue (-337 / +10 lines)
Lines 1-8 Link Here
1
<template>
1
<template>
2
    <div v-if="!initialized">{{ $__("Loading") }}</div>
2
    <div id="agreements_list">
3
    <div v-else-if="agreements" id="agreements_list">
4
        <Toolbar v-if="before_route_entered" />
3
        <Toolbar v-if="before_route_entered" />
5
        <fieldset v-if="agreements.length" class="filters">
4
        <fieldset class="filters">
6
            <label for="expired_filter">{{ $__("Filter by expired") }}:</label>
5
            <label for="expired_filter">{{ $__("Filter by expired") }}:</label>
7
            <input
6
            <input
8
                type="checkbox"
7
                type="checkbox"
Lines 24-30 Link Here
24
                :value="$__('Filter')"
23
                :value="$__('Filter')"
25
            />
24
            />
26
        </fieldset>
25
        </fieldset>
27
        <div v-if="agreements.length" class="page-section">
26
        <div class="page-section">
28
            <KohaTable
27
            <KohaTable
29
                ref="table"
28
                ref="table"
30
                v-bind="tableOptions"
29
                v-bind="tableOptions"
Lines 33-41 Link Here
33
                @delete="doDelete"
32
                @delete="doDelete"
34
            ></KohaTable>
33
            ></KohaTable>
35
        </div>
34
        </div>
36
        <div v-else-if="initialized" class="dialog message">
37
            {{ $__("There are no agreements defined") }}
38
        </div>
39
    </div>
35
    </div>
40
</template>
36
</template>
41
37
Lines 92-120 export default { Link Here
92
                    0: ["show"],
88
                    0: ["show"],
93
                    "-1": ["edit", "delete"],
89
                    "-1": ["edit", "delete"],
94
                },
90
                },
91
                options: {
92
                    embed: ["vendor"],
93
                },
95
            },
94
            },
96
        }
95
        }
97
    },
96
    },
98
    beforeRouteEnter(to, from, next) {
97
    beforeRouteEnter(to, from, next) {
99
        next(vm => {
98
        next(vm => {
100
            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)
99
            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)
101
            if (!vm.building_table) {
102
                vm.building_table = true
103
                vm.getAgreements()
104
                vm.initialized = true
105
            }
106
        })
100
        })
107
    },
101
    },
108
    methods: {
102
    methods: {
109
        async getAgreements() {
103
        async getAgreements() {
110
            const client = APIClient.erm
104
            const client = APIClient.erm
111
            await client.agreements.getAll().then(
105
            this.agreements = await client.agreements.getAll()
112
                agreements => {
106
            this.initialized = true
113
                    this.agreements = agreements
114
                    this.initialized = true
115
                },
116
                error => {}
117
            )
118
        },
107
        },
119
        doShow: function (agreement, dt, event) {
108
        doShow: function (agreement, dt, event) {
120
            event.preventDefault()
109
            event.preventDefault()
Lines 181-488 export default { Link Here
181
            }
170
            }
182
            this.$refs.table.redraw(this.table_url())
171
            this.$refs.table.redraw(this.table_url())
183
        },
172
        },
184
        build_datatable: function () {
185
            let show_agreement = this.show_agreement
186
            let edit_agreement = this.edit_agreement
187
            let delete_agreement = this.delete_agreement
188
            let select_agreement = this.select_agreement
189
            let get_lib_from_av = this.get_lib_from_av
190
            let map_av_dt_filter = this.map_av_dt_filter
191
            let datatable_url = this.datatable_url
192
            let default_search = this.$route.query.q
193
            let actions = this.before_route_entered ? "edit_delete" : "select"
194
            let table_id = this.table_id
195
196
            window["vendors"] = this.vendors.map(e => {
197
                e["_id"] = e["id"]
198
                e["_str"] = e["name"]
199
                return e
200
            })
201
            let vendors_map = this.vendors.reduce((map, e) => {
202
                map[e.id] = e
203
                return map
204
            }, {})
205
            let avs = [
206
                "av_agreement_statuses",
207
                "av_agreement_closure_reasons",
208
                "av_agreement_renewal_priorities",
209
            ]
210
            avs.forEach(function (av_cat) {
211
                window[av_cat] = map_av_dt_filter(av_cat)
212
            })
213
214
            window["av_agreement_is_perpetual"] = [
215
                { _id: 0, _str: _("No") },
216
                { _id: 1, _str: _("Yes") },
217
            ]
218
219
            const table = $("#" + table_id).kohaTable(
220
                {
221
                    ajax: {
222
                        url: datatable_url,
223
                    },
224
                    order: [[0, "asc"]],
225
                    autoWidth: false,
226
                    search: { search: default_search },
227
                    columnDefs: [
228
                        {
229
                            targets: [0, 2],
230
                            render: function (data, type, row, meta) {
231
                                if (type == "display") {
232
                                    return escape_str(data)
233
                                }
234
                                return data
235
                            },
236
                        },
237
                    ],
238
                    columns: [
239
                        {
240
                            title: __("Name"),
241
                            data: "me.agreement_id:me.name",
242
                            searchable: true,
243
                            orderable: true,
244
                            render: function (data, type, row, meta) {
245
                                // Rendering done in drawCallback
246
                                return ""
247
                            },
248
                        },
249
                        {
250
                            title: __("Vendor"),
251
                            data: "vendor_id",
252
                            searchable: true,
253
                            orderable: true,
254
                            render: function (data, type, row, meta) {
255
                                return row.vendor_id != undefined
256
                                    ? escape_str(
257
                                          vendors_map[row.vendor_id].name
258
                                      )
259
                                    : ""
260
                            },
261
                        },
262
                        {
263
                            title: __("Description"),
264
                            data: "description",
265
                            searchable: true,
266
                            orderable: true,
267
                        },
268
                        {
269
                            title: __("Status"),
270
                            data: "status",
271
                            searchable: true,
272
                            orderable: true,
273
                            render: function (data, type, row, meta) {
274
                                return escape_str(
275
                                    get_lib_from_av(
276
                                        "av_agreement_statuses",
277
                                        row.status
278
                                    )
279
                                )
280
                            },
281
                        },
282
                        {
283
                            title: __("Closure reason"),
284
                            data: "closure_reason",
285
                            searchable: true,
286
                            orderable: true,
287
                            render: function (data, type, row, meta) {
288
                                return escape_str(
289
                                    get_lib_from_av(
290
                                        "av_agreement_closure_reasons",
291
                                        row.closure_reason
292
                                    )
293
                                )
294
                            },
295
                        },
296
                        {
297
                            title: __("Is perpetual"),
298
                            data: "is_perpetual",
299
                            searchable: true,
300
                            orderable: true,
301
                            render: function (data, type, row, meta) {
302
                                return escape_str(
303
                                    row.is_perpetual ? _("Yes") : _("No")
304
                                )
305
                            },
306
                        },
307
                        {
308
                            title: __("Renewal priority"),
309
                            data: "renewal_priority",
310
                            searchable: true,
311
                            orderable: true,
312
                            render: function (data, type, row, meta) {
313
                                return escape_str(
314
                                    get_lib_from_av(
315
                                        "av_agreement_renewal_priorities",
316
                                        row.renewal_priority
317
                                    )
318
                                )
319
                            },
320
                        },
321
                        {
322
                            title: __("Actions"),
323
                            data: function (row, type, val, meta) {
324
                                return '<div class="actions"></div>'
325
                            },
326
                            className: "actions noExport",
327
                            searchable: false,
328
                            orderable: false,
329
                        },
330
                    ],
331
                    drawCallback: function (settings) {
332
                        var api = new $.fn.dataTable.Api(settings)
333
334
                        if (actions == "edit_delete") {
335
                            $.each(
336
                                $(this).find("td .actions"),
337
                                function (index, e) {
338
                                    let tr = $(this).parent().parent()
339
                                    let agreement_id = api
340
                                        .row(tr)
341
                                        .data().agreement_id
342
                                    let agreement_name = api.row(tr).data().name
343
                                    let editButton = createVNode(
344
                                        "a",
345
                                        {
346
                                            class: "btn btn-default btn-xs",
347
                                            role: "button",
348
                                            onClick: () => {
349
                                                edit_agreement(agreement_id)
350
                                            },
351
                                        },
352
                                        [
353
                                            createVNode("i", {
354
                                                class: "fa fa-pencil",
355
                                                "aria-hidden": "true",
356
                                            }),
357
                                            __("Edit"),
358
                                        ]
359
                                    )
360
361
                                    let deleteButton = createVNode(
362
                                        "a",
363
                                        {
364
                                            class: "btn btn-default btn-xs",
365
                                            role: "button",
366
                                            onClick: () => {
367
                                                delete_agreement(
368
                                                    agreement_id,
369
                                                    agreement_name
370
                                                )
371
                                            },
372
                                        },
373
                                        [
374
                                            createVNode("i", {
375
                                                class: "fa fa-trash",
376
                                                "aria-hidden": "true",
377
                                            }),
378
                                            __("Delete"),
379
                                        ]
380
                                    )
381
382
                                    let n = createVNode("span", {}, [
383
                                        editButton,
384
                                        " ",
385
                                        deleteButton,
386
                                    ])
387
                                    render(n, e)
388
                                }
389
                            )
390
                        } else {
391
                            $.each(
392
                                $(this).find("td .actions"),
393
                                function (index, e) {
394
                                    let tr = $(this).parent().parent()
395
                                    let agreement_id = api
396
                                        .row(tr)
397
                                        .data().agreement_id
398
                                    let selectButton = createVNode(
399
                                        "a",
400
                                        {
401
                                            class: "btn btn-default btn-xs",
402
                                            role: "button",
403
                                            onClick: () => {
404
                                                select_agreement(agreement_id)
405
                                            },
406
                                        },
407
                                        [
408
                                            createVNode("i", {
409
                                                class: "fa fa-check",
410
                                                "aria-hidden": "true",
411
                                            }),
412
                                            __("Select"),
413
                                        ]
414
                                    )
415
416
                                    let n = createVNode("span", {}, [
417
                                        selectButton,
418
                                    ])
419
                                    render(n, e)
420
                                }
421
                            )
422
                        }
423
424
                        $.each(
425
                            $(this).find("tbody tr td:first-child"),
426
                            function (index, e) {
427
                                let tr = $(this).parent()
428
                                let row = api.row(tr).data()
429
                                if (!row) return // Happen if the table is empty
430
                                let n = createVNode(
431
                                    "a",
432
                                    {
433
                                        role: "button",
434
                                        onClick: () => {
435
                                            show_agreement(row.agreement_id)
436
                                        },
437
                                    },
438
                                    `${row.name} (#${row.agreement_id})`
439
                                )
440
                                render(n, e)
441
                            }
442
                        )
443
                    },
444
                    preDrawCallback: function (settings) {
445
                        $("#" + table_id)
446
                            .find("thead th")
447
                            .eq(1)
448
                            .attr("data-filter", "vendors")
449
                        $("#" + table_id)
450
                            .find("thead th")
451
                            .eq(3)
452
                            .attr("data-filter", "av_agreement_statuses")
453
                        $("#" + table_id)
454
                            .find("thead th")
455
                            .eq(4)
456
                            .attr("data-filter", "av_agreement_closure_reasons")
457
                        $("#" + table_id)
458
                            .find("thead th")
459
                            .eq(5)
460
                            .attr("data-filter", "av_agreement_is_perpetual")
461
                        $("#" + table_id)
462
                            .find("thead th")
463
                            .eq(6)
464
                            .attr(
465
                                "data-filter",
466
                                "av_agreement_renewal_priorities"
467
                            )
468
                    },
469
                },
470
                agreement_table_settings,
471
                1
472
            )
473
        },
474
        getTableColumns: function () {
173
        getTableColumns: function () {
475
            let get_lib_from_av = this.get_lib_from_av
174
            let get_lib_from_av = this.get_lib_from_av
476
            let escape_str = this.escape_str
175
            let escape_str = this.escape_str
477
            window["vendors"] = this.vendors.map(e => {
478
                e["_id"] = e["id"]
479
                e["_str"] = e["name"]
480
                return e
481
            })
482
            let vendors_map = this.vendors.reduce((map, e) => {
483
                map[e.id] = e
484
                return map
485
            }, {})
486
            let avs = [
176
            let avs = [
487
                "av_agreement_statuses",
177
                "av_agreement_statuses",
488
                "av_agreement_closure_reasons",
178
                "av_agreement_closure_reasons",
Lines 514-526 export default { Link Here
514
                },
204
                },
515
                {
205
                {
516
                    title: __("Vendor"),
206
                    title: __("Vendor"),
517
                    data: "vendor_id",
207
                    data: "vendor.name",
518
                    searchable: true,
208
                    searchable: true,
519
                    orderable: true,
209
                    orderable: true,
520
                    render: function (data, type, row, meta) {
210
                    render: function (data, type, row, meta) {
521
                        return row.vendor_id != undefined
211
                        return row.vendor.name
522
                            ? escape_str(vendors_map[row.vendor_id].name)
523
                            : ""
524
                    },
212
                    },
525
                },
213
                },
526
                {
214
                {
Lines 577-600 export default { Link Here
577
                        )
265
                        )
578
                    },
266
                    },
579
                },
267
                },
580
                {
581
                    title: __("Actions"),
582
                    data: function (row, type, val, meta) {
583
                        return '<div class="actions"></div>'
584
                    },
585
                    className: "actions noExport",
586
                    searchable: false,
587
                    orderable: false,
588
                },
589
            ]
268
            ]
590
        },
269
        },
591
    },
270
    },
592
    mounted() {
593
        if (!this.building_table) {
594
            this.building_table = true
595
            this.getAgreements()
596
        }
597
    },
598
    components: { flatPickr, Toolbar, KohaTable },
271
    components: { flatPickr, Toolbar, KohaTable },
599
    name: "AgreementsList",
272
    name: "AgreementsList",
600
    emits: ["select-agreement", "close"],
273
    emits: ["select-agreement", "close"],
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/Main.vue (-22 / +31 lines)
Lines 6-12 Link Here
6
                <div class="col-sm-10 col-sm-push-2">
6
                <div class="col-sm-10 col-sm-push-2">
7
                    <main>
7
                    <main>
8
                        <Dialog />
8
                        <Dialog />
9
                        <router-view/>
9
                        <router-view v-if="vendorStore.vendors.length" />
10
                    </main>
10
                    </main>
11
                </div>
11
                </div>
12
12
Lines 147-168 export default { Link Here
147
            component: "agreement",
147
            component: "agreement",
148
        }
148
        }
149
    },
149
    },
150
    beforeCreate() {
150
    async beforeCreate() {
151
        if(!this.ERMModule) {
151
        if (!this.ERMModule) {
152
            return this.setError(this.$__(
152
            return this.setError(
153
                'The e-resource management module is disabled, turn on <a href="/cgi-bin/koha/admin/preferences.pl?tab=&op=search&searchfield=ERMModule">ERMModule</a> to use it'
153
                this.$__(
154
            ), false);
154
                    'The e-resource management module is disabled, turn on <a href="/cgi-bin/koha/admin/preferences.pl?tab=&op=search&searchfield=ERMModule">ERMModule</a> to use it'
155
                ),
156
                false
157
            )
155
        }
158
        }
156
        this.loading()
159
        this.loading()
157
160
158
        const acq_client = APIClient.acquisition
161
        const acq_client = APIClient.acquisition
159
        acq_client.vendors.getAll().then(
162
        const vendors = await acq_client.vendors.getAll()
160
            vendors => {
163
161
                this.vendorStore.vendors = vendors
164
        this.vendorStore.vendors = vendors
162
                this.initialized = true
165
        this.initialized = true
163
            },
164
            error => {}
165
        )
166
166
167
        const av_client = APIClient.authorised_values
167
        const av_client = APIClient.authorised_values
168
        const authorised_values = {
168
        const authorised_values = {
Lines 179-193 export default { Link Here
179
            av_title_publication_types: "ERM_TITLE_PUBLICATION_TYPE",
179
            av_title_publication_types: "ERM_TITLE_PUBLICATION_TYPE",
180
        }
180
        }
181
181
182
        let av_cat_array = Object.keys(authorised_values).map(function(av_cat){return "\""+authorised_values[av_cat]+"\""});
182
        let av_cat_array = Object.keys(authorised_values).map(function (
183
183
            av_cat
184
        av_client.values.getCategoriesWithValues(av_cat_array).then(av_categories => {
184
        ) {
185
            Object.entries(authorised_values).forEach(([av_var, av_cat]) => {
185
            return '"' + authorised_values[av_cat] + '"'
186
                const av_match = av_categories.find(element => element.category_name ==  av_cat);
186
        })
187
                this.AVStore[av_var] = av_match.authorised_values;
187
188
188
        av_client.values
189
            .getCategoriesWithValues(av_cat_array)
190
            .then(av_categories => {
191
                Object.entries(authorised_values).forEach(
192
                    ([av_var, av_cat]) => {
193
                        const av_match = av_categories.find(
194
                            element => element.category_name == av_cat
195
                        )
196
                        this.AVStore[av_var] = av_match.authorised_values
197
                    }
198
                )
189
            })
199
            })
190
        }).then(() => (this.loaded()));
200
            .then(() => this.loaded())
191
    },
201
    },
192
    components: {
202
    components: {
193
        Breadcrumb,
203
        Breadcrumb,
194
- 

Return to bug 33066