Files
kupshop/web/templates/koza/static/js/wpj.reclamation.js
2025-08-02 16:30:27 +02:00

109 lines
3.5 KiB
JavaScript

/* Změna počtu kusů po kliknutí na tlačítko
* Jako parametry bere input (s hodnotou a volitelnými atributy)
* a jestli má hodnota přičíst (true) nebo odečíst (false).
* Vrátí novou hodnotu inputu jako string.
* Možné atributy: max, min, step, data-precision
* */
function updatePieces($input, isUp) {
var oldValue = parseFloat($input.val());
var maxValue = $input.attr('max');
var step = $input.attr('step') ? parseFloat($input.attr('step')) : 1;
var minValue = $input.attr('min') ? parseFloat($input.attr('min')) : step;
var precision = $input.data('precision') ? parseFloat($input.data('precision')) : 0;
var newVal;
if (isUp) {
if (typeof(maxValue) === 'undefined' || (oldValue + step) <= parseFloat(maxValue)) {
newVal = oldValue + step;
} else {
newVal = parseFloat(maxValue);
}
} else {
if ((oldValue - step) >= minValue) {
newVal = oldValue - step;
} else {
newVal = minValue;
}
}
return newVal.toFixed(precision);
}
/* Zaokrouhlení počtu kusů po změně inputu
* Jako parametry bere input (s hodnotou a volitelnými atributy).
* Pokud je zadané množství které neopovídá stepu, hodnota se zaokrouhlí.
* Aplikuje se omezení max a min atributy.
* Vrátí novou hodnotu inputu jako string.
* */
function roundPieces($input) {
var newVal = parseFloat($input.val());
var maxValue = $input.attr('max');
var step = $input.attr('step') ? parseFloat($input.attr('step')) : 1;
var minValue = $input.attr('min') ? parseFloat($input.attr('min')) : step;
var precision = $input.data('precision') ? parseFloat($input.data('precision')) : 0;
if (newVal % step > 0) {
newVal = Math.round(newVal / step) * step;
}
if (newVal < minValue) {
newVal = minValue;
}
if (!isNaN(maxValue) && newVal > parseFloat(maxValue)) {
newVal = parseFloat(maxValue);
}
return newVal.toFixed(precision);
}
$('body').on('change', '[data-row-check]', function() {
var $checkbox = $(this);
var $input = $checkbox.closest('tr').find('.form-control');
var $table = $checkbox.closest('table');
if ($checkbox.prop('checked') === true) {
$input.prop('disabled', false);
$input.val($input.attr('max'));
$('[data-returns]').not($table).find('th .custom-control-input').prop('checked', false).trigger('change');
} else {
$input.prop('disabled', true);
$input.val('');
}
}).on('change', '[data-order-check]', function() {
var $table = $(this).closest('table');
if ($(this).prop('checked') === true && $table.hasClass('closed')) {
$table.toggleClass('closed');
}
$table.find('td .custom-control-input').prop('checked', $(this).prop('checked')).trigger('change');
}).on('click', '[data-returns] th', function() {
$(this).closest('table').toggleClass('closed');
}).on('click', '[data-returns] .buy_count button', function() {
var $button = $(this);
var $input = $button.closest('td').find('[data-pieces]');
var newVal = updatePieces($input, $button.hasClass('plus_unit'));
$input.val(newVal);
}).on('blur', 'input[data-pieces]', function() {
var $input = $(this);
var newVal = roundPieces($input);
if (parseFloat(newVal) !== parseFloat($input.val())) {
$input.val(newVal);
}
}).on('keydown', 'input[data-pieces]', function(e) {
if (e.keyCode === 13) {
e.preventDefault();
var $input = $(this);
var newVal = roundPieces($input);
if (parseFloat(newVal) !== parseFloat($input.val())) {
$input.val(newVal);
}
}
});