295 lines
11 KiB
JavaScript
295 lines
11 KiB
JavaScript
/**
|
|
* Combination management
|
|
*/
|
|
var combinations = (function() {
|
|
var id_product = $('#form_id_product').val();
|
|
|
|
/**
|
|
* Remove a combination
|
|
* @param {object} elem - The clicked link
|
|
*/
|
|
function remove(elem) {
|
|
var combinationElem = $('#attribute_' + elem.attr('data'));
|
|
|
|
modalConfirmation.create(translate_javascripts['Are you sure to delete this?'], null, {
|
|
onContinue: function() {
|
|
|
|
var attributeId = elem.attr('data');
|
|
$.ajax({
|
|
type: 'DELETE',
|
|
data: {'attribute-ids': [attributeId]},
|
|
url: elem.attr('href'),
|
|
beforeSend: function() {
|
|
elem.attr('disabled', 'disabled');
|
|
$('#create-combinations, #apply-on-combinations, #submit, .btn-submit').attr('disabled', 'disabled');
|
|
},
|
|
success: function(response) {
|
|
refreshTotalCombinations(-1, 1);
|
|
combinationElem.remove();
|
|
showSuccessMessage(response.message);
|
|
displayFieldsManager.refresh();
|
|
},
|
|
error: function(response) {
|
|
showErrorMessage(jQuery.parseJSON(response.responseText).message);
|
|
},
|
|
complete: function() {
|
|
elem.removeAttr('disabled');
|
|
$('#create-combinations, #apply-on-combinations, #submit, .btn-submit').removeAttr('disabled');
|
|
supplierCombinations.refresh();
|
|
warehouseCombinations.refresh();
|
|
if ($('.js-combinations-list .combination').length <= 0) {
|
|
$('#combinations_thead').fadeOut();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}).show();
|
|
}
|
|
|
|
/**
|
|
* Update final price, regarding the impact on price in combinations table
|
|
* @param {jQuery} tableRow - Table row that contains the combination
|
|
*/
|
|
function updateFinalPrice(tableRow) {
|
|
if (!tableRow.is('tr')) {
|
|
throw new Error('Structure of table has changed, this function needs to be updated.');
|
|
}
|
|
var priceImpactInput = tableRow.find('.attribute_priceTE').first();
|
|
var finalPriceLabel = tableRow.find('.attribute-finalprice span');
|
|
|
|
var impactOnPrice = Tools.parseFloatFromString(priceImpactInput.val());
|
|
var previousImpactOnPrice = Tools.parseFloatFromString(priceImpactInput.attr('value'));
|
|
|
|
var currentFinalPrice = Tools.parseFloatFromString(finalPriceLabel.data('price'), true);
|
|
var finalPrice = currentFinalPrice - previousImpactOnPrice + impactOnPrice;
|
|
|
|
finalPriceLabel.html(Number(ps_round(finalPrice, 6)).toFixed(6));
|
|
}
|
|
|
|
/**
|
|
* Returns a reference to the form for a specific combination
|
|
* @param {String} attributeId
|
|
* @return {jQuery}
|
|
*/
|
|
function getCombinationForm(attributeId) {
|
|
return $('#combination_form_' + attributeId);
|
|
}
|
|
|
|
/**
|
|
* Returns a reference to the row of a specific combination
|
|
* @param {String} attributeId
|
|
* @return {jQuery}
|
|
*/
|
|
function getCombinationRow(attributeId) {
|
|
return $('#accordion_combinations #attribute_' + attributeId);
|
|
}
|
|
|
|
return {
|
|
'init': function() {
|
|
var showVariationsSelector = '#show_variations_selector input';
|
|
var productTypeSelector = $('#form_step1_type_product');
|
|
var combinationsListSelector = '#accordion_combinations .combination';
|
|
var combinationsList = $(combinationsListSelector);
|
|
|
|
if (combinationsList.length > 0) {
|
|
productTypeSelector.prop('disabled', true);
|
|
}
|
|
|
|
$(document)
|
|
// delete combination
|
|
.on('click', '#accordion_combinations .delete', function(e) {
|
|
e.preventDefault();
|
|
remove($(this));
|
|
})
|
|
|
|
// when typing a new quantity on the form, update it on the row
|
|
.on('keyup', 'input[id^="combination"][id$="_attribute_quantity"]', function() {
|
|
var attributeId = $(this).closest('.combination-form').attr('data');
|
|
var input = getCombinationRow(attributeId).find('.attribute-quantity input');
|
|
|
|
input.val($(this).val());
|
|
})
|
|
|
|
// when typing a new quantity on the row, update it on the form
|
|
.on('keyup', '.attribute-quantity input', function() {
|
|
var attributeId = $(this).closest('.combination').attr('data');
|
|
var input = getCombinationForm(attributeId).find('input[id^="combination"][id$="_attribute_quantity"]');
|
|
|
|
input.val($(this).val());
|
|
})
|
|
|
|
.on({
|
|
// when typing a new impact on price on the form, update it on the row
|
|
'keyup': function () {
|
|
var attributeId = $(this).closest('.combination-form').attr('data');
|
|
var input = getCombinationRow(attributeId).find('.attribute-price input');
|
|
|
|
input.val($(this).val());
|
|
},
|
|
// when impact on price on the form is changed, update final price
|
|
'change': function () {
|
|
var attributeId = $(this).closest('.combination-form').attr('data');
|
|
var input = getCombinationRow(attributeId).find('.attribute-price input');
|
|
|
|
input.val($(this).val());
|
|
|
|
updateFinalPrice($(input.parents('tr')[0]));
|
|
}
|
|
}, 'input[id^="combination"][id$="_attribute_price"]')
|
|
|
|
// when price impact is changed on the row, update it on the form
|
|
.on('change', '.attribute-price input', function() {
|
|
var attributeId = $(this).closest('.combination').attr('data');
|
|
var input = getCombinationForm(attributeId).find('input[id^="combination"][id$="_attribute_price"]');
|
|
|
|
input.val($(this).val());
|
|
|
|
updateFinalPrice($(this).parent().parent().parent());
|
|
})
|
|
|
|
// on change default attribute, update which combination is the new default
|
|
.on('click', 'input.attribute-default', function() {
|
|
var selectedCombination = $(this);
|
|
var combinationRadioButtons = $('input.attribute-default');
|
|
var attributeId = $(this).closest('.combination').attr('data');
|
|
|
|
combinationRadioButtons.each(function unselect(index) {
|
|
var combination = $(this);
|
|
if (combination.data('id') !== selectedCombination.data('id')) {
|
|
combination.prop("checked", false);
|
|
}
|
|
});
|
|
|
|
$('.attribute_default_checkbox').removeAttr('checked');
|
|
getCombinationForm(attributeId)
|
|
.find('input[id^="combination"][id$="_attribute_default"]')
|
|
.prop("checked", true);
|
|
})
|
|
|
|
// Combinations fields display management
|
|
.on('change', showVariationsSelector, function() {
|
|
displayFieldsManager.refresh();
|
|
combinationsList = $(combinationsListSelector);
|
|
|
|
if ($(this).val() === '0') {
|
|
//if combination(s) exists, alert user for deleting it
|
|
if (combinationsList.length > 0) {
|
|
modalConfirmation.create(translate_javascripts['Are you sure to disable variations ? they will all be deleted'], null, {
|
|
onCancel: function() {
|
|
$('#show_variations_selector input[value="1"]').prop('checked', true);
|
|
displayFieldsManager.refresh();
|
|
},
|
|
onContinue: function() {
|
|
$.ajax({
|
|
type: 'GET',
|
|
url: $('#accordion_combinations').attr('data-action-delete-all').replace(/\/\d+(?=\?.*)/, '/' + $('#form_id_product').val()),
|
|
success: function(response) {
|
|
combinationsList.remove();
|
|
displayFieldsManager.refresh();
|
|
},
|
|
error: function(response) {
|
|
showErrorMessage(jQuery.parseJSON(response.responseText).message);
|
|
}
|
|
});
|
|
// enable the top header selector
|
|
// we want to use a "Simple product" without any combinations
|
|
productTypeSelector.prop('disabled', false);
|
|
}
|
|
}).show();
|
|
} else {
|
|
// enable the top header selector if no combination(s) exists
|
|
productTypeSelector.prop('disabled', false);
|
|
}
|
|
} else {
|
|
// this means we have or we want to have combinations
|
|
// disable the product type selector
|
|
productTypeSelector.prop('disabled', true);
|
|
}
|
|
})
|
|
|
|
// open combination form
|
|
.on('click', '#accordion_combinations .btn-open', function(e) {
|
|
e.preventDefault();
|
|
var contentElem = $($(this).attr('href'));
|
|
|
|
/** create combinations navigation */
|
|
var navElem = contentElem.find('.nav');
|
|
var id_attribute = contentElem.attr('data');
|
|
var prevCombinationId = $('#accordion_combinations tr[data="' + id_attribute + '"]').prev().attr('data');
|
|
var nextCombinationId = $('#accordion_combinations tr[data="' + id_attribute + '"]').next().attr('data');
|
|
navElem.find('.prev, .next').hide();
|
|
if (prevCombinationId) {
|
|
navElem.find('.prev').attr('data', prevCombinationId).show();
|
|
}
|
|
if (nextCombinationId) {
|
|
navElem.find('.next').attr('data', nextCombinationId).show();
|
|
}
|
|
|
|
/** init combination tax include price */
|
|
priceCalculation.impactTaxInclude(contentElem.find('.attribute_priceTE'));
|
|
|
|
contentElem.insertBefore('#form-nav').removeClass('hide').show();
|
|
|
|
contentElem.find('.datepicker input[type="text"]').datetimepicker({
|
|
locale: iso_user,
|
|
format: 'YYYY-MM-DD'
|
|
});
|
|
|
|
function countSelectedProducts() {
|
|
return $('#combination_form_' + contentElem.attr('data') + ' .img-highlight').length;
|
|
}
|
|
|
|
var number = $('#combination_form_' + contentElem.attr('data') + ' .number-of-images'),
|
|
allProductCombination = $('#combination_form_' + contentElem.attr('data') + ' .product-combination-image').length;
|
|
|
|
number.text(countSelectedProducts() + '/' + allProductCombination);
|
|
|
|
$(document).on('click','.tabs .product-combination-image', function () {
|
|
number.text(countSelectedProducts() + '/' + allProductCombination);
|
|
});
|
|
|
|
/** Add title on product's combination image */
|
|
$(function() {
|
|
$('#combination_form_' + contentElem.attr('data')).find("img").each(function() {
|
|
title = $(this).attr('src').split('/').pop();
|
|
$(this).attr('title',title);
|
|
});
|
|
});
|
|
|
|
$('#form-nav, #form_content').hide();
|
|
})
|
|
|
|
// close combination form
|
|
.on('click', '#form .combination-form .btn-back', function(e) {
|
|
e.preventDefault();
|
|
$(this).closest('.combination-form').hide();
|
|
$('#form-nav, #form_content').show();
|
|
})
|
|
|
|
// switch combination form
|
|
.on('click', '#form .combination-form .nav a', function(e) {
|
|
e.preventDefault();
|
|
$('.combination-form').hide();
|
|
$('#accordion_combinations .combination[data="' + $(this).attr('data') + '"] .btn-open').click();
|
|
})
|
|
;
|
|
}
|
|
};
|
|
})();
|
|
|
|
BOEvent.on("Product Combinations Management started", function initCombinationsManagement() {
|
|
combinations.init();
|
|
}, "Back office");
|
|
|
|
/**
|
|
* Refresh bulk actions combination number after creating or deleting combinations
|
|
*
|
|
* @param {number} sign
|
|
* @param {number} number
|
|
*/
|
|
var refreshTotalCombinations = function (sign, number) {
|
|
var $bulkCombinationsTotal = $('#js-bulk-combinations-total');
|
|
var currentnumber = parseInt($bulkCombinationsTotal.text()) + (sign * number);
|
|
$bulkCombinationsTotal.text(currentnumber);
|
|
}
|