Dans cet article, je vais vous montrer comment et pourquoi nous avons utilisé JSON Forms pour créer une plateforme de gestion de formulaires et rapports médicaux qui soit aussi robuste que fiable.
JSON Forms
Dans le cadre du projet MedAI, nous avions besoin de trouver une solution flexible et efficace pour gérer la création et la manipulation de formulaires dynamiques. AprÚs avoir échangé sur nos expériences passées en interne, nous avons décidé de choisir JSON Forms, à priori candidat parfait pour nos besoins.
Nos besoins spécifiques
Dans MedAI, les formulaires ainsi que les rapports mĂ©dicaux qui en dĂ©coulent reprĂ©sentent la piĂšce principale de la plateforme. Plusieurs groupes dâutilisateur·trice·s sont impliquĂ©s Ă diffĂ©rentes Ă©tapes du processus:
- Administrateur·trice·s: vont créer les formulaires directement sur la plateforme en ajoutant des étapes, des champs et autres informations. Le but étant de remplacer et de migrer les formulaires Microsoft Word utilisés jusque-là .
- Gestionnaires: Au moment de la crĂ©ation dâun rapport mĂ©dical, le ou la gestionnaire va pouvoir modifier de maniĂšre restreinte le formulaire pour y ajouter des questions ou enlever des informations inutiles.
- Médecins et personnel soignant: vont remplir un rapport médical avec les informations du bénéficiaire. Ils et elles vont devoir remplir les champs pré-définis par les administrateur·trice·s et les gestionnaires.
Une fois le rapport médical dûment rempli et soumis, une version PDF de ce dernier sera générée et transmise à la GED (Gestion électronique des documents). Cette GED est de la responsabilité du GILAI, structure en charge de l'informatique des Offices de l'assurance-invalidité (AI) du canton de Vaud et de 19 autres cantons.
Ătant donnĂ© cet environnement multi-usages et multi-rĂŽles, nous avions besoin d'un outil permettant une gestion entiĂšrement dynamique des formulaires, de leur crĂ©ation Ă leur rendu final sous forme de rapport PDF. Une bonne occasion de mettre la bibliothĂšque open-source JSON Forms Ă lâĂ©preuve.
Comment fonctionne JSON Forms?
Pour dĂ©finir un formulaire, JSON Forms se base sur plusieurs informations et configuration. Nous allons passer ensemble au travers de ces diffĂ©rents Ă©lĂ©ments pour vous montrer lâĂ©tablissement dâun formulaire.
Le schéma des données (Schema)
JSON Forms repose sur JSON Schema, qui définit la structure et la validation des données des formulaires. Il spécifie les types de champs (texte, nombre, date, etc.), leurs contraintes (valeurs obligatoires, plages autorisées, formats, etc.) et la structure globale du formulaire.
const schema: JsonSchema = {
properties: {
username: { type: 'string' },
password: { type: 'string' },
},
required: ['username', 'password'],
};
Le schĂ©ma dâinterface utilisateur (UI Schema)
Le UI Schema permet de personnaliser l'affichage du formulaire sans toucher à la structure des données. Il définit la disposition des champs, leur regroupement et leur ordre d'affichage.
const uiSchema: VerticalLayout = {
type: 'VerticalLayout',
elements: [
{
type: 'Control',
label: t('views.admin.auth.form.username'),
scope: '#/properties/username',
options: { props: { autofocus: true } },
},
{
type: 'Control',
label: t('views.admin.auth.form.password'),
scope: '#/properties/password',
options: { format: 'password' },
},
],
};
Les données (Data)
Les informations renseignées par les personnes remplissant le formulaire sont stockées sous format JSON et suivent la structure définie par le schéma.
{"username": "bryan", "password": "secret"}
Les composants de rendu (Renderer)
Ils permettent de dĂ©finir quel composant va ĂȘtre utilisĂ© par rapport Ă ce qui est dĂ©fini dans le schĂ©ma de donnĂ©es ainsi que dans le schĂ©ma dâinterface utilisateur.
export const renderers: JsonFormsRendererRegistryEntry[] = [
{ renderer: markRaw(TextFieldControl), tester: textFieldControlTester },
{ renderer: markRaw(PasswordFieldControl), tester: passwordFieldControlTester },
{ renderer: markRaw(VerticalLayout), tester: verticalLayoutTester },
];
Dans le cadre de MedAI, on définit des renderers différents pour:
- le formulaire affichĂ© en mode âadminâ
- le rapport mĂ©dical affichĂ© pour le mĂ©decin en mode âformulaireâ
- le rapport mĂ©dical affichĂ© lors de la gĂ©nĂ©ration du PDF en mode âPDFâ.
Rendu automatique
En combinant les diffĂ©rents Ă©lĂ©ments prĂ©sentĂ©s ci-dessus, nous allons pouvoir afficher un formulaire avec le rendu souhaitĂ© en termes dâaffichage des Ă©tapes, sections et champs. La validation lors de la soumission du formulaire est Ă©galement prise en compte.
<JsonForms
ref="jsonformsEl"
:i18n="jsonFormsI18n"
:data="modelValue"
:schema="schema"
:renderers="renderers"
:uischema="uiSchema"
:ajv="ajv"
validation-mode="ValidateAndShow"
:additional-errors="combinedErrors"
@change="onChange"
/>
Et visuellement, ça donne quoi ?
Page de modification dâun formulaire
Les administrateur·trice·s et gestionnaires peuvent modifier le formulaire en y ajoutant des Ă©tapes sur la gauche puis, des sections et des champs sur chaque Ă©tape. Avec la possibilitĂ© de rajouter diffĂ©rentes informations sur ces champs: label, description, infobulle, texte dâaide, etc.
Les utilisateur·trice·s peuvent Ă©galement dĂ©placer les Ă©tapes, les sections ainsi que les champs. Le formulaire est affichĂ© dâune maniĂšre bien spĂ©cifique. Les champs eux-mĂȘmes ne sont pas remplissables, ils sont juste affichĂ©s afin de simuler ce Ă quoi un rapport mĂ©dical va ressembler.
Pendant cette étape, les opérations des utilisateurs vont principalement modifier deux parties:
- le schéma de données (Schema)
- le schĂ©ma dâinterface utilisateur (UI Schema)
Pour lâaffichage, nous utilisons des renderers spĂ©cifiques.
Page dâun rapport mĂ©dical
La page dâun rapport mĂ©dical permet dâafficher le rapport mĂ©dical créé, Ă©tablie Ă partir du formulaire dĂ©fini par les administrateur·trice·s et gestionnaires. Ici, les mĂ©decins et le personnel soignant vont pouvoir remplir les informations utilisateurs facilement, Ă©tape par Ă©tape. Une fois toutes les informations renseignĂ©es, lâutilisateur·trice pourra soumettre ce formulaire. Dans cette Ă©tape, ne seront modifiĂ©es que les donnĂ©es liĂ©es au formulaire et non les schĂ©mas. Dans le cadre de cet exemple de formulaire, nous allons lâafficher en nous aidant des renderers normaux, qui sont Ă©galement ceux utilisĂ©s pour les autres formulaires de la plateforme.

Génération de PDF
Le PDF est gĂ©nĂ©rĂ© en intĂ©grant toutes les donnĂ©es remplies par les administrateur·trice·s, gestionnaires et mĂ©decins afin dâavoir un document regroupant toutes les informations requises.
Ici, nous allons utiliser des renderers spĂ©cifiques afin dâavoir un affichage simplifiĂ© enlevant toute fioriture et Ă©lĂ©ments inutiles. La gĂ©nĂ©ration PDF Ă©tant faite avec Weasyprint, les composants ont dĂ» ĂȘtre implĂ©mentĂ©s de maniĂšre un peu diffĂ©rente afin de gĂ©rer les contraintes liĂ©es au style CSS.

Autres formulaires
Sur la plateforme, nous avons bien dâautres formulaires qui gravitent autour des rapports mĂ©dicaux. Pour la rĂ©alisation et la gestion de ces derniers, nous utilisons Ă©galement JSON Forms qui est assez modulable pour fonctionner avec divers types de formulaires.

Nous sommes pleinement satisfaits de notre choix dâutiliser JSON Forms. Une fois les concepts fondamentaux assimilĂ©s et les premiĂšres fonctionnalitĂ©s mises en place, la crĂ©ation et lâadaptation des formulaires se sont rĂ©vĂ©lĂ©es fluides et efficaces. JSON Forms constitue une option particuliĂšrement pertinente lorsque lâapplication doit gĂ©rer un grand nombre de formulaires de complexitĂ© variable. Son approche modulaire et dynamique en fait un atout considĂ©rable pour des cas dâusage nĂ©cessitant une gestion avancĂ©e des formulaires.