mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-01 02:03:22 +00:00
Bring variant_autocomplete from spree_backend as is
This commit is contained in:
@@ -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.length<quantity){
|
||||
url += "/add"
|
||||
new_quantity = (quantity - inventory_units.length);
|
||||
}else if(inventory_units.length>quantity){
|
||||
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;
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user