Files
drmaterac.pl/iadmin/themes/new-theme/js/product-page/product-bulk-combinations.js
2025-01-06 20:47:25 +01:00

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;
}
}