From cee5d7514253ced501019d507bb074084d80c7f2 Mon Sep 17 00:00:00 2001 From: Matt Blenkinsop Date: Tue, 29 Oct 2024 17:12:24 +0000 Subject: [PATCH] Bug 38262: Update UI --- .../en/modules/admin/additional-fields.tt | 3 +- .../prog/js/fetch/acquisition-api-client.js | 2 +- .../vue/components/Vendors/VendorFormAdd.vue | 12 +++ .../js/vue/components/Vendors/VendorList.vue | 86 ++++++++++++++++++- .../js/vue/components/Vendors/VendorShow.vue | 9 ++ 5 files changed, 108 insertions(+), 4 deletions(-) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/additional-fields.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/additional-fields.tt index 8b97922eb2a..698e8465317 100755 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/additional-fields.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/additional-fields.tt @@ -30,7 +30,7 @@ [% marcfield_tables = ['subscription', 'aqorders'] %] -[% searchable_tables = ['subscription', 'aqbasket', 'aqinvoices', 'erm_licenses', 'erm_agreements', 'erm_packages'] %] +[% searchable_tables = ['subscription', 'aqbasket', 'aqinvoices', 'erm_licenses', 'erm_agreements', 'erm_packages', 'aqbooksellers'] %] [% show_marcfield = marcfield_tables.grep('^' _ tablename _ '$').size ? 1 : 0 %] [% show_searchable = searchable_tables.grep('^' _ tablename _ '$').size ? 1 : 0 %] @@ -130,6 +130,7 @@ [% IF CAN_user_acquisition_order_manage %] [% WRAPPER table_option value="aqbasket" %]Order baskets[% END %] [% WRAPPER table_option value="aqorders" %]Order lines[% END %] + [% WRAPPER table_option value="aqbooksellers:vendor" %]Vendors[% END %] [% END %] [% END %] diff --git a/koha-tmpl/intranet-tmpl/prog/js/fetch/acquisition-api-client.js b/koha-tmpl/intranet-tmpl/prog/js/fetch/acquisition-api-client.js index 0316beb3b33..7c7a8d7345c 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/fetch/acquisition-api-client.js +++ b/koha-tmpl/intranet-tmpl/prog/js/fetch/acquisition-api-client.js @@ -12,7 +12,7 @@ export class AcquisitionAPIClient { endpoint: "vendors/" + id, headers: { "x-koha-embed": - "aliases,subscriptions+count,interfaces,contacts,contracts,baskets", + "aliases,subscriptions+count,interfaces,contacts,contracts,baskets,extended_attributes,+strings", }, }), getAll: (query, params) => diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorFormAdd.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorFormAdd.vue index abfbb45e562..6fbe6d6fa24 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorFormAdd.vue +++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorFormAdd.vue @@ -19,6 +19,11 @@ + @@ -33,6 +38,7 @@ import VendorOrderingInformation from "./VendorOrderingInformation.vue"; import VendorInterfaces from "./VendorInterfaces.vue"; import Toolbar from "../Toolbar.vue"; import ToolbarButton from "../ToolbarButton.vue"; +import AdditionalFieldsEntry from "../AdditionalFieldsEntry.vue"; export default { data() { @@ -66,6 +72,7 @@ export default { aliases: [], contacts: [], interfaces: [], + extended_attributes: [], }, initialized: false, }; @@ -118,6 +125,7 @@ export default { } delete vendor.physical; delete vendor.subscriptions_count; + delete vendor._strings; vendor.contacts = this.checkContactOrInterface( vendor.contacts.map( @@ -168,6 +176,9 @@ export default { return acc; }, []); }, + additionalFieldsChanged(additionalFieldValues) { + this.vendor.extended_attributes = additionalFieldValues; + }, }, components: { ButtonSubmit, @@ -177,6 +188,7 @@ export default { VendorInterfaces, Toolbar, ToolbarButton, + AdditionalFieldsEntry, }, name: "VendorFormAdd", }; diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorList.vue index 4ea2d7be2df..04bfdc7d3e0 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorList.vue +++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorList.vue @@ -17,6 +17,8 @@ @delete="doDelete" @select="doSelect" @receive="doReceive" + :searchable_additional_fields="searchable_additional_fields" + :searchable_av_options="searchable_av_options" >
@@ -64,10 +66,12 @@ export default { vendor_count: 0, initialized: false, searchTerm: null, + searchable_av_options: [], + searchable_additional_fields: [], tableOptions: { columns: this.getTableColumns(), options: { - embed: "aliases,baskets,subscriptions+count,invoices", + embed: "aliases,baskets,subscriptions+count,invoices,extended_attributes,+strings", }, url: () => this.tableURL(), add_filters: true, @@ -118,7 +122,15 @@ export default { }, beforeRouteEnter(to, from, next) { next(vm => { - vm.getVendorCount().then(() => (vm.initialized = true)); + vm.getVendorCount().then(() => + vm + .getSearchableAdditionalFields() + .then(() => + vm + .getSearchableAVOptions() + .then(() => (vm.initialized = true)) + ) + ); if (to.query.supplier) { vm.searchTerm = to.query.supplier; } @@ -272,6 +284,76 @@ export default { }, ]; }, + async getSearchableAdditionalFields() { + const client = APIClient.additional_fields; + await client.additional_fields.getAll("vendor").then( + searchable_additional_fields => { + this.searchable_additional_fields = + searchable_additional_fields.filter( + field => field.searchable + ); + }, + error => {} + ); + }, + async getSearchableAVOptions() { + const client_av = APIClient.authorised_values; + let av_cat_array = this.searchable_additional_fields + .filter(field => field.authorised_value_category_name) + .map(field => field.authorised_value_category_name); + + await client_av.values + .getCategoriesWithValues([ + ...new Set(av_cat_array.map(av_cat => '"' + av_cat + '"')), + ]) // unique + .then(av_categories => { + av_cat_array.forEach(av_cat => { + let av_match = av_categories.find( + element => element.category_name == av_cat + ); + this.searchable_av_options[av_cat] = + av_match.authorised_values.map(av => ({ + value: av.value, + label: av.description, + })); + }); + }); + }, + async getSearchableAdditionalFields() { + const client = APIClient.additional_fields; + await client.additional_fields.getAll("vendor").then( + searchable_additional_fields => { + this.searchable_additional_fields = + searchable_additional_fields.filter( + field => field.searchable + ); + }, + error => {} + ); + }, + async getSearchableAVOptions() { + const client_av = APIClient.authorised_values; + let av_cat_array = this.searchable_additional_fields + .filter(field => field.authorised_value_category_name) + .map(field => field.authorised_value_category_name); + + await client_av.values + .getCategoriesWithValues([ + ...new Set(av_cat_array.map(av_cat => '"' + av_cat + '"')), + ]) // unique + .then(av_categories => { + av_cat_array.forEach(av_cat => { + let av_match = av_categories.find( + element => element.category_name == av_cat + ); + this.searchable_av_options[av_cat] = + av_match.authorised_values.map(av => ({ + value: av.value, + label: av.description, + })); + }); + }); + }, }, components: { flatPickr, Toolbar, ToolbarButton, KohaTable }, name: "VendorList", diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorShow.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorShow.vue index e0114e8b137..34ff9bf2e3e 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorShow.vue +++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorShow.vue @@ -77,6 +77,13 @@
+