Tutoriel : construire les vues du module Task Management
Statut documentaire : tutorial — voir Maturité et preuves.
Objectif
Ajouter une vue à Task en séparant clairement :
- le cache de données de page ;
- l'état et les actions de page ;
- les composants visuels et leurs bindings.
La vue est une projection du modèle métier. Elle ne doit pas devenir la source du sens métier.
Structure conceptuelle d'une vue
Task view
├── data cache
│ └── datasets / datasources
├── page model
│ ├── local state
│ ├── events
│ └── actions
└── visual projection
├── fields
├── list
└── buttons
1. Déclarer le cache de données
Exemple XML :
<lgc:dataSets>
<lgc:dataCursor name="TaskPageCursor">
<lgc:dataSet
name="TaskEntityDs"
collectionPath="/ClassItem[@name='TaskManagement.Task']/Collection[@name='Entity']">
<lgc:fields>
<field name="Id" fieldType="String" />
<field name="Name" fieldType="String" />
<field name="Description" fieldType="String" />
<field name="Priority" fieldType="Integer" />
<field name="StartDate" fieldType="DateTime" />
<field name="EndDate" fieldType="DateTime" />
</lgc:fields>
</lgc:dataSet>
</lgc:dataCursor>
</lgc:dataSets>
Le chemin exact de collection dépend du package chargé. Vérifiez toujours le nom public complet exposé par votre modèle.
2. Initialiser l'état de page
Le pageModel contient uniquement l'état propre à l'interaction de la page : filtre courant, élément sélectionné, mode d'édition, etc.
Exemple de logique en functionalP :
OnlyMine := false;
SelectedTaskId := "";
Évitez d'y déplacer des règles métier qui doivent rester dans le modèle ou dans une action publiée.
3. Filtrer avant l'ouverture du dataset
Appliquez les filtres avant l'ouverture afin d'éviter de charger puis rejeter inutilement des données.
if OnlyMine then
TaskEntityDs.Filter := "AssigneeId = :CurrentUserId";
La syntaxe exacte du filtre dépend du datasource et du Runtime utilisés ; l'exemple illustre le pattern de placement de la logique.
4. Lier les composants
Un composant visuel se lie à un datasource et à un champ public :
<lgc:edit
name="NameEdit"
nameField="Name"
dataSource="TaskEntityDs"
caption="#TaskName" />
<lgc:edit
name="PriorityEdit"
nameField="Priority"
dataSource="TaskEntityDs"
caption="#Priority" />
Le binding doit rester déclaratif. Une modification de l'implémentation visuelle ne doit pas forcer une duplication du modèle métier.
5. Ajouter Save et Cancel
Save:
post current object
refresh current dataset
Cancel:
cancel current edit
restore page state
Dans le script effectif, utilisez les opérations publiées par la version du Runtime et du composant concerné. Le site doit éviter d'inventer un symbole public : tout exemple exécutable doit être certifié contre la référence ou le manifest de la release.
6. Créer une nouvelle tâche
L'action « New Task » doit :
- créer une instance de
Task; - initialiser les valeurs nécessaires ;
- positionner la page en mode édition ;
- laisser la validation métier au modèle ;
- poster uniquement lorsque l'utilisateur confirme.
7. Événements visuels
Les événements visuels déclenchent des actions de page ou des actions métier publiées. Ils ne doivent pas contenir une seconde implémentation de la règle métier.
Exemples de responsabilités adaptées :
OnChange: mettre à jour un filtre local ;OnDoubleClick: ouvrir l'objet sélectionné ;OnKeyUp: rafraîchir une recherche ;- bouton
Save: appeler l'action de persistance/validation appropriée.
8. Validation
Avant de considérer la vue terminée, vérifiez :
- datasource résolu ;
- noms de champs cohérents avec le modèle ;
- initialisation du pageModel ;
- filtres appliqués avant ouverture lorsque possible ;
- Save/Cancel testés ;
- création d'un objet testée ;
- aucune règle métier dupliquée dans le composant visuel.
Étape suivante
Une fois le modèle et la vue validés, vous pouvez publier des capacités de service ou une API. Voir Publier une API de gestion d'utilisateurs pour le pattern de publication.