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.