Samx Here
n1udSecurity


Server : Apache
System : Linux webd348.cluster026.gra.hosting.ovh.net 5.15.148-ovh-vps-grsec-zfs-classid #1 SMP Thu Feb 8 09:41:04 UTC 2024 x86_64
User : hednacluml ( 122243)
PHP Version : 8.3.9
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
Directory :  /home/hednacluml/info/plugins/auto/saisies/javascript/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/hednacluml/info/plugins/auto/saisies/javascript/saisies_afficher_si.js
$(function(){
	afficher_si_init();
	onAjaxLoad(afficher_si_init);
});
afficher_si_current_data = '';
function afficher_si_init() {
	$('form:not([data-afficher_si-init])').each(function(){
		// Seulement si au moins un afficher_si dedans !
		if (this.hasAttribute('data-resume_etapes_futures')) {
			var resume_etapes_futures = this.getAttribute('data-resume_etapes_futures');
		} else {
			var resume_etapes_futures = '';
		}
		if ($(this).find('[data-afficher_si]').length !== 0 || resume_etapes_futures) {
			form = $(this);
			form.find('.formulaire_spip__etapes').each(function() {
				$(this).css('min-height', $(this).height());
			});
			afficher_si_init_chemin_etapes(form);

			afficher_si_set_current_data(form);
			form.find('[data-afficher_si]').each(function(){
				condition = verifier_afficher_si($(this), true);
				animer_afficher_si($(this), condition, true);
			}
			);
			afficher_si_set_etapes_presentation_courante(form);
			afficher_si_set_etape_suivante(form);

			// Un écouteur sur les champs qui conditionent d'autres champs
			$(this).find('textarea, input, select').each(function () {
				var name = $(this).attr('name');
				if (name) {
					name = afficher_si_normaliser_name(name);
					if (form.find('[data-afficher_si*=\''+name+'\']').length || resume_etapes_futures.includes(name)) {
						$(this).on('input change', function() {
							afficher_si_onchange($(this));
						});
					}
				}
			}
			);
			$(this).attr('data-afficher_si-init', true);
		}
	})
}

/**
 * Normaliser les names
 * @param string name
 * @return return name
**/
function afficher_si_normaliser_name(name) {
	var name = name.replace('[]', '');
	var name = name.replace('_choix_alternatif', '');
	return name;
}
/**
 * Ecouteur sur les champ
 * @param jQuery Object $champ
**/
function afficher_si_onchange($champ) {
	// Seulement si ce champ a un name
	if (name = $champ.attr('name')) {
		var form = $champ.parents('form');
		var name = afficher_si_normaliser_name(name);
		afficher_si_set_current_data(form);

		// Si un autre champ utilise celui-ci dans une condition
		form.find('[data-afficher_si*=\''+name+'\']').each(function(){
			condition = verifier_afficher_si($(this));
			animer_afficher_si($(this), condition);
		})
		afficher_si_set_etapes_presentation_courante(form, name);
		afficher_si_set_etape_suivante(form, name);
	}
}
function afficher_si_set_current_data(form) {
	current_data = form.serializeArray();//Le format de retour n'est pas simple, on transforme en tableau associatif
	afficher_si_current_data = [];
	$(current_data).each(function() {
		if (this.name.includes('[]')) {
			this.name	= this.name.replace('[]', '');
			if (Array.isArray(afficher_si_current_data[this.name])) {
				afficher_si_current_data[this.name].push(this.value)
			} else {
				afficher_si_current_data[this.name] = [this.value];
			}
		} else {
			afficher_si_current_data[this.name] = this.value;
		}
	 if (afficher_si_current_data[this.name] === '@choix_alternatif') {
		 afficher_si_current_data[this.name] = form.find('[name = "' + this.name + '_choix_alternatif' + '"]').val();
		 afficher_si_current_data[this.name + ':choix_alternatif'] = true;// Usage interne, pas de stabilité de l'API
	 } else {
		 afficher_si_current_data[this.name + ':choix_alternatif'] = false;// Usage interne, pas de stabilité de l'API
	 }
	});
}
function verifier_afficher_si(saisie, chargement = false) {
	if (
			(saisie.hasClass('erreur') || $('.erreur', saisie).length)
			&& !saisie.hasClass('saisies-menu-onglets__item')
			&& !saisie.hasClass('saisies-contenu-onglet')
	) {//Tjr afficher au chargement s'il y  une erreur. Si cela arrive c'est qu'il y a quelque part une incohérence entre l'évaluation JS et l'évaluation PHP des afficher si. Attention ! Ne pas appliquer aux onglets qui ont des classes erreurs, ca c'est volontaire
		console.log('Attention : saisies masquée par afficher_si avec une erreur...' + saisie.attr('data-id'));
		return true;
	}
	condition = saisie.attr('data-afficher_si');
	condition = eval(condition);
	return condition
}
function animer_afficher_si(saisie, condition, chargement){
	if (condition) {
		if (!saisie.hasClass('afficher_si_visible')) {
			saisie.trigger('afficher_si_visible_pre');
			saisie.removeClass('afficher_si_masque_chargement').removeClass('afficher_si_masque').addClass('afficher_si_visible').removeAttr('aria-hiden');
			if (!saisie.hasClass('afficher_si_sans_visuel')) {
				afficher_si_show(saisie);
			}
			afficher_si_restaure_validation(saisie);
			saisie.trigger('afficher_si_visible_post');
		}
	} else {
		if (!saisie.hasClass('afficher_si_masque')) {
			saisie.trigger('afficher_si_masque_pre');
			if (!saisie.hasClass('afficher_si_sans_visuel')) {
				afficher_si_hide(saisie);
			}
			if (chargement) {
				saisie.addClass('afficher_si_masque_chargement');
			}
			saisie.addClass('afficher_si_masque').removeClass('afficher_si_visible').attr('aria-hiden', true);
			afficher_si_disable_validation(saisie);
			saisie.trigger('afficher_si_masque_post');
		}
	}
}
/**
 * Prend les attribut de validation au sein d'une saisie et les supprime
 * tout en stockant en mémoire dans des data-truc
 * @param $saisie la saisie (conteneur)
**/
function afficher_si_disable_validation($saisie) {
	for (attribut of afficher_si_validation_attributs) {
		if (attribut in afficher_si_validation_attributs_valeurs) {
			var selecteur = afficher_si_validation_attributs_valeurs[attribut].map((x) => '[' + attribut + '=' + x + ']').join(', ');
		} else {
			var selecteur = '[' + attribut + ']';
		}
		var enfants = $saisie.find(selecteur);
		enfants.each(function() {
			$(this).attr('data-afficher_si-' + attribut, $(this).attr(attribut)).attr(attribut, null);
		});
	}
}

/**
 * Rétabli si besoin les attribut de validation au sein d'une saisie
 * @param $saisie la saisie (conteneur)
**/
function afficher_si_restaure_validation($saisie) {
	for (attribut of afficher_si_validation_attributs) {
		var enfants = $saisie.find('[data-afficher_si-' + attribut + ']');
		enfants.each(function() {
			if ($(this).parents('.afficher_si_masque').length == 0) {
				$(this).attr(attribut, $(this).attr('data-afficher_si-' + attribut)).attr('data-afficher_si-' + attribut, null);
			}
		});
	}
}


var afficher_si_validation_attributs = [
	'required',
	'minlength',
	'maxlength',
	'min',
	'max',
	'type',
	'step',
	'pattern'
];
var afficher_si_validation_attributs_valeurs = {'type': ['email', 'url']};
// Ref https://developer.mozilla.org/en-US/docs/Web/HTML/Constraint_validation#validation-related_attributes


function afficher_si(args) {
	if (afficher_si_current_data.hasOwnProperty(args['champ'])) {
		valeur_champ = afficher_si_current_data[args['champ']];
	} else {
		valeur_champ = '';
	}
	valeur = args['valeur'];

	// Compat historique == > IN pour données tabulaires !
	if (Array.isArray(valeur_champ) && !args['total']) {
		if (args['operateur'] == '==') {
			args['operateur'] = 'IN';
		} else if(args['operateur'] == '!=') {
			args['operateur'] = '!IN';
		}
	}
	// Si on vérifie un total
	if (args['total']) {
		if (Array.isArray(valeur_champ)) {
			valeur_champ = valeur_champ.length;
		} else {
			valeur_champ = 0;
		}
	}

	// Transformation en tableau des valeurs et valeur_champ, si IN/!IN
	if (args['operateur'] == 'IN' || args['operateur'] == '!IN') {
		valeur = valeur.split(',');
		if (!Array.isArray(valeur_champ)) {
			if (valeur_champ) {
				valeur_champ = [valeur_champ];
			} else {
				valeur_champ = [];
			}
		}
	}

	// Transformation en entier des valeurs et valeur_champ, si opérateur de comparaison
	if (['<', '<=', '>=', '>'].includes(args['operateur'])) {
		valeur = Number(valeur);
		valeur_champ = Number(valeur_champ);
	}

	// Et maintenant les test
	switch (args['operateur']) {
		case '==':
			return valeur_champ == valeur;
		case '!=':
			return valeur_champ != valeur;
		case '>':
			return valeur_champ > valeur;
		case '>=':
			return valeur_champ >= valeur;
		case '<':
			return valeur_champ < valeur;
		case '<=':
			return valeur_champ <= valeur;
		case 'MATCH':
			return RegExp(valeur, args.regexp_modif).test(valeur_champ);
		case '!MATCH':
			return !RegExp(valeur, args.regexp_modif).test(valeur_champ);
		case 'IN':
			return $(valeur).filter(valeur_champ).length ? true : false;
		case '!IN':
			return $(valeur).filter(valeur_champ).length ? false : true;
		default:
			return valeur_champ ? true : false;
	}
}


//Pour l'affichage des étapes selon la présentation "étape courante" seulement
//@param form, le formulaire
//@param name le nom de la saisie dont la valeur vient juste de changer
function afficher_si_set_etapes_presentation_courante(form, name='') {
	var etapes = afficher_si_parse_data_etapes_futures(form);
	if (!etapes) {
		return;
	}
	form.find('[data-etapes_max]').each(function() {
		var etape_total = $(this).attr('data-etapes_max');
		for (etape in etapes) {
			var condition = etapes[etape]['afficher_si'] ?? 'true';
			if (!name || condition.includes(name)) {
				$(this).attr('data-' + etape, eval(condition));
			}
			if (condition && !eval($(this).attr('data-' + etape))) {
				etape_total--;
			}
		}
		$(this).find('.formulaire_spip_etape__total').text(etape_total);
	});
}

// Pour le libellé de l'étape suivante
//@param form, le formulaire
//@param name le nom de la saisie dont la valeur vient juste de changer
function afficher_si_set_etape_suivante(form, name) {
	var etapes = afficher_si_parse_data_etapes_futures(form);
	if (!etapes) {
		return;
	}
	var label_enregistrer = form.find('button.submit_suivant').attr('data-label_enregistrer');
	var titre_retenu = label_enregistrer;
	// Chercher la première future étape
	for (etape in etapes) {
		var afficher_si_etape = etapes[etape]['afficher_si'] ?? 'true';
		if (eval(afficher_si_etape)) {
			titre_retenu = etapes[etape]['label'];
			break;
		}
	}
	form.find('button.submit_suivant').each(function() {
		var $span = $(this).find('.btn__label');
		// Stocker le modèle pour suivant, si pas deja fait
		if (!$(this).attr('data-modele')) {
			$(this).attr('data-modele', $span.html());
		}
		// Puis ajuster le titre, le modèle variant selon que nous passons directement à la validation ou pas
		if (titre_retenu == label_enregistrer) {
			$span.html(titre_retenu);
		} else {
			$span.html($(this).attr('data-modele'));
			$span.find('.titre-etape').html(titre_retenu);
		}
	});
}
// Recopier les info d'afficher_si présente dans [data-resume_etapes_futures] au sein de chaque etapes futures
// Le but est de simplifier ainsi le code principal, en se contentant du code de animer_afficher_si()
// @param jquery obcet form
function afficher_si_init_chemin_etapes(form) {
	var etapes = afficher_si_parse_data_etapes_futures(form);
	if (!etapes) {
		return;
	}
	for (etape in etapes) {
		var afficher_si_etape = etapes[etape]['afficher_si'] ?? '';
		if (afficher_si_etape) {
			form.find('.etapes__item.' + etape).attr('data-afficher_si', afficher_si_etape).addClass('afficher_si_sans_visuel');
		}
	}
}
function afficher_si_parse_data_etapes_futures(form) {
	var data = form.attr('data-resume_etapes_futures');
	if (!data) {
		return;
	}
	var etapes = JSON.parse(data);
	return etapes;
}

SAMX