Skip to content
Extraits de code Groupes Projets
Valider f6365fdc rédigé par Maïeul's avatar Maïeul
Parcourir les fichiers

fix(#331): ajuster le libellé de l'étape suivante en fonction des `afficher_si`

Pour cela :
 * fonction PHP `saisies_afficher_si_js_titres_etape_suivante()` qui permet d'afficher les titres et js d'`afficher_si` de l'étape suivante
 * fonction JS `afficher_si_set_etape_suivante()` qui règle le libellé de l'étape suivante.
parent 01d9c830
Aucune branche associée trouvée
Aucune étiquette associée trouvée
2 requêtes de fusion!332# 331 à la dernière vraie étape en tenant compte des `afficher_si`, avoir un bouton `Valider` et pas `Etape suivante`,!339Issue 331 : libellé des boutons d'étape et afficher_si
<p class="boutons" [ data-afficher_si="(#ENV*{_saisies/options/afficher_si_submit}|saisies_afficher_si_js{#ENV{_saisies}})"]>
<span class="image_loading"></span>
[(#SET{label_valider, #ENV*{_saisies/options/texte_submit, #ENV*{saisies_texte_submit, <:bouton_enregistrer:>}}})]
#SET{label_enregistrer,#GET{label_valider}}
#SET{afficher_si_titres,''}
[(#ENV{_etape}|et{#ENV{_etape}|!={#ENV{_etapes}}}|oui)
[(#SET{label_valider, #ENV*{_saisies/options/etapes_suivant, <:bouton_suivant:>}})]
[(#ENV*{_saisies/options/etapes_precedent_suivant_titrer}|oui)
#SET{etape,#ENV*{_saisies_par_etapes/etape_#VAL{#ENV{_etape}|plus{1}}}
[(#SET{etape_suivante_titre,#INCLURE{
fond=inclure/fieldset_legend,
label=#GET{etape/options/label},
icone=#GET{etape/options/icone},
taille_icone=#GET{etape/options/taille_icone}
}|sinon{<:saisies:etapes_recapitulatif_label:>}})]
[(#SET{afficher_si_titres,#ENV*{_saisies_par_etapes}|saisies_afficher_si_js_titres_etape_suivante{#ENV{_etape},#GET{label_enregistrer}}})]
#SET{etape_suivante_titre,#GET{afficher_si_titres/etapes}|current|table_valeur{titre}}
#SET{label_valider,#GET{label_valider}|trim|label_ponctuer|concat{' ',#GET{etape_suivante_titre}|wrap{'<span class="titre-etape">'}}}
]
]
[(#ENV*{_saisies/options/etapes_precedent_suivant_titrer}|non)
[(#SET{afficher_si_titres,#ENV*{_saisies_par_etapes}|saisies_afficher_si_js_titres_etape_suivante{#ENV{_etape},#GET{label_enregistrer},'on'}})]
]
]
[(#ENV{_etape}|>{1}|oui)
[(#SET{label_precedent,#ENV*{_saisies/options/etapes_precedent, <:precedent|ucfirst:>}})]
......@@ -33,5 +31,12 @@
]
<button type="submit" class="submit submit_precedent" name="aller_a_etape" value="[(#ENV{_saisies}|saisies_determiner_recul_rapide{#ENV{_etape}})]"><span class="btn__label">[(#GET{label_precedent}|_T_ou_typo)]</span></button>
]
<button type="submit" class="submit[ (#ENV{_etapes}|?{submit_suivant,submit_main})]" value="1"><span class="btn__label">[(#GET{label_valider}|_T_ou_typo)]</span></button>
<button
type="submit"
class="submit[ (#ENV{_etapes}|?{submit_suivant,submit_main})]"
value="1"
[(#GET{afficher_si_titres}|oui)
data-afficher_si_titres=["(#VAL{'"'}|str_replace{'&quot;',#GET{afficher_si_titres}|json_encode})]"
]
><span class="btn__label">[(#GET{label_valider}|_T_ou_typo)]</span></button>
</p>
......@@ -132,3 +132,66 @@ function saisies_afficher_si_js_etapes_futures(array $etapes, int $etape): array
}
return $afficher_si;
}
/**
* Retourne les afficher_si et les titres potentiels de la prochaine étape.
* Pour ce faire, recherche la première étape postérieure qui n'est pas conditionnée par `afficher_si`.
* Retourne tous les titre et afficher_si format JS des étapes intermédiaire.
* On ne met cependant pas les étapes qui sont forcément masquées.
* @param array $etapes liste des étapes (sous forme de tableau de saisies)
* @param int $etape etape courante
* @param string $label_enregistrer le label pour la validation finale
* @param bool|string $sans_titre pour le cas où on ne veut pas le titre de l'étape
* @return array
* 'etapes' => [
* 'etape_x' => [
* 'condition' => afficher_si format js
* 'titre' => 'titre de l'étape'
* ]....
* ]
* 'label_enregistrer' => $label_enregistrer
**/
function saisies_afficher_si_js_titres_etape_suivante(array $etapes, int $etape, string $label_enregistrer, $sans_titre = false): array {
$afficher_si = saisies_afficher_si_js_etapes_futures($etapes, $etape);
$retours = [];
foreach ($etapes as $e => $description) {
if (intval(str_replace('etape_', '', $e) <= $etape)) {
continue;
}
$condition = $afficher_si[$e] ?? 'true';
if (saisies_afficher_si_js_est_statique($condition) === true) {
if (saisies_evaluer_afficher_si($condition)) {
$condition = 'true';
} else {
$condition = 'false';
}
}
if ($condition === 'false') {
continue;
}
$retours[$e] = [
'condition' => $condition
];
if (!$sans_titre) {
$retours[$e]['titre'] = recuperer_fond(
'inclure/fieldset_legend',
[
'label' => $description['options']['label'],
'icone' => $description['options']['icone'] ?? '',
'taille_icone' => $description['options']['taille_icone'] ?? '',
]
);
}
if ($condition === 'true') {
break;
}
}
$retours = ['etapes' => $retours];
$retours['label_enregistrer'] = $label_enregistrer;
return $retours;
}
......@@ -6,7 +6,11 @@ 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).find('[data-afficher_si]').length !== 0 || $(this).find('[data-afficher_si-etapes-futures]') !== 0) {
if (
$(this).find('[data-afficher_si]').length !== 0
|| $(this).find('[data-afficher_si-etapes-futures]') !== 0
|| $(this).find('[data-afficher_si-titres]') !== 0
) {
form = $(this);
form.find('.formulaire_spip__etapes').each(function() {
$(this).css('min-height', $(this).height());
......@@ -17,7 +21,9 @@ function afficher_si_init() {
animer_afficher_si($(this), condition, true);
}
);
afficher_si_set_etapes_presentation_courante(form);
afficher_si_set_etape_suivante(form);
// Un écouteur sur la modif de tous les champs de ce form
$(this).find('textarea, input, select').change(function(){
......@@ -34,6 +40,7 @@ function afficher_si_init() {
animer_afficher_si($(this), condition);
})
afficher_si_set_etapes_presentation_courante(form, name);
afficher_si_set_etape_suivante(form, name);
}
});
$(this).attr('data-afficher_si-init', true);
......@@ -182,3 +189,41 @@ function afficher_si_set_etapes_presentation_courante(form, name='') {
$(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) {
form.find('button[data-afficher_si_titres]').each(function() {
titres = JSON.parse($(this).attr('data-afficher_si_titres'));
etapes = titres['etapes'];
titre_retenu = titres['label_enregistrer'];
for (etape in etapes) {
condition = etapes[etape]['condition'];
titre = etapes[etape]['titre'];
if (!name || condition.includes(name) || condition === 'true') {
resultat = eval(condition);
if (resultat) {
titre_retenu = titre;
break;
}
}
}
$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 == titres['label_enregistrer']) {
$span.html(titre_retenu);
} else {
$span.html($(this).attr('data-modele'));
$span.find('.titre-etape').html(titre_retenu);
}
});
}
......@@ -8,6 +8,8 @@ use PHPUnit\Framework\TestCase;
* @covers saisies_afficher_si_js_est_statique()
* @covers saisies_afficher_si_js()
* @covers saisies_afficher_si_js_etapes_futures()
* @covers saisies_afficher_si_js_titres_etape_suivante()
* @covers saisies_afficher_si_js_titres_etape_suivante()
* @internal
*/
......@@ -346,4 +348,185 @@ class AfficherSiJsTest extends TestCase {
$actual = saisies_afficher_si_js_etapes_futures($etapes, $etape);
$this->assertSame($expected, $actual);
}
static public function dataAfficherSiJsTitresEtapeSuivante(): array {
return [
'avec_titre' => [
// Expected
[
'etapes' => [
'etape_3' => [
'condition' => 'afficher_si({"champ":"toto","total":"","operateur":"==","valeur":"hop"})',
'titre' => [
'nom' => 'inclure/fieldset_legend',
'contexte' => [
'label' => 'etape 3',
'icone' => 'etape3.svg',
'taille_icone' => '16px'
]
]
],
'etape_5' => [
'condition' => 'true',
'titre' => [
'nom' => 'inclure/fieldset_legend',
'contexte' => [
'label' => 'etape 5',
'icone' => 'etape5.svg',
'taille_icone' => '16px'
]
]
],
],
'label_enregistrer' => 'label_enregistrer',
],
// Etapes
[
'etape_1' => [
'options' => [
'label' => 'etape 1',
'afficher_si' => 'false',
],
'saisies' => []
],
'etape_2' => [
'options' => [
'label' => 'etape 2',
'icone' => 'etape2.svg',
'taille_icone' => '16px'
],
'saisies' => [
[
'saisie' => 'input',
'options' => [
'nom' => 'toto',
]
]
]
],
'etape_3' => [
'options' => [
'label' => 'etape 3',
'icone' => 'etape3.svg',
'taille_icone' => '16px',
'afficher_si' => '@toto@ == "hop"',
],
'saisies' => []
],
'etape_4' => [
'options' => [
'label' => 'etape 4',
'afficher_si' => 'false',
'icone' => 'etape4.svg',
'taille_icone' => '16px'
],
'saisies' => []
],
'etape_5' => [
'options' => [
'label' => 'etape 5',
'afficher_si' => 'true',
'icone' => 'etape5.svg',
'taille_icone' => '16px'
],
'saisies' => []
]
],
// Etape
2,
// Label enregistrer
'label_enregistrer'
],
'sans_titre' => [
// Expected
[
'etapes' => [
'etape_3' => [
'condition' => 'afficher_si({"champ":"toto","total":"","operateur":"==","valeur":"hop"})',
],
'etape_5' => [
'condition' => 'true',
],
],
'label_enregistrer' => 'label_enregistrer',
],
// Etapes
[
'etape_1' => [
'options' => [
'label' => 'etape 1',
'afficher_si' => 'false',
],
'saisies' => []
],
'etape_2' => [
'options' => [
'label' => 'etape 2',
'icone' => 'etape2.svg',
'taille_icone' => '16px'
],
'saisies' => [
[
'saisie' => 'input',
'options' => [
'nom' => 'toto',
]
]
]
],
'etape_3' => [
'options' => [
'label' => 'etape 3',
'icone' => 'etape3.svg',
'taille_icone' => '16px',
'afficher_si' => '@toto@ == "hop"',
],
'saisies' => []
],
'etape_4' => [
'options' => [
'label' => 'etape 4',
'afficher_si' => 'false',
'icone' => 'etape4.svg',
'taille_icone' => '16px'
],
'saisies' => []
],
'etape_5' => [
'options' => [
'label' => 'etape 5',
'afficher_si' => 'true',
'icone' => 'etape5.svg',
'taille_icone' => '16px'
],
'saisies' => []
]
],
// Etape
2,
// Label enregistrer
'label_enregistrer',
// sans titre
'on'
]
];
}
/**
* @dataProvider dataAfficherSiJsTitresEtapeSuivante
* @uses saisies_afficher_si_evaluer_plugin()
* @uses saisies_afficher_si_secure()
* @uses saisies_afficher_si_verifier_syntaxe()
* @uses saisies_lister_par_nom()
* @uses saisies_parser_condition_afficher_si()
* @uses saisie_nom2name()
* @uses saisies_afficher_si_filtrer_parse_condition()
* @uses saisies_afficher_si_js_defaut()
* @uses saisies_evaluer_afficher_si()
* @uses saisies_transformer_condition_afficher_si()
**/
public function testAfficherSiJsTitresEtapeSuivante(array $expected, array $etapes, int $etape, string $label_enregistrer, $sans_titre = false): void {
$actual = saisies_afficher_si_js_titres_etape_suivante($etapes, $etape, $label_enregistrer, $sans_titre);
$this->assertSame($expected, $actual);
}
}
......@@ -314,6 +314,14 @@ if (!function_exists('find_all_in_path')) {
}
}
if (!function_exists('recuperer_fond')) {
// Pour récuperer fond, on envoi un tableau qui donne le nom et les args du fond
function recuperer_fond(string $nom, array $contexte): array{
return ['nom' => $nom, 'contexte' => $contexte];
}
}
/**
* Mock pour la fonction de translitteration
* Cette fonction n'est utilisé que pour des tri alphab accentué
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter