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-uncomplete" 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_204906643" class="t3 emphasis">Canal Web Paris 17
                        </h2>

                        <p>Développeur / Développeuse web, en France</p>

                    </hgroup>

                </div>

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

                    <p class="mb-2">

                        <span class="tag tag-known-uncomplete-default"><span class="tag-content">Activité connue et incomplète</span><span class="tag-append">
                                <span aria-hidden="true" class="icon icon-info-full"></span>
                            </span>

                        </span>

                    </p>

                    <p>
                        Du 01 septembre 2009 au 31 juin 2016<br />
                        Démission - Lorem ipsum dolor sit amet
                    </p>

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

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

            <button aria-label="Supprimer Canal Web Paris 17" class="btn btn-secondary btn-ratio-square ml-0" id="button_884835965" type="button" data-ft-tooltip="Supprimer" data-ft-vocalize="false">
                <span aria-hidden="true" class="icon icon-trash"></span>
                <span class="sr-only">Supprimer</span>
            </button>

            <button aria-label="Compléter Canal Web Paris 17" class="btn btn-primary ml-0" data-carte-formulaire="afficher-formulaire" id="button_39965955" type="button">
                <span class="btn-content">Compléter</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 Canal Web Paris 17</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>

                    <label class="form-label" for="form-input_792523213">
                        Prénom<span class="required">&nbsp;*</span></label>

                    <div class="form-control-wrapper">
                        <input autocomplete="given-name" class="form-control has-icon-left" id="form-input_792523213" name="form-input_792523213" required type="text">

                        <span aria-hidden="true" class="icon icon-user"></span>
                    </div>
                    <div class="form-check form-check mt-2">
                        <input class="form-check-input" id="form-checkbox_180060831" name="form-checkbox_180060831" required type="checkbox" value="checkbox-value_954394164">

                        <label class="form-check-label" for="form-checkbox_180060831">
                            Je n'ai pas de prénom<span class="required">&nbsp;*</span></label>

                    </div>

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

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

            <button class="btn btn-secondary ml-0" data-carte-formulaire="masquer-formulaire" id="button_107401269" 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_880338891" 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();
                }
            }
        });
    });