diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index 3af1c0714a..e43d4e4145 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -55,6 +55,15 @@ module Admin @report_title = report_title @rendering_options = rendering_options @data = Reporting::FrontendData.new(spree_current_user) + + variant_id_in = params[:variant_id_in].reject(&:blank?) + load_selected_variant if variant_id_in.present? + end + + # Orders and Fulfillment Reports include a per product filter, load any selected product + def load_selected_variant + variant = Spree::Variant.find(params[:variant_id_in][0]) + @variant_serialized = Api::Admin::VariantSerializer.new(variant) end def render_data? diff --git a/app/views/admin/reports/filters/_orders_and_fulfillment.html.haml b/app/views/admin/reports/filters/_orders_and_fulfillment.html.haml index 0a9963544f..aa6097c6ba 100755 --- a/app/views/admin/reports/filters/_orders_and_fulfillment.html.haml +++ b/app/views/admin/reports/filters/_orders_and_fulfillment.html.haml @@ -12,3 +12,9 @@ .alpha.two.columns= label_tag nil, t(:report_customers_cycle) .omega.fourteen.columns = f.select(:order_cycle_id_in, report_order_cycle_options(@data.order_cycles), {selected: params.dig(:q, :order_cycle_id_in)}, {class: "select2 fullwidth", multiple: true}) +.row + .alpha.two.columns= label_tag :add_variant_id, Spree.t(:name_or_sku) + .omega.fourteen.columns + - variant_json = @variant_serialized.present? ? @variant_serialized.to_json() : {} + = select_tag(:variant_id_in, params[:variant_id_in], { class: "fullwidth", multiple: true , data: { controller: "select-variant", "select-variant-selected-value": "#{variant_json}" } }) + diff --git a/app/webpacker/controllers/select_variant_controller.js b/app/webpacker/controllers/select_variant_controller.js index 778f1717c8..75d9a9ebcf 100644 --- a/app/webpacker/controllers/select_variant_controller.js +++ b/app/webpacker/controllers/select_variant_controller.js @@ -1,15 +1,15 @@ import TomSelectController from "./tom_select_controller"; -// This is simalar to the "variantAutocomplete" directive that uses "select2", but it doesn't +// This is simalar to the "variantAutocomplete" directive that uses "select2", but it doesn't // have all the same feature // export default class extends TomSelectController { - static values = { options: Object, distributor: Number }; + static values = { options: Object, distributor: Number, selected: Object }; connect() { const options = { - valueField: 'id', - searchField: ['name', 'sku'], + valueField: "id", + searchField: ["name", "sku"], load: this.#load.bind(this), shouldLoad: (query) => query.length > 2, render: { @@ -18,17 +18,33 @@ export default class extends TomSelectController { }, }; super.connect(options); + // Add the selected value if any and select it. + // It will need to include data used in the templates below: + // - id + // - image + // - name + // - producer_name + // - sku + // - on_demand + // - on_hand + // - options_text + // + if (this.hasSelectedValue && Object.keys(this.selectedValue).length > 0) { + this.control.addOption(this.selectedValue); + this.control.addItem(this.selectedValue.id); + } } // private #load(query, callback) { - const url = '/admin/variants/search.json?q=' + encodeURIComponent(query); + const url = "/admin/variants/search.json?q=" + encodeURIComponent(query); fetch(url) - .then(response => response.json()) - .then(json => { + .then((response) => response.json()) + .then((json) => { callback(json); - }).catch((error) => { + }) + .catch((error) => { console.log(error); callback(); }); @@ -37,30 +53,38 @@ export default class extends TomSelectController { #renderOption(variant, escape) { return `
- ${ variant.image ? `` : "" } + ${variant.image ? `` : ""}
-
${ escape(variant.name)}
+
${escape(variant.name)}
`; - } + } #renderItem(variant, escape) { - return `${ escape(variant.name) }` + return `${escape(variant.name)}`; } } -