Les formulaires sont constitués d'items.
Les items de formulaires peuvent correspondre à :
des éléments graphiques de présentation (item formulaires ou regroupement d'items)
des éléments graphiques de saisie (cases à cocher, zones de texte…)
Les formulaires sont codés dans un ou plusieurs
fichiers XML dont la structure doit répondre à des règle précises.
Il est nécessaire de définir au moins un item formulaire (cf infra).
Les valeurs de ces items sont automatiquement sauvegardés en base de données pour les restituer sans code supplémentaire.
Les items de formulaire peuvent être déclarés avec ou l'utilisation des attributs
XML.
La déclaration du type form n'est pas obligatoire.
Vous pouvez inclure des sous-formulaires au sein de vos formulaires en utilisant l'inclusion de fichier (tag file).
Il est possible d'associer des scripts aux formulaires.
<!-- Déclaration d'un formulaire sans utilisation des attributs -->
<MedForm>
<type>form</type>
<name>Unique::Identifiant</name>
[...]
</MedForm>
<!-- Déclaration d'un formulaire avec utilisation des attributs -->
<MedForm type="form" name="Unique::Identifiant">
[...]
</MedForm>
<!-- Inclusion de fichier XML -->
<file>__subforms__/machin/truc/central.xml</file>
<!-- Inclusion de fichier de script -->
<file type="script" name="onload">./scripts/xx/script.js</file>
<!-- Déclaration d'items sans utilisation des attributs -->
<Item>
<type>check</type>
<name>Unique::Identifiant</name>
[...]
</Item>
<!-- Déclaration d'items avec utilisation des attributs -->
<Item type="check" name="Unique::Identifiant">
[...]
</Item>
Tous les formulaires et items de formulaires doivent être identifiés par un identifiant unique.
Ces identifiants doivent être persistants dans le temps (dans le cas de mise à jour du formulaire). Ils sont utilisés pour le stockage des données dans la base de données.
Il est préférable, pour éviter les conflits de nommage, d'utiliser des espace de nommage. Les espaces de nommage peuvent être séparés par : '::', ':', '.', '__'.
Vous pouvez utiliser le designer de Qt pour créer des formulaires de présentation complexe.
Il vous faudra alors deux fichiers (au moins), le descripteur
XML pour FreeMedForms et l'interface (fichier *.ui créé par le designer).
Pour plus d'information sur cette fonctionnalité, reportez-vous à la création d'item formulaire.
labelonleft : le libellé de l'item sera intégré à gauche de l'item dans le formulaire (valeur par défaut)
labelontop : le libellé de l'item sera intégré au-dessus de l'item dans le formulaire
compact : vues compactes (limite l'espace utilisé par l'item)
notprintable : par défaut tous les items seront inclus lors d'une demande d'impression. Utilisez cette option pour faire disparaître de l'impression un item (ou plusieurs si il s'agit d'un conteneur).
Les items formulaire définissent les différents formulaires patient.
Ils peuvent contenir plusieurs items voire même des items formulaires (formulaires imbriqués).
Il est indispensable de définir au moins un item formulaire.
Vous pouvez définir une hauteur supplémentaire dans la vue pour les items à la racine de l'arborescence avec rootitemextraheight. Vous pouvez utilisez ce tag dans le tag FreeMedForms pour qu'il s'applique à tous les formulaires racine.
<MedForm name="GP::Basic::IdentityForm" uifilename="v0.6.2+">
<label lang="xx">Identity</label>
<label lang="fr">Identité</label>
<options>unique</options>
<icon>__theme__/identity.png</icon>
</MedForm>
Options disponibles :
Vous pouvez définir le nombre de colonnes à l'aide du tag
column<column>2</column>
unique : un seul enregistrement dans la base de données. Il n'est pas possible de créer plusieurs épisodes pour ce formulaire (identité par exemple).
noepisode : aucun enregistrement ne sera créé dans la base de données pour les items et sous-items du formulaire. Vous pouvez utiliser cet option pour regrouper dans l'arborescence plusieurs items formulaire (exemple page médicaments du formulaire médecine générale).
HideHeaderOnUniqueEpisode (0.8.0) : cache l'entête du formulaire si le formulaire est limité à un épisode (voir aussi l'option : unique)
UseFormNameAsNameSpace (0.6.2), vous pouvez simplifier l'écriture de vos formulaires en attribuant à tous les items du formulaire un espace de nommage correspondant au nom du formulaire. Par exemple, le nom complet de l'item
One sera
Form::Test::BlaBla::One et non
One.
<MedForm name="Form::Test::BlaBla">
<options>UseFormNameAsNameSpace</options>
<Item name="One>...</Item>
</MedForm>
Vous pouvez regrouper des items pour améliorer la lisibilité de vos formulaires.
Les groupes possèdent une entête et un encadrement pour ses sous-items.
Vous pouvez définir des groupes spécifiques aux pays à l'aide du tag
country suivi de la liste des codes
ISO des pays séparés par un point-virgule. Par exemple, pour créer un groupe spécifique à la France, le code serait
<country>FR</country>.
Options (non implémenté) :
Vous pouvez définir le nombre de colonnes à l'aide du tag
column<column>2</column>
Grid : utilise une grille pour ranger les éléments
FormGrid : utilise une grille formulaire pour ranger les éléments (non disponible)
NoGrid : les éléments sont affichés tel quel les uns à la suite des autres (non disponible)
DontPrintTitle : n'ajoute pas le titre du groupe au moment de l'impression (à partir de la v0.6.2)
DontPrintEmptyValues : n'imprime pas si le contenu du groupe est vide
checkable : ajoute une case à cocher au groupe
collapsible : le group devient alors 'pliant'/'dépliant'
-
<Item type="group" name="sampleGroup">
<country>FR</country>
<option>compact</option>
<label>Intitulé</label>
[... Sous-items ...]
</Item>
Vous pouvez regrouper des items dans des groupes ou à l'intérieur de groupes “extensible”.
Ces items possèdent un libellé, un libellé supplémentaire, un bouton permettant de cacher/montrer le contenu du groupe et son contenu.
Pour définir le contenu de ces items, vous devez obligatoirement utiliser des formulaires d'interface QtUI (fichiers *.ui).
Ces items peuvent être inclues dans les vues en utilisant des “layouts”.
Options :
SummaryFontBold : le libellé est présenté en gras (par défaut il ne l'ai pas)
DontPrintEmptyValues : n'imprime pas si le contenu du groupe est vide
expanded : ajoute une case à cocher au groupe
<Item type="detailswidget" name="sampleGroup" uifilename="./ui/xx/file.ui">
<uilink label="" widget="" layout="identityLayout"/>
<option>SummaryFontBold;expanded</option>
<label lang="fr">Intitulé</label>
<extralabel lang="fr">Extension de libellé</label>
[... Sous-items ...]
</Item>
<Item name="HelpText" type="helptext">
<label lang="xx">This a simple help text</label>
<label lang="fr">Ceci est texte d'aide</label>
<options>printable</options>
<value>
<default>The default value</default>
</value>
</Item>
<Item name="ShortText" type="shorttext">
<label lang="xx">This a sample of a line edit</label>
<label lang="fr">Exemple de zone de saisie sur une ligne</label>
<placeholder lang="xx">My placeholder</placeholder>
<placeholder lang="fr">Saisissez qqchose</placeholder>
<value>
<default lang="xx">The default value</default>
<default lang="fr">La valeur par défaut</default>
</value>
<validator>email</validator>
<inputmask>A999A99</inputmask>
</Item>
<Item name="LongText" type="longtext">
<label lang="xx">This a simple text edit without complex formatting</label>
<label lang="fr">Exemple de zone de saisie textuelle brute et multi-ligne</label>
<value>
<default lang="xx">The default value</default>
<default lang="fr">La valeur par défaut</default>
</value>
</Item>
Correspond à une zone de saisie multi-ligne avec possibilité de mise en forme des caractères, ajout de tableau, ajout d'images, sauvegarde et lecture de fichier html…
Options disponibles :
FullEditor : éditeur complet (avec impression, tableaux, fichiers…)
WithTable : éditeur basique avec manipulation de tableaux activée
WithIO : éditeur basique avec manipulation de fichiers activée
DontPrintEmptyValues : n'imprime pas si l'éditeur de texte est vide
Expanded : Étend la zone de texte en hauteur à 1000 pixels
PrintDuplicata (v0.8.2+) : Au moment de l'impression prépare un duplicata (pratique pour les ordonnances textuelles)
Les documents utilisateur (entête, pied de page, filigrane) pour l'impression peuvent être définis grâce au tag papers et peuvent être (une seule des trois options) (v0.8.2+):
Generic : jeux de documents pour l'impression de documents génériques
Administrative : jeux de documents pour l'impression de documents administratifs
Prescription : jeux de documents pour l'impression de prescriptions
Lors de l'impression du contenu de la zone de texte, le libellé défini dans le code
XML sera utilisé comme titre de document.
<Item name="GP::Basic::SOAP::S" type="texteditor>
<label lang="xx">Subjective</label>
<label lang="fr">Subjectif</label>
<options>FullEditor</options>
<papers>Prescription</papers>
</Item>
Options disponibles :
min : borne inférieure
max : borne supérieure
step : pas
<Item name="Spin1" type="spin">
<label lang="xx">Spin</label>
</Item>
<Item name="doublespin1" type="doublespin">
<label lang="xx">Double Spin</label>
<min>2</min>
<max>1324</max>
<step>0.1</step>
</Item>
<Item name="CheckBox" type="check">
<label lang="xx">This is a simple scripted checkbox sample</label>
<label lang="fr">Exemple de case à cocher simple</label>
<tooltip lang="xx">My tootip</tooltip>
<options>printonlychecked</options>
<value>
<numerical id="0">1</numerical>
<numerical id="1">2</numerical>
</value>
</Item>
<Item name="RadioBoxes" type="radio">
<label lang="xx">There are the radio buttons</label>
<label lang="fr">Exemple de cases à cocher multiples auto-exclusives</label>
<value>
<uuid id="0">first</uuid>
<uuid id="1">second</uuid>
<uuid id="2">third</uuid>
<possible id="0" lang="xx">The first value</possible>
<possible id="1" lang="xx">The second value</possible>
<possible id="2" lang="xx">The third value</possible>
<possible id="0" lang="fr">Première valeur</possible>
<possible id="1" lang="fr">Seconde valeur</possible>
<possible id="2" lang="fr">Troisième valeur</possible>
<numerical id="0">1</numerical>
<numerical id="1">2</numerical>
<numerical id="2">4</numerical>
</value>
</Item>
<Item name="SampleDateEdit" type="date">
<dateformat>dd MM yyyy</dateformat>
<label lang="xx">This a date editor</label>
<label lang="fr">Exemple d'éditeur de date et heure</label>
<options>now;patientLimits</options>
</Item>
<Item name="SampleDateEdit" type="moderndate">
<dateformat>dd MM yyyy</dateformat>
<label lang="xx">This a date editor</label>
<label lang="fr">Exemple d'éditeur de date et heure</label>
<options>now;patientLimits</options>
</Item>
(0.6.2) Vous pouvez spécifier une valeur par défaut qui sera activée lors de chaque création de formulaire grâce à la valeur default. Spécifiez le nom de l'uuid par défaut.
(0.8.2) Vous pouvez demander à FreeMedForms de peupler le combo avec des valeurs traduites par défaut comme :
les périodes (minutes, secondes, jours, semaines, mois, trimestres, années, décennies) avec l'option
PopulateWithPeriods. Vous pouvez alors définir la valeur par défaut parmi les identifiants suivants : second, minute, day, week, month, quarter, year, decade.
<options>PopulateWithPeriods</options>
<default>year</default>
<Item>
<name>sampleCombo</name>
<type>combo</type>
<label>This a simple combo from the BaseWidgetsForm plugins</label>
<value>
<uuid id="0">firstcombo</uuid>
<uuid id="1">secondcombo</uuid>
<uuid id="2">thirdcombo</uuid>
<possible id="0" lang="xx">First Combo's Element</possible>
<possible id="1" lang="xx">Second Combo's Element</possible>
<possible id="2" lang="xx">Third Combo's Element</possible>
<possible id="0" lang="fr">Premier élément</possible>
<possible id="1" lang="fr">Deuxième élément</possible>
<possible id="2" lang="fr">Troisième élément</possible>
<default>secondcombo</default>
</value>
</Item>
Listes à choix multiple : multilist
Listes à choix simple : uniquelist
(0.8.2) Les listes à choix simple ou multiple peuvent être définies dans des fichiers QtUi en utilisant des QListView et en identifiant les widgets dans le tag uilink l'attribut widget.
Options
<Item name="sampleList" type="multilist">
<label>This a simple MutliList Selector from the BaseWidgetsForm plugins</label>
<value>
<uuid id="0">firstitem</uuid>
<uuid id="1">seconditem</uuid>
<uuid id="2">thirditem</uuid>
<possible id="0">First Element</possible>
<possible id="1">Second Element</possible>
<possible id="2">Third Element</possible>
</value>
</Item>
<Item name="editableListSample" type="editableList">
<label lang="xx">This a simple of editable list limited to 10 lines</label>
<maxrow>10</maxrow>
</Item>
<Item name="sampleButton" type="button">
<uilink widget="sendMailButton"/>
<label lang="fr">Ceci est un bouton</label>
<label lang="en">This a simple button</label>
<icon>__theme__/icon.png</icon>
<scripts>
<onclicked>...script executed when button is clicked by the user...</onclicked>
<onload>...</onload>
[...] Read doc about scripts in forms
</scripts>
</Item>
A partir de la v0.8.4
Cet élément se présente comme un bouton. Lorsqu'il est cliqué un menu apparait. Ce menu permet de naviguer dans les fichiers présents sur le disque dur local. Lorsqu'un fichier est sélectionné le contenu peut être inséré dans un éditeur de texte.
Il est possible de définir plusieurs options :
WithoutConfirmation : insère le texte dans l'éditeur sans demander de confirmation à l'utilisateur (attention le texte déjà présent dans l'éditeur sera écrasé). Pour définir cette option utilisez le tag options.
path : le répertoire de départ du menu (tag spécifique).
filter : le filtre à appliquer sur les fichiers (tag spécifique). Les filtres sont à séparer par un point virgule.
populate : spécifie l'uuid de l'éditeur lié.
Actuellement, le script onClick n'est pas prit en charge.
-
<Item name="FileNavigationButton" type="buttonmenupath">
<label lang="xx">Select a file (replacement with confirmation)</label>
<label lang="fr">Sélectionnez un fichier (replacement avec confirmation)</label>
<tooltip lang="xx">Select a file and the its content will be included in the text editor</tooltip>
<tooltip lang="fr">Sélectionnez un fichier et son contenu sera insérer dans l'éditeur de texte</tooltip>
<icon>__theme__/fileopen.png</icon>
<path>__userDocuments__</path>
<filter>*.htm;*.html;*.txt;*.rtf</filter>
<populate>GP::Basic::Prescr::Text::Content</populate>
</Item>
A partir de la version 0.8.2.
Ces éléments comprennent une zone de saisie numérique (décimal) et une liste déroulante (pour les unités).
Vous pouvez définir les unités de mesure avec le tag options, la valeur par défaut avec le tag default.
La valeur par défaut peut être différente selon la langue de l'application. Vous pouvez choisir parmi :
centimeter
meter
inch
foot
Vous pouvez peupler automatiquement les unités de mesures en précisant dans le tag options
Weight pour les poids (les valeurs transmises seront alors automatiquement traduites en grammes)
Length pour les longueurs (les valeurs transmises seront alors automatiquement traduites en centimètres)
<Item type="measurement" name="Height">
<label lang="xx">Height (widgets)</label>
<label lang="fr">Taille (widgets)</label>
<options>DontPrintEmptyValues;Length</options>
<default>meter</default>
</Item>
<Item name="GP::Basic::IdentityItem" type="identity">
<label lang="xx">Full Identity</label>
<label lang="fr">Identité</label>
<options>with-address</options>
</Item>
<Item name="GP::Basic::Prescr::Drugs::Content" type="prescriptor">
<label lang="xx">Therapeutic prescription</label>
<label lang="fr">Prescription médicamenteuse</label>
</Item>
<Item name="GP::Basic::ICD10::Content" type="icd">
<label lang="xx">ICD10 coding</label>
<label lang="fr">Codes CIM10</label>
</Item>
<Item name="girSample" type="gir">
<label lang="xx">Gir sample</label>
<label lang="fr">Exemple de grille AGGIR</label>
</Item>
<Item name="fagerstromScore" type="sum">
<label lang="fr">Score</label>
<label lang="xx">Score</label>
<sumof>cig_reveil;fum_interdit;cig_indispensable;cig_par_jour;premiere_heure;maladie</sumof>
<option>changeepisodelabel</option>
</Item>
options disponibles :
précisez les items à inclure dans le calcul dans le tag sumof en les séparant par un ;
le calcul se fait en temps réel à chaque modification des items spécifiés
les valeurs utilisées pour le calcul sont les numerical.
(0.6.2) Vous pouvez utiliser une interface UI, pour ce faire spécifier la QLineEdit dans le code xml
<uilink label="myQLabelFromUi" widget="myQLineEditFromUi"/>
exemple d'utilisation :
addictology/Fagerström
geriatrics/iadl
<Item name="fagerstromScore" type="sum">
<label lang="fr">Score</label>
<label lang="xx">Score</label>
<sumof_regexp>Subs:Psychiatry::Depression::Hamilton::*</sumof_regexp>
<option>changeepisodelabel</option>
</Item>
<Item name="Total" type="scriptcalculation">
<label lang="xx">Result</label>
<options>vertical;labelontop;changeepisodelabel;DontPrintEmptyValues</options>
<connect_regexp>Test::Calculation::Script::*</connect_regexp>
<calcScript>
var s = "Script test: ";
forms.namespaceInUse = "Test::Calculation::Script";
var first = forms.item("First").currentValue;
var second = forms.item("Second").currentValue;
var calc = forms.item("Formula").currentText;
var tmp = calc;
tmp = tmp.replace(/first/g, first.toString());
tmp = tmp.replace(/second/g, second.toString());
s += "(Formula:"+calc+"="+tmp+") = " + eval(calc);
s; // Result to show in the lineedit: "Script test: (Formula:first*second=2*3) = 6"
</calcScript>
</Item>
options disponibles :
changeepisodelabel : ajoute au libellé de l'épisode le libellé de l'item suivi du score calculé. Ex : Épisode (Score = 5)
showintexteditor : affiche le résultat dans un éditeur de texte enrichi (sinon affiche dans une line edit)
Précisez les items à inclure dans le calcul dans le tag connect en les séparant par un ; ou dans le tag connect_regexp en utilisant une expression.
Le script sera exécuté en temps réel à chaque modification des items spécifiés.