| @@ -54,8 +54,30 @@ | ||
| 54 | 54 | |
| 55 | 55 | // Execute once when script loads |
| 56 | 56 | addBasicNotificationCSS(); |
| 57 | 57 | |
| 58 | + /** | |
| 59 | + * Native range inputs cannot land on max when (max-min) is not a multiple | |
| 60 | + * of step (min=1, max=1000, step=10 stops at 991). Use a 1-unit step so | |
| 61 | + * the labeled maximum is a legal value. The visible min/max labels stay | |
| 62 | + * as configured in the widget. | |
| 63 | + */ | |
| 64 | + function alignRangeToLabeledMax(input) { | |
| 65 | + if (!input) { | |
| 66 | + return; | |
| 67 | + } | |
| 68 | + var min = parseFloat(input.min); | |
| 69 | + var max = parseFloat(input.max); | |
| 70 | + var step = parseFloat(input.step); | |
| 71 | + if (isNaN(min) || isNaN(max) || isNaN(step) || step <= 0) { | |
| 72 | + return; | |
| 73 | + } | |
| 74 | + if (((max - min) % step) === 0) { | |
| 75 | + return; | |
| 76 | + } | |
| 77 | + input.step = '1'; | |
| 78 | + } | |
| 79 | + | |
| 58 | 80 | // --- Shared Helper Functions --- (Moved here) |
| 59 | 81 | |
| 60 | 82 | /** |
| 61 | 83 | * Calculates the price based on the value and formula settings. |
| @@ -302,8 +324,10 @@ | ||
| 302 | 324 | defaultValue = Math.max(minValue, Math.min(maxValue, defaultValue)); |
| 303 | 325 | if (parseFloat(rangeInput.val()) !== defaultValue) { |
| 304 | 326 | rangeInput.val(defaultValue); // Ensure input value matches calculated default |
| 305 | 327 | } |
| 328 | + alignRangeToLabeledMax(rangeInput.get(0)); | |
| 329 | + defaultValue = parseFloat(rangeInput.val()); | |
| 306 | 330 | |
| 307 | 331 | /** |
| 308 | 332 | * Updates the price display, button link (if applicable), and features for the single slider. |
| 309 | 333 | */ |
| @@ -362,8 +386,9 @@ | ||
| 362 | 386 | |
| 363 | 387 | // --- Event Listener --- |
| 364 | 388 | // Ensure previous listeners are removed before adding new ones (important for editor) |
| 365 | 389 | rangeInput.off('.pricingSlider').on('input.pricingSlider change.pricingSlider', function() { |
| 390 | + alignRangeToLabeledMax(this); | |
| 366 | 391 | var value = parseFloat($(this).val()); |
| 367 | 392 | sharedUpdateSliderUI(sliderWrapper, value); // Update slider UI visuals |
| 368 | 393 | updateDisplay(); // Update price, button, features based on new value |
| 369 | 394 | }); |
| @@ -496,8 +521,10 @@ | ||
| 496 | 521 | |
| 497 | 522 | if (parseFloat(rangeInput.val()) !== defaultValue) { |
| 498 | 523 | rangeInput.val(defaultValue); // Set initial value correctly |
| 499 | 524 | } |
| 525 | + alignRangeToLabeledMax(rangeInput.get(0)); | |
| 526 | + defaultValue = parseFloat(rangeInput.val()); | |
| 500 | 527 | sharedUpdateSliderUI(singleSliderWrapper, defaultValue); // Use shared function |
| 501 | 528 | }); |
| 502 | 529 | // Update the combined display based on initial values |
| 503 | 530 | updateCombinedDisplayForMulti(); |
| @@ -507,8 +534,9 @@ | ||
| 507 | 534 | slidersContainer.off('.pricingSlider', '.king-addons-pricing-slider__range'); |
| 508 | 535 | // Add new delegated listener |
| 509 | 536 | slidersContainer.on('input.pricingSlider change.pricingSlider', '.king-addons-pricing-slider__range', function() { |
| 510 | 537 | var rangeInput = $(this); // The input that triggered the event |
| 538 | + alignRangeToLabeledMax(this); | |
| 511 | 539 | var singleSliderWrapper = rangeInput.closest('.king-addons-single-slider'); |
| 512 | 540 | var value = parseFloat(rangeInput.val()); |
| 513 | 541 | |
| 514 | 542 | // Log for debugging multi-slider events |