From 59a7242231e43511c90bb129624c532ab74d688f Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Date: Tue, 7 Mar 2023 15:02:25 +0100
Subject: [PATCH] Bug 33066: Reintroduce column filters
---
koha-tmpl/intranet-tmpl/prog/js/datatables.js | 13 ++++--
.../js/vue/components/ERM/AgreementsList.vue | 41 ++++++++++---------
.../prog/js/vue/components/KohaTable.vue | 6 ++-
3 files changed, 35 insertions(+), 25 deletions(-)
diff --git a/koha-tmpl/intranet-tmpl/prog/js/datatables.js b/koha-tmpl/intranet-tmpl/prog/js/datatables.js
index 4a897056eb0..7caf266faed 100644
--- a/koha-tmpl/intranet-tmpl/prog/js/datatables.js
+++ b/koha-tmpl/intranet-tmpl/prog/js/datatables.js
@@ -828,7 +828,7 @@ function _dt_on_visibility(add_filters, table_node, table_dt){
}
}
-function _dt_add_filters(table_node, table_dt) {
+function _dt_add_filters(table_node, table_dt, filters_options = {}) {
$(table_node).find('thead tr').clone().appendTo( $(table_node).find('thead') );
$(table_node).find('thead tr:eq(1) th').each( function (i) {
@@ -837,14 +837,19 @@ function _dt_add_filters(table_node, table_dt) {
$(this).data('th-id', i);
if ( is_searchable ) {
let input_type = 'input';
- if ( $(this).data('filter') ) {
+ if ( $(this).data('filter') || filters_options.hasOwnProperty(i)) {
input_type = 'select'
let filter_type = $(this).data('filter');
- var existing_search = table_dt.column(i).search();
+ let existing_search = table_dt.column(i).search();
let select = $('<select><option value=""></option></select');
// FIXME eval here is bad and dangerous, how do we workaround that?
- $(eval(filter_type)).each(function(){
+ if ( !filters_options.hasOwnProperty(i) ) {
+ filters_options[i] = eval(filter_type)
+ } else if ( typeof filters_options[i] === "function" ) {
+ filters_options[i] = filters_options[i]()
+ }
+ $(filters_options[i]).each(function(){
let o = $('<option value="%s">%s</option>'.format(this._id, this._str));
if ( existing_search === this._id ) {
o.prop("selected", "selected");
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/AgreementsList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/AgreementsList.vue
index a902f6b506f..ff80299014c 100644
--- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/AgreementsList.vue
+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/AgreementsList.vue
@@ -88,6 +88,25 @@ export default {
url: () => this.table_url(),
table_settings: this.agreement_table_settings,
add_filters: true,
+ filters_options: {
+ 1: () =>
+ this.vendors.map(e => {
+ e["_id"] = e["id"]
+ e["_str"] = e["name"]
+ return e
+ }),
+ 3: () => this.map_av_dt_filter("av_agreement_statuses"),
+ 4: () =>
+ this.map_av_dt_filter("av_agreement_closure_reasons"),
+ 5: [
+ { _id: 0, _str: _("No") },
+ { _id: 1, _str: _("Yes") },
+ ],
+ 6: () =>
+ this.map_av_dt_filter(
+ "av_agreement_renewal_priorities"
+ ),
+ },
actions: {
0: ["show"],
"-1": ["edit", "delete"],
@@ -100,7 +119,7 @@ export default {
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)
if (!vm.building_table) {
vm.building_table = true
- vm.getAgreements().then(() => vm.initialized = true)
+ vm.getAgreements().then(() => (vm.initialized = true))
}
})
},
@@ -473,29 +492,11 @@ export default {
getTableColumns: function () {
let get_lib_from_av = this.get_lib_from_av
let escape_str = this.escape_str
- window["vendors"] = this.vendors.map(e => {
- e["_id"] = e["id"]
- e["_str"] = e["name"]
- return e
- })
let vendors_map = this.vendors.reduce((map, e) => {
map[e.id] = e
return map
}, {})
- let avs = [
- "av_agreement_statuses",
- "av_agreement_closure_reasons",
- "av_agreement_renewal_priorities",
- ]
- let c = this
- avs.forEach(function (av_cat) {
- window[av_cat] = c.map_av_dt_filter(av_cat)
- })
- window["av_agreement_is_perpetual"] = [
- { _id: 0, _str: _("No") },
- { _id: 1, _str: _("Yes") },
- ]
return [
{
title: __("Name"),
@@ -518,7 +519,7 @@ export default {
orderable: true,
render: function (data, type, row, meta) {
return row.vendor_id != undefined
- ? escape_str(vendors_map[row.vendor_id].name)
+ ? row.vendor_id //escape_str(vendors_map[row.vendor_id].name)
: ""
},
},
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/KohaTable.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/KohaTable.vue
index e334c405fce..2e0173e1a2f 100644
--- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/KohaTable.vue
+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/KohaTable.vue
@@ -120,7 +120,7 @@ export default {
let dt = this.$refs.table.dt()
let table_node = dt.table().node()
if (this.add_filters) {
- _dt_add_filters(table_node, dt)
+ _dt_add_filters(table_node, dt, this.filters_options)
}
dt.on("column-visibility.dt", function () {
@@ -189,6 +189,10 @@ export default {
type: Boolean,
required: false,
},
+ filters_options: {
+ type: Object,
+ required: false,
+ },
},
}
</script>
--
2.25.1