288 lines
9.0 KiB
JavaScript
288 lines
9.0 KiB
JavaScript
/**
|
|
* Combination bulk actions management
|
|
*/
|
|
export default function() {
|
|
|
|
var bulkForm = $('#bulk-combinations-container');
|
|
var deleteCombinationsBtn = $('#delete-combinations');
|
|
var applyChangesBtn = $('#apply-on-combinations');
|
|
var syncedCollection = $('[data-uniqid]');
|
|
var finalPrice = $('#form_step2_price');
|
|
var finalPriceIT = $('#form_step2_price_ttc');
|
|
var finalPriceBasics = $('#form_step1_price_shortcut');
|
|
var finalPriceBasicsIT = $('#form_step1_price_ttc_shortcut');
|
|
var impactOnPriceSelector = 'input.attribute_priceTE';
|
|
var finalPriceSelector = '.attribute-finalprice span';
|
|
|
|
return {
|
|
'init': function init() {
|
|
var that = this;
|
|
// stop propagation on buttons
|
|
deleteCombinationsBtn.on('click', (event) => {
|
|
event.preventDefault();
|
|
that.deleteCombinations();
|
|
});
|
|
|
|
applyChangesBtn.on('click', (event) => {
|
|
event.preventDefault();
|
|
that.applyChangesOnCombinations()
|
|
.hideForm()
|
|
.resetForm()
|
|
.unselectCombinations()
|
|
.submitUpdate();
|
|
});
|
|
|
|
/* if final price change with user interaction, combinations should be impacted */
|
|
finalPrice.on('blur', () => {
|
|
this.syncToPricingTab();
|
|
});
|
|
|
|
finalPriceIT.on('blur', () => {
|
|
this.syncToPricingTab();
|
|
});
|
|
|
|
/* if we use final price shortcuts, also combinations should be impacted */
|
|
finalPriceBasics.on('blur', () => {
|
|
this.syncToPricingTab();
|
|
});
|
|
|
|
finalPriceBasicsIT.on('blur', () => {
|
|
this.syncToPricingTab();
|
|
});
|
|
|
|
syncedCollection.on('DOMSubtreeModified', (event) => {
|
|
|
|
var uniqid = event.target.getAttribute('data-uniqid');
|
|
var newValue = event.target.innerText;
|
|
|
|
var spans = $('[data-uniqid="'+uniqid+'"]');
|
|
|
|
spans.each( function( index, element ){
|
|
if ($(this).text() !== newValue) {
|
|
$(this).text(newValue);
|
|
}
|
|
});
|
|
});
|
|
|
|
// bulk select animation
|
|
$('#toggle-all-combinations').on('change', (event) => {
|
|
$('#accordion_combinations td:first-child input[type="checkbox"]').each(function() {
|
|
$(this).prop('checked', $(event.currentTarget).prop('checked'));
|
|
});
|
|
});
|
|
|
|
$(document).on('change', '.js-combination', () => {
|
|
if ($('.bulk-action').attr('aria-expanded') === "false" || !$('.js-combination').is(':checked')) {
|
|
$('.js-collapse').collapse('toggle');
|
|
}
|
|
$('span.js-bulk-combinations').text($('input.js-combination:checked').length);
|
|
});
|
|
},
|
|
'getSelectedCombinations': function getSelectedCombinations() {
|
|
var combinations = [];
|
|
var selectedCombinations = Array.from($('#accordion_combinations td:first-child input[type="checkbox"]:checked'));
|
|
selectedCombinations.forEach((combination) => {
|
|
var combinationId = combination.getAttribute('data-id');
|
|
var combinationIndex = combination.getAttribute('data-index');
|
|
combinations.push(new Combination(combinationId, combinationIndex));
|
|
});
|
|
|
|
return combinations;
|
|
},
|
|
'applyChangesOnCombinations': function applyChangesOnCombinations() {
|
|
var values = this.getFormValues();
|
|
var combinations = this.getSelectedCombinations();
|
|
combinations.forEach((combination) => {
|
|
combination.updateForm(values);
|
|
combination.syncValues(values);
|
|
});
|
|
|
|
return this;
|
|
},
|
|
'deleteCombinations': function deleteCombinations() {
|
|
var combinations = this.getSelectedCombinations();
|
|
var combinationsIds = [];
|
|
combinations.forEach((combination) => {
|
|
combinationsIds.push(combination.domId);
|
|
});
|
|
|
|
modalConfirmation.create(translate_javascripts['Are you sure to delete this?'], null, {
|
|
onContinue: function() {
|
|
var deletionURL = $(deleteCombinationsBtn).attr('data');
|
|
$.ajax({
|
|
type: 'DELETE',
|
|
data: {
|
|
'attribute-ids': combinationsIds
|
|
},
|
|
url: deletionURL,
|
|
beforeSend: function () {
|
|
$('#create-combinations, #apply-on-combinations, #submit, .btn-submit').attr('disabled', 'disabled');
|
|
},
|
|
success: function(response) {
|
|
showSuccessMessage(response.message);
|
|
refreshTotalCombinations(-1, combinationsIds.length);
|
|
$('span.js-bulk-combinations').text('0');
|
|
combinationsIds.forEach((combinationId) => {
|
|
var combination = new Combination(combinationId);
|
|
combination.removeFromDOM();
|
|
});
|
|
displayFieldsManager.refresh();
|
|
},
|
|
error: function(response) {
|
|
showErrorMessage(jQuery.parseJSON(response.responseText).message);
|
|
},
|
|
complete: function () {
|
|
$('#create-combinations, #apply-on-combinations, #submit, .btn-submit').removeAttr('disabled');
|
|
},
|
|
});
|
|
}
|
|
}).show();
|
|
},
|
|
'getFormValues': function getFormValues() {
|
|
var values = [];
|
|
$(bulkForm).find('input').each(function() {
|
|
if ($(this).val() !== '' && $(this).attr('id') !== 'product_combination_bulk__token') {
|
|
values.push({
|
|
'id': $(this).attr('id'),
|
|
'value': $(this).val()
|
|
});
|
|
}
|
|
});
|
|
return values;
|
|
},
|
|
'resetForm': function resetForm() {
|
|
bulkForm.find('input').val('');
|
|
|
|
return this;
|
|
},
|
|
'unselectCombinations': function unselectCombinations() {
|
|
// Use of the bulk action button. It has an event listener to unselect all the combinations
|
|
$('#toggle-all-combinations').prop('checked', false);
|
|
|
|
return this;
|
|
},
|
|
'hideForm': function toggleForm() {
|
|
bulkForm.collapse('hide');
|
|
|
|
return this;
|
|
},
|
|
'submitUpdate': function submitUpdate() {
|
|
var globalProductSubmitButton = $('#form'); // @todo: choose a better identifier
|
|
globalProductSubmitButton.submit();
|
|
},
|
|
'syncToPricingTab': function syncToPricingTab() {
|
|
var newPrice = finalPrice.val();
|
|
$('tr.combination').toArray().forEach((item) => {
|
|
var jQueryRow = $('#'+item.id);
|
|
var jQueryFinalPriceEl = jQueryRow.find(finalPriceSelector);
|
|
var impactOnPriceEl = jQueryRow.find(impactOnPriceSelector);
|
|
var impactOnPrice = impactOnPriceEl.val();
|
|
|
|
jQueryFinalPriceEl.data('price', newPrice);
|
|
// calculate new price
|
|
var newFinalPrice = new Number(newPrice) + new Number(impactOnPrice);
|
|
jQueryFinalPriceEl.text(ps_round(newFinalPrice, 6));
|
|
});
|
|
}
|
|
};
|
|
}
|
|
|
|
class Combination {
|
|
constructor(domId, index) {
|
|
this.inputBulkPattern = "product_combination_bulk_";
|
|
this.inputPattern = "combination_" + index + "_";
|
|
this.domId = domId;
|
|
this.appId = 'attribute_' + this.domId;
|
|
this.element = $('#' + this.appId);
|
|
this.form = $('#combination_form_' + this.domId);
|
|
}
|
|
|
|
isSelected() {
|
|
return this.element.checked;
|
|
}
|
|
|
|
removeFromDOM() {
|
|
$(this.element).remove();
|
|
}
|
|
|
|
updateForm(values) {
|
|
values.forEach((valueObject) => {
|
|
var valueId = valueObject.id.substr(this.inputBulkPattern.length);
|
|
var $field = $('#'+this.convertInput(valueId));
|
|
if ($field.is(':checkbox')) {
|
|
$field.prop("checked", !!valueObject.value);
|
|
} else {
|
|
$field.val(valueObject.value);
|
|
}
|
|
});
|
|
return this.form;
|
|
}
|
|
|
|
/**
|
|
* Returns the related input field in legacy form from
|
|
* bulk form field
|
|
*
|
|
* @param bulkInput
|
|
* @returns {string}
|
|
*/
|
|
convertInput(bulkInput) {
|
|
|
|
var convertedInput = '';
|
|
switch (bulkInput) {
|
|
case "quantity":
|
|
case "reference":
|
|
case "minimal_quantity":
|
|
case "low_stock_threshold":
|
|
case "low_stock_alert":
|
|
convertedInput = this.inputPattern + 'attribute_' + bulkInput;
|
|
break;
|
|
case "cost_price":
|
|
convertedInput = this.inputPattern + 'attribute_wholesale_price';
|
|
break;
|
|
case "date_availability":
|
|
convertedInput = this.inputPattern + 'available_date_attribute';
|
|
break;
|
|
case "impact_on_weight":
|
|
convertedInput = this.inputPattern + 'attribute_weight';
|
|
break;
|
|
case "impact_on_price_te":
|
|
convertedInput = this.inputPattern + 'attribute_price';
|
|
break;
|
|
case "impact_on_price_ti":
|
|
convertedInput = this.inputPattern + 'attribute_priceTI';
|
|
break;
|
|
default:
|
|
}
|
|
|
|
return convertedInput;
|
|
}
|
|
|
|
/**
|
|
* Sync values with fast bulk edit form of each combination
|
|
*
|
|
* @param values
|
|
* @returns {bool}
|
|
*/
|
|
syncValues(values) {
|
|
|
|
values.forEach((valueObject) => {
|
|
var valueId = valueObject.id.substr(this.inputBulkPattern.length);
|
|
var value = valueObject.value;
|
|
|
|
var syncedProperties = [
|
|
'quantity',
|
|
'impact_on_price_te'
|
|
];
|
|
|
|
if (syncedProperties.indexOf(valueId) !== -1) {
|
|
valueId = valueId === 'quantity' ? 'quantity' : 'price';
|
|
var input = $(`#attribute_${this.domId} .attribute-${valueId} input`);
|
|
input.val(value);
|
|
input.change();
|
|
}
|
|
});
|
|
|
|
return true;
|
|
}
|
|
}
|