// Module de gestion de l'UI et des sliders // Les fonctions ci-dessous supposent que form_sliders, map_values, authorized_value sont passés en paramètre ou importés export function change_duree(form_sliders, map_values, authorized_value, default_min, default_max, selected_value) { var list = ''; var list_class = '', loan_type = jQuery('#loan_type').val(), loan_radio_type = jQuery('.loan_type:checked').length ? jQuery('.loan_type:checked').val() : '', sub_loan_radio_type = jQuery('.sub_loan_type:checked').length ? jQuery('.sub_loan_type:checked').val() : '', class_name = 'mens_', selected_capital = jQuery('#selected_capital').val(), monthly_low = 0, monthly_high = 0, capital_min = 0, capital_max = 0, selected_duree_box = jQuery('#selected_months_range').parents('.selected_duree'); var loan_type_in_years = ['am', 'amr', 'cdp', 'cied']; if (loan_radio_type != '') loan_type = loan_radio_type; if (selected_capital == '') { selected_capital = form_sliders[loan_type]['capital_selected']; } if (sub_loan_radio_type != '') { if (authorized_value.includes(sub_loan_radio_type)) { loan_type = sub_loan_radio_type; } else if (map_values[sub_loan_radio_type] !== 'undefined') { loan_type = map_values[sub_loan_radio_type]; } } capital_min = form_sliders[loan_type]['capital_min']; capital_max = form_sliders[loan_type]['capital_max']; // Ici, il faudrait injecter les fonctions de calcul en paramètre ou via import // Pour l'instant, on laisse un placeholder pour results let results = [default_min, default_max]; // ... (à compléter avec l'appel à la bonne fonction de calcul) monthly_low = results[0]; monthly_high = results[1]; var validDurees = []; for (var j = 0; j < duree_range.length; j++) { if ((monthly_low <= parseInt(duree_range[j]) && parseInt(duree_range[j]) <= monthly_high)) { validDurees.push(duree_range[j]); } } var startIndex = Math.max(0, validDurees.length - 4); if (jQuery('#selected_capital').val() < capital_min) { list = '
  • La somme minimale est de ' + capital_min + '€
  • '; } else if (jQuery('#selected_capital').val() > capital_max) { list = '
  • La somme maximale est de ' + capital_max + '€
  • '; } else { for (var i = startIndex; i < validDurees.length; i++) { var periodicite = ' mois'; if (loan_type_in_years.includes(loan_type)) { class_name = validDurees[i] + '_ans'; periodicite = ' ans'; } else { class_name = 'mens_' + validDurees[i]; } if ((default_min <= parseInt(validDurees[i]) && parseInt(validDurees[i]) <= default_max)) { if (selected_value == validDurees[i]) { list_class = ' selected'; } if (validDurees[i] <= monthly_high) { list = list + '
  • ' + validDurees[i] + periodicite + '
  • '; } } else { list = list + ''; } list_class = ''; } } jQuery('#date-range-selector').html(list); var periodicite = loan_type_in_years.includes(loan_type) ? ' ans' : ' mois'; jQuery('.slider_duree_box').text(selected_value + periodicite); jQuery(selected_duree_box).find('.outside_slider_duree_box').text(selected_value + periodicite); } export function change_capital_slider(form_sliders, map_values, authorized_value, number_format, default_min, default_max, default_selected_value) { var selected_capital_range = '#selected_capital_range'; var selected_capital = '#selected_capital'; var selected_capital_box = jQuery(selected_capital_range).parents('.selected_capital'); var stepUpdateTimeout = null; var isInputChange = false; var loan_type = jQuery('#loan_type').val(), loan_radio_type = jQuery('.loan_type:checked').length ? jQuery('.loan_type:checked').val() : '', sub_loan_radio_type = jQuery('.sub_loan_type:checked').length ? jQuery('.sub_loan_type:checked').val() : ''; if (loan_radio_type != '') loan_type = loan_radio_type; if (sub_loan_radio_type != '') { if (authorized_value.includes(sub_loan_radio_type)) { loan_type = sub_loan_radio_type; } else if (map_values[sub_loan_radio_type] !== 'undefined') { loan_type = map_values[sub_loan_radio_type]; } } var pivot_value = form_sliders[loan_type].pivot_value; var sub_pivot_value = form_sliders[loan_type].sub_pivot_value; var pivot_percent = ((pivot_value - default_min) / (default_max - default_min)) * 100; var sub_pivot_percent = ((sub_pivot_value - default_min) / (default_max - default_min)) * 100; jQuery('.pivot-zone').remove(); if (pivot_value > 0) { var pivotZone = jQuery('
    '); pivotZone.css({ 'position': 'absolute', 'left': pivot_percent + '%', 'right': '0', 'top': '0', 'bottom': '0', 'background-color': 'rgba(255, 0, 0, 0.2)', 'pointer-events': 'none' }); jQuery(selected_capital_range).append(pivotZone); } function calculateStep(value) { return value < 10000 ? 500 : 250; } function roundToStep(value) { var step = calculateStep(value); return Math.round(value / step) * step; } jQuery(selected_capital) .attr('step', calculateStep(default_selected_value)) .on('input', function() { var $input = jQuery(this); var value = Number($input.val()); if (!value) return; if (stepUpdateTimeout) { clearTimeout(stepUpdateTimeout); } stepUpdateTimeout = setTimeout(function() { var newStep = calculateStep(value); $input.attr('step', newStep); }, 500); isInputChange = true; jQuery(selected_capital_range).slider('value', value); jQuery(selected_capital_range).find('.slider_capital_box') .text(number_format(value, 2, ',', '.') + ' €'); selected_capital_box.find('.outside_box').text(number_format(value, 2, ',', '.') + ' €'); }); jQuery(selected_capital_range).slider({ min: default_min, max: default_max, value: default_selected_value, step: calculateStep(default_selected_value), slide: function(event, ui) { if (isInputChange) return; var orange_bar = jQuery('.slider_capital_wrapper .after_bar'), elem = jQuery(ui.handle), left_css = parseInt(elem.css('left'), 10); orange_bar.css('width', left_css + 10); if (pivot_value > 0 && ui.value >= pivot_value) { jQuery(selected_capital_range).find('.slider_capital_box').addClass('pivot-value'); if (!jQuery('#acceptConditions').is(':checked')) { jQuery('.stimulator_result_btn').prop('disabled', true).addClass('disabled'); } } else { jQuery(selected_capital_range).find('.slider_capital_box').removeClass('pivot-value'); jQuery('.stimulator_result_btn').prop('disabled', false).removeClass('disabled'); } jQuery(selected_capital).val(ui.value); jQuery(selected_capital_range).find('.slider_capital_box').text(number_format((ui.value), 2, ',', '.') + ' €'); selected_capital_box.find('.outside_box').text(number_format(ui.value, 2, ',', '.') + ' €'); if (pivot_value > 0) { if (ui.value >= pivot_value) { jQuery('.pat_plus75000').slideDown(300); } else { jQuery('.pat_plus75000').slideUp(300); } } else { jQuery('.pat_plus75000').hide(); } }, stop: function(event, ui) { // Les callbacks de recalcul et de sliders seront injectés dans main.js }, change: function(event, ui) { var orange_bar = jQuery('.slider_capital_wrapper .after_bar'), elem = jQuery(ui.handle), left_css = parseInt(elem.css('left'), 10); orange_bar.css('width', left_css + 10); } }); jQuery('#acceptConditions').on('change', function() { var currentValue = jQuery(selected_capital).val(); if (pivot_value > 0 && currentValue >= pivot_value) { if (jQuery(this).is(':checked')) { jQuery('.stimulator_result_btn').prop('disabled', false).removeClass('disabled'); } else { jQuery('.stimulator_result_btn').prop('disabled', true).addClass('disabled'); } } }); var appended_elem = 'test'; if (!jQuery('.ui-slider-handle .fa-angle-right').length) jQuery(selected_capital_range).find('.ui-slider-handle').append(''); if (!jQuery(selected_capital_range).find('.slider_capital_box').length) { jQuery(selected_capital_range).find('.ui-slider-handle').append(appended_elem); } jQuery(selected_capital_range).find('.slider_capital_box').text(number_format((jQuery(selected_capital_range).slider('value')), 2, ',', '.') + ' €'); selected_capital_box.find('.outside_box').text(number_format((jQuery(selected_capital_range).slider('value')), 2, ',', '.') + ' €'); if (sub_pivot_value > 0) { var subPivotZone = jQuery('
    '); subPivotZone.css({ 'position': 'absolute', 'left': '0', 'width': sub_pivot_percent + '%', 'top': '0', 'bottom': '0', 'background-color': 'rgba(0, 0, 255, 0.15)', 'pointer-events': 'none' }); if(jQuery('.sub-pivot-zone').length == 0) jQuery(selected_capital_range).append(subPivotZone); } } export function change_month_slider(form_sliders, map_values, authorized_value, number_format, getStepForValue, default_min, default_max, default_selected_value) { var selected_months_range = '#selected_months_range'; var selected_months = '#selected_months'; var loan_type_in_years = ['am', 'amr', 'cdp', 'cied', 'ph']; var sel_duree = jQuery(selected_months).val(), selected_duree_box = jQuery(selected_months_range).parents('.selected_duree'); var loan_type = jQuery('#loan_type').val(), loan_radio_type = jQuery('.loan_type:checked').length ? jQuery('.loan_type:checked').val() : '', sub_loan_radio_type = jQuery('.sub_loan_type:checked').length ? jQuery('.sub_loan_type:checked').val() : ''; if (loan_radio_type != '') loan_type = loan_radio_type; if (sub_loan_radio_type != '') { if (authorized_value.includes(sub_loan_radio_type)) { loan_type = sub_loan_radio_type; } else if (map_values[sub_loan_radio_type] !== 'undefined') { loan_type = map_values[sub_loan_radio_type]; } } var selected_capital = jQuery('#selected_capital').val(); if (selected_capital == '') selected_capital = form_sliders[loan_type]['capital_selected']; // Les résultats de calcul sont à injecter via callback dans main.js si besoin let results = [default_min, default_max]; // À remplacer par l'appel à la bonne fonction de calcul var max_duration = results[1]; var dynamic_max = max_duration; var available_durations = form_sliders[loan_type].durees; for (var i = available_durations.length - 1; i >= 0; i--) { if (available_durations[i] <= max_duration) { dynamic_max = available_durations[i]; break; } } jQuery(selected_months_range).slider({ min: default_min, max: dynamic_max, value: dynamic_max, step: getStepForValue(loan_type, dynamic_max), slide: function(event, ui) { var newStep = getStepForValue(loan_type, ui.value); if (newStep !== jQuery(this).slider('option', 'step')) { jQuery(this).slider('option', 'step', newStep); } var orange_bar = jQuery('.slider_duree_wrapper .after_bar_month'), elem = jQuery(ui.handle), left_css = parseInt(elem.css('left'), 10); orange_bar.css('width', left_css + 10); jQuery(selected_months).val(ui.value); if (loan_type_in_years.includes(loan_type)) { jQuery(selected_months_range).find('.slider_duree_box').text(ui.value + ' ans'); jQuery(selected_duree_box).find('.outside_slider_duree_box').text(ui.value + ' ans'); } else { jQuery(selected_months_range).find('.slider_duree_box').text(ui.value + ' mois'); jQuery(selected_duree_box).find('.outside_slider_duree_box').text(ui.value + ' mois'); } }, stop: function(event, ui) { // Les callbacks de recalcul seront injectés dans main.js }, change: function(event, ui) { var orange_bar = jQuery('.slider_duree_wrapper .after_bar_month'), elem = jQuery(ui.handle), left_css = parseInt(elem.css('left'), 10); orange_bar.css('width', left_css + 10); } }); jQuery(selected_months).val(jQuery(selected_months_range).slider('value')); var periodicite = loan_type_in_years.includes(loan_type) ? ' ans' : ' mois'; var appended_elem = '' + jQuery(selected_months_range).slider('value') + periodicite + ''; jQuery(selected_duree_box).find('.outside_slider_duree_box').text(jQuery(selected_months_range).slider('value') + periodicite); if (!jQuery(selected_months_range).find('.ui-slider-handle .fa-angle-right').length) { jQuery(selected_months_range).find('.ui-slider-handle').append(''); } if (!jQuery(selected_months_range).find('.slider_duree_box').length) { jQuery(selected_months_range).find('.ui-slider-handle').append(appended_elem); } } export function update_capital_input(form_sliders, map_values, authorized_value) { if (jQuery('#selected_capital').length) { var selected = jQuery('#loan_type').val(), selected_radio = jQuery('.loan_type:checked').length ? jQuery('.loan_type:checked').val() : '', sub_loan_radio_type = jQuery('.sub_loan_type:checked').length ? jQuery('.sub_loan_type:checked').val() : ''; if (selected_radio != '') selected = selected_radio; if (sub_loan_radio_type != '' && authorized_value.includes(sub_loan_radio_type)) { selected = sub_loan_radio_type; } else if (map_values[sub_loan_radio_type] !== 'undefined') { selected = map_values[sub_loan_radio_type]; } var capital_max = form_sliders[selected].capital_max; var capital_min = form_sliders[selected].capital_min; var capital_selected = form_sliders[selected].capital_selected; jQuery('#selected_capital').prop('min', capital_min); jQuery('#selected_capital').prop('max', capital_max); jQuery('#selected_capital').val(capital_selected); } } export function validate_months_input(form_sliders, map_values, authorized_value, getStepForValue, calculate_mensualite) { var selected_months_range = '#selected_months_range'; var selected_months = '#selected_months'; var selected = jQuery('#loan_type').val(), loan_radio_type = jQuery('.loan_type:checked').length ? jQuery('.loan_type:checked').val() : '', sub_loan_radio_type = jQuery('.sub_loan_type:checked').length ? jQuery('.sub_loan_type:checked').val() : '', selected_duree_box = jQuery(selected_months_range).parents('.selected_duree'); if (loan_radio_type != '') { selected = loan_radio_type; } if (sub_loan_radio_type != '') { if (authorized_value.includes(sub_loan_radio_type)) { selected = sub_loan_radio_type; } else if (map_values[sub_loan_radio_type] !== 'undefined') { selected = map_values[sub_loan_radio_type]; } } var duree_max = form_sliders[selected].duree_max; var duree_min = form_sliders[selected].duree_min; var loan_type_in_years = ['am', 'amr', 'cdp', 'cied', 'ph']; var current_value = parseInt(jQuery(selected_months).val()); // Utiliser la fonction getStepForValue passée en paramètre var step = getStepForValue(selected, current_value); // Arrondir à la valeur la plus proche selon le step var rounded_value = Math.round(current_value / step) * step; // Appliquer les limites min/max if (rounded_value < duree_min) { rounded_value = duree_min; } else if (rounded_value > duree_max) { rounded_value = duree_max; } // Mettre à jour le champ et le slider jQuery(selected_months).val(rounded_value); jQuery(selected_months_range).slider('value', rounded_value); // Mettre à jour l'affichage var periodicite = loan_type_in_years.includes(selected) ? ' ans' : ' mois'; jQuery(selected_months_range).find('.slider_duree_box').text(rounded_value + periodicite); jQuery(selected_duree_box).find('.outside_slider_duree_box').text(rounded_value + periodicite); // Recalculer la mensualité calculate_mensualite(); } export function getStepForValue(loan_type, value) { let loan_type_in_years = ['am', 'amr', 'cdp', 'cied', 'ph']; let dynamic_step = 1; if (loan_type_in_years.includes(loan_type)) { dynamic_step = 1; // Step de 1 an pour les prêts en années } else { if (value <= 48) { dynamic_step = 6; // Step de 6 mois jusqu'à 48 mois } else { dynamic_step = 12; // Step de 12 mois au-delà de 48 mois } } return dynamic_step; } export function display_alert_capital(form_sliders, map_values, authorized_value) { var selected_capital = jQuery('#selected_capital').val(); var selected = jQuery('#loan_type').val(), selected_radio = jQuery('.loan_type:checked').length ? jQuery('.loan_type:checked').val() : '', sub_loan_radio_type = jQuery('.sub_loan_type:checked').length ? jQuery('.sub_loan_type:checked').val() : ''; if (selected_radio != '') selected = selected_radio; if (sub_loan_radio_type != '') { if (authorized_value.includes(sub_loan_radio_type)) { selected = sub_loan_radio_type; } else if (map_values[sub_loan_radio_type] !== 'undefined') { selected = map_values[sub_loan_radio_type]; } } var capital_max = form_sliders[selected].capital_max; var capital_min = form_sliders[selected].capital_min; if (jQuery('.limit-warning').length) { jQuery('.limit-warning').slideUp(); jQuery('.limit-warning').remove(); } if (!((selected_capital > capital_min) && (selected_capital < capital_max))) { if ((selected_capital <= capital_min)) { jQuery('.second-col').prepend('
    Le montant minimum requis est de ' + capital_min + '€
    '); } else { jQuery('.second-col').prepend('
    Le montant maximum est de ' + capital_max + '€
    '); } } } export function delayed_capital_chnage(form_sliders, map_values, authorized_value, on_slider_value_change) { var selected_capital_range = '#selected_capital_range'; var selected = jQuery('#loan_type').val(), loan_radio_type = jQuery('.loan_type:checked').length ? jQuery('.loan_type:checked').val() : '', sub_loan_radio_type = jQuery('.sub_loan_type:checked').length ? jQuery('.sub_loan_type:checked').val() : ''; var selected_capital = jQuery('#selected_capital').val(); if (loan_radio_type != '') { selected = loan_radio_type; } if (sub_loan_radio_type != '') { if (authorized_value.includes(sub_loan_radio_type)) { selected = sub_loan_radio_type; } else if (map_values[sub_loan_radio_type] !== 'undefined') { selected = map_values[sub_loan_radio_type]; } } var capital_max = form_sliders[selected].capital_max; var capital_min = form_sliders[selected].capital_min; var simu_button = document.querySelector('.stimulator_result_btn'); if (jQuery('.limit-warning').length) { jQuery('.limit-warning').slideUp(); jQuery('.limit-warning').remove(); } if ((selected_capital >= capital_min) && (selected_capital <= capital_max)) { if (jQuery('.stimulator_result_btn').is(':disabled')) jQuery('.stimulator_result_btn').removeAttr('disabled'); on_slider_value_change(); } else { if (!((selected_capital > capital_min) && (selected_capital < capital_max))) { if ((selected_capital <= capital_min)) { let elem = '

    Le montant minimum requis est de ' + capital_min + '€

    '; jQuery(elem).insertBefore('.stimulator_result_btn'); } else { jQuery('

    Le montant maximum requis est de ' + capital_max + '€

    ').insertBefore('.stimulator_result_btn'); } jQuery('.stimulator_result_btn').prop('disabled', true); on_slider_value_change(); } } }