← Tous les articles

Responsive Design Partie 4 : Le cas particulier des formulaires 📝

AprĂšs avoir structurĂ© l’application et rendu les galeries dynamiques, la gestion de la saisie de donnĂ©es constitue la derniĂšre Ă©tape de cette configuration. Ce quatriĂšme tutoriel se concentre sur les formulaires, des Ă©lĂ©ments centraux des applications d’entreprise qui nĂ©cessitent des ajustements spĂ©cifiques pour s’adapter aux diffĂ©rents Ă©crans.

Pour consulter la Partie 3 : Rendre le contenu dynamique et adaptatif đŸ§©, cliquez ici

  1. PrĂ©ambule : L’enjeu de la saisie de donnĂ©es
    1. ⛔ Formulaires customs, pourquoi faut-il les Ă©viter ?
  2. Comprendre le fonctionnement des formulaires
    1. Matrice de positionnement des datacards :
    2. L’alignement sur les colonnes (SnapToColumns)
    3. Comportement des dimensions d’un Datacard
      1. Hauteur (Height)
      2. Largeur (Width)
      3. Comportement en cas de changement de taille du formulaire
  3. Mise en pratique
    1. Prérequis
    2. MĂ©thode Express ⚡👟🚄
    3. MĂ©thodes avancĂ©es â©đŸŽšïžđŸŻ
      1. Occuper toute la largeur
      2. Forcer l’affichage de champs sur une mĂȘme ligne
      3. RecrĂ©er un attribut “FillPortions”
  4. Les points d’attention avec les formulaires
    1. Privilégiez la disposition Verticale
    2. Dimensionnement des cibles tactiles
    3. Gestion du clavier virtuel
  5. Conclusion

PrĂ©ambule : L’enjeu de la saisie de donnĂ©es

Les formulaires (saisie de tickets, crĂ©ation de profils, commandes) sont gĂ©nĂ©ralement les Ă©crans les plus denses d’une application. Sur un Ă©cran d’ordinateur (desktop), une disposition de dix champs sur trois ou quatre colonnes est fonctionnelle. Sur un smartphone, cette mĂȘme disposition rend les champs trop Ă©troits et le texte illisible.

Dans Power Apps, deux architectures sont possibles pour la saisie : utiliser le contrĂŽle standard Formulaire de modification (EditForm), ou construire un Formulaire personnalisĂ© (Custom) avec des contrĂŽles individuels et la fonction Patch(). Ces deux approches peuvent ĂȘtre rendues responsives en appliquant des paramĂ©trages distincts.

⛔ Formulaires customs, pourquoi faut-il les Ă©viter ?

Contrairement Ă  ce que conseillent une partie des experts Power Platform, “bouder” les formulaires natifs pour tout reconstruire soi mĂȘme est une fausse bonne idĂ©e ( du moins c’est lĂ  mon opinion 😁 ), voici pourquoi :

CrĂ©er des formulaires de toutes piĂšces en assemblant manuellement des conteneurs de mise en page et des contrĂŽles individuels (sauvegardĂ©s via Patch()) permet une personnalisation avancĂ©e du design. Toutefois, cette mĂ©thode nĂ©cessite un temps de dĂ©veloppement nettement supĂ©rieur pour configurer manuellement la validation des champs, les messages d’erreur et la rĂ©initialisation des donnĂ©es ; vous pourriez y consacrer des jours et des jours, que vous seriez encore Ă  dĂ©velopper des fonctionnalitĂ©s qui sont embarquĂ©es nativement dans les EditForm.

Gardez en tĂȘte '’l’esprit low-code’‘, qui consiste Ă  exploiter prioritairement les outils natifs de la plateforme pour optimiser l’efficacitĂ© du dĂ©veloppement.

D’autant que les formulaires natifs restent hautement personnalisables, pour peu que l’on sache comment les maütriser


Comprendre le fonctionnement des formulaires

Le contrĂŽle EditForm est utilisĂ© pour sa rapiditĂ© de mise en Ɠuvre : il se connecte directement Ă  la source de donnĂ©es et gĂšre nativement les erreurs de validation, les types de champs et les soumissions via SubmitForm(). Bien qu’il paraisse rigide par dĂ©faut car configurĂ© sur une grille stricte, il est tout Ă  fait possible de le rendre fluide.

La mĂ©thode pour rendre un formulaire natif adaptatif consiste Ă  libĂ©rer les cartes de donnĂ©es (DataCards) de leur contrainte d’alignement par dĂ©faut, afin qu’elles se comportent comme des blocs flexibles.

Matrice de positionnement des datacards :

Les datacards sont positionnés dans un formulaire sur une grille X/Y les valeurs en X (0,1,2,3...) indiquent la position sur une ligne, les valeurs en Y (0,1,2,3...) indiquent la position sur une colonne. Cet agencement répond à plusieurs rÚgles:

  • Le Datacard ayant pour coordonnĂ©es 0,0 sera tout en haut Ă  gauche du formulaire

  • Le dĂ©bordement est natif : Si un Datacard n’a pas de place pour ĂȘtre affichĂ© sur une ligne, il s’affichera en dessous des datacards prĂ©cĂ©dents (Et dĂ©calera les lignes suivantes automatiquement)

  • Les Datacards sont empilĂ©s, si une position en X ou en Y n’est pas utilisĂ©e, il n’y aura pas d’espace vide entre les datacards. (il est donc vain de donner la mĂȘme valeur de X Ă  des datacards situĂ©s sur des positions Y diffĂ©rentes pour les aligner verticalement)

  • Si deux DataCards ont exactement les mĂȘme valeurs en X et Y, leur ordre sera dĂ©terminĂ© en fonction de leur position dans l’arborescence

Voici un schéma qui récapitule le comportement du positionnement des DataCards dans un formulaire :

💡Notez qu’un DataCard masquĂ© n’occupera jamais d’espace vide !

⚠ Dans le volet propriĂ©tĂ©s, on trouve les paramĂštres X et Y, attention, ce ne sont pas les mĂȘme paramĂštres, dans un cas se sont des coordonnĂ©es, dans l’autre des pixels

L’alignement sur les colonnes (SnapToColumns)

Par dĂ©faut, l’éditeur Power Apps utilise la propriĂ©tĂ© Colonnes (Columns) couplĂ©e Ă  l’option Aligner sur les colonnes (SnapToColumns) pour vous aider Ă  gĂ©nĂ©rer trĂšs rapidement une disposition structurĂ©e de votre formulaire. L’intĂ©rĂȘt rĂ©el de ces paramĂštres est de vous faire gagner un temps prĂ©cieux lors de la crĂ©ation initiale pour placer tous vos champs dans une grille rigide.

ConcrÚtement, que se passe-t-il quand vous ajoutez ou déplacez un champ quand ce paramÚtre est activé ? Et bien le formulaire va attribuer automatiquement des coordonnées X et Y au Datacard.

Une fois cette mise en place de nos champs effectuĂ©e, ce comportement va vite devenir une contrainte car destinĂ© Ă  gĂ©nĂ©rer un formulaire purement statique. C’est pourquoi, aprĂšs avoir ajoutĂ© tous nos champs, nous allons dĂ©libĂ©rĂ©ment dĂ©sactiver cette option pour reprendre le contrĂŽle total et de rendre l’agencement des cartes de donnĂ©es (DataCards) pleinement dynamique. Pour ce faire :

  1. Sélectionnez votre contrÎle Formulaire.

  2. Dans le panneau de propriĂ©tĂ©s, dĂ©sactivez l’option Aligner sur les colonnes (SnapToColumns) en la passant sur false.

Cette action supprime la grille rigide du formulaire, nous laissant toute la latitude pour personnaliser la disposition des champs.

⚠ Attention, rĂ©activer cette option rĂ©initialisera toutes les coordonnĂ©es X,Y de vos Datacards

Comportement des dimensions d’un Datacard

Le comportement des propriétés hauteur et largeur (Width / Height) des Datacards est particulier.

Hauteur (Height)

La hauteur est flexible, spĂ©cifier la hauteur d’un Datacard ne sert qu’à dĂ©terminer une hauteur minimale. La hauteur s’adaptera automatiquement pour pouvoir afficher l’objet visible le plus bas. Dans l’exemple ci-dessous, notre DataCard a une hauteur de 130, qui devrait se situer au niveau de la ligne mauve. Toute fois, le rectangle a une hauteur plus importante, le DataCard s’adapte en hauteur pour pouvoir l’afficher.

💡 Comme nous l’avons vu dans les rĂšgles de position, la hauteur de la ligne s’adaptera Ă  la hauteur du DataCard la plus Ă©levĂ©e. Dans cet exemple, la taille et la position du rectangle va augmenter la hauteur de toute la ligne. Notez Ă©galement que les objets flexibles sont identifiables grĂące au “A” associĂ© au cadre de sĂ©lection.

C’est un aspect trĂšs important Ă  prendre en considĂ©ration pour la construction des formulaires : Pour optimiser l’espace, essayez de regrouper sur les mĂȘmes lignes les Datacards les plus grands en hauteur ( Texte enrichi, image
).

Largeur (Width)

La largeur d’un DataCard se comporte diffĂ©rement de la hauteur. Tout d’abord, elle ne s’adapte pas, si un objet “sort” du cadre car trop grand, il sera masquĂ© :

Comportement en cas de changement de taille du formulaire

Par dĂ©faut la largeur d’un DataCard est donc fixe ! Mais un paramĂštre va jouer un rĂŽle crucial pour nous permettre de rendre nos formulaires responsive : “L’ajustement Ă  la largeur (WidthFit)”. s’il est activĂ©, ce paramĂštre permet Ă  un DataCard d’occuper toute la largeur disponible dans le formulaire. Si plusieurs DataCard d’une mĂȘme ligne on ce paramĂštre activĂ©, ils se partageront l’espace disponible.

Voici un schéma qui récapitule le comportement des DataCards en largeur et en hauteur:

Une fois que nous avons pris en compte toutes ces rĂšgles, nous avons toutes les clefs en main pour comprendre comment va se comporter un formulaire si sa largeur Ă©volue d’un pĂ©riphĂ©rique Ă  un autre ou quand l’utilisateur change l’orientation de l’écran. Le schĂ©ma ci-aprĂšs nous montre comment la disposition des Datacards va s’adapter au nouveau format :

Nous pouvez déjà remarquer deux choses :

  • Nous devrons ĂȘtre particuliĂšrement vigilant Ă  la largeur des DataCards
    • Trop petite, le contenu du Datacard peut ĂȘtre masquĂ© car il n’y aura pas suffisamment de place pour afficher les informations qui seront tronquĂ©es.

    • Trop grande, le contenu peut Ă©galement ne pas s’afficher car dĂ©bordant du formulaire !

  • La disposition change automatiquement pour rĂ©ordonner le contenu en largeur, ce qui agrandit proportionnellement le formulaire en hauteur !
    • C’est gĂ©nĂ©ralement peu impactant sur un changement d’orientation, car en position “portrait” l’utilisateur est habituĂ© Ă  “scroller”

    • Cela peut ĂȘtre plus problĂ©matique si l’apparition de barre de dĂ©filement verticales apparaissent sur de faibles rĂ©solutions, car cela peut ĂȘtre plus fastidieux sur un Ă©cran PC.

Mise en pratique

Maintenant que nous connaissons les rĂšgles du jeu, passons Ă  la pratique !

Prérequis

Nous allons gĂ©nĂ©rer rapidement un Ă©cran contenant un formulaire, connectĂ© Ă  une source de donnĂ©es, une table contenant beaucoup de colonnes afin d’explorer plusieurs techniques.

Depuis l’arobrescence, gĂ©nĂ©rons un Ă©cran d’aprĂšs le Template “En-tĂȘte et formulaire” :

Ajoutons ensuite une source de donnĂ©es bien fournie en nombre de champs : La table Dataverse “utilisateurs”

Cela passera l’application en Premium 💎, mais peu importe que vous ayez une licence ou non, l’intĂ©rĂȘt ici est purement pĂ©dagogique et aucune licence n’est nĂ©cessaire pour dĂ©velopper une appli premium.

Si vous n’avez pas accĂšs aux tables dataverse ou prĂ©fĂ©rez garder l’appli en licence Standard🟧, vous pouvez utiliser n’importe quelle liste SharePoint Ă  la place, tant qu’elle a plus de 10 champs.

Pour afficher des donnĂ©es, nous mettrons le formulaire en mode “modifier” (FormMode.Edit) et nous placerons dans la propriĂ©tĂ© Items du formulaire la formule suivante :

Power Fx
LookUp(Utilisateurs;'ID d''objet Azure AD' = User().EntraObjectId)

Vous devriez maintenant avoir un formulaire d’une colonne avec votre nom affichĂ©

⚠ Par sĂ©curitĂ©, supprimez le bouton “Envoyer”, nous ne voulons pas modifier les donnĂ©es de votre profil utilisateur dans Dataverse par accident.

Pour l’instant c’est inutilisable en l’état, les Datacards ont une largeur fixe de 1300 pixels, si vous switchez de form factor, vous les verrez tronquĂ©s. Nous allons commencer par dĂ©sactiver l’alignement sur les colonnes.

MĂ©thode Express ⚡👟🚄

J’ai une mĂ©thode pour rendre un formulaire rĂ©actif en seulement quelques clics : SĂ©lectionnez tous les DataCards du formulaire (astuce : SĂ©lectionnez le formulaire dans le Canvas et faites Ctrl+A)

Changez la largeur de tous les DataCards à 300, cela nous garantit que les contrÎles ne seront pas tronqués sur un smartphone en mode portrait.

Changez également la largeur minimale du formulaire pour 300 pixels

Mettez la coordonné Y à 0 pour tous les Datacards

Activez l’ajustement à la largeur pour tous les Datacards

Et voila ! Votre formulaire est rĂ©actif avec la technique du Reflow, quelle que soit la rĂ©solution ou l’orientation, tous les champs seront toujours visibles et le nombre de colonnes s’adaptera Ă  la largeur disponible.

Il ne reste plus qu’à dĂ©terminer l’ordre des DataCards en modifiant leur rang en X ou en les dĂ©plaçant sur le Canvas:

MĂ©thodes avancĂ©es â©đŸŽšïžđŸŻ

Voici quelques mĂ©thodes pour vous aider dans la conception de votre formulaire en mode rĂ©actif. Nous partirons de notre mise en forme “Express” pour l’optimiser avec ces techniques.

PrĂ©paration : Pour ne pas ĂȘtre gĂ©nĂ© par les DataCards durant la personnalisation, nous allons les “remiser” tout au fond de notre formulaire en mettant leur coordonnĂ©es Ă  30,30. CelĂ  nous permettra de mettre en forme notre formulaire par le haut, ce qui facilitera la conception.

Occuper toute la largeur

Nous allons crĂ©er deux sĂ©parateurs, leur rĂŽle : organiser notre formulaire en catĂ©gories de champs. Ils devront occuper toute la largeur du formulaire, quelle que soit la rĂ©solution. Cette technique peut Ă©galement s’appliquer Ă  tout Datacard pour lequel vous souhaitez qu’il occupe toute la largeur du formulaire (un champ de saisie de texte enrichi par exemple).

Ajoutons deux DataCards personnalisĂ©es depuis le volet “Champs” du formulaire:

Quand un DataCard est ajouté, il apparaßt toujours à la suite des autres. Nous retrouverons donc nos deux cartes en position 31,30 et 32,30. Nous allons ensuite :

  • Leur attribuer une hauteur de 28 px et une largeur de 300 px

  • Activer “Ajuster Ă  la Largeur (WidthFit)”

  • Changer leur position X,Y en 0,0 et 0,5 pour les ramener en haut du formulaire

📌 Important : Nos cartes de Titre de section devront toujours ĂȘtre seules sur leur position en Y.

Ajoutons y des labels (Cliquez ici pour afficher le code Ă  copier et coller dans les cartes)
YAML
- txt_civilite:
    Control: ModernText@1.0.0
    Properties:
      Color: =Color.White
      Fill: =App.Theme.Colors.Lighter20
      FontWeight: =FontWeight.Semibold
      Height: =28
      Text: ="Civilité"
      Width: =Parent.Width
YAML
- txt_coordon:
    Control: ModernText@1.0.0
    Properties:
      Color: =Color.White
      Fill: =App.Theme.Colors.Lighter20
      FontWeight: =FontWeight.Semibold
      Height: =28
      Text: ="Coordonnées"
      Width: =Parent.Width

Il ne nous reste plus qu’à “Ranger” les DataCards des champs correspondant Ă  ces catĂ©gories dans les “espaces” que nous avons laissĂ© en Y : de 1 Ă  4 pour la civilitĂ©, et Ă  partir de 6 pour les coordonnĂ©es.

🩉Conseil : Gardez toujours des lignes vides au cas oĂč vous auriez Ă  ajouter des champs par la suite, cela vous Ă©pargnera de dĂ©caler tous les cartes des lignes suivantes.

Forcer l’affichage de champs sur une mĂȘme ligne

Parfois nous avons besoin que certains champs soient toujours affichĂ©s sur une mĂȘme ligne quelle que soit la rĂ©solution.

Prenons 4 champs Oui/Non dans notre formulaire

  • Mettons les sur la ligne Y=10

  • Profitons-en pour ajouter une carte custom avec un titre de section “ParamĂštres” comme vu avec la technique prĂ©cĂ©dente, en position Y=9

  • DĂ©sactivons l’ajustement Ă  la largeur (WidthFit)

  • Mettons une largeur (Width) calculĂ©e aux quatre cartes :

Texte
Parent.Width/4 // divisier par le nombre de colonnes souhaitées

Quel que soit le format, les 4 cartes se partageront toute la ligne. Mais le problùme, c’est que nos cartes deviennent illisibles sur un mobile en mode portrait :

AmĂ©liorons donc la formule pour la largeur des DataCards en leur donnant une largeur minimale pour qu’elles restent lisibles en toutes circonstances:

Texte
Max(
    Parent.Width/4; // divisier par le nombre de colonnes souhaitées
    200             // La largeur minimale du DataCard pour la lisibilité
)

Explications : Sur grand écran, les cartes occuperont toute la ligne, sauf si la taille des cartes devient critique (<200 pixels), dans ce cas elles seront renvoyées à la ligne.

Il ne nous reste plus qu’à rĂ©activer l’ajustement Ă  la largeur (WidthFit) pour que les cartes occupent tout l’espace disponible si elles ont Ă©tĂ© “wrappĂ©es”

RecrĂ©er un attribut “FillPortions”

Dans la partie 2, avec les containers, quand nous activions la largeur flexible d’un objet, nous pouvions dĂ©terminer “le nombre de portions” que le contrĂŽle allait occuper dans le remplissage automatique. Et bien nous pouvons reproduire ce comportement avec les Datacards en amĂ©liorant la formule vue dans le point prĂ©cĂ©dent :

  • Prenons deux Datcards pour lesquels nous n’avons pas encore personnalisĂ© la disposition

  • Mettons les sur la mĂȘme ligne Y=14

  • Pour la largeur du premier mettez la formule :

Texte
Max(
    Parent.Width * 1/3; // Portions occupées
    200             // La largeur minimale du DataCard pour la lisibilité
)
  • Pour la largeur du 2eme (le plus grand) mettez la formule :
Texte
Max(
    Parent.Width * 2/3; // Portions occupées
    400             // La largeur minimale du DataCard pour la lisibilité
)

Le premier Datacard occupera 1/3 de la ligne, le second 2/3. Si l’écran ne permet pas d’afficher les deux champs sur la mĂȘme ligne, le second sera dĂ©calĂ© en dessous, alors les deux cartes occuperont toute la largeur du formulaire car elles ont WidthFit=true.

Les points d’attention avec les formulaires

L’ergonomie globale du formulaire doit respecter plusieurs rùgles UI/UX pour rester fonctionnelle sur tout support :

Privilégiez la disposition Verticale

Évitez la disposition horizontale, elle est inadaptĂ©e aux Ă©crans Ă©troits. Un positionnement au-dessus assure une structure verticale fluide et maximise la largeur de la zone de saisie.

Dimensionnement des cibles tactiles

Les zones interactives doivent ĂȘtre dimensionnĂ©es pour un usage tactile. Fixez la Hauteur (Height) des zones de texte, listes dĂ©roulantes et boutons Ă  un minimum de 40px ou 44px (standards d’accessibilitĂ© mobile).

Gestion du clavier virtuel

Sur mobile, le clavier virtuel occulte prĂšs de la moitiĂ© de l’écran.

  • Assurez-vous que le conteneur du formulaire autorise le dĂ©filement (LayoutOverflowY = Scroll) et ajoutez un Datacard vide en fin de formulaire qui fait Ă  peu prĂšs un tiers de l’écran (Ou mettez cette hauteur au dernier Datacard du formulaire). Cela permettra, quand l’utilisateur clique sur un champ qui active le clavier, de toujours avoir le champ modifiĂ© affichĂ© sans avoir Ă  re-scroller.

  • DĂ©sactivez la recherche sur les contrĂŽles de type ComboBox (IsSearchable = false) lorsque cela n’est pas strictement requis, afin d’éviter l’ouverture intempestive du clavier virtuel lors d’un clic.

  • N’utilisez pas des contrĂŽles de saisie pour afficher du texte, sur une sĂ©lection, ils afficheraient le clavier inutilement.

💡 Aller plus loin avec les formulaires Pour dĂ©couvrir cette technique de configuration en dĂ©tail et maĂźtriser toutes les subtilitĂ©s du contrĂŽle EditForm (modes d’affichage, fonctions de soumission, personnalisation des cartes), je vous invite Ă  consulter la vidĂ©o que j’ai rĂ©alisĂ©e sur le sujet : đŸ“ș Easy Power Platform : Les Formulaires .

Conclusion

L’intĂ©gration d’un formulaire adaptatif marque l’aboutissement de la structuration de base d’une application. Depuis l’approche Mobile-First, en passant par l’utilisation des Layout Containers, jusqu’à la dynamisation des galeries et des cartes de donnĂ©es, l’ensemble des mĂ©canismes structurels du Responsive Design a Ă©tĂ© couvert au cours de ces quatre parties.

Cependant, l’optimisation d’une interface professionnelle ne s’arrĂȘte pas Ă  la simple disposition des blocs. Pour garantir une expĂ©rience visuelle homogĂšne et de haut niveau sur tous les appareils, il est nĂ©cessaire de rationaliser le design global.

Dans la Partie 5 de cette sĂ©rie, j’envisageai d’aborder des techniques qui permettent de compenser le niveau de zoom sur les petits Ă©crans. Mais Microsoft ayant apport des amĂ©lioration sur la taille des contrĂŽles, je vais prendre le temps de vĂ©rifier si ce chapitre est toujours utile. Donc Ă  trĂšs bientĂŽt pour une 5eme partie.. ou pas ! 😁.

Échanger autour de cet article

Les commentaires utilisent Giscus et GitHub Discussions. Le service externe n’est contactĂ© qu’aprĂšs activation.