diff --git a/app/assets/javascripts/admin/spree/orders/variant_autocomplete.js.erb b/app/assets/javascripts/admin/spree/orders/variant_autocomplete.js.erb new file mode 100644 index 0000000000..04d392a0e2 --- /dev/null +++ b/app/assets/javascripts/admin/spree/orders/variant_autocomplete.js.erb @@ -0,0 +1,277 @@ +<%#encoding: UTF-8%> +// variant autocompletion + +$(document).ready(function() { + + if ($('#variant_autocomplete_template').length > 0) { + window.variantTemplate = Handlebars.compile($('#variant_autocomplete_template').text()); + window.variantStockTemplate = Handlebars.compile($('#variant_autocomplete_stock_template').text()); + + // handle variant selection, show stock level. + $('#add_variant_id').change(function(){ + var variant_id = $(this).val(); + + var variant = _.find(window.variants, function(variant){ + return variant.id == variant_id + }) + $('#stock_details').html(variantStockTemplate({variant: variant})); + $('#stock_details').show(); + + $('button.add_variant').click(addVariantFromStockLocation); + + // Add some tips + $('.with-tip').powerTip({ + smartPlacement: true, + fadeInTime: 50, + fadeOutTime: 50, + intentPollInterval: 300 + }); + + }); + + //handle edit click + $('a.edit-item').click(toggleItemEdit); + + //handle cancel click + $('a.cancel-item').click(toggleItemEdit); + + //handle split click + $('a.split-item').click(startItemSplit); + + //handle save click + $('a.save-item').click(function(){ + var save = $(this); + var shipment_number = save.data('shipment-number'); + var variant_id = save.data('variant-id'); + + var quantity = parseInt(save.parents('tr').find('input.line_item_quantity').val()); + + toggleItemEdit(); + + adjustItems(shipment_number, variant_id, quantity); + return false; + }); + + //handle delete click + $('a.delete-item').click(function(){ + var del = $(this); + var shipment_number = del.data('shipment-number'); + var variant_id = del.data('variant-id'); + + toggleItemEdit(); + + adjustItems(shipment_number, variant_id, 0); + + }); + } +}); + +adjustItems = function(shipment_number, variant_id, quantity){ + var shipment = _.findWhere(shipments, {number: shipment_number + ''}); + var inventory_units = _.where(shipment.inventory_units, {variant_id: variant_id}); + + var url = Spree.routes.orders_api + "/" + order_number + "/shipments/" + shipment_number; + + var new_quantity = 0; + if(inventory_units.lengthquantity){ + url += "/remove" + new_quantity = (inventory_units.length - quantity); + } + url += '.json'; + + if(new_quantity!=0){ + $.ajax({ + type: "PUT", + url: Spree.url(url), + data: { variant_id: variant_id, quantity: new_quantity } + }).done(function( msg ) { + window.location.reload(); + }); + } +} + +toggleTrackingEdit = function(){ + var link = $(this); + link.parents('tbody').find('tr.edit-tracking').toggle(); + link.parents('tbody').find('tr.show-tracking').toggle(); +} + +toggleMethodEdit = function(){ + var link = $(this); + link.parents('tbody').find('tr.edit-method').toggle(); + link.parents('tbody').find('tr.show-method').toggle(); +} + +toggleItemEdit = function(){ + var link = $(this); + link.parent().find('a.edit-item').toggle(); + link.parent().find('a.cancel-item').toggle(); + link.parent().find('a.split-item').toggle(); + link.parent().find('a.save-item').toggle(); + link.parent().find('a.delete-item').toggle(); + link.parents('tr').find('td.item-qty-show').toggle(); + link.parents('tr').find('td.item-qty-edit').toggle(); + + return false; +} + +startItemSplit = function(event){ + event.preventDefault(); + var link = $(this); + link.parent().find('a.edit-item').toggle(); + link.parent().find('a.split-item').toggle(); + link.parent().find('a.delete-item').toggle(); + var variant_id = link.data('variant-id'); + + var variant = {}; + $.ajax({ + type: "GET", + async: false, + url: Spree.url(Spree.routes.variants_api), + data: { + q: { + "id_eq": variant_id + } + } + }).success(function( data ) { + variant = data['variants'][0]; + }).error(function( msg ) { + console.log(msg); + }); + + var max_quantity = link.closest('tr').data('item-quantity'); + var split_item_template = Handlebars.compile($('#variant_split_template').text()); + link.closest('tr').after(split_item_template({ variant: variant, shipments: shipments, max_quantity: max_quantity })); + $('a.cancel-split').click(cancelItemSplit); + $('a.save-split').click(completeItemSplit); + + // Add some tips + $('.with-tip').powerTip({ + smartPlacement: true, + fadeInTime: 50, + fadeOutTime: 50, + intentPollInterval: 300 + }); + $('#item_stock_location').select2({ width: 'resolve', placeholder: 'Choose Location' }); +} + +completeItemSplit = function(event) { + event.preventDefault(); + var link = $(this); + var order_number = link.closest('tbody').data('order-number'); + var stock_item_row = link.closest('tr'); + var variant_id = stock_item_row.data('variant-id'); + var quantity = stock_item_row.find('#item_quantity').val(); + + var stock_location_id = stock_item_row.find('#item_stock_location').val(); + var original_shipment_number = link.closest('tbody').data('shipment-number'); + + var selected_shipment = stock_item_row.find($('#item_stock_location').select2('data').element); + var target_shipment_number = selected_shipment.data('shipment-number'); + var new_shipment = selected_shipment.data('new-shipment'); + + if (stock_location_id != 'new_shipment') { + // first remove item(s) from original shipment + $.ajax({ + type: "PUT", + async: false, + url: Spree.url(Spree.routes.orders_api + "/" + order_number + "/shipments/" + original_shipment_number + "/remove.json"), + data: { variant_id: variant_id, quantity: quantity } + }).done(function(msg) { + window.location.reload(); + }); + + if (new_shipment != undefined) { + $.ajax({ + type: "POST", + async: false, + url: Spree.url(Spree.routes.orders_api + "/" + order_number + "/shipments.json"), + data: { variant_id: variant_id, quantity: quantity, stock_location_id: stock_location_id } + }); + } else { + $.ajax({ + type: "PUT", + async: false, + url: Spree.url(Spree.routes.orders_api + "/" + order_number + "/shipments/" + target_shipment_number + "/add.json"), + data: { variant_id: variant_id, quantity: quantity } + }); + } + } +} + +cancelItemSplit = function(event) { + event.preventDefault(); + var link = $(this); + var prev_row = link.closest('tr').prev(); + link.closest('tr').remove(); + prev_row.find('a.edit-item').toggle(); + prev_row.find('a.split-item').toggle(); + prev_row.find('a.delete-item').toggle(); +} + +addVariantFromStockLocation = function() { + $('#stock_details').hide(); + + var variant_id = $('input.variant_autocomplete').val(); + var stock_location_id = $(this).data('stock-location-id'); + var quantity = $("input.quantity[data-stock-location-id='" + stock_location_id + "']").val(); + + var shipment = _.find(shipments, function(shipment){ + return shipment.stock_location_id == stock_location_id && (shipment.state == 'ready' || shipment.state == 'pending'); + }); + + if(shipment==undefined){ + $.ajax({ + type: "POST", + url: Spree.url(Spree.routes.orders_api + "/" + order_number + "/shipments.json"), + data: { variant_id: variant_id, quantity: quantity, stock_location_id: stock_location_id } + }).done(function( msg ) { + window.location.reload(); + }).error(function( msg ) { + console.log(msg); + }); + }else{ + //add to existing shipment + adjustItems(shipment.number, variant_id, quantity); + } + return 1 +} + +formatVariantResult = function(variant) { + if (variant["images"][0] != undefined && variant["images"][0].urls != undefined) { + variant.image = variant.images[0].urls.mini + } + return variantTemplate({ variant: variant }) +} + +$.fn.variantAutocomplete = function() { + this.parent().children(".options_placeholder").attr('id', this.parent().data('index')) + this.select2({ + placeholder: Spree.translations.variant_placeholder, + minimumInputLength: 3, + ajax: { + url: Spree.url(Spree.routes.variants_search), + datatype: 'json', + data: function(term, page) { + return { + q: { + "product_name_or_sku_cont": term + } + } + }, + results: function (data, page) { + window.variants = data['variants']; + + return { results: data['variants'] } + } + }, + formatResult: formatVariantResult, + formatSelection: function (variant) { + $(this.element).parent().children('.options_placeholder').html(variant.options_text) + return variant.name; + } + }) +}