Choix de l'univers FT

Card form Carte de formulaire

Regrouper et restituer des éléments de formulaire.

Elles comportent un état de saisie et leur équivalent qui restitue les informations saisies.

Documentation : Figma

Langage:  HTML

<section class="carte-formulaire carte-formulaire-default" data-carte-formulaire="parent" tabindex="-1">

    <div class="carte-formulaire-restit" data-carte-formulaire="restitution">
        <div class="media media-form p-3 p-lg-4">

            <span aria-hidden="true" class="icon icon-briefcase text-gray-40 d-none d-md-block mr-3"></span>

            <div class="media-body">
                <div class="carte-formulaire-header">
                    <hgroup>
                        <h2 id="carte-formulaire-heading_206214893" class="t3 emphasis">Titre de la section
                        </h2>

                        <p>Description optionnelle</p>

                    </hgroup>

                </div>

                <div class="carte-formulaire-body">

                </div>
            </div>
        </div>

        <div class="carte-formulaire-footer">

            <button aria-label="Modifier Titre de la section" class="btn btn-secondary ml-0" data-carte-formulaire="afficher-formulaire" id="button_165861288" type="button">
                <span class="btn-content">Modifier</span>
            </button>

        </div>

    </div>

    <div class="carte-formulaire-modifier" hidden data-carte-formulaire="modifier">
        <div class="media media-form p-4">

            <span aria-hidden="true" class="icon icon-briefcase text-gray-40 d-none d-md-block mr-3"></span>

            <div class="media-body">
                <div class="carte-formulaire-header">
                    <hgroup>
                        <h2 class="t3 emphasis mb-2">Modification de Titre de la section</h2>

                        <p>Compléter les informations manquantes</p>

                    </hgroup>
                </div>

                <div class="carte-formulaire-body pt-2">

                    <p>Contenu de la carte en édition</p>

                </div>
            </div>
        </div>

        <div class="carte-formulaire-footer p-3">

            <button class="btn btn-secondary ml-0" data-carte-formulaire="masquer-formulaire" id="button_596968408" type="button">
                <span class="btn-content">Annuler</span><span class="sr-only">&nbsp;les modifications et revenir au contenu</span>

            </button>

            <button class="btn btn-primary ml-0" data-carte-formulaire="masquer-formulaire" id="button_721198317" type="button">
                <span class="btn-content">Valider</span><span class="sr-only">&nbsp;et revenir au contenu</span>

            </button>

        </div>
    </div>

</section>
  • URL Preview : /js/card-form.js
  • Chemin d'accès : public/js/card-form.js
  • Taille : 1.4 KB
  • Contenu :
    'use strict';
    
    window.addEventListener('DOMContentLoaded', function () {
    	let $boutonsAfficher = document.querySelectorAll('[data-carte-formulaire="afficher-formulaire"]');
    	let $boutonsMasquer = document.querySelectorAll('[data-carte-formulaire="masquer-formulaire"]');
    
    	$boutonsAfficher.forEach(function (boutonAfficher) {
    		boutonAfficher.addEventListener('click', afficherFormulaire);
    	});
    
    	$boutonsMasquer.forEach(function (boutonMasquer) {
    		boutonMasquer.addEventListener('click', masquerFormulaire);
    	});
    });
    
    function afficherFormulaire(event) {
    	let $parent = event.target.closest('[data-carte-formulaire="parent"]');
    	let $formulaire = $parent.querySelector('[data-carte-formulaire="modifier"]');
    	let $restitution = $parent.querySelector('[data-carte-formulaire="restitution"]');
    
    	if ($parent && $formulaire && $restitution) {
    		$restitution.setAttribute("hidden", "");
    		$formulaire.removeAttribute("hidden");
    		$parent.focus();
    	}
    };
    
    function masquerFormulaire(event) {
    	let $parent = event.target.closest('[data-carte-formulaire="parent"]');
    	let $formulaire = $parent.querySelector('[data-carte-formulaire="modifier"]');
    	let $restitution = $parent.querySelector('[data-carte-formulaire="restitution"]');
    
    	if ($parent && $formulaire && $restitution) {
    		$formulaire.setAttribute("hidden", "");
    		$restitution.removeAttribute("hidden");
    		$parent.focus();
    	}
    }
  • URL Preview : /js/pe-toggle.js
  • Chemin d'accès : public/js/pe-toggle.js
  • Taille : 3.9 KB
  • Contenu :
    // Script toggle-more
    jQuery(function ($) {
        /** Structure attendue
         * <ul id="collapsable-item"> // L'id du bloc "controllé"
         *  <li>Item 1</li>
         *  <li>Item 2</li>
         *  <li class="fadeIn hidden">Item 1</li>
         *  <li class="fadeIn hidden">Item 2</li>
         *  <li class="fadeIn hidden">Item 3</li>
         *  <li class="fadeIn hidden">Item 4</li>
        * </ul>
        * <button
        *     type="button" class="btn-reset btn-more"
        *     data-pe-toggle="more"  // Pour des soucis retro-compatibilité, data-toggle="more" est aussi accepté
        *     data-target="#collapsable-item" // On précise l'id bu bloc à controller dans le data-target
        *     data-title-collapsed="Title quand replié"
        *     data-title-visible="Title quand déplié"
        *     aria-controls="collapsable-item" // On précise l'id bu bloc à controller dans le data-target
        * >
        *   Voir plus / Voir moins
        * </button>
        *
        * Attention : Nécessite du CSS complémentaire pour controller l'affichage du bouton Voir plus / Voir moins
        * Pour gérer l'affichage, quand la liste est dépliée le bouton a la classe "displayed", et la classe "collapsed" quand elle est repliée
    
        /** Gestion des collapses */
        $('[data-pe-toggle="more"], [data-toggle="more"]').on('click', function (e) {
            let $trigger = $(this);
            wasVisible = $trigger.hasClass('displayed'), // Is the button currently in display mode ?
                $itemsToToggle = $trigger.attr('dataItemsToToggle') || $($trigger.attr('data-target')).children('.fadeIn'), // We cache the jQuery items upon first use
                $firstItemToToggle = $itemsToToggle.first(),
                $firstInputFocusable = null;
    
            // Si l'élément séléctionné est un input, on l'utilisera
            if ($firstItemToToggle.is('input')) {
                $firstInputFocusable = $firstItemToToggle;
            }
            // Si l'élément séléctionné contient un input, on utilise le premier
            else if ($firstItemToToggle.find('input').length) {
                $firstInputFocusable = $firstItemToToggle.find('input').first()
            }
    
            // Si on replie la liste
            const dataExpanded = $trigger.attr('data-expanded');
            const dataCollapsed = $trigger.attr('data-collapsed');
            if (wasVisible) {
                $trigger
                    .removeClass('displayed')
                    .addClass('collapsed')
                    .attr('title', $trigger.attr('data-title-collapsed'));
    
                // Si le bouton de collapse change de contenu ("afficher / masquer la suite"), il ne doit pas avoir de `aria-expanded`
                if (!dataExpanded && !dataCollapsed) {
                    $trigger.attr('aria-expanded', 'false')
                }
    
                $itemsToToggle.addClass('hidden').prop('hidden', true); // On utilise aussi la classe .hidden au cas ou le display:none de l'attribut hidden est surchargé par une autre classe
                if ($firstInputFocusable === null) {
                    $firstItemToToggle.removeAttr('tabindex');
                }
            }
    
            // Si on affiche la liste
            else {
                $trigger
                    .addClass('displayed')
                    .removeClass('collapsed')
                    .attr('title', $trigger.attr('data-title-visible'));
    
                // Si le bouton de collapse change de contenu ("afficher / masquer la suite"), il ne doit pas avoir de `aria-expanded`
                if (!dataExpanded && !dataCollapsed) {
                    $trigger.attr('aria-expanded', 'true')
                }
    
                $itemsToToggle.removeClass('hidden').prop('hidden', false);
    
                if ($firstInputFocusable === null) {
                    $firstItemToToggle
                        .attr('tabindex', '-1')
                        .trigger('focus');
                }
                else {
                    $firstInputFocusable.focus();
                }
            }
        });
    });