( function () { function notify(stateId, productId, isEnabled, quantity) { window.EventBus.dispatchEvent('change-state-' + stateId, { id: productId, isEnabled: isEnabled, quantity: quantity || null, }); } function getQuantity($container) { var $quantityInput = $container.find('.quantity-input-selector'); if ($quantityInput) { return $quantityInput.val() || null; } return null; } $.fn.productBox = function (stateId) { const $container = $(this); let isInMultiSelect = false; injectMode(false); const $selectedCheckbox = $container.find('.selection-checkbox'); const productId = $container.data('productid'); const $elementContainers = $container.find('.multi-selector-switch'); const $quantityInput = $container.find('.quantity-input-selector'); const minPossibleQuantity = 1; let quantityInputMin = minPossibleQuantity; quantityInputMin = getValueFromInputAttribute("min"); const quantityInputDefault = getValueFromInputAttribute("data-default-quantity"); const $resetButton = $container.find('.multi-select-reset'); const $clickElement = $container.find('.click-trigger'); const $addToBasketButton = $container.find('.productlistaddtocartbutton'); const canBeAddedToBasketQuickly = $addToBasketButton.length > 0; if (canBeAddedToBasketQuickly) { window.EventBus.dispatchEvent('register-' + stateId, { id: productId, isEnabled: false, quantity: getQuantity($container) }); } else { $selectedCheckbox.attr('disabled', 'disabled') } function validateInput() { if (!validateAndAdjustQuantityValue($quantityInput)) return; $selectedCheckbox.prop('checked', true); const isSelected = true; const quantity = $quantityInput.val(); notify(stateId, productId, isSelected, quantity); if ($resetButton.length && $resetButton.hasClass("is-hidden")) { $resetButton.removeClass("is-hidden"); } } const toggleProduct = () => { var isSelected = $selectedCheckbox.prop('checked'); notify(stateId, productId, isSelected, getQuantity($container)) toggleIndividualReset(); } const selectProduct = () => { notify(stateId, productId, true, getQuantity($container)) toggleIndividualReset(true); if ($resetButton.length && $resetButton.hasClass("is-hidden")) { $resetButton.removeClass("is-hidden"); } } $selectedCheckbox.click(toggleProduct) $quantityInput.on("blur", validateInput); $quantityInput.on("input", selectProduct); $clickElement.click(function (e) { if (!isInMultiSelect && !canBeAddedToBasketQuickly) { return; } e.preventDefault(); if (canBeAddedToBasketQuickly) { var isSelected = $selectedCheckbox.prop('checked'); notify(stateId, productId, !isSelected, getQuantity($container)) toggleIndividualReset(); } }); function getValueFromInputAttribute(attributeName) { return getQuantityWithFallback($quantityInput.attr(attributeName)); } function getQuantityWithFallback(value) { return Number(!!value ? value : quantityInputMin); } function validateAndAdjustQuantityValue(quantityInput) { const max = getValueFromInputAttribute("max"); const val = getQuantityWithFallback(quantityInput.val()); if (val > max || val < quantityInputMin) { $quantityInput.val(quantityInputMin); return false; } else { $quantityInput.val(val); return true; } } function injectMode(mode) { isInMultiSelect = mode; if (isInMultiSelect) { $container.addClass('multi-select-mode'); $container.removeClass('normal-mode'); } else { $container.removeClass('multi-select-mode'); $container.addClass('normal-mode'); } } function switchToMultiSelect() { $elementContainers.hide(); if (!canBeAddedToBasketQuickly) { $container.addClass('product-box-grayed'); } else { $container.removeClass('product-box-grayed'); } injectMode(true) } function switchToNormalSelect() { $elementContainers.show(); $container.removeClass('product-box-grayed'); injectMode(false) } function toggleIndividualReset(toggleSwitch) { if ($resetButton.length === 0) { return; } $resetButton.toggleClass("is-hidden", toggleSwitch); } $resetButton.on('click', (event) => { $quantityInput.val(quantityInputDefault ?? minPossibleQuantity); $selectedCheckbox.prop('checked', false); notify(stateId, productId, false, getQuantity($container)); $resetButton.addClass("is-hidden"); }); window.EventBus.addEventListener('on-state-changed-' + stateId, function (event) { var products = event.detail; if (products.length == 0) { switchToNormalSelect(); } else { switchToMultiSelect(); } var product = products.find(it => it.id == productId); if (product != null) { $selectedCheckbox.prop('checked', true); } else { $selectedCheckbox.prop('checked', false); } }); return this; } } )();